annotate foosdk/sdk/libPPUI/gdiplus_helpers.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
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
1
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1 #include "stdafx.h"
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2 #include "gdiplus_helpers.h"
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4 static bool _Once() {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
5 ULONG_PTR token = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
6 Gdiplus::GdiplusStartupInput input;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
7 Gdiplus::GdiplusStartupOutput output;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
8 GdiplusErrorHandler() << Gdiplus::GdiplusStartup(&token, &input, &output);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
9 return true;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
10 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
11
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
12 void GdiplusScope::Once() {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
13 static bool done = _Once();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
14 (void)done; // suppress warning
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
15 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
16
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
17 void GdiplusErrorHandler::Handle(Gdiplus::Status p_code) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
18 if (p_code != Gdiplus::Ok) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
19 switch (p_code) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
20 case Gdiplus::InvalidParameter:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
21 throw pfc::exception_invalid_params();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
22 default:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
23 throw std::runtime_error(pfc::format("Gdiplus error (", (unsigned)p_code, ")"));
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
24 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
25
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
26 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
27 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
28
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
29 HBITMAP GdiplusLoadBitmap(UINT id, const TCHAR* resType, CSize size) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
30 using namespace Gdiplus;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
31 try {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
32 auto stream = WinLoadResourceAsStream(GetThisModuleHandle(), MAKEINTRESOURCE(id), resType);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
33
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
34 GdiplusErrorHandler EH;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
35 Image source ( stream );
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
36 EH << source.GetLastStatus();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
37
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
38 Bitmap resized (size.cx, size.cy, PixelFormat32bppARGB);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
39 EH << resized.GetLastStatus();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
40
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
41 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
42 Graphics target(&resized);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
43 EH << target.GetLastStatus();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
44 EH << target.SetInterpolationMode(InterpolationModeHighQuality);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
45 EH << target.Clear(Color(0, 0, 0, 0));
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
46 EH << target.DrawImage(&source, Rect(0, 0, size.cx, size.cy));
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
47 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
48
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
49 HBITMAP bmp = NULL;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
50 EH << resized.GetHBITMAP(Gdiplus::Color::White, &bmp);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
51 return bmp;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
52 } catch (...) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
53 PFC_ASSERT(!"Should not get here");
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
54 return NULL;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
55 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
56 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
57
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
58 std::unique_ptr<Gdiplus::Image> GdiplusImageFromMem(const void* ptr, size_t bytes) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
59 using namespace Gdiplus;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
60 GdiplusErrorHandler EH;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
61
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
62 CComPtr<IStream> stream;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
63 stream.p = SHCreateMemStream((const BYTE*)ptr, pfc::downcast_guarded<UINT>(bytes));
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
64 if (!stream) throw std::bad_alloc();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
65 std::unique_ptr<Image> source ( new Image(stream.p) );
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
66 EH << source->GetLastStatus();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
67 return source;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
68 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
69
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
70 std::unique_ptr< Gdiplus::Bitmap > GdiplusResizeImage(Gdiplus::Image* source, CSize size, Gdiplus::PixelFormat pf) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
71 PFC_ASSERT(size.cx > 0 && size.cy > 0);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
72 using namespace Gdiplus;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
73 GdiplusErrorHandler EH;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
74 std::unique_ptr<Bitmap> resized ( new Bitmap(size.cx, size.cy, pf) );
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
75 EH << resized->GetLastStatus();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
76 Graphics target (resized.get() );
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
77 EH << target.GetLastStatus();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
78 EH << target.SetInterpolationMode(InterpolationModeHighQuality);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
79 EH << target.Clear(Color(0, 0, 0, 0));
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
80 EH << target.DrawImage(source, Rect(0, 0, size.cx, size.cy));
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
81 return resized;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
82 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
83
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
84 HICON GdiplusLoadIconFromMem(const void* ptr, size_t bytes, CSize size) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
85 using namespace Gdiplus;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
86 try {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
87
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
88 GdiplusErrorHandler EH;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
89 auto source = GdiplusImageFromMem(ptr, bytes);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
90 auto resized = GdiplusResizeImage(source.get(), size);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
91 HICON icon = NULL;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
92 EH << resized->GetHICON(&icon);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
93 return icon;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
94 } catch (...) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
95 PFC_ASSERT(!"Should not get here");
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
96 return NULL;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
97 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
98 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
99
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
100 HICON GdiplusLoadIcon(UINT id, const TCHAR* resType, CSize size) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
101 GdiplusIconArg_t arg = { size };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
102 return GdiplusLoadIconEx(id, resType, arg);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
103 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
104
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
105 HICON GdiplusLoadIconEx(UINT id, const TCHAR* resType, GdiplusIconArg_t const& arg) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
106 using namespace Gdiplus;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
107 try {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
108 auto stream = WinLoadResourceAsStream(GetThisModuleHandle(), MAKEINTRESOURCE(id), resType);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
109
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
110 GdiplusErrorHandler EH;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
111
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
112 Bitmap resized(arg.size.cx, arg.size.cy, PixelFormat32bppARGB);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
113 EH << resized.GetLastStatus();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
114
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
115 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
116 Image source(stream);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
117 EH << source.GetLastStatus();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
118
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
119 Graphics target(&resized);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
120 EH << target.GetLastStatus();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
121 EH << target.SetInterpolationMode(InterpolationModeHighQuality);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
122 EH << target.Clear(Color(0, 0, 0, 0));
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
123 EH << target.DrawImage(&source, Rect(0, 0, arg.size.cx, arg.size.cy));
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
124 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
125
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
126
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
127 if (arg.transform) arg.transform(&resized);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
128
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
129 HICON icon = NULL;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
130 EH << resized.GetHICON(&icon);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
131 return icon;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
132 } catch (...) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
133 PFC_ASSERT(!"Should not get here");
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
134 return NULL;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
135 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
136 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
137
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
138 HICON GdiplusLoadPNGIcon(UINT id, CSize size) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
139 return GdiplusLoadIcon(id, _T("PNG"), size);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
140 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
141
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
142 HICON LoadPNGIcon(UINT id, CSize size) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
143 GdiplusScope scope;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
144 return GdiplusLoadPNGIcon(id, size);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
145 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
146
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
147 void GdiplusLoadButtonPNG(CIcon& icon, HWND btn_, UINT image, GdiplusBitmapTransform_t transform) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
148 CButton btn(btn_);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
149 if (icon == NULL) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
150 CRect client; WIN32_OP_D(btn.GetClientRect(client));
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
151 CSize size = client.Size();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
152 int v = MulDiv(pfc::min_t<int>(size.cx, size.cy), 3, 4);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
153 if (v < 8) v = 8;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
154
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
155 GdiplusIconArg_t arg;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
156 arg.size = CSize(v, v);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
157 arg.transform = transform;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
158 icon = GdiplusLoadIconEx(image, L"PNG", arg);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
159 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
160 btn.SetIcon(icon);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
161 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
162
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
163 std::unique_ptr<Gdiplus::Bitmap> GdiplusLoadResource(UINT id, const TCHAR* resType) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
164 using namespace Gdiplus;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
165 GdiplusErrorHandler EH;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
166
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
167 auto stream = WinLoadResourceAsStream(GetThisModuleHandle(), MAKEINTRESOURCE(id), resType);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
168
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
169 std::unique_ptr<Bitmap> img ( new Bitmap(stream) );
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
170 EH << img->GetLastStatus();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
171 return img;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
172 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
173
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
174 std::unique_ptr<Gdiplus::Bitmap> GdiplusLoadResourceAsSize(UINT id, const TCHAR* resType, CSize size) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
175 auto source = GdiplusLoadResource(id, resType);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
176 return GdiplusResizeImage(source.get(), size);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
177 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
178
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
179 void GdiplusDimImage(Gdiplus::Bitmap* bmp) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
180 using namespace Gdiplus;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
181 GdiplusErrorHandler EH;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
182 Gdiplus::Rect r(0, 0, bmp->GetWidth(), bmp->GetHeight());
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
183 BitmapData data = {};
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
184 EH << bmp->LockBits(&r, ImageLockModeRead | ImageLockModeWrite, PixelFormat32bppARGB, &data);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
185
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
186 BYTE* scan = (BYTE*)data.Scan0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
187 for (UINT y = 0; y < data.Height; ++y) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
188 BYTE* px = scan;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
189 for (UINT x = 0; x < data.Width; ++x) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
190 //px[0] = _dimPixel(px[0]);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
191 //px[1] = _dimPixel(px[1]);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
192 //px[2] = _dimPixel(px[2]);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
193 px[3] /= 3;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
194 px += 4;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
195 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
196 scan += data.Stride;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
197 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
198
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
199 EH << bmp->UnlockBits(&data);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
200 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
201
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
202 void GdiplusInvertImage(Gdiplus::Bitmap* bmp) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
203 using namespace Gdiplus;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
204 GdiplusErrorHandler EH;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
205 Gdiplus::Rect r(0, 0, bmp->GetWidth(), bmp->GetHeight());
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
206 BitmapData data = {};
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
207 EH << bmp->LockBits(&r, ImageLockModeRead | ImageLockModeWrite, PixelFormat32bppARGB, &data);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
208
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
209 BYTE* scan = (BYTE*)data.Scan0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
210 for (UINT y = 0; y < data.Height; ++y) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
211 BYTE* px = scan;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
212 for (UINT x = 0; x < data.Width; ++x) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
213 unsigned v = (unsigned)px[0] + (unsigned)px[1] + (unsigned)px[2];
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
214 v /= 3;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
215 px[0] = px[1] = px[2] = (BYTE)(255 - v);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
216 px += 4;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
217 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
218 scan += data.Stride;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
219 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
220
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
221 EH << bmp->UnlockBits(&data);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
222 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
223
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
224 #pragma comment(lib, "gdiplus.lib")