winhelp: Added support for transparent bitmaps.
This commit is contained in:
parent
8f1805f9b6
commit
2f1048862a
|
@ -708,6 +708,89 @@ static BOOL HLPFILE_RtfAddHexBytes(struct RtfData* rd, const void* _ptr, unsigne
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/******************************************************************
|
||||||
|
* HLPFILE_RtfAddTransparentBitmap
|
||||||
|
*
|
||||||
|
* We'll transform a transparent bitmap into an metafile that
|
||||||
|
* we then transform into RTF
|
||||||
|
*/
|
||||||
|
static BOOL HLPFILE_RtfAddTransparentBitmap(struct RtfData* rd, const BITMAPINFO* bi,
|
||||||
|
const void* pict, unsigned nc)
|
||||||
|
{
|
||||||
|
HDC hdc, hdcMask, hdcMem, hdcEMF;
|
||||||
|
HBITMAP hbm, hbmMask, hbmOldMask, hbmOldMem;
|
||||||
|
HENHMETAFILE hEMF;
|
||||||
|
BOOL ret = FALSE;
|
||||||
|
void* data;
|
||||||
|
UINT sz;
|
||||||
|
|
||||||
|
hbm = CreateDIBitmap(hdc = GetDC(0), &bi->bmiHeader,
|
||||||
|
CBM_INIT, pict, bi, DIB_RGB_COLORS);
|
||||||
|
|
||||||
|
hdcMem = CreateCompatibleDC(hdc);
|
||||||
|
hbmOldMem = SelectObject(hdcMem, hbm);
|
||||||
|
|
||||||
|
/* create the mask bitmap from the main bitmap */
|
||||||
|
hdcMask = CreateCompatibleDC(hdc);
|
||||||
|
hbmMask = CreateBitmap(bi->bmiHeader.biWidth, bi->bmiHeader.biHeight, 1, 1, NULL);
|
||||||
|
hbmOldMask = SelectObject(hdcMask, hbmMask);
|
||||||
|
SetBkColor(hdcMem,
|
||||||
|
RGB(bi->bmiColors[nc - 1].rgbRed,
|
||||||
|
bi->bmiColors[nc - 1].rgbGreen,
|
||||||
|
bi->bmiColors[nc - 1].rgbBlue));
|
||||||
|
BitBlt(hdcMask, 0, 0, bi->bmiHeader.biWidth, bi->bmiHeader.biHeight, hdcMem, 0, 0, SRCCOPY);
|
||||||
|
|
||||||
|
/* sets to RGB(0,0,0) the transparent bits in main bitmap */
|
||||||
|
SetBkColor(hdcMem, RGB(0,0,0));
|
||||||
|
SetTextColor(hdcMem, RGB(255,255,255));
|
||||||
|
BitBlt(hdcMem, 0, 0, bi->bmiHeader.biWidth, bi->bmiHeader.biHeight, hdcMask, 0, 0, SRCAND);
|
||||||
|
|
||||||
|
SelectObject(hdcMask, hbmOldMask);
|
||||||
|
DeleteDC(hdcMask);
|
||||||
|
|
||||||
|
SelectObject(hdcMem, hbmOldMem);
|
||||||
|
DeleteDC(hdcMem);
|
||||||
|
|
||||||
|
/* we create the bitmap on the fly */
|
||||||
|
hdcEMF = CreateEnhMetaFile(NULL, NULL, NULL, NULL);
|
||||||
|
hdcMem = CreateCompatibleDC(hdcEMF);
|
||||||
|
|
||||||
|
/* sets to RGB(0,0,0) the transparent bits in final bitmap */
|
||||||
|
hbmOldMem = SelectObject(hdcMem, hbmMask);
|
||||||
|
SetBkColor(hdcEMF, RGB(255, 255, 255));
|
||||||
|
SetTextColor(hdcEMF, RGB(0, 0, 0));
|
||||||
|
BitBlt(hdcEMF, 0, 0, bi->bmiHeader.biWidth, bi->bmiHeader.biHeight, hdcMem, 0, 0, SRCAND);
|
||||||
|
|
||||||
|
/* and copy the remaining bits of main bitmap */
|
||||||
|
SelectObject(hdcMem, hbm);
|
||||||
|
BitBlt(hdcEMF, 0, 0, bi->bmiHeader.biWidth, bi->bmiHeader.biHeight, hdcMem, 0, 0, SRCPAINT);
|
||||||
|
SelectObject(hdcMem, hbmOldMem);
|
||||||
|
DeleteDC(hdcMem);
|
||||||
|
|
||||||
|
/* do the cleanup */
|
||||||
|
ReleaseDC(0, hdc);
|
||||||
|
DeleteObject(hbmMask);
|
||||||
|
DeleteObject(hbm);
|
||||||
|
|
||||||
|
hEMF = CloseEnhMetaFile(hdcEMF);
|
||||||
|
|
||||||
|
/* generate rtf stream */
|
||||||
|
sz = GetEnhMetaFileBits(hEMF, 0, NULL);
|
||||||
|
if (sz && (data = HeapAlloc(GetProcessHeap(), 0, sz)))
|
||||||
|
{
|
||||||
|
if (sz == GetEnhMetaFileBits(hEMF, sz, data))
|
||||||
|
{
|
||||||
|
ret = HLPFILE_RtfAddControl(rd, "{\\pict\\emfblip") &&
|
||||||
|
HLPFILE_RtfAddHexBytes(rd, data, sz) &&
|
||||||
|
HLPFILE_RtfAddControl(rd, "}");
|
||||||
|
}
|
||||||
|
HeapFree(GetProcessHeap(), 0, data);
|
||||||
|
}
|
||||||
|
DeleteEnhMetaFile(hEMF);
|
||||||
|
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
/******************************************************************
|
/******************************************************************
|
||||||
* HLPFILE_RtfAddBitmap
|
* HLPFILE_RtfAddBitmap
|
||||||
*
|
*
|
||||||
|
@ -719,6 +802,7 @@ static BOOL HLPFILE_RtfAddBitmap(struct RtfData* rd, BYTE* beg, BYTE type, BYTE
|
||||||
BITMAPINFO* bi;
|
BITMAPINFO* bi;
|
||||||
unsigned long off, csz;
|
unsigned long off, csz;
|
||||||
unsigned nc = 0;
|
unsigned nc = 0;
|
||||||
|
BOOL clrImportant = FALSE;
|
||||||
BOOL ret = FALSE;
|
BOOL ret = FALSE;
|
||||||
char tmp[256];
|
char tmp[256];
|
||||||
|
|
||||||
|
@ -735,7 +819,8 @@ static BOOL HLPFILE_RtfAddBitmap(struct RtfData* rd, BYTE* beg, BYTE type, BYTE
|
||||||
bi->bmiHeader.biWidth = fetch_ulong(&ptr);
|
bi->bmiHeader.biWidth = fetch_ulong(&ptr);
|
||||||
bi->bmiHeader.biHeight = fetch_ulong(&ptr);
|
bi->bmiHeader.biHeight = fetch_ulong(&ptr);
|
||||||
bi->bmiHeader.biClrUsed = fetch_ulong(&ptr);
|
bi->bmiHeader.biClrUsed = fetch_ulong(&ptr);
|
||||||
bi->bmiHeader.biClrImportant = fetch_ulong(&ptr);
|
clrImportant = fetch_ulong(&ptr);
|
||||||
|
bi->bmiHeader.biClrImportant = (clrImportant > 1) ? clrImportant : 0;
|
||||||
bi->bmiHeader.biCompression = BI_RGB;
|
bi->bmiHeader.biCompression = BI_RGB;
|
||||||
if (bi->bmiHeader.biBitCount > 32) WINE_FIXME("Unknown bit count %u\n", bi->bmiHeader.biBitCount);
|
if (bi->bmiHeader.biBitCount > 32) WINE_FIXME("Unknown bit count %u\n", bi->bmiHeader.biBitCount);
|
||||||
if (bi->bmiHeader.biPlanes != 1) WINE_FIXME("Unsupported planes %u\n", bi->bmiHeader.biPlanes);
|
if (bi->bmiHeader.biPlanes != 1) WINE_FIXME("Unsupported planes %u\n", bi->bmiHeader.biPlanes);
|
||||||
|
@ -773,7 +858,11 @@ static BOOL HLPFILE_RtfAddBitmap(struct RtfData* rd, BYTE* beg, BYTE type, BYTE
|
||||||
}
|
}
|
||||||
pict_beg = HLPFILE_DecompressGfx(beg + off, csz, bi->bmiHeader.biSizeImage, pack);
|
pict_beg = HLPFILE_DecompressGfx(beg + off, csz, bi->bmiHeader.biSizeImage, pack);
|
||||||
|
|
||||||
|
if (clrImportant == 1 && nc > 0)
|
||||||
|
{
|
||||||
|
ret = HLPFILE_RtfAddTransparentBitmap(rd, bi, pict_beg, nc);
|
||||||
|
goto done;
|
||||||
|
}
|
||||||
if (!HLPFILE_RtfAddControl(rd, "{\\pict")) goto done;
|
if (!HLPFILE_RtfAddControl(rd, "{\\pict")) goto done;
|
||||||
if (type == 0x06)
|
if (type == 0x06)
|
||||||
{
|
{
|
||||||
|
|
Loading…
Reference in New Issue