| Index: core/src/fxge/win32/fx_win32_dib.cpp
|
| diff --git a/core/src/fxge/win32/fx_win32_dib.cpp b/core/src/fxge/win32/fx_win32_dib.cpp
|
| index 3dcfce48022b965a7ce0edcd567a98a946b844ed..b1ffe8080d04633586a2ccfb048e8625a741afd7 100644
|
| --- a/core/src/fxge/win32/fx_win32_dib.cpp
|
| +++ b/core/src/fxge/win32/fx_win32_dib.cpp
|
| @@ -5,273 +5,282 @@
|
| // Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
|
|
|
| #include "../../../include/fxge/fx_ge.h"
|
| -#if _FX_OS_ == _FX_WIN32_DESKTOP_ || _FX_OS_ == _FX_WIN64_DESKTOP_
|
| +#if _FX_OS_ == _FX_WIN32_DESKTOP_ || _FX_OS_ == _FX_WIN64_DESKTOP_
|
| #include <windows.h>
|
| #include "../../../include/fxge/fx_ge_win32.h"
|
| #include "win32_int.h"
|
| -CFX_ByteString CFX_WindowsDIB::GetBitmapInfo(const CFX_DIBitmap* pBitmap)
|
| -{
|
| - CFX_ByteString result;
|
| - int len = sizeof (BITMAPINFOHEADER);
|
| - if (pBitmap->GetBPP() == 1 || pBitmap->GetBPP() == 8) {
|
| - len += sizeof (DWORD) * (int)(1 << pBitmap->GetBPP());
|
| - }
|
| - BITMAPINFOHEADER* pbmih = (BITMAPINFOHEADER*)result.GetBuffer(len);
|
| - FXSYS_memset(pbmih, 0, sizeof (BITMAPINFOHEADER));
|
| - pbmih->biSize = sizeof(BITMAPINFOHEADER);
|
| - pbmih->biBitCount = pBitmap->GetBPP();
|
| - pbmih->biCompression = BI_RGB;
|
| - pbmih->biHeight = -(int)pBitmap->GetHeight();
|
| - pbmih->biPlanes = 1;
|
| - pbmih->biWidth = pBitmap->GetWidth();
|
| - if (pBitmap->GetBPP() == 8) {
|
| - FX_DWORD* pPalette = (FX_DWORD*)(pbmih + 1);
|
| - if (pBitmap->GetPalette() == NULL) {
|
| - for (int i = 0; i < 256; i ++) {
|
| - pPalette[i] = i * 0x010101;
|
| - }
|
| - } else {
|
| - for (int i = 0; i < 256; i ++) {
|
| - pPalette[i] = pBitmap->GetPalette()[i];
|
| - }
|
| - }
|
| +CFX_ByteString CFX_WindowsDIB::GetBitmapInfo(const CFX_DIBitmap* pBitmap) {
|
| + CFX_ByteString result;
|
| + int len = sizeof(BITMAPINFOHEADER);
|
| + if (pBitmap->GetBPP() == 1 || pBitmap->GetBPP() == 8) {
|
| + len += sizeof(DWORD) * (int)(1 << pBitmap->GetBPP());
|
| + }
|
| + BITMAPINFOHEADER* pbmih = (BITMAPINFOHEADER*)result.GetBuffer(len);
|
| + FXSYS_memset(pbmih, 0, sizeof(BITMAPINFOHEADER));
|
| + pbmih->biSize = sizeof(BITMAPINFOHEADER);
|
| + pbmih->biBitCount = pBitmap->GetBPP();
|
| + pbmih->biCompression = BI_RGB;
|
| + pbmih->biHeight = -(int)pBitmap->GetHeight();
|
| + pbmih->biPlanes = 1;
|
| + pbmih->biWidth = pBitmap->GetWidth();
|
| + if (pBitmap->GetBPP() == 8) {
|
| + FX_DWORD* pPalette = (FX_DWORD*)(pbmih + 1);
|
| + if (pBitmap->GetPalette() == NULL) {
|
| + for (int i = 0; i < 256; i++) {
|
| + pPalette[i] = i * 0x010101;
|
| + }
|
| + } else {
|
| + for (int i = 0; i < 256; i++) {
|
| + pPalette[i] = pBitmap->GetPalette()[i];
|
| + }
|
| }
|
| - if (pBitmap->GetBPP() == 1) {
|
| - FX_DWORD* pPalette = (FX_DWORD*)(pbmih + 1);
|
| - if (pBitmap->GetPalette() == NULL) {
|
| - pPalette[0] = 0;
|
| - pPalette[1] = 0xffffff;
|
| - } else {
|
| - pPalette[0] = pBitmap->GetPalette()[0];
|
| - pPalette[1] = pBitmap->GetPalette()[1];
|
| - }
|
| + }
|
| + if (pBitmap->GetBPP() == 1) {
|
| + FX_DWORD* pPalette = (FX_DWORD*)(pbmih + 1);
|
| + if (pBitmap->GetPalette() == NULL) {
|
| + pPalette[0] = 0;
|
| + pPalette[1] = 0xffffff;
|
| + } else {
|
| + pPalette[0] = pBitmap->GetPalette()[0];
|
| + pPalette[1] = pBitmap->GetPalette()[1];
|
| }
|
| - result.ReleaseBuffer(len);
|
| - return result;
|
| + }
|
| + result.ReleaseBuffer(len);
|
| + return result;
|
| }
|
| -CFX_DIBitmap* _FX_WindowsDIB_LoadFromBuf(BITMAPINFO* pbmi, LPVOID pData, FX_BOOL bAlpha)
|
| -{
|
| - int width = pbmi->bmiHeader.biWidth;
|
| - int height = pbmi->bmiHeader.biHeight;
|
| - BOOL bBottomUp = TRUE;
|
| - if (height < 0) {
|
| - height = -height;
|
| - bBottomUp = FALSE;
|
| - }
|
| - int pitch = (width * pbmi->bmiHeader.biBitCount + 31) / 32 * 4;
|
| - CFX_DIBitmap* pBitmap = new CFX_DIBitmap;
|
| - FXDIB_Format format = bAlpha ? (FXDIB_Format)(pbmi->bmiHeader.biBitCount + 0x200) : (FXDIB_Format)pbmi->bmiHeader.biBitCount;
|
| - FX_BOOL ret = pBitmap->Create(width, height, format);
|
| - if (!ret) {
|
| - delete pBitmap;
|
| - return NULL;
|
| +CFX_DIBitmap* _FX_WindowsDIB_LoadFromBuf(BITMAPINFO* pbmi,
|
| + LPVOID pData,
|
| + FX_BOOL bAlpha) {
|
| + int width = pbmi->bmiHeader.biWidth;
|
| + int height = pbmi->bmiHeader.biHeight;
|
| + BOOL bBottomUp = TRUE;
|
| + if (height < 0) {
|
| + height = -height;
|
| + bBottomUp = FALSE;
|
| + }
|
| + int pitch = (width * pbmi->bmiHeader.biBitCount + 31) / 32 * 4;
|
| + CFX_DIBitmap* pBitmap = new CFX_DIBitmap;
|
| + FXDIB_Format format = bAlpha
|
| + ? (FXDIB_Format)(pbmi->bmiHeader.biBitCount + 0x200)
|
| + : (FXDIB_Format)pbmi->bmiHeader.biBitCount;
|
| + FX_BOOL ret = pBitmap->Create(width, height, format);
|
| + if (!ret) {
|
| + delete pBitmap;
|
| + return NULL;
|
| + }
|
| + FXSYS_memcpy(pBitmap->GetBuffer(), pData, pitch * height);
|
| + if (bBottomUp) {
|
| + uint8_t* temp_buf = FX_Alloc(uint8_t, pitch);
|
| + int top = 0, bottom = height - 1;
|
| + while (top < bottom) {
|
| + FXSYS_memcpy(temp_buf, pBitmap->GetBuffer() + top * pitch, pitch);
|
| + FXSYS_memcpy(pBitmap->GetBuffer() + top * pitch,
|
| + pBitmap->GetBuffer() + bottom * pitch, pitch);
|
| + FXSYS_memcpy(pBitmap->GetBuffer() + bottom * pitch, temp_buf, pitch);
|
| + top++;
|
| + bottom--;
|
| }
|
| - FXSYS_memcpy(pBitmap->GetBuffer(), pData, pitch * height);
|
| - if (bBottomUp) {
|
| - uint8_t* temp_buf = FX_Alloc(uint8_t, pitch);
|
| - int top = 0, bottom = height - 1;
|
| - while (top < bottom) {
|
| - FXSYS_memcpy(temp_buf, pBitmap->GetBuffer() + top * pitch, pitch);
|
| - FXSYS_memcpy(pBitmap->GetBuffer() + top * pitch, pBitmap->GetBuffer() + bottom * pitch, pitch);
|
| - FXSYS_memcpy(pBitmap->GetBuffer() + bottom * pitch, temp_buf, pitch);
|
| - top ++;
|
| - bottom --;
|
| - }
|
| - FX_Free(temp_buf);
|
| - temp_buf = NULL;
|
| + FX_Free(temp_buf);
|
| + temp_buf = NULL;
|
| + }
|
| + if (pbmi->bmiHeader.biBitCount == 1) {
|
| + for (int i = 0; i < 2; i++) {
|
| + pBitmap->SetPaletteEntry(i, ((FX_DWORD*)pbmi->bmiColors)[i] | 0xff000000);
|
| }
|
| - if (pbmi->bmiHeader.biBitCount == 1) {
|
| - for (int i = 0; i < 2; i ++) {
|
| - pBitmap->SetPaletteEntry(i, ((FX_DWORD*)pbmi->bmiColors)[i] | 0xff000000);
|
| - }
|
| - } else if (pbmi->bmiHeader.biBitCount == 8) {
|
| - for (int i = 0; i < 256; i ++) {
|
| - pBitmap->SetPaletteEntry(i, ((FX_DWORD*)pbmi->bmiColors)[i] | 0xff000000);
|
| - }
|
| + } else if (pbmi->bmiHeader.biBitCount == 8) {
|
| + for (int i = 0; i < 256; i++) {
|
| + pBitmap->SetPaletteEntry(i, ((FX_DWORD*)pbmi->bmiColors)[i] | 0xff000000);
|
| }
|
| - return pBitmap;
|
| + }
|
| + return pBitmap;
|
| }
|
| -CFX_DIBitmap* CFX_WindowsDIB::LoadFromBuf(BITMAPINFO* pbmi, LPVOID pData)
|
| -{
|
| - return _FX_WindowsDIB_LoadFromBuf(pbmi, pData, FALSE);
|
| +CFX_DIBitmap* CFX_WindowsDIB::LoadFromBuf(BITMAPINFO* pbmi, LPVOID pData) {
|
| + return _FX_WindowsDIB_LoadFromBuf(pbmi, pData, FALSE);
|
| }
|
| -HBITMAP CFX_WindowsDIB::GetDDBitmap(const CFX_DIBitmap* pBitmap, HDC hDC)
|
| -{
|
| - CFX_ByteString info = GetBitmapInfo(pBitmap);
|
| - HBITMAP hBitmap = NULL;
|
| - hBitmap = CreateDIBitmap(hDC, (BITMAPINFOHEADER*)info.c_str(), CBM_INIT,
|
| - pBitmap->GetBuffer(), (BITMAPINFO*)info.c_str(), DIB_RGB_COLORS);
|
| - return hBitmap;
|
| +HBITMAP CFX_WindowsDIB::GetDDBitmap(const CFX_DIBitmap* pBitmap, HDC hDC) {
|
| + CFX_ByteString info = GetBitmapInfo(pBitmap);
|
| + HBITMAP hBitmap = NULL;
|
| + hBitmap = CreateDIBitmap(hDC, (BITMAPINFOHEADER*)info.c_str(), CBM_INIT,
|
| + pBitmap->GetBuffer(), (BITMAPINFO*)info.c_str(),
|
| + DIB_RGB_COLORS);
|
| + return hBitmap;
|
| }
|
| -void GetBitmapSize(HBITMAP hBitmap, int& w, int& h)
|
| -{
|
| - BITMAP bmp;
|
| - GetObject(hBitmap, sizeof bmp, &bmp);
|
| - w = bmp.bmWidth;
|
| - h = bmp.bmHeight;
|
| +void GetBitmapSize(HBITMAP hBitmap, int& w, int& h) {
|
| + BITMAP bmp;
|
| + GetObject(hBitmap, sizeof bmp, &bmp);
|
| + w = bmp.bmWidth;
|
| + h = bmp.bmHeight;
|
| }
|
| -CFX_DIBitmap* CFX_WindowsDIB::LoadFromFile(const FX_WCHAR* filename)
|
| -{
|
| - CWin32Platform* pPlatform = (CWin32Platform*)CFX_GEModule::Get()->GetPlatformData();
|
| - if (pPlatform->m_GdiplusExt.IsAvailable()) {
|
| - WINDIB_Open_Args_ args;
|
| - args.flags = WINDIB_OPEN_PATHNAME;
|
| - args.path_name = filename;
|
| - return pPlatform->m_GdiplusExt.LoadDIBitmap(args);
|
| - }
|
| - HBITMAP hBitmap = (HBITMAP)LoadImageW(NULL, (wchar_t*)filename, IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE);
|
| - if (hBitmap == NULL) {
|
| - return NULL;
|
| - }
|
| - HDC hDC = CreateCompatibleDC(NULL);
|
| - int width, height;
|
| - GetBitmapSize(hBitmap, width, height);
|
| - CFX_DIBitmap* pDIBitmap = new CFX_DIBitmap;
|
| - if (!pDIBitmap->Create(width, height, FXDIB_Rgb)) {
|
| - delete pDIBitmap;
|
| - DeleteDC(hDC);
|
| - return NULL;
|
| - }
|
| - CFX_ByteString info = GetBitmapInfo(pDIBitmap);
|
| - int ret = GetDIBits(hDC, hBitmap, 0, height, pDIBitmap->GetBuffer(), (BITMAPINFO*)info.c_str(), DIB_RGB_COLORS);
|
| - if (!ret) {
|
| - delete pDIBitmap;
|
| - pDIBitmap = NULL;
|
| - }
|
| +CFX_DIBitmap* CFX_WindowsDIB::LoadFromFile(const FX_WCHAR* filename) {
|
| + CWin32Platform* pPlatform =
|
| + (CWin32Platform*)CFX_GEModule::Get()->GetPlatformData();
|
| + if (pPlatform->m_GdiplusExt.IsAvailable()) {
|
| + WINDIB_Open_Args_ args;
|
| + args.flags = WINDIB_OPEN_PATHNAME;
|
| + args.path_name = filename;
|
| + return pPlatform->m_GdiplusExt.LoadDIBitmap(args);
|
| + }
|
| + HBITMAP hBitmap = (HBITMAP)LoadImageW(NULL, (wchar_t*)filename, IMAGE_BITMAP,
|
| + 0, 0, LR_LOADFROMFILE);
|
| + if (hBitmap == NULL) {
|
| + return NULL;
|
| + }
|
| + HDC hDC = CreateCompatibleDC(NULL);
|
| + int width, height;
|
| + GetBitmapSize(hBitmap, width, height);
|
| + CFX_DIBitmap* pDIBitmap = new CFX_DIBitmap;
|
| + if (!pDIBitmap->Create(width, height, FXDIB_Rgb)) {
|
| + delete pDIBitmap;
|
| DeleteDC(hDC);
|
| - return pDIBitmap;
|
| + return NULL;
|
| + }
|
| + CFX_ByteString info = GetBitmapInfo(pDIBitmap);
|
| + int ret = GetDIBits(hDC, hBitmap, 0, height, pDIBitmap->GetBuffer(),
|
| + (BITMAPINFO*)info.c_str(), DIB_RGB_COLORS);
|
| + if (!ret) {
|
| + delete pDIBitmap;
|
| + pDIBitmap = NULL;
|
| + }
|
| + DeleteDC(hDC);
|
| + return pDIBitmap;
|
| }
|
| -CFX_DIBitmap* CFX_WindowsDIB::LoadDIBitmap(WINDIB_Open_Args_ args)
|
| -{
|
| - CWin32Platform* pPlatform = (CWin32Platform*)CFX_GEModule::Get()->GetPlatformData();
|
| - if (pPlatform->m_GdiplusExt.IsAvailable()) {
|
| - return pPlatform->m_GdiplusExt.LoadDIBitmap(args);
|
| - }
|
| - if (args.flags == WINDIB_OPEN_MEMORY) {
|
| - return NULL;
|
| - }
|
| - HBITMAP hBitmap = (HBITMAP)LoadImageW(NULL, (wchar_t*)args.path_name, IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE);
|
| - if (hBitmap == NULL) {
|
| - return NULL;
|
| - }
|
| - HDC hDC = CreateCompatibleDC(NULL);
|
| - int width, height;
|
| - GetBitmapSize(hBitmap, width, height);
|
| - CFX_DIBitmap* pDIBitmap = new CFX_DIBitmap;
|
| - if (!pDIBitmap->Create(width, height, FXDIB_Rgb)) {
|
| - delete pDIBitmap;
|
| - DeleteDC(hDC);
|
| - return NULL;
|
| - }
|
| - CFX_ByteString info = GetBitmapInfo(pDIBitmap);
|
| - int ret = GetDIBits(hDC, hBitmap, 0, height, pDIBitmap->GetBuffer(), (BITMAPINFO*)info.c_str(), DIB_RGB_COLORS);
|
| - if (!ret) {
|
| - delete pDIBitmap;
|
| - pDIBitmap = NULL;
|
| - }
|
| +CFX_DIBitmap* CFX_WindowsDIB::LoadDIBitmap(WINDIB_Open_Args_ args) {
|
| + CWin32Platform* pPlatform =
|
| + (CWin32Platform*)CFX_GEModule::Get()->GetPlatformData();
|
| + if (pPlatform->m_GdiplusExt.IsAvailable()) {
|
| + return pPlatform->m_GdiplusExt.LoadDIBitmap(args);
|
| + }
|
| + if (args.flags == WINDIB_OPEN_MEMORY) {
|
| + return NULL;
|
| + }
|
| + HBITMAP hBitmap = (HBITMAP)LoadImageW(NULL, (wchar_t*)args.path_name,
|
| + IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE);
|
| + if (hBitmap == NULL) {
|
| + return NULL;
|
| + }
|
| + HDC hDC = CreateCompatibleDC(NULL);
|
| + int width, height;
|
| + GetBitmapSize(hBitmap, width, height);
|
| + CFX_DIBitmap* pDIBitmap = new CFX_DIBitmap;
|
| + if (!pDIBitmap->Create(width, height, FXDIB_Rgb)) {
|
| + delete pDIBitmap;
|
| DeleteDC(hDC);
|
| - return pDIBitmap;
|
| + return NULL;
|
| + }
|
| + CFX_ByteString info = GetBitmapInfo(pDIBitmap);
|
| + int ret = GetDIBits(hDC, hBitmap, 0, height, pDIBitmap->GetBuffer(),
|
| + (BITMAPINFO*)info.c_str(), DIB_RGB_COLORS);
|
| + if (!ret) {
|
| + delete pDIBitmap;
|
| + pDIBitmap = NULL;
|
| + }
|
| + DeleteDC(hDC);
|
| + return pDIBitmap;
|
| }
|
| -CFX_DIBitmap* CFX_WindowsDIB::LoadFromDDB(HDC hDC, HBITMAP hBitmap, FX_DWORD* pPalette, FX_DWORD palsize)
|
| -{
|
| - FX_BOOL bCreatedDC = hDC == NULL;
|
| - if (hDC == NULL) {
|
| - hDC = CreateCompatibleDC(NULL);
|
| +CFX_DIBitmap* CFX_WindowsDIB::LoadFromDDB(HDC hDC,
|
| + HBITMAP hBitmap,
|
| + FX_DWORD* pPalette,
|
| + FX_DWORD palsize) {
|
| + FX_BOOL bCreatedDC = hDC == NULL;
|
| + if (hDC == NULL) {
|
| + hDC = CreateCompatibleDC(NULL);
|
| + }
|
| + BITMAPINFOHEADER bmih;
|
| + FXSYS_memset(&bmih, 0, sizeof bmih);
|
| + bmih.biSize = sizeof bmih;
|
| + GetDIBits(hDC, hBitmap, 0, 0, NULL, (BITMAPINFO*)&bmih, DIB_RGB_COLORS);
|
| + int width = bmih.biWidth;
|
| + int height = abs(bmih.biHeight);
|
| + bmih.biHeight = -height;
|
| + bmih.biCompression = BI_RGB;
|
| + CFX_DIBitmap* pDIBitmap = new CFX_DIBitmap;
|
| + int ret = 0;
|
| + if (bmih.biBitCount == 1 || bmih.biBitCount == 8) {
|
| + int size = sizeof(BITMAPINFOHEADER) + 8;
|
| + if (bmih.biBitCount == 8) {
|
| + size += sizeof(FX_DWORD) * 254;
|
| }
|
| - BITMAPINFOHEADER bmih;
|
| - FXSYS_memset(&bmih, 0, sizeof bmih);
|
| - bmih.biSize = sizeof bmih;
|
| - GetDIBits(hDC, hBitmap, 0, 0, NULL, (BITMAPINFO*)&bmih, DIB_RGB_COLORS);
|
| - int width = bmih.biWidth;
|
| - int height = abs(bmih.biHeight);
|
| - bmih.biHeight = -height;
|
| - bmih.biCompression = BI_RGB;
|
| - CFX_DIBitmap* pDIBitmap = new CFX_DIBitmap;
|
| - int ret = 0;
|
| - if (bmih.biBitCount == 1 || bmih.biBitCount == 8) {
|
| - int size = sizeof (BITMAPINFOHEADER) + 8;
|
| - if (bmih.biBitCount == 8) {
|
| - size += sizeof (FX_DWORD) * 254;
|
| - }
|
| - BITMAPINFO* pbmih = (BITMAPINFO*)FX_Alloc(uint8_t, size);
|
| - pbmih->bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
|
| - pbmih->bmiHeader.biBitCount = bmih.biBitCount;
|
| - pbmih->bmiHeader.biCompression = BI_RGB;
|
| - pbmih->bmiHeader.biHeight = -height;
|
| - pbmih->bmiHeader.biPlanes = 1;
|
| - pbmih->bmiHeader.biWidth = bmih.biWidth;
|
| - if (!pDIBitmap->Create(bmih.biWidth, height, bmih.biBitCount == 1 ? FXDIB_1bppRgb : FXDIB_8bppRgb)) {
|
| - delete pDIBitmap;
|
| - FX_Free(pbmih);
|
| - if (bCreatedDC) {
|
| - DeleteDC(hDC);
|
| - }
|
| - return NULL;
|
| - }
|
| - ret = GetDIBits(hDC, hBitmap, 0, height, pDIBitmap->GetBuffer(), (BITMAPINFO*)pbmih, DIB_RGB_COLORS);
|
| - FX_Free(pbmih);
|
| - pbmih = NULL;
|
| - pDIBitmap->CopyPalette(pPalette, palsize);
|
| - } else {
|
| - if (bmih.biBitCount <= 24) {
|
| - bmih.biBitCount = 24;
|
| - } else {
|
| - bmih.biBitCount = 32;
|
| - }
|
| - if (!pDIBitmap->Create(bmih.biWidth, height, bmih.biBitCount == 24 ? FXDIB_Rgb : FXDIB_Rgb32)) {
|
| - delete pDIBitmap;
|
| - if (bCreatedDC) {
|
| - DeleteDC(hDC);
|
| - }
|
| - return NULL;
|
| - }
|
| - ret = GetDIBits(hDC, hBitmap, 0, height, pDIBitmap->GetBuffer(), (BITMAPINFO*)&bmih, DIB_RGB_COLORS);
|
| - if (ret != 0 && bmih.biBitCount == 32) {
|
| - int pitch = pDIBitmap->GetPitch();
|
| - for (int row = 0; row < height; row ++) {
|
| - uint8_t* dest_scan = (uint8_t*)(pDIBitmap->GetBuffer() + row * pitch);
|
| - for (int col = 0; col < width; col++) {
|
| - dest_scan[3] = 255;
|
| - dest_scan += 4;
|
| - }
|
| - }
|
| - }
|
| + BITMAPINFO* pbmih = (BITMAPINFO*)FX_Alloc(uint8_t, size);
|
| + pbmih->bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
|
| + pbmih->bmiHeader.biBitCount = bmih.biBitCount;
|
| + pbmih->bmiHeader.biCompression = BI_RGB;
|
| + pbmih->bmiHeader.biHeight = -height;
|
| + pbmih->bmiHeader.biPlanes = 1;
|
| + pbmih->bmiHeader.biWidth = bmih.biWidth;
|
| + if (!pDIBitmap->Create(bmih.biWidth, height, bmih.biBitCount == 1
|
| + ? FXDIB_1bppRgb
|
| + : FXDIB_8bppRgb)) {
|
| + delete pDIBitmap;
|
| + FX_Free(pbmih);
|
| + if (bCreatedDC) {
|
| + DeleteDC(hDC);
|
| + }
|
| + return NULL;
|
| }
|
| - if (ret == 0) {
|
| - delete pDIBitmap;
|
| - pDIBitmap = NULL;
|
| + ret = GetDIBits(hDC, hBitmap, 0, height, pDIBitmap->GetBuffer(),
|
| + (BITMAPINFO*)pbmih, DIB_RGB_COLORS);
|
| + FX_Free(pbmih);
|
| + pbmih = NULL;
|
| + pDIBitmap->CopyPalette(pPalette, palsize);
|
| + } else {
|
| + if (bmih.biBitCount <= 24) {
|
| + bmih.biBitCount = 24;
|
| + } else {
|
| + bmih.biBitCount = 32;
|
| }
|
| - if (bCreatedDC) {
|
| + if (!pDIBitmap->Create(bmih.biWidth, height,
|
| + bmih.biBitCount == 24 ? FXDIB_Rgb : FXDIB_Rgb32)) {
|
| + delete pDIBitmap;
|
| + if (bCreatedDC) {
|
| DeleteDC(hDC);
|
| + }
|
| + return NULL;
|
| }
|
| - return pDIBitmap;
|
| + ret = GetDIBits(hDC, hBitmap, 0, height, pDIBitmap->GetBuffer(),
|
| + (BITMAPINFO*)&bmih, DIB_RGB_COLORS);
|
| + if (ret != 0 && bmih.biBitCount == 32) {
|
| + int pitch = pDIBitmap->GetPitch();
|
| + for (int row = 0; row < height; row++) {
|
| + uint8_t* dest_scan = (uint8_t*)(pDIBitmap->GetBuffer() + row * pitch);
|
| + for (int col = 0; col < width; col++) {
|
| + dest_scan[3] = 255;
|
| + dest_scan += 4;
|
| + }
|
| + }
|
| + }
|
| + }
|
| + if (ret == 0) {
|
| + delete pDIBitmap;
|
| + pDIBitmap = NULL;
|
| + }
|
| + if (bCreatedDC) {
|
| + DeleteDC(hDC);
|
| + }
|
| + return pDIBitmap;
|
| }
|
| -CFX_WindowsDIB::CFX_WindowsDIB(HDC hDC, int width, int height)
|
| -{
|
| - Create(width, height, FXDIB_Rgb, (uint8_t*)1);
|
| - BITMAPINFOHEADER bmih;
|
| - FXSYS_memset(&bmih, 0, sizeof bmih);
|
| - bmih.biSize = sizeof bmih;
|
| - bmih.biBitCount = 24;
|
| - bmih.biHeight = -height;
|
| - bmih.biPlanes = 1;
|
| - bmih.biWidth = width;
|
| - m_hBitmap = CreateDIBSection(hDC, (BITMAPINFO*)&bmih, DIB_RGB_COLORS, (LPVOID*)&m_pBuffer, NULL, 0);
|
| - m_hMemDC = CreateCompatibleDC(hDC);
|
| - m_hOldBitmap = (HBITMAP)SelectObject(m_hMemDC, m_hBitmap);
|
| +CFX_WindowsDIB::CFX_WindowsDIB(HDC hDC, int width, int height) {
|
| + Create(width, height, FXDIB_Rgb, (uint8_t*)1);
|
| + BITMAPINFOHEADER bmih;
|
| + FXSYS_memset(&bmih, 0, sizeof bmih);
|
| + bmih.biSize = sizeof bmih;
|
| + bmih.biBitCount = 24;
|
| + bmih.biHeight = -height;
|
| + bmih.biPlanes = 1;
|
| + bmih.biWidth = width;
|
| + m_hBitmap = CreateDIBSection(hDC, (BITMAPINFO*)&bmih, DIB_RGB_COLORS,
|
| + (LPVOID*)&m_pBuffer, NULL, 0);
|
| + m_hMemDC = CreateCompatibleDC(hDC);
|
| + m_hOldBitmap = (HBITMAP)SelectObject(m_hMemDC, m_hBitmap);
|
| }
|
| -CFX_WindowsDIB::~CFX_WindowsDIB()
|
| -{
|
| - SelectObject(m_hMemDC, m_hOldBitmap);
|
| - DeleteDC(m_hMemDC);
|
| - DeleteObject(m_hBitmap);
|
| +CFX_WindowsDIB::~CFX_WindowsDIB() {
|
| + SelectObject(m_hMemDC, m_hOldBitmap);
|
| + DeleteDC(m_hMemDC);
|
| + DeleteObject(m_hBitmap);
|
| }
|
| -void CFX_WindowsDIB::LoadFromDevice(HDC hDC, int left, int top)
|
| -{
|
| - ::BitBlt(m_hMemDC, 0, 0, m_Width, m_Height, hDC, left, top, SRCCOPY);
|
| +void CFX_WindowsDIB::LoadFromDevice(HDC hDC, int left, int top) {
|
| + ::BitBlt(m_hMemDC, 0, 0, m_Width, m_Height, hDC, left, top, SRCCOPY);
|
| }
|
| -void CFX_WindowsDIB::SetToDevice(HDC hDC, int left, int top)
|
| -{
|
| - ::BitBlt(hDC, left, top, m_Width, m_Height, m_hMemDC, 0, 0, SRCCOPY);
|
| +void CFX_WindowsDIB::SetToDevice(HDC hDC, int left, int top) {
|
| + ::BitBlt(hDC, left, top, m_Width, m_Height, m_hMemDC, 0, 0, SRCCOPY);
|
| }
|
| #endif
|
|
|