OLD | NEW |
1 // Copyright 2014 PDFium Authors. All rights reserved. | 1 // Copyright 2014 PDFium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 // Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com | 5 // Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com |
6 | 6 |
7 #include "core/fxge/include/fx_ge.h" | 7 #include "core/fxge/include/fx_ge.h" |
8 | 8 |
9 #if _FX_OS_ == _FX_WIN32_DESKTOP_ || _FX_OS_ == _FX_WIN64_DESKTOP_ | 9 #if _FX_OS_ == _FX_WIN32_DESKTOP_ || _FX_OS_ == _FX_WIN64_DESKTOP_ |
10 #include <windows.h> | 10 #include <windows.h> |
(...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
62 bBottomUp = FALSE; | 62 bBottomUp = FALSE; |
63 } | 63 } |
64 int pitch = (width * pbmi->bmiHeader.biBitCount + 31) / 32 * 4; | 64 int pitch = (width * pbmi->bmiHeader.biBitCount + 31) / 32 * 4; |
65 CFX_DIBitmap* pBitmap = new CFX_DIBitmap; | 65 CFX_DIBitmap* pBitmap = new CFX_DIBitmap; |
66 FXDIB_Format format = bAlpha | 66 FXDIB_Format format = bAlpha |
67 ? (FXDIB_Format)(pbmi->bmiHeader.biBitCount + 0x200) | 67 ? (FXDIB_Format)(pbmi->bmiHeader.biBitCount + 0x200) |
68 : (FXDIB_Format)pbmi->bmiHeader.biBitCount; | 68 : (FXDIB_Format)pbmi->bmiHeader.biBitCount; |
69 FX_BOOL ret = pBitmap->Create(width, height, format); | 69 FX_BOOL ret = pBitmap->Create(width, height, format); |
70 if (!ret) { | 70 if (!ret) { |
71 delete pBitmap; | 71 delete pBitmap; |
72 return NULL; | 72 return nullptr; |
73 } | 73 } |
74 FXSYS_memcpy(pBitmap->GetBuffer(), pData, pitch * height); | 74 FXSYS_memcpy(pBitmap->GetBuffer(), pData, pitch * height); |
75 if (bBottomUp) { | 75 if (bBottomUp) { |
76 uint8_t* temp_buf = FX_Alloc(uint8_t, pitch); | 76 uint8_t* temp_buf = FX_Alloc(uint8_t, pitch); |
77 int top = 0, bottom = height - 1; | 77 int top = 0, bottom = height - 1; |
78 while (top < bottom) { | 78 while (top < bottom) { |
79 FXSYS_memcpy(temp_buf, pBitmap->GetBuffer() + top * pitch, pitch); | 79 FXSYS_memcpy(temp_buf, pBitmap->GetBuffer() + top * pitch, pitch); |
80 FXSYS_memcpy(pBitmap->GetBuffer() + top * pitch, | 80 FXSYS_memcpy(pBitmap->GetBuffer() + top * pitch, |
81 pBitmap->GetBuffer() + bottom * pitch, pitch); | 81 pBitmap->GetBuffer() + bottom * pitch, pitch); |
82 FXSYS_memcpy(pBitmap->GetBuffer() + bottom * pitch, temp_buf, pitch); | 82 FXSYS_memcpy(pBitmap->GetBuffer() + bottom * pitch, temp_buf, pitch); |
83 top++; | 83 top++; |
84 bottom--; | 84 bottom--; |
85 } | 85 } |
86 FX_Free(temp_buf); | 86 FX_Free(temp_buf); |
87 temp_buf = NULL; | 87 temp_buf = nullptr; |
88 } | 88 } |
89 if (pbmi->bmiHeader.biBitCount == 1) { | 89 if (pbmi->bmiHeader.biBitCount == 1) { |
90 for (int i = 0; i < 2; i++) { | 90 for (int i = 0; i < 2; i++) { |
91 pBitmap->SetPaletteEntry(i, ((uint32_t*)pbmi->bmiColors)[i] | 0xff000000); | 91 pBitmap->SetPaletteEntry(i, ((uint32_t*)pbmi->bmiColors)[i] | 0xff000000); |
92 } | 92 } |
93 } else if (pbmi->bmiHeader.biBitCount == 8) { | 93 } else if (pbmi->bmiHeader.biBitCount == 8) { |
94 for (int i = 0; i < 256; i++) { | 94 for (int i = 0; i < 256; i++) { |
95 pBitmap->SetPaletteEntry(i, ((uint32_t*)pbmi->bmiColors)[i] | 0xff000000); | 95 pBitmap->SetPaletteEntry(i, ((uint32_t*)pbmi->bmiColors)[i] | 0xff000000); |
96 } | 96 } |
97 } | 97 } |
98 return pBitmap; | 98 return pBitmap; |
99 } | 99 } |
100 CFX_DIBitmap* CFX_WindowsDIB::LoadFromBuf(BITMAPINFO* pbmi, LPVOID pData) { | 100 CFX_DIBitmap* CFX_WindowsDIB::LoadFromBuf(BITMAPINFO* pbmi, LPVOID pData) { |
101 return _FX_WindowsDIB_LoadFromBuf(pbmi, pData, FALSE); | 101 return _FX_WindowsDIB_LoadFromBuf(pbmi, pData, FALSE); |
102 } | 102 } |
103 HBITMAP CFX_WindowsDIB::GetDDBitmap(const CFX_DIBitmap* pBitmap, HDC hDC) { | 103 HBITMAP CFX_WindowsDIB::GetDDBitmap(const CFX_DIBitmap* pBitmap, HDC hDC) { |
104 CFX_ByteString info = GetBitmapInfo(pBitmap); | 104 CFX_ByteString info = GetBitmapInfo(pBitmap); |
105 HBITMAP hBitmap = NULL; | 105 return CreateDIBitmap(hDC, (BITMAPINFOHEADER*)info.c_str(), CBM_INIT, |
106 hBitmap = CreateDIBitmap(hDC, (BITMAPINFOHEADER*)info.c_str(), CBM_INIT, | 106 pBitmap->GetBuffer(), (BITMAPINFO*)info.c_str(), |
107 pBitmap->GetBuffer(), (BITMAPINFO*)info.c_str(), | 107 DIB_RGB_COLORS); |
108 DIB_RGB_COLORS); | |
109 return hBitmap; | |
110 } | 108 } |
111 void GetBitmapSize(HBITMAP hBitmap, int& w, int& h) { | 109 void GetBitmapSize(HBITMAP hBitmap, int& w, int& h) { |
112 BITMAP bmp; | 110 BITMAP bmp; |
113 GetObject(hBitmap, sizeof bmp, &bmp); | 111 GetObject(hBitmap, sizeof bmp, &bmp); |
114 w = bmp.bmWidth; | 112 w = bmp.bmWidth; |
115 h = bmp.bmHeight; | 113 h = bmp.bmHeight; |
116 } | 114 } |
117 CFX_DIBitmap* CFX_WindowsDIB::LoadFromFile(const FX_WCHAR* filename) { | 115 CFX_DIBitmap* CFX_WindowsDIB::LoadFromFile(const FX_WCHAR* filename) { |
118 CWin32Platform* pPlatform = | 116 CWin32Platform* pPlatform = |
119 (CWin32Platform*)CFX_GEModule::Get()->GetPlatformData(); | 117 (CWin32Platform*)CFX_GEModule::Get()->GetPlatformData(); |
120 if (pPlatform->m_GdiplusExt.IsAvailable()) { | 118 if (pPlatform->m_GdiplusExt.IsAvailable()) { |
121 WINDIB_Open_Args_ args; | 119 WINDIB_Open_Args_ args; |
122 args.flags = WINDIB_OPEN_PATHNAME; | 120 args.flags = WINDIB_OPEN_PATHNAME; |
123 args.path_name = filename; | 121 args.path_name = filename; |
124 return pPlatform->m_GdiplusExt.LoadDIBitmap(args); | 122 return pPlatform->m_GdiplusExt.LoadDIBitmap(args); |
125 } | 123 } |
126 HBITMAP hBitmap = (HBITMAP)LoadImageW(NULL, (wchar_t*)filename, IMAGE_BITMAP, | 124 HBITMAP hBitmap = (HBITMAP)LoadImageW(nullptr, (wchar_t*)filename, |
127 0, 0, LR_LOADFROMFILE); | 125 IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE); |
128 if (!hBitmap) { | 126 if (!hBitmap) { |
129 return NULL; | 127 return nullptr; |
130 } | 128 } |
131 HDC hDC = CreateCompatibleDC(NULL); | 129 HDC hDC = CreateCompatibleDC(nullptr); |
132 int width, height; | 130 int width, height; |
133 GetBitmapSize(hBitmap, width, height); | 131 GetBitmapSize(hBitmap, width, height); |
134 CFX_DIBitmap* pDIBitmap = new CFX_DIBitmap; | 132 CFX_DIBitmap* pDIBitmap = new CFX_DIBitmap; |
135 if (!pDIBitmap->Create(width, height, FXDIB_Rgb)) { | 133 if (!pDIBitmap->Create(width, height, FXDIB_Rgb)) { |
136 delete pDIBitmap; | 134 delete pDIBitmap; |
137 DeleteDC(hDC); | 135 DeleteDC(hDC); |
138 return NULL; | 136 return nullptr; |
139 } | 137 } |
140 CFX_ByteString info = GetBitmapInfo(pDIBitmap); | 138 CFX_ByteString info = GetBitmapInfo(pDIBitmap); |
141 int ret = GetDIBits(hDC, hBitmap, 0, height, pDIBitmap->GetBuffer(), | 139 int ret = GetDIBits(hDC, hBitmap, 0, height, pDIBitmap->GetBuffer(), |
142 (BITMAPINFO*)info.c_str(), DIB_RGB_COLORS); | 140 (BITMAPINFO*)info.c_str(), DIB_RGB_COLORS); |
143 if (!ret) { | 141 if (!ret) { |
144 delete pDIBitmap; | 142 delete pDIBitmap; |
145 pDIBitmap = NULL; | 143 pDIBitmap = nullptr; |
146 } | 144 } |
147 DeleteDC(hDC); | 145 DeleteDC(hDC); |
148 return pDIBitmap; | 146 return pDIBitmap; |
149 } | 147 } |
150 CFX_DIBitmap* CFX_WindowsDIB::LoadDIBitmap(WINDIB_Open_Args_ args) { | 148 CFX_DIBitmap* CFX_WindowsDIB::LoadDIBitmap(WINDIB_Open_Args_ args) { |
151 CWin32Platform* pPlatform = | 149 CWin32Platform* pPlatform = |
152 (CWin32Platform*)CFX_GEModule::Get()->GetPlatformData(); | 150 (CWin32Platform*)CFX_GEModule::Get()->GetPlatformData(); |
153 if (pPlatform->m_GdiplusExt.IsAvailable()) { | 151 if (pPlatform->m_GdiplusExt.IsAvailable()) { |
154 return pPlatform->m_GdiplusExt.LoadDIBitmap(args); | 152 return pPlatform->m_GdiplusExt.LoadDIBitmap(args); |
155 } | 153 } |
156 if (args.flags == WINDIB_OPEN_MEMORY) { | 154 if (args.flags == WINDIB_OPEN_MEMORY) { |
157 return NULL; | 155 return nullptr; |
158 } | 156 } |
159 HBITMAP hBitmap = (HBITMAP)LoadImageW(NULL, (wchar_t*)args.path_name, | 157 HBITMAP hBitmap = (HBITMAP)LoadImageW(nullptr, (wchar_t*)args.path_name, |
160 IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE); | 158 IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE); |
161 if (!hBitmap) { | 159 if (!hBitmap) { |
162 return NULL; | 160 return nullptr; |
163 } | 161 } |
164 HDC hDC = CreateCompatibleDC(NULL); | 162 HDC hDC = CreateCompatibleDC(nullptr); |
165 int width, height; | 163 int width, height; |
166 GetBitmapSize(hBitmap, width, height); | 164 GetBitmapSize(hBitmap, width, height); |
167 CFX_DIBitmap* pDIBitmap = new CFX_DIBitmap; | 165 CFX_DIBitmap* pDIBitmap = new CFX_DIBitmap; |
168 if (!pDIBitmap->Create(width, height, FXDIB_Rgb)) { | 166 if (!pDIBitmap->Create(width, height, FXDIB_Rgb)) { |
169 delete pDIBitmap; | 167 delete pDIBitmap; |
170 DeleteDC(hDC); | 168 DeleteDC(hDC); |
171 return NULL; | 169 return nullptr; |
172 } | 170 } |
173 CFX_ByteString info = GetBitmapInfo(pDIBitmap); | 171 CFX_ByteString info = GetBitmapInfo(pDIBitmap); |
174 int ret = GetDIBits(hDC, hBitmap, 0, height, pDIBitmap->GetBuffer(), | 172 int ret = GetDIBits(hDC, hBitmap, 0, height, pDIBitmap->GetBuffer(), |
175 (BITMAPINFO*)info.c_str(), DIB_RGB_COLORS); | 173 (BITMAPINFO*)info.c_str(), DIB_RGB_COLORS); |
176 if (!ret) { | 174 if (!ret) { |
177 delete pDIBitmap; | 175 delete pDIBitmap; |
178 pDIBitmap = NULL; | 176 pDIBitmap = nullptr; |
179 } | 177 } |
180 DeleteDC(hDC); | 178 DeleteDC(hDC); |
181 return pDIBitmap; | 179 return pDIBitmap; |
182 } | 180 } |
183 CFX_DIBitmap* CFX_WindowsDIB::LoadFromDDB(HDC hDC, | 181 CFX_DIBitmap* CFX_WindowsDIB::LoadFromDDB(HDC hDC, |
184 HBITMAP hBitmap, | 182 HBITMAP hBitmap, |
185 uint32_t* pPalette, | 183 uint32_t* pPalette, |
186 uint32_t palsize) { | 184 uint32_t palsize) { |
187 FX_BOOL bCreatedDC = !hDC; | 185 FX_BOOL bCreatedDC = !hDC; |
188 if (bCreatedDC) { | 186 if (bCreatedDC) { |
189 hDC = CreateCompatibleDC(NULL); | 187 hDC = CreateCompatibleDC(nullptr); |
190 } | 188 } |
191 BITMAPINFOHEADER bmih; | 189 BITMAPINFOHEADER bmih; |
192 FXSYS_memset(&bmih, 0, sizeof bmih); | 190 FXSYS_memset(&bmih, 0, sizeof bmih); |
193 bmih.biSize = sizeof bmih; | 191 bmih.biSize = sizeof bmih; |
194 GetDIBits(hDC, hBitmap, 0, 0, NULL, (BITMAPINFO*)&bmih, DIB_RGB_COLORS); | 192 GetDIBits(hDC, hBitmap, 0, 0, nullptr, (BITMAPINFO*)&bmih, DIB_RGB_COLORS); |
195 int width = bmih.biWidth; | 193 int width = bmih.biWidth; |
196 int height = abs(bmih.biHeight); | 194 int height = abs(bmih.biHeight); |
197 bmih.biHeight = -height; | 195 bmih.biHeight = -height; |
198 bmih.biCompression = BI_RGB; | 196 bmih.biCompression = BI_RGB; |
199 CFX_DIBitmap* pDIBitmap = new CFX_DIBitmap; | 197 CFX_DIBitmap* pDIBitmap = new CFX_DIBitmap; |
200 int ret = 0; | 198 int ret = 0; |
201 if (bmih.biBitCount == 1 || bmih.biBitCount == 8) { | 199 if (bmih.biBitCount == 1 || bmih.biBitCount == 8) { |
202 int size = sizeof(BITMAPINFOHEADER) + 8; | 200 int size = sizeof(BITMAPINFOHEADER) + 8; |
203 if (bmih.biBitCount == 8) { | 201 if (bmih.biBitCount == 8) { |
204 size += sizeof(uint32_t) * 254; | 202 size += sizeof(uint32_t) * 254; |
205 } | 203 } |
206 BITMAPINFO* pbmih = (BITMAPINFO*)FX_Alloc(uint8_t, size); | 204 BITMAPINFO* pbmih = (BITMAPINFO*)FX_Alloc(uint8_t, size); |
207 pbmih->bmiHeader.biSize = sizeof(BITMAPINFOHEADER); | 205 pbmih->bmiHeader.biSize = sizeof(BITMAPINFOHEADER); |
208 pbmih->bmiHeader.biBitCount = bmih.biBitCount; | 206 pbmih->bmiHeader.biBitCount = bmih.biBitCount; |
209 pbmih->bmiHeader.biCompression = BI_RGB; | 207 pbmih->bmiHeader.biCompression = BI_RGB; |
210 pbmih->bmiHeader.biHeight = -height; | 208 pbmih->bmiHeader.biHeight = -height; |
211 pbmih->bmiHeader.biPlanes = 1; | 209 pbmih->bmiHeader.biPlanes = 1; |
212 pbmih->bmiHeader.biWidth = bmih.biWidth; | 210 pbmih->bmiHeader.biWidth = bmih.biWidth; |
213 if (!pDIBitmap->Create(bmih.biWidth, height, bmih.biBitCount == 1 | 211 if (!pDIBitmap->Create(bmih.biWidth, height, bmih.biBitCount == 1 |
214 ? FXDIB_1bppRgb | 212 ? FXDIB_1bppRgb |
215 : FXDIB_8bppRgb)) { | 213 : FXDIB_8bppRgb)) { |
216 delete pDIBitmap; | 214 delete pDIBitmap; |
217 FX_Free(pbmih); | 215 FX_Free(pbmih); |
218 if (bCreatedDC) { | 216 if (bCreatedDC) { |
219 DeleteDC(hDC); | 217 DeleteDC(hDC); |
220 } | 218 } |
221 return NULL; | 219 return nullptr; |
222 } | 220 } |
223 ret = GetDIBits(hDC, hBitmap, 0, height, pDIBitmap->GetBuffer(), | 221 ret = GetDIBits(hDC, hBitmap, 0, height, pDIBitmap->GetBuffer(), |
224 (BITMAPINFO*)pbmih, DIB_RGB_COLORS); | 222 (BITMAPINFO*)pbmih, DIB_RGB_COLORS); |
225 FX_Free(pbmih); | 223 FX_Free(pbmih); |
226 pbmih = NULL; | 224 pbmih = nullptr; |
227 pDIBitmap->CopyPalette(pPalette, palsize); | 225 pDIBitmap->CopyPalette(pPalette, palsize); |
228 } else { | 226 } else { |
229 if (bmih.biBitCount <= 24) { | 227 if (bmih.biBitCount <= 24) { |
230 bmih.biBitCount = 24; | 228 bmih.biBitCount = 24; |
231 } else { | 229 } else { |
232 bmih.biBitCount = 32; | 230 bmih.biBitCount = 32; |
233 } | 231 } |
234 if (!pDIBitmap->Create(bmih.biWidth, height, | 232 if (!pDIBitmap->Create(bmih.biWidth, height, |
235 bmih.biBitCount == 24 ? FXDIB_Rgb : FXDIB_Rgb32)) { | 233 bmih.biBitCount == 24 ? FXDIB_Rgb : FXDIB_Rgb32)) { |
236 delete pDIBitmap; | 234 delete pDIBitmap; |
237 if (bCreatedDC) { | 235 if (bCreatedDC) { |
238 DeleteDC(hDC); | 236 DeleteDC(hDC); |
239 } | 237 } |
240 return NULL; | 238 return nullptr; |
241 } | 239 } |
242 ret = GetDIBits(hDC, hBitmap, 0, height, pDIBitmap->GetBuffer(), | 240 ret = GetDIBits(hDC, hBitmap, 0, height, pDIBitmap->GetBuffer(), |
243 (BITMAPINFO*)&bmih, DIB_RGB_COLORS); | 241 (BITMAPINFO*)&bmih, DIB_RGB_COLORS); |
244 if (ret != 0 && bmih.biBitCount == 32) { | 242 if (ret != 0 && bmih.biBitCount == 32) { |
245 int pitch = pDIBitmap->GetPitch(); | 243 int pitch = pDIBitmap->GetPitch(); |
246 for (int row = 0; row < height; row++) { | 244 for (int row = 0; row < height; row++) { |
247 uint8_t* dest_scan = (uint8_t*)(pDIBitmap->GetBuffer() + row * pitch); | 245 uint8_t* dest_scan = (uint8_t*)(pDIBitmap->GetBuffer() + row * pitch); |
248 for (int col = 0; col < width; col++) { | 246 for (int col = 0; col < width; col++) { |
249 dest_scan[3] = 255; | 247 dest_scan[3] = 255; |
250 dest_scan += 4; | 248 dest_scan += 4; |
251 } | 249 } |
252 } | 250 } |
253 } | 251 } |
254 } | 252 } |
255 if (ret == 0) { | 253 if (ret == 0) { |
256 delete pDIBitmap; | 254 delete pDIBitmap; |
257 pDIBitmap = NULL; | 255 pDIBitmap = nullptr; |
258 } | 256 } |
259 if (bCreatedDC) { | 257 if (bCreatedDC) { |
260 DeleteDC(hDC); | 258 DeleteDC(hDC); |
261 } | 259 } |
262 return pDIBitmap; | 260 return pDIBitmap; |
263 } | 261 } |
264 CFX_WindowsDIB::CFX_WindowsDIB(HDC hDC, int width, int height) { | 262 CFX_WindowsDIB::CFX_WindowsDIB(HDC hDC, int width, int height) { |
265 Create(width, height, FXDIB_Rgb, (uint8_t*)1); | 263 Create(width, height, FXDIB_Rgb, (uint8_t*)1); |
266 BITMAPINFOHEADER bmih; | 264 BITMAPINFOHEADER bmih; |
267 FXSYS_memset(&bmih, 0, sizeof bmih); | 265 FXSYS_memset(&bmih, 0, sizeof bmih); |
268 bmih.biSize = sizeof bmih; | 266 bmih.biSize = sizeof bmih; |
269 bmih.biBitCount = 24; | 267 bmih.biBitCount = 24; |
270 bmih.biHeight = -height; | 268 bmih.biHeight = -height; |
271 bmih.biPlanes = 1; | 269 bmih.biPlanes = 1; |
272 bmih.biWidth = width; | 270 bmih.biWidth = width; |
273 m_hBitmap = CreateDIBSection(hDC, (BITMAPINFO*)&bmih, DIB_RGB_COLORS, | 271 m_hBitmap = CreateDIBSection(hDC, (BITMAPINFO*)&bmih, DIB_RGB_COLORS, |
274 (LPVOID*)&m_pBuffer, NULL, 0); | 272 (LPVOID*)&m_pBuffer, nullptr, 0); |
275 m_hMemDC = CreateCompatibleDC(hDC); | 273 m_hMemDC = CreateCompatibleDC(hDC); |
276 m_hOldBitmap = (HBITMAP)SelectObject(m_hMemDC, m_hBitmap); | 274 m_hOldBitmap = (HBITMAP)SelectObject(m_hMemDC, m_hBitmap); |
277 } | 275 } |
278 CFX_WindowsDIB::~CFX_WindowsDIB() { | 276 CFX_WindowsDIB::~CFX_WindowsDIB() { |
279 SelectObject(m_hMemDC, m_hOldBitmap); | 277 SelectObject(m_hMemDC, m_hOldBitmap); |
280 DeleteDC(m_hMemDC); | 278 DeleteDC(m_hMemDC); |
281 DeleteObject(m_hBitmap); | 279 DeleteObject(m_hBitmap); |
282 } | 280 } |
283 void CFX_WindowsDIB::LoadFromDevice(HDC hDC, int left, int top) { | 281 void CFX_WindowsDIB::LoadFromDevice(HDC hDC, int left, int top) { |
284 ::BitBlt(m_hMemDC, 0, 0, m_Width, m_Height, hDC, left, top, SRCCOPY); | 282 ::BitBlt(m_hMemDC, 0, 0, m_Width, m_Height, hDC, left, top, SRCCOPY); |
285 } | 283 } |
286 void CFX_WindowsDIB::SetToDevice(HDC hDC, int left, int top) { | 284 void CFX_WindowsDIB::SetToDevice(HDC hDC, int left, int top) { |
287 ::BitBlt(hDC, left, top, m_Width, m_Height, m_hMemDC, 0, 0, SRCCOPY); | 285 ::BitBlt(hDC, left, top, m_Width, m_Height, m_hMemDC, 0, 0, SRCCOPY); |
288 } | 286 } |
289 #endif | 287 #endif |
OLD | NEW |