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 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
44 pPalette[0] = pBitmap->GetPalette()[0]; | 44 pPalette[0] = pBitmap->GetPalette()[0]; |
45 pPalette[1] = pBitmap->GetPalette()[1]; | 45 pPalette[1] = pBitmap->GetPalette()[1]; |
46 } else { | 46 } else { |
47 pPalette[0] = 0; | 47 pPalette[0] = 0; |
48 pPalette[1] = 0xffffff; | 48 pPalette[1] = 0xffffff; |
49 } | 49 } |
50 } | 50 } |
51 result.ReleaseBuffer(len); | 51 result.ReleaseBuffer(len); |
52 return result; | 52 return result; |
53 } | 53 } |
| 54 |
54 CFX_DIBitmap* _FX_WindowsDIB_LoadFromBuf(BITMAPINFO* pbmi, | 55 CFX_DIBitmap* _FX_WindowsDIB_LoadFromBuf(BITMAPINFO* pbmi, |
55 LPVOID pData, | 56 LPVOID pData, |
56 FX_BOOL bAlpha) { | 57 FX_BOOL bAlpha) { |
57 int width = pbmi->bmiHeader.biWidth; | 58 int width = pbmi->bmiHeader.biWidth; |
58 int height = pbmi->bmiHeader.biHeight; | 59 int height = pbmi->bmiHeader.biHeight; |
59 BOOL bBottomUp = TRUE; | 60 BOOL bBottomUp = TRUE; |
60 if (height < 0) { | 61 if (height < 0) { |
61 height = -height; | 62 height = -height; |
62 bBottomUp = FALSE; | 63 bBottomUp = FALSE; |
63 } | 64 } |
(...skipping 26 matching lines...) Expand all Loading... |
90 for (int i = 0; i < 2; i++) { | 91 for (int i = 0; i < 2; i++) { |
91 pBitmap->SetPaletteEntry(i, ((uint32_t*)pbmi->bmiColors)[i] | 0xff000000); | 92 pBitmap->SetPaletteEntry(i, ((uint32_t*)pbmi->bmiColors)[i] | 0xff000000); |
92 } | 93 } |
93 } else if (pbmi->bmiHeader.biBitCount == 8) { | 94 } else if (pbmi->bmiHeader.biBitCount == 8) { |
94 for (int i = 0; i < 256; i++) { | 95 for (int i = 0; i < 256; i++) { |
95 pBitmap->SetPaletteEntry(i, ((uint32_t*)pbmi->bmiColors)[i] | 0xff000000); | 96 pBitmap->SetPaletteEntry(i, ((uint32_t*)pbmi->bmiColors)[i] | 0xff000000); |
96 } | 97 } |
97 } | 98 } |
98 return pBitmap; | 99 return pBitmap; |
99 } | 100 } |
| 101 |
100 CFX_DIBitmap* CFX_WindowsDIB::LoadFromBuf(BITMAPINFO* pbmi, LPVOID pData) { | 102 CFX_DIBitmap* CFX_WindowsDIB::LoadFromBuf(BITMAPINFO* pbmi, LPVOID pData) { |
101 return _FX_WindowsDIB_LoadFromBuf(pbmi, pData, FALSE); | 103 return _FX_WindowsDIB_LoadFromBuf(pbmi, pData, FALSE); |
102 } | 104 } |
| 105 |
103 HBITMAP CFX_WindowsDIB::GetDDBitmap(const CFX_DIBitmap* pBitmap, HDC hDC) { | 106 HBITMAP CFX_WindowsDIB::GetDDBitmap(const CFX_DIBitmap* pBitmap, HDC hDC) { |
104 CFX_ByteString info = GetBitmapInfo(pBitmap); | 107 CFX_ByteString info = GetBitmapInfo(pBitmap); |
105 return CreateDIBitmap(hDC, (BITMAPINFOHEADER*)info.c_str(), CBM_INIT, | 108 return CreateDIBitmap(hDC, (BITMAPINFOHEADER*)info.c_str(), CBM_INIT, |
106 pBitmap->GetBuffer(), (BITMAPINFO*)info.c_str(), | 109 pBitmap->GetBuffer(), (BITMAPINFO*)info.c_str(), |
107 DIB_RGB_COLORS); | 110 DIB_RGB_COLORS); |
108 } | 111 } |
| 112 |
109 void GetBitmapSize(HBITMAP hBitmap, int& w, int& h) { | 113 void GetBitmapSize(HBITMAP hBitmap, int& w, int& h) { |
110 BITMAP bmp; | 114 BITMAP bmp; |
111 GetObject(hBitmap, sizeof bmp, &bmp); | 115 GetObject(hBitmap, sizeof bmp, &bmp); |
112 w = bmp.bmWidth; | 116 w = bmp.bmWidth; |
113 h = bmp.bmHeight; | 117 h = bmp.bmHeight; |
114 } | 118 } |
| 119 |
115 CFX_DIBitmap* CFX_WindowsDIB::LoadFromFile(const FX_WCHAR* filename) { | 120 CFX_DIBitmap* CFX_WindowsDIB::LoadFromFile(const FX_WCHAR* filename) { |
116 CWin32Platform* pPlatform = | 121 CWin32Platform* pPlatform = |
117 (CWin32Platform*)CFX_GEModule::Get()->GetPlatformData(); | 122 (CWin32Platform*)CFX_GEModule::Get()->GetPlatformData(); |
118 if (pPlatform->m_GdiplusExt.IsAvailable()) { | 123 if (pPlatform->m_GdiplusExt.IsAvailable()) { |
119 WINDIB_Open_Args_ args; | 124 WINDIB_Open_Args_ args; |
120 args.flags = WINDIB_OPEN_PATHNAME; | 125 args.flags = WINDIB_OPEN_PATHNAME; |
121 args.path_name = filename; | 126 args.path_name = filename; |
122 return pPlatform->m_GdiplusExt.LoadDIBitmap(args); | 127 return pPlatform->m_GdiplusExt.LoadDIBitmap(args); |
123 } | 128 } |
124 HBITMAP hBitmap = (HBITMAP)LoadImageW(nullptr, (wchar_t*)filename, | 129 HBITMAP hBitmap = (HBITMAP)LoadImageW(nullptr, (wchar_t*)filename, |
(...skipping 13 matching lines...) Expand all Loading... |
138 CFX_ByteString info = GetBitmapInfo(pDIBitmap); | 143 CFX_ByteString info = GetBitmapInfo(pDIBitmap); |
139 int ret = GetDIBits(hDC, hBitmap, 0, height, pDIBitmap->GetBuffer(), | 144 int ret = GetDIBits(hDC, hBitmap, 0, height, pDIBitmap->GetBuffer(), |
140 (BITMAPINFO*)info.c_str(), DIB_RGB_COLORS); | 145 (BITMAPINFO*)info.c_str(), DIB_RGB_COLORS); |
141 if (!ret) { | 146 if (!ret) { |
142 delete pDIBitmap; | 147 delete pDIBitmap; |
143 pDIBitmap = nullptr; | 148 pDIBitmap = nullptr; |
144 } | 149 } |
145 DeleteDC(hDC); | 150 DeleteDC(hDC); |
146 return pDIBitmap; | 151 return pDIBitmap; |
147 } | 152 } |
| 153 |
| 154 CFX_DIBitmap* CFX_WindowsDIB::LoadFromFile(const FX_CHAR* filename) { |
| 155 return LoadFromFile(CFX_WideString::FromLocal(filename).c_str()); |
| 156 } |
| 157 |
148 CFX_DIBitmap* CFX_WindowsDIB::LoadDIBitmap(WINDIB_Open_Args_ args) { | 158 CFX_DIBitmap* CFX_WindowsDIB::LoadDIBitmap(WINDIB_Open_Args_ args) { |
149 CWin32Platform* pPlatform = | 159 CWin32Platform* pPlatform = |
150 (CWin32Platform*)CFX_GEModule::Get()->GetPlatformData(); | 160 (CWin32Platform*)CFX_GEModule::Get()->GetPlatformData(); |
151 if (pPlatform->m_GdiplusExt.IsAvailable()) { | 161 if (pPlatform->m_GdiplusExt.IsAvailable()) { |
152 return pPlatform->m_GdiplusExt.LoadDIBitmap(args); | 162 return pPlatform->m_GdiplusExt.LoadDIBitmap(args); |
153 } | 163 } |
154 if (args.flags == WINDIB_OPEN_MEMORY) { | 164 if (args.flags == WINDIB_OPEN_MEMORY) { |
155 return nullptr; | 165 return nullptr; |
156 } | 166 } |
157 HBITMAP hBitmap = (HBITMAP)LoadImageW(nullptr, (wchar_t*)args.path_name, | 167 HBITMAP hBitmap = (HBITMAP)LoadImageW(nullptr, (wchar_t*)args.path_name, |
(...skipping 13 matching lines...) Expand all Loading... |
171 CFX_ByteString info = GetBitmapInfo(pDIBitmap); | 181 CFX_ByteString info = GetBitmapInfo(pDIBitmap); |
172 int ret = GetDIBits(hDC, hBitmap, 0, height, pDIBitmap->GetBuffer(), | 182 int ret = GetDIBits(hDC, hBitmap, 0, height, pDIBitmap->GetBuffer(), |
173 (BITMAPINFO*)info.c_str(), DIB_RGB_COLORS); | 183 (BITMAPINFO*)info.c_str(), DIB_RGB_COLORS); |
174 if (!ret) { | 184 if (!ret) { |
175 delete pDIBitmap; | 185 delete pDIBitmap; |
176 pDIBitmap = nullptr; | 186 pDIBitmap = nullptr; |
177 } | 187 } |
178 DeleteDC(hDC); | 188 DeleteDC(hDC); |
179 return pDIBitmap; | 189 return pDIBitmap; |
180 } | 190 } |
| 191 |
181 CFX_DIBitmap* CFX_WindowsDIB::LoadFromDDB(HDC hDC, | 192 CFX_DIBitmap* CFX_WindowsDIB::LoadFromDDB(HDC hDC, |
182 HBITMAP hBitmap, | 193 HBITMAP hBitmap, |
183 uint32_t* pPalette, | 194 uint32_t* pPalette, |
184 uint32_t palsize) { | 195 uint32_t palsize) { |
185 FX_BOOL bCreatedDC = !hDC; | 196 FX_BOOL bCreatedDC = !hDC; |
186 if (bCreatedDC) { | 197 if (bCreatedDC) { |
187 hDC = CreateCompatibleDC(nullptr); | 198 hDC = CreateCompatibleDC(nullptr); |
188 } | 199 } |
189 BITMAPINFOHEADER bmih; | 200 BITMAPINFOHEADER bmih; |
190 FXSYS_memset(&bmih, 0, sizeof bmih); | 201 FXSYS_memset(&bmih, 0, sizeof bmih); |
(...skipping 61 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
252 } | 263 } |
253 if (ret == 0) { | 264 if (ret == 0) { |
254 delete pDIBitmap; | 265 delete pDIBitmap; |
255 pDIBitmap = nullptr; | 266 pDIBitmap = nullptr; |
256 } | 267 } |
257 if (bCreatedDC) { | 268 if (bCreatedDC) { |
258 DeleteDC(hDC); | 269 DeleteDC(hDC); |
259 } | 270 } |
260 return pDIBitmap; | 271 return pDIBitmap; |
261 } | 272 } |
| 273 |
262 CFX_WindowsDIB::CFX_WindowsDIB(HDC hDC, int width, int height) { | 274 CFX_WindowsDIB::CFX_WindowsDIB(HDC hDC, int width, int height) { |
263 Create(width, height, FXDIB_Rgb, (uint8_t*)1); | 275 Create(width, height, FXDIB_Rgb, (uint8_t*)1); |
264 BITMAPINFOHEADER bmih; | 276 BITMAPINFOHEADER bmih; |
265 FXSYS_memset(&bmih, 0, sizeof bmih); | 277 FXSYS_memset(&bmih, 0, sizeof bmih); |
266 bmih.biSize = sizeof bmih; | 278 bmih.biSize = sizeof bmih; |
267 bmih.biBitCount = 24; | 279 bmih.biBitCount = 24; |
268 bmih.biHeight = -height; | 280 bmih.biHeight = -height; |
269 bmih.biPlanes = 1; | 281 bmih.biPlanes = 1; |
270 bmih.biWidth = width; | 282 bmih.biWidth = width; |
271 m_hBitmap = CreateDIBSection(hDC, (BITMAPINFO*)&bmih, DIB_RGB_COLORS, | 283 m_hBitmap = CreateDIBSection(hDC, (BITMAPINFO*)&bmih, DIB_RGB_COLORS, |
272 (LPVOID*)&m_pBuffer, nullptr, 0); | 284 (LPVOID*)&m_pBuffer, nullptr, 0); |
273 m_hMemDC = CreateCompatibleDC(hDC); | 285 m_hMemDC = CreateCompatibleDC(hDC); |
274 m_hOldBitmap = (HBITMAP)SelectObject(m_hMemDC, m_hBitmap); | 286 m_hOldBitmap = (HBITMAP)SelectObject(m_hMemDC, m_hBitmap); |
275 } | 287 } |
| 288 |
276 CFX_WindowsDIB::~CFX_WindowsDIB() { | 289 CFX_WindowsDIB::~CFX_WindowsDIB() { |
277 SelectObject(m_hMemDC, m_hOldBitmap); | 290 SelectObject(m_hMemDC, m_hOldBitmap); |
278 DeleteDC(m_hMemDC); | 291 DeleteDC(m_hMemDC); |
279 DeleteObject(m_hBitmap); | 292 DeleteObject(m_hBitmap); |
280 } | 293 } |
| 294 |
281 void CFX_WindowsDIB::LoadFromDevice(HDC hDC, int left, int top) { | 295 void CFX_WindowsDIB::LoadFromDevice(HDC hDC, int left, int top) { |
282 ::BitBlt(m_hMemDC, 0, 0, m_Width, m_Height, hDC, left, top, SRCCOPY); | 296 ::BitBlt(m_hMemDC, 0, 0, m_Width, m_Height, hDC, left, top, SRCCOPY); |
283 } | 297 } |
| 298 |
284 void CFX_WindowsDIB::SetToDevice(HDC hDC, int left, int top) { | 299 void CFX_WindowsDIB::SetToDevice(HDC hDC, int left, int top) { |
285 ::BitBlt(hDC, left, top, m_Width, m_Height, m_hMemDC, 0, 0, SRCCOPY); | 300 ::BitBlt(hDC, left, top, m_Width, m_Height, m_hMemDC, 0, 0, SRCCOPY); |
286 } | 301 } |
287 #endif | 302 #endif |
OLD | NEW |