Mercurial > foo_out_sdl
diff foosdk/sdk/libPPUI/GDIUtils.cpp @ 1:20d02a178406 default tip
*: check in everything else
yay
| author | Paper <paper@tflc.us> |
|---|---|
| date | Mon, 05 Jan 2026 02:15:46 -0500 |
| parents | |
| children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/foosdk/sdk/libPPUI/GDIUtils.cpp Mon Jan 05 02:15:46 2026 -0500 @@ -0,0 +1,101 @@ +#include "stdafx.h" + +#include "GDIUtils.h" + +HBITMAP CreateDIB24(CSize size) { + struct { + BITMAPINFOHEADER bmi; + } bi = {}; + bi.bmi.biSize = sizeof(bi.bmi); + bi.bmi.biWidth = size.cx; + bi.bmi.biHeight = size.cy; + bi.bmi.biPlanes = 1; + bi.bmi.biBitCount = 24; + bi.bmi.biCompression = BI_RGB; + void* bitsPtr; + return CreateDIBSection(NULL, reinterpret_cast<const BITMAPINFO*>(&bi), DIB_RGB_COLORS, &bitsPtr, 0, 0); +} + +HBITMAP CreateDIB16(CSize size) { + struct { + BITMAPINFOHEADER bmi; + } bi = {}; + bi.bmi.biSize = sizeof(bi.bmi); + bi.bmi.biWidth = size.cx; + bi.bmi.biHeight = size.cy; + bi.bmi.biPlanes = 1; + bi.bmi.biBitCount = 16; + bi.bmi.biCompression = BI_RGB; + void* bitsPtr; + return CreateDIBSection(NULL, reinterpret_cast<const BITMAPINFO*>(&bi), DIB_RGB_COLORS, &bitsPtr, 0, 0); +} + +HBITMAP CreateDIB8(CSize size, const COLORREF palette[256]) { + struct { + BITMAPINFOHEADER bmi; + COLORREF colors[256]; + } bi = { }; + for (int c = 0; c < 256; ++c) bi.colors[c] = palette[c]; + bi.bmi.biSize = sizeof(bi.bmi); + bi.bmi.biWidth = size.cx; + bi.bmi.biHeight = size.cy; + bi.bmi.biPlanes = 1; + bi.bmi.biBitCount = 8; + bi.bmi.biCompression = BI_RGB; + bi.bmi.biClrUsed = 256; + void* bitsPtr; + return CreateDIBSection(NULL, reinterpret_cast<const BITMAPINFO*>(&bi), DIB_RGB_COLORS, &bitsPtr, 0, 0); +} + +void CreateScaledFont(CFont& out, CFontHandle in, double scale) { + LOGFONT lf; + WIN32_OP_D(in.GetLogFont(lf)); + int temp = pfc::rint32(scale * lf.lfHeight); + if (temp == 0) temp = pfc::sgn_t(lf.lfHeight); + lf.lfHeight = temp; + WIN32_OP_D(out.CreateFontIndirect(&lf) != NULL); +} + +void CreateScaledFontEx(CFont& out, CFontHandle in, double scale, int weight) { + LOGFONT lf; + WIN32_OP_D(in.GetLogFont(lf)); + int temp = pfc::rint32(scale * lf.lfHeight); + if (temp == 0) temp = pfc::sgn_t(lf.lfHeight); + lf.lfHeight = temp; + lf.lfWeight = weight; + WIN32_OP_D(out.CreateFontIndirect(&lf) != NULL); +} + +void CreatePreferencesHeaderFont(CFont& out, CWindow source) { + CreateScaledFontEx(out, source.GetFont(), 1.3, FW_BOLD); +} + +void CreatePreferencesHeaderFont2(CFont& out, CWindow source) { + CreateScaledFontEx(out, source.GetFont(), 1.1, FW_BOLD); +} + +CSize GetBitmapSize(HBITMAP bmp) { + PFC_ASSERT(bmp != NULL); + CBitmapHandle h(bmp); + BITMAP bm = {}; + WIN32_OP_D(h.GetBitmap(bm)); + return CSize(bm.bmWidth, bm.bmHeight); +} + +CSize GetIconSize(HICON icon) { + PFC_ASSERT(icon != NULL); + CIconHandle h(icon); + ICONINFO info = {}; + WIN32_OP_D( h.GetIconInfo(&info) ); + CSize ret; + if (info.hbmColor != NULL) ret = GetBitmapSize(info.hbmColor); + else if (info.hbmMask != NULL) ret = GetBitmapSize(info.hbmMask); + else { PFC_ASSERT(!"???"); } + if (info.hbmColor != NULL) DeleteObject(info.hbmColor); + if (info.hbmMask != NULL) DeleteObject(info.hbmMask); + return ret; +} + +HBRUSH MakeTempBrush(HDC dc, COLORREF color) noexcept { + SetDCBrushColor(dc, color); return (HBRUSH)GetStockObject(DC_BRUSH); +}
