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/fxcodec/fx_codec.h" | 7 #include "core/fxcodec/fx_codec.h" |
8 #include "core/fxge/fx_dib.h" | 8 #include "core/fxge/fx_dib.h" |
9 | 9 |
10 class CFX_Palette { | 10 class CFX_Palette { |
11 public: | 11 public: |
12 CFX_Palette(); | 12 CFX_Palette(); |
13 ~CFX_Palette(); | 13 ~CFX_Palette(); |
14 | 14 |
15 FX_BOOL BuildPalette(const CFX_DIBSource* pBitmap); | 15 bool BuildPalette(const CFX_DIBSource* pBitmap); |
16 uint32_t* GetPalette() const { return m_pPalette; } | 16 uint32_t* GetPalette() const { return m_pPalette; } |
17 uint32_t* GetColorLut() const { return m_cLut; } | 17 uint32_t* GetColorLut() const { return m_cLut; } |
18 uint32_t* GetAmountLut() const { return m_aLut; } | 18 uint32_t* GetAmountLut() const { return m_aLut; } |
19 int32_t Getlut() const { return m_lut; } | 19 int32_t Getlut() const { return m_lut; } |
20 | 20 |
21 protected: | 21 protected: |
22 uint32_t* m_pPalette; | 22 uint32_t* m_pPalette; |
23 uint32_t* m_cLut; | 23 uint32_t* m_cLut; |
24 uint32_t* m_aLut; | 24 uint32_t* m_aLut; |
25 int m_lut; | 25 int m_lut; |
(...skipping 63 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
89 m_lut = 0; | 89 m_lut = 0; |
90 } | 90 } |
91 | 91 |
92 CFX_Palette::~CFX_Palette() { | 92 CFX_Palette::~CFX_Palette() { |
93 FX_Free(m_pPalette); | 93 FX_Free(m_pPalette); |
94 FX_Free(m_cLut); | 94 FX_Free(m_cLut); |
95 FX_Free(m_aLut); | 95 FX_Free(m_aLut); |
96 m_lut = 0; | 96 m_lut = 0; |
97 } | 97 } |
98 | 98 |
99 FX_BOOL CFX_Palette::BuildPalette(const CFX_DIBSource* pBitmap) { | 99 bool CFX_Palette::BuildPalette(const CFX_DIBSource* pBitmap) { |
100 if (!pBitmap) { | 100 if (!pBitmap) { |
101 return FALSE; | 101 return false; |
102 } | 102 } |
103 FX_Free(m_pPalette); | 103 FX_Free(m_pPalette); |
104 m_pPalette = FX_Alloc(uint32_t, 256); | 104 m_pPalette = FX_Alloc(uint32_t, 256); |
105 int bpp = pBitmap->GetBPP() / 8; | 105 int bpp = pBitmap->GetBPP() / 8; |
106 int width = pBitmap->GetWidth(); | 106 int width = pBitmap->GetWidth(); |
107 int height = pBitmap->GetHeight(); | 107 int height = pBitmap->GetHeight(); |
108 FX_Free(m_cLut); | 108 FX_Free(m_cLut); |
109 m_cLut = nullptr; | 109 m_cLut = nullptr; |
110 FX_Free(m_aLut); | 110 FX_Free(m_aLut); |
111 m_aLut = nullptr; | 111 m_aLut = nullptr; |
(...skipping 14 matching lines...) Expand all Loading... |
126 } | 126 } |
127 for (row = 0; row < 4096; row++) { | 127 for (row = 0; row < 4096; row++) { |
128 if (m_aLut[row] != 0) { | 128 if (m_aLut[row] != 0) { |
129 m_aLut[m_lut] = m_aLut[row]; | 129 m_aLut[m_lut] = m_aLut[row]; |
130 m_cLut[m_lut] = row; | 130 m_cLut[m_lut] = row; |
131 m_lut++; | 131 m_lut++; |
132 } | 132 } |
133 } | 133 } |
134 _Qsort(m_aLut, m_cLut, 0, m_lut - 1); | 134 _Qsort(m_aLut, m_cLut, 0, m_lut - 1); |
135 _Obtain_Pal(m_aLut, m_cLut, m_pPalette, m_lut); | 135 _Obtain_Pal(m_aLut, m_cLut, m_pPalette, m_lut); |
136 return TRUE; | 136 return true; |
137 } | 137 } |
138 | 138 |
139 FX_BOOL ConvertBuffer_1bppMask2Gray(uint8_t* dest_buf, | 139 bool ConvertBuffer_1bppMask2Gray(uint8_t* dest_buf, |
140 int dest_pitch, | 140 int dest_pitch, |
141 int width, | 141 int width, |
142 int height, | 142 int height, |
143 const CFX_DIBSource* pSrcBitmap, | 143 const CFX_DIBSource* pSrcBitmap, |
144 int src_left, | 144 int src_left, |
145 int src_top) { | 145 int src_top) { |
146 uint8_t set_gray, reset_gray; | 146 uint8_t set_gray, reset_gray; |
147 set_gray = 0xff; | 147 set_gray = 0xff; |
148 reset_gray = 0x00; | 148 reset_gray = 0x00; |
149 for (int row = 0; row < height; row++) { | 149 for (int row = 0; row < height; row++) { |
150 uint8_t* dest_scan = dest_buf + row * dest_pitch; | 150 uint8_t* dest_scan = dest_buf + row * dest_pitch; |
151 FXSYS_memset(dest_scan, reset_gray, width); | 151 FXSYS_memset(dest_scan, reset_gray, width); |
152 const uint8_t* src_scan = pSrcBitmap->GetScanline(src_top + row); | 152 const uint8_t* src_scan = pSrcBitmap->GetScanline(src_top + row); |
153 for (int col = src_left; col < src_left + width; col++) { | 153 for (int col = src_left; col < src_left + width; col++) { |
154 if (src_scan[col / 8] & (1 << (7 - col % 8))) { | 154 if (src_scan[col / 8] & (1 << (7 - col % 8))) { |
155 *dest_scan = set_gray; | 155 *dest_scan = set_gray; |
156 } | 156 } |
157 dest_scan++; | 157 dest_scan++; |
158 } | 158 } |
159 } | 159 } |
160 return TRUE; | 160 return true; |
161 } | 161 } |
162 | 162 |
163 FX_BOOL ConvertBuffer_8bppMask2Gray(uint8_t* dest_buf, | 163 bool ConvertBuffer_8bppMask2Gray(uint8_t* dest_buf, |
164 int dest_pitch, | 164 int dest_pitch, |
165 int width, | 165 int width, |
166 int height, | 166 int height, |
167 const CFX_DIBSource* pSrcBitmap, | 167 const CFX_DIBSource* pSrcBitmap, |
168 int src_left, | 168 int src_left, |
169 int src_top) { | 169 int src_top) { |
170 for (int row = 0; row < height; row++) { | 170 for (int row = 0; row < height; row++) { |
171 uint8_t* dest_scan = dest_buf + row * dest_pitch; | 171 uint8_t* dest_scan = dest_buf + row * dest_pitch; |
172 const uint8_t* src_scan = pSrcBitmap->GetScanline(src_top + row) + src_left; | 172 const uint8_t* src_scan = pSrcBitmap->GetScanline(src_top + row) + src_left; |
173 FXSYS_memcpy(dest_scan, src_scan, width); | 173 FXSYS_memcpy(dest_scan, src_scan, width); |
174 } | 174 } |
175 return TRUE; | 175 return true; |
176 } | 176 } |
177 | 177 |
178 FX_BOOL ConvertBuffer_1bppPlt2Gray(uint8_t* dest_buf, | 178 bool ConvertBuffer_1bppPlt2Gray(uint8_t* dest_buf, |
179 int dest_pitch, | 179 int dest_pitch, |
180 int width, | 180 int width, |
181 int height, | 181 int height, |
182 const CFX_DIBSource* pSrcBitmap, | 182 const CFX_DIBSource* pSrcBitmap, |
183 int src_left, | 183 int src_left, |
184 int src_top) { | 184 int src_top) { |
185 uint32_t* src_plt = pSrcBitmap->GetPalette(); | 185 uint32_t* src_plt = pSrcBitmap->GetPalette(); |
186 uint8_t gray[2]; | 186 uint8_t gray[2]; |
187 uint8_t reset_r; | 187 uint8_t reset_r; |
188 uint8_t reset_g; | 188 uint8_t reset_g; |
189 uint8_t reset_b; | 189 uint8_t reset_b; |
190 uint8_t set_r; | 190 uint8_t set_r; |
191 uint8_t set_g; | 191 uint8_t set_g; |
192 uint8_t set_b; | 192 uint8_t set_b; |
193 if (pSrcBitmap->IsCmykImage()) { | 193 if (pSrcBitmap->IsCmykImage()) { |
194 AdobeCMYK_to_sRGB1(FXSYS_GetCValue(src_plt[0]), FXSYS_GetMValue(src_plt[0]), | 194 AdobeCMYK_to_sRGB1(FXSYS_GetCValue(src_plt[0]), FXSYS_GetMValue(src_plt[0]), |
(...skipping 17 matching lines...) Expand all Loading... |
212 uint8_t* dest_scan = dest_buf + row * dest_pitch; | 212 uint8_t* dest_scan = dest_buf + row * dest_pitch; |
213 FXSYS_memset(dest_scan, gray[0], width); | 213 FXSYS_memset(dest_scan, gray[0], width); |
214 const uint8_t* src_scan = pSrcBitmap->GetScanline(src_top + row); | 214 const uint8_t* src_scan = pSrcBitmap->GetScanline(src_top + row); |
215 for (int col = src_left; col < src_left + width; col++) { | 215 for (int col = src_left; col < src_left + width; col++) { |
216 if (src_scan[col / 8] & (1 << (7 - col % 8))) { | 216 if (src_scan[col / 8] & (1 << (7 - col % 8))) { |
217 *dest_scan = gray[1]; | 217 *dest_scan = gray[1]; |
218 } | 218 } |
219 dest_scan++; | 219 dest_scan++; |
220 } | 220 } |
221 } | 221 } |
222 return TRUE; | 222 return true; |
223 } | 223 } |
224 | 224 |
225 FX_BOOL ConvertBuffer_8bppPlt2Gray(uint8_t* dest_buf, | 225 bool ConvertBuffer_8bppPlt2Gray(uint8_t* dest_buf, |
226 int dest_pitch, | 226 int dest_pitch, |
227 int width, | 227 int width, |
228 int height, | 228 int height, |
229 const CFX_DIBSource* pSrcBitmap, | 229 const CFX_DIBSource* pSrcBitmap, |
230 int src_left, | 230 int src_left, |
231 int src_top) { | 231 int src_top) { |
232 uint32_t* src_plt = pSrcBitmap->GetPalette(); | 232 uint32_t* src_plt = pSrcBitmap->GetPalette(); |
233 uint8_t gray[256]; | 233 uint8_t gray[256]; |
234 if (pSrcBitmap->IsCmykImage()) { | 234 if (pSrcBitmap->IsCmykImage()) { |
235 uint8_t r; | 235 uint8_t r; |
236 uint8_t g; | 236 uint8_t g; |
237 uint8_t b; | 237 uint8_t b; |
238 for (size_t i = 0; i < FX_ArraySize(gray); i++) { | 238 for (size_t i = 0; i < FX_ArraySize(gray); i++) { |
239 AdobeCMYK_to_sRGB1( | 239 AdobeCMYK_to_sRGB1( |
240 FXSYS_GetCValue(src_plt[i]), FXSYS_GetMValue(src_plt[i]), | 240 FXSYS_GetCValue(src_plt[i]), FXSYS_GetMValue(src_plt[i]), |
241 FXSYS_GetYValue(src_plt[i]), FXSYS_GetKValue(src_plt[i]), r, g, b); | 241 FXSYS_GetYValue(src_plt[i]), FXSYS_GetKValue(src_plt[i]), r, g, b); |
242 gray[i] = FXRGB2GRAY(r, g, b); | 242 gray[i] = FXRGB2GRAY(r, g, b); |
243 } | 243 } |
244 } else { | 244 } else { |
245 for (size_t i = 0; i < FX_ArraySize(gray); i++) { | 245 for (size_t i = 0; i < FX_ArraySize(gray); i++) { |
246 gray[i] = FXRGB2GRAY(FXARGB_R(src_plt[i]), FXARGB_G(src_plt[i]), | 246 gray[i] = FXRGB2GRAY(FXARGB_R(src_plt[i]), FXARGB_G(src_plt[i]), |
247 FXARGB_B(src_plt[i])); | 247 FXARGB_B(src_plt[i])); |
248 } | 248 } |
249 } | 249 } |
250 | 250 |
251 for (int row = 0; row < height; row++) { | 251 for (int row = 0; row < height; row++) { |
252 uint8_t* dest_scan = dest_buf + row * dest_pitch; | 252 uint8_t* dest_scan = dest_buf + row * dest_pitch; |
253 const uint8_t* src_scan = pSrcBitmap->GetScanline(src_top + row) + src_left; | 253 const uint8_t* src_scan = pSrcBitmap->GetScanline(src_top + row) + src_left; |
254 for (int col = 0; col < width; col++) { | 254 for (int col = 0; col < width; col++) { |
255 *dest_scan++ = gray[*src_scan++]; | 255 *dest_scan++ = gray[*src_scan++]; |
256 } | 256 } |
257 } | 257 } |
258 return TRUE; | 258 return true; |
259 } | 259 } |
260 | 260 |
261 FX_BOOL ConvertBuffer_RgbOrCmyk2Gray(uint8_t* dest_buf, | 261 bool ConvertBuffer_RgbOrCmyk2Gray(uint8_t* dest_buf, |
262 int dest_pitch, | 262 int dest_pitch, |
263 int width, | 263 int width, |
264 int height, | 264 int height, |
265 const CFX_DIBSource* pSrcBitmap, | 265 const CFX_DIBSource* pSrcBitmap, |
266 int src_left, | 266 int src_left, |
267 int src_top) { | 267 int src_top) { |
268 int Bpp = pSrcBitmap->GetBPP() / 8; | 268 int Bpp = pSrcBitmap->GetBPP() / 8; |
269 if (pSrcBitmap->IsCmykImage()) { | 269 if (pSrcBitmap->IsCmykImage()) { |
270 for (int row = 0; row < height; row++) { | 270 for (int row = 0; row < height; row++) { |
271 uint8_t* dest_scan = dest_buf + row * dest_pitch; | 271 uint8_t* dest_scan = dest_buf + row * dest_pitch; |
272 const uint8_t* src_scan = | 272 const uint8_t* src_scan = |
273 pSrcBitmap->GetScanline(src_top + row) + src_left * 4; | 273 pSrcBitmap->GetScanline(src_top + row) + src_left * 4; |
274 for (int col = 0; col < width; col++) { | 274 for (int col = 0; col < width; col++) { |
275 uint8_t r, g, b; | 275 uint8_t r, g, b; |
276 AdobeCMYK_to_sRGB1(FXSYS_GetCValue((uint32_t)src_scan[0]), | 276 AdobeCMYK_to_sRGB1(FXSYS_GetCValue((uint32_t)src_scan[0]), |
277 FXSYS_GetMValue((uint32_t)src_scan[1]), | 277 FXSYS_GetMValue((uint32_t)src_scan[1]), |
278 FXSYS_GetYValue((uint32_t)src_scan[2]), | 278 FXSYS_GetYValue((uint32_t)src_scan[2]), |
279 FXSYS_GetKValue((uint32_t)src_scan[3]), r, g, b); | 279 FXSYS_GetKValue((uint32_t)src_scan[3]), r, g, b); |
280 *dest_scan++ = FXRGB2GRAY(r, g, b); | 280 *dest_scan++ = FXRGB2GRAY(r, g, b); |
281 src_scan += 4; | 281 src_scan += 4; |
282 } | 282 } |
283 } | 283 } |
284 } else { | 284 } else { |
285 for (int row = 0; row < height; row++) { | 285 for (int row = 0; row < height; row++) { |
286 uint8_t* dest_scan = dest_buf + row * dest_pitch; | 286 uint8_t* dest_scan = dest_buf + row * dest_pitch; |
287 const uint8_t* src_scan = | 287 const uint8_t* src_scan = |
288 pSrcBitmap->GetScanline(src_top + row) + src_left * Bpp; | 288 pSrcBitmap->GetScanline(src_top + row) + src_left * Bpp; |
289 for (int col = 0; col < width; col++) { | 289 for (int col = 0; col < width; col++) { |
290 *dest_scan++ = FXRGB2GRAY(src_scan[2], src_scan[1], src_scan[0]); | 290 *dest_scan++ = FXRGB2GRAY(src_scan[2], src_scan[1], src_scan[0]); |
291 src_scan += Bpp; | 291 src_scan += Bpp; |
292 } | 292 } |
293 } | 293 } |
294 } | 294 } |
295 return TRUE; | 295 return true; |
296 } | 296 } |
297 | 297 |
298 void ConvertBuffer_IndexCopy(uint8_t* dest_buf, | 298 void ConvertBuffer_IndexCopy(uint8_t* dest_buf, |
299 int dest_pitch, | 299 int dest_pitch, |
300 int width, | 300 int width, |
301 int height, | 301 int height, |
302 const CFX_DIBSource* pSrcBitmap, | 302 const CFX_DIBSource* pSrcBitmap, |
303 int src_left, | 303 int src_left, |
304 int src_top) { | 304 int src_top) { |
305 if (pSrcBitmap->GetBPP() == 1) { | 305 if (pSrcBitmap->GetBPP() == 1) { |
(...skipping 11 matching lines...) Expand all Loading... |
317 } else { | 317 } else { |
318 for (int row = 0; row < height; row++) { | 318 for (int row = 0; row < height; row++) { |
319 uint8_t* dest_scan = dest_buf + row * dest_pitch; | 319 uint8_t* dest_scan = dest_buf + row * dest_pitch; |
320 const uint8_t* src_scan = | 320 const uint8_t* src_scan = |
321 pSrcBitmap->GetScanline(src_top + row) + src_left; | 321 pSrcBitmap->GetScanline(src_top + row) + src_left; |
322 FXSYS_memcpy(dest_scan, src_scan, width); | 322 FXSYS_memcpy(dest_scan, src_scan, width); |
323 } | 323 } |
324 } | 324 } |
325 } | 325 } |
326 | 326 |
327 FX_BOOL ConvertBuffer_Plt2PltRgb8(uint8_t* dest_buf, | 327 bool ConvertBuffer_Plt2PltRgb8(uint8_t* dest_buf, |
328 int dest_pitch, | 328 int dest_pitch, |
329 int width, | 329 int width, |
330 int height, | 330 int height, |
331 const CFX_DIBSource* pSrcBitmap, | 331 const CFX_DIBSource* pSrcBitmap, |
332 int src_left, | 332 int src_left, |
333 int src_top, | 333 int src_top, |
334 uint32_t* dst_plt) { | 334 uint32_t* dst_plt) { |
335 ConvertBuffer_IndexCopy(dest_buf, dest_pitch, width, height, pSrcBitmap, | 335 ConvertBuffer_IndexCopy(dest_buf, dest_pitch, width, height, pSrcBitmap, |
336 src_left, src_top); | 336 src_left, src_top); |
337 uint32_t* src_plt = pSrcBitmap->GetPalette(); | 337 uint32_t* src_plt = pSrcBitmap->GetPalette(); |
338 int plt_size = pSrcBitmap->GetPaletteSize(); | 338 int plt_size = pSrcBitmap->GetPaletteSize(); |
339 if (pSrcBitmap->IsCmykImage()) { | 339 if (pSrcBitmap->IsCmykImage()) { |
340 for (int i = 0; i < plt_size; i++) { | 340 for (int i = 0; i < plt_size; i++) { |
341 uint8_t r; | 341 uint8_t r; |
342 uint8_t g; | 342 uint8_t g; |
343 uint8_t b; | 343 uint8_t b; |
344 AdobeCMYK_to_sRGB1( | 344 AdobeCMYK_to_sRGB1( |
345 FXSYS_GetCValue(src_plt[i]), FXSYS_GetMValue(src_plt[i]), | 345 FXSYS_GetCValue(src_plt[i]), FXSYS_GetMValue(src_plt[i]), |
346 FXSYS_GetYValue(src_plt[i]), FXSYS_GetKValue(src_plt[i]), r, g, b); | 346 FXSYS_GetYValue(src_plt[i]), FXSYS_GetKValue(src_plt[i]), r, g, b); |
347 dst_plt[i] = FXARGB_MAKE(0xff, r, g, b); | 347 dst_plt[i] = FXARGB_MAKE(0xff, r, g, b); |
348 } | 348 } |
349 } else { | 349 } else { |
350 FXSYS_memcpy(dst_plt, src_plt, plt_size * 4); | 350 FXSYS_memcpy(dst_plt, src_plt, plt_size * 4); |
351 } | 351 } |
352 return TRUE; | 352 return true; |
353 } | 353 } |
354 | 354 |
355 FX_BOOL ConvertBuffer_Rgb2PltRgb8(uint8_t* dest_buf, | 355 bool ConvertBuffer_Rgb2PltRgb8(uint8_t* dest_buf, |
356 int dest_pitch, | 356 int dest_pitch, |
357 int width, | 357 int width, |
358 int height, | 358 int height, |
359 const CFX_DIBSource* pSrcBitmap, | 359 const CFX_DIBSource* pSrcBitmap, |
360 int src_left, | 360 int src_left, |
361 int src_top, | 361 int src_top, |
362 uint32_t* dst_plt) { | 362 uint32_t* dst_plt) { |
363 int bpp = pSrcBitmap->GetBPP() / 8; | 363 int bpp = pSrcBitmap->GetBPP() / 8; |
364 CFX_Palette palette; | 364 CFX_Palette palette; |
365 palette.BuildPalette(pSrcBitmap); | 365 palette.BuildPalette(pSrcBitmap); |
366 uint32_t* cLut = palette.GetColorLut(); | 366 uint32_t* cLut = palette.GetColorLut(); |
367 uint32_t* aLut = palette.GetAmountLut(); | 367 uint32_t* aLut = palette.GetAmountLut(); |
368 if (!cLut || !aLut) { | 368 if (!cLut || !aLut) { |
369 return FALSE; | 369 return false; |
370 } | 370 } |
371 int lut = palette.Getlut(); | 371 int lut = palette.Getlut(); |
372 uint32_t* pPalette = palette.GetPalette(); | 372 uint32_t* pPalette = palette.GetPalette(); |
373 if (lut > 256) { | 373 if (lut > 256) { |
374 int err, min_err; | 374 int err, min_err; |
375 int lut_256 = lut - 256; | 375 int lut_256 = lut - 256; |
376 for (int row = 0; row < lut_256; row++) { | 376 for (int row = 0; row < lut_256; row++) { |
377 min_err = 1000000; | 377 min_err = 1000000; |
378 uint8_t r, g, b; | 378 uint8_t r, g, b; |
379 _ColorDecode(cLut[row], r, g, b); | 379 _ColorDecode(cLut[row], r, g, b); |
(...skipping 24 matching lines...) Expand all Loading... |
404 int b = src_port[0] & 0xf0; | 404 int b = src_port[0] & 0xf0; |
405 uint32_t clrindex = (r << 4) + g + (b >> 4); | 405 uint32_t clrindex = (r << 4) + g + (b >> 4); |
406 for (int i = lut_1; i >= 0; i--) | 406 for (int i = lut_1; i >= 0; i--) |
407 if (clrindex == cLut[i]) { | 407 if (clrindex == cLut[i]) { |
408 *(dest_scan + col) = (uint8_t)(aLut[i]); | 408 *(dest_scan + col) = (uint8_t)(aLut[i]); |
409 break; | 409 break; |
410 } | 410 } |
411 } | 411 } |
412 } | 412 } |
413 FXSYS_memcpy(dst_plt, pPalette, sizeof(uint32_t) * 256); | 413 FXSYS_memcpy(dst_plt, pPalette, sizeof(uint32_t) * 256); |
414 return TRUE; | 414 return true; |
415 } | 415 } |
416 | 416 |
417 FX_BOOL ConvertBuffer_1bppMask2Rgb(FXDIB_Format dst_format, | 417 bool ConvertBuffer_1bppMask2Rgb(FXDIB_Format dst_format, |
418 uint8_t* dest_buf, | 418 uint8_t* dest_buf, |
419 int dest_pitch, | 419 int dest_pitch, |
420 int width, | 420 int width, |
421 int height, | 421 int height, |
422 const CFX_DIBSource* pSrcBitmap, | 422 const CFX_DIBSource* pSrcBitmap, |
423 int src_left, | 423 int src_left, |
424 int src_top) { | 424 int src_top) { |
425 int comps = (dst_format & 0xff) / 8; | 425 int comps = (dst_format & 0xff) / 8; |
426 uint8_t set_gray, reset_gray; | 426 uint8_t set_gray, reset_gray; |
427 set_gray = 0xff; | 427 set_gray = 0xff; |
428 reset_gray = 0x00; | 428 reset_gray = 0x00; |
429 for (int row = 0; row < height; row++) { | 429 for (int row = 0; row < height; row++) { |
430 uint8_t* dest_scan = dest_buf + row * dest_pitch; | 430 uint8_t* dest_scan = dest_buf + row * dest_pitch; |
431 const uint8_t* src_scan = pSrcBitmap->GetScanline(src_top + row); | 431 const uint8_t* src_scan = pSrcBitmap->GetScanline(src_top + row); |
432 for (int col = src_left; col < src_left + width; col++) { | 432 for (int col = src_left; col < src_left + width; col++) { |
433 if (src_scan[col / 8] & (1 << (7 - col % 8))) { | 433 if (src_scan[col / 8] & (1 << (7 - col % 8))) { |
434 dest_scan[0] = set_gray; | 434 dest_scan[0] = set_gray; |
435 dest_scan[1] = set_gray; | 435 dest_scan[1] = set_gray; |
436 dest_scan[2] = set_gray; | 436 dest_scan[2] = set_gray; |
437 } else { | 437 } else { |
438 dest_scan[0] = reset_gray; | 438 dest_scan[0] = reset_gray; |
439 dest_scan[1] = reset_gray; | 439 dest_scan[1] = reset_gray; |
440 dest_scan[2] = reset_gray; | 440 dest_scan[2] = reset_gray; |
441 } | 441 } |
442 dest_scan += comps; | 442 dest_scan += comps; |
443 } | 443 } |
444 } | 444 } |
445 return TRUE; | 445 return true; |
446 } | 446 } |
447 | 447 |
448 FX_BOOL ConvertBuffer_8bppMask2Rgb(FXDIB_Format dst_format, | 448 bool ConvertBuffer_8bppMask2Rgb(FXDIB_Format dst_format, |
449 uint8_t* dest_buf, | 449 uint8_t* dest_buf, |
450 int dest_pitch, | 450 int dest_pitch, |
451 int width, | 451 int width, |
452 int height, | 452 int height, |
453 const CFX_DIBSource* pSrcBitmap, | 453 const CFX_DIBSource* pSrcBitmap, |
454 int src_left, | 454 int src_left, |
455 int src_top) { | 455 int src_top) { |
456 int comps = (dst_format & 0xff) / 8; | 456 int comps = (dst_format & 0xff) / 8; |
457 for (int row = 0; row < height; row++) { | 457 for (int row = 0; row < height; row++) { |
458 uint8_t* dest_scan = dest_buf + row * dest_pitch; | 458 uint8_t* dest_scan = dest_buf + row * dest_pitch; |
459 const uint8_t* src_scan = pSrcBitmap->GetScanline(src_top + row) + src_left; | 459 const uint8_t* src_scan = pSrcBitmap->GetScanline(src_top + row) + src_left; |
460 uint8_t src_pixel; | 460 uint8_t src_pixel; |
461 for (int col = 0; col < width; col++) { | 461 for (int col = 0; col < width; col++) { |
462 src_pixel = *src_scan++; | 462 src_pixel = *src_scan++; |
463 *dest_scan++ = src_pixel; | 463 *dest_scan++ = src_pixel; |
464 *dest_scan++ = src_pixel; | 464 *dest_scan++ = src_pixel; |
465 *dest_scan = src_pixel; | 465 *dest_scan = src_pixel; |
466 dest_scan += comps - 2; | 466 dest_scan += comps - 2; |
467 } | 467 } |
468 } | 468 } |
469 return TRUE; | 469 return true; |
470 } | 470 } |
471 | 471 |
472 FX_BOOL ConvertBuffer_1bppPlt2Rgb(FXDIB_Format dst_format, | 472 bool ConvertBuffer_1bppPlt2Rgb(FXDIB_Format dst_format, |
473 uint8_t* dest_buf, | 473 uint8_t* dest_buf, |
474 int dest_pitch, | 474 int dest_pitch, |
475 int width, | 475 int width, |
476 int height, | 476 int height, |
477 const CFX_DIBSource* pSrcBitmap, | 477 const CFX_DIBSource* pSrcBitmap, |
478 int src_left, | 478 int src_left, |
479 int src_top) { | 479 int src_top) { |
480 int comps = (dst_format & 0xff) / 8; | 480 int comps = (dst_format & 0xff) / 8; |
481 uint32_t* src_plt = pSrcBitmap->GetPalette(); | 481 uint32_t* src_plt = pSrcBitmap->GetPalette(); |
482 uint32_t plt[2]; | 482 uint32_t plt[2]; |
483 uint8_t* bgr_ptr = (uint8_t*)plt; | 483 uint8_t* bgr_ptr = (uint8_t*)plt; |
484 if (pSrcBitmap->IsCmykImage()) { | 484 if (pSrcBitmap->IsCmykImage()) { |
485 plt[0] = FXCMYK_TODIB(src_plt[0]); | 485 plt[0] = FXCMYK_TODIB(src_plt[0]); |
486 plt[1] = FXCMYK_TODIB(src_plt[1]); | 486 plt[1] = FXCMYK_TODIB(src_plt[1]); |
487 } else { | 487 } else { |
488 bgr_ptr[0] = FXARGB_B(src_plt[0]); | 488 bgr_ptr[0] = FXARGB_B(src_plt[0]); |
489 bgr_ptr[1] = FXARGB_G(src_plt[0]); | 489 bgr_ptr[1] = FXARGB_G(src_plt[0]); |
(...skipping 21 matching lines...) Expand all Loading... |
511 *dest_scan++ = bgr_ptr[4]; | 511 *dest_scan++ = bgr_ptr[4]; |
512 *dest_scan = bgr_ptr[5]; | 512 *dest_scan = bgr_ptr[5]; |
513 } else { | 513 } else { |
514 *dest_scan++ = bgr_ptr[0]; | 514 *dest_scan++ = bgr_ptr[0]; |
515 *dest_scan++ = bgr_ptr[1]; | 515 *dest_scan++ = bgr_ptr[1]; |
516 *dest_scan = bgr_ptr[2]; | 516 *dest_scan = bgr_ptr[2]; |
517 } | 517 } |
518 dest_scan += comps - 2; | 518 dest_scan += comps - 2; |
519 } | 519 } |
520 } | 520 } |
521 return TRUE; | 521 return true; |
522 } | 522 } |
523 | 523 |
524 FX_BOOL ConvertBuffer_8bppPlt2Rgb(FXDIB_Format dst_format, | 524 bool ConvertBuffer_8bppPlt2Rgb(FXDIB_Format dst_format, |
525 uint8_t* dest_buf, | 525 uint8_t* dest_buf, |
526 int dest_pitch, | 526 int dest_pitch, |
527 int width, | 527 int width, |
528 int height, | 528 int height, |
529 const CFX_DIBSource* pSrcBitmap, | 529 const CFX_DIBSource* pSrcBitmap, |
530 int src_left, | 530 int src_left, |
531 int src_top) { | 531 int src_top) { |
532 int comps = (dst_format & 0xff) / 8; | 532 int comps = (dst_format & 0xff) / 8; |
533 uint32_t* src_plt = pSrcBitmap->GetPalette(); | 533 uint32_t* src_plt = pSrcBitmap->GetPalette(); |
534 uint32_t plt[256]; | 534 uint32_t plt[256]; |
535 uint8_t* bgr_ptr = (uint8_t*)plt; | 535 uint8_t* bgr_ptr = (uint8_t*)plt; |
536 if (!pSrcBitmap->IsCmykImage()) { | 536 if (!pSrcBitmap->IsCmykImage()) { |
537 for (int i = 0; i < 256; i++) { | 537 for (int i = 0; i < 256; i++) { |
538 *bgr_ptr++ = FXARGB_B(src_plt[i]); | 538 *bgr_ptr++ = FXARGB_B(src_plt[i]); |
539 *bgr_ptr++ = FXARGB_G(src_plt[i]); | 539 *bgr_ptr++ = FXARGB_G(src_plt[i]); |
540 *bgr_ptr++ = FXARGB_R(src_plt[i]); | 540 *bgr_ptr++ = FXARGB_R(src_plt[i]); |
541 } | 541 } |
(...skipping 15 matching lines...) Expand all Loading... |
557 uint8_t* dest_scan = dest_buf + row * dest_pitch; | 557 uint8_t* dest_scan = dest_buf + row * dest_pitch; |
558 const uint8_t* src_scan = pSrcBitmap->GetScanline(src_top + row) + src_left; | 558 const uint8_t* src_scan = pSrcBitmap->GetScanline(src_top + row) + src_left; |
559 for (int col = 0; col < width; col++) { | 559 for (int col = 0; col < width; col++) { |
560 uint8_t* src_pixel = bgr_ptr + 3 * (*src_scan++); | 560 uint8_t* src_pixel = bgr_ptr + 3 * (*src_scan++); |
561 *dest_scan++ = *src_pixel++; | 561 *dest_scan++ = *src_pixel++; |
562 *dest_scan++ = *src_pixel++; | 562 *dest_scan++ = *src_pixel++; |
563 *dest_scan = *src_pixel++; | 563 *dest_scan = *src_pixel++; |
564 dest_scan += comps - 2; | 564 dest_scan += comps - 2; |
565 } | 565 } |
566 } | 566 } |
567 return TRUE; | 567 return true; |
568 } | 568 } |
569 | 569 |
570 FX_BOOL ConvertBuffer_24bppRgb2Rgb24(uint8_t* dest_buf, | 570 bool ConvertBuffer_24bppRgb2Rgb24(uint8_t* dest_buf, |
571 int dest_pitch, | 571 int dest_pitch, |
572 int width, | 572 int width, |
573 int height, | 573 int height, |
574 const CFX_DIBSource* pSrcBitmap, | 574 const CFX_DIBSource* pSrcBitmap, |
575 int src_left, | 575 int src_left, |
576 int src_top) { | 576 int src_top) { |
577 for (int row = 0; row < height; row++) { | 577 for (int row = 0; row < height; row++) { |
578 uint8_t* dest_scan = dest_buf + row * dest_pitch; | 578 uint8_t* dest_scan = dest_buf + row * dest_pitch; |
579 const uint8_t* src_scan = | 579 const uint8_t* src_scan = |
580 pSrcBitmap->GetScanline(src_top + row) + src_left * 3; | 580 pSrcBitmap->GetScanline(src_top + row) + src_left * 3; |
581 FXSYS_memcpy(dest_scan, src_scan, width * 3); | 581 FXSYS_memcpy(dest_scan, src_scan, width * 3); |
582 } | 582 } |
583 return TRUE; | 583 return true; |
584 } | 584 } |
585 | 585 |
586 FX_BOOL ConvertBuffer_32bppRgb2Rgb24(uint8_t* dest_buf, | 586 bool ConvertBuffer_32bppRgb2Rgb24(uint8_t* dest_buf, |
587 int dest_pitch, | 587 int dest_pitch, |
588 int width, | 588 int width, |
589 int height, | 589 int height, |
590 const CFX_DIBSource* pSrcBitmap, | 590 const CFX_DIBSource* pSrcBitmap, |
591 int src_left, | 591 int src_left, |
592 int src_top) { | 592 int src_top) { |
593 for (int row = 0; row < height; row++) { | 593 for (int row = 0; row < height; row++) { |
594 uint8_t* dest_scan = dest_buf + row * dest_pitch; | 594 uint8_t* dest_scan = dest_buf + row * dest_pitch; |
595 const uint8_t* src_scan = | 595 const uint8_t* src_scan = |
596 pSrcBitmap->GetScanline(src_top + row) + src_left * 4; | 596 pSrcBitmap->GetScanline(src_top + row) + src_left * 4; |
597 for (int col = 0; col < width; col++) { | 597 for (int col = 0; col < width; col++) { |
598 *dest_scan++ = *src_scan++; | 598 *dest_scan++ = *src_scan++; |
599 *dest_scan++ = *src_scan++; | 599 *dest_scan++ = *src_scan++; |
600 *dest_scan++ = *src_scan++; | 600 *dest_scan++ = *src_scan++; |
601 src_scan++; | 601 src_scan++; |
602 } | 602 } |
603 } | 603 } |
604 return TRUE; | 604 return true; |
605 } | 605 } |
606 | 606 |
607 FX_BOOL ConvertBuffer_Rgb2Rgb32(uint8_t* dest_buf, | 607 bool ConvertBuffer_Rgb2Rgb32(uint8_t* dest_buf, |
608 int dest_pitch, | 608 int dest_pitch, |
609 int width, | 609 int width, |
610 int height, | 610 int height, |
611 const CFX_DIBSource* pSrcBitmap, | 611 const CFX_DIBSource* pSrcBitmap, |
612 int src_left, | 612 int src_left, |
613 int src_top) { | 613 int src_top) { |
614 int comps = pSrcBitmap->GetBPP() / 8; | 614 int comps = pSrcBitmap->GetBPP() / 8; |
615 for (int row = 0; row < height; row++) { | 615 for (int row = 0; row < height; row++) { |
616 uint8_t* dest_scan = dest_buf + row * dest_pitch; | 616 uint8_t* dest_scan = dest_buf + row * dest_pitch; |
617 const uint8_t* src_scan = | 617 const uint8_t* src_scan = |
618 pSrcBitmap->GetScanline(src_top + row) + src_left * comps; | 618 pSrcBitmap->GetScanline(src_top + row) + src_left * comps; |
619 for (int col = 0; col < width; col++) { | 619 for (int col = 0; col < width; col++) { |
620 *dest_scan++ = *src_scan++; | 620 *dest_scan++ = *src_scan++; |
621 *dest_scan++ = *src_scan++; | 621 *dest_scan++ = *src_scan++; |
622 *dest_scan++ = *src_scan++; | 622 *dest_scan++ = *src_scan++; |
623 dest_scan++; | 623 dest_scan++; |
624 src_scan += comps - 3; | 624 src_scan += comps - 3; |
625 } | 625 } |
626 } | 626 } |
627 return TRUE; | 627 return true; |
628 } | 628 } |
629 | 629 |
630 FX_BOOL ConvertBuffer_32bppCmyk2Rgb32(uint8_t* dest_buf, | 630 bool ConvertBuffer_32bppCmyk2Rgb32(uint8_t* dest_buf, |
631 int dest_pitch, | 631 int dest_pitch, |
632 int width, | 632 int width, |
633 int height, | 633 int height, |
634 const CFX_DIBSource* pSrcBitmap, | 634 const CFX_DIBSource* pSrcBitmap, |
635 int src_left, | 635 int src_left, |
636 int src_top) { | 636 int src_top) { |
637 for (int row = 0; row < height; row++) { | 637 for (int row = 0; row < height; row++) { |
638 uint8_t* dest_scan = dest_buf + row * dest_pitch; | 638 uint8_t* dest_scan = dest_buf + row * dest_pitch; |
639 const uint8_t* src_scan = | 639 const uint8_t* src_scan = |
640 pSrcBitmap->GetScanline(src_top + row) + src_left * 4; | 640 pSrcBitmap->GetScanline(src_top + row) + src_left * 4; |
641 for (int col = 0; col < width; col++) { | 641 for (int col = 0; col < width; col++) { |
642 AdobeCMYK_to_sRGB1(src_scan[0], src_scan[1], src_scan[2], src_scan[3], | 642 AdobeCMYK_to_sRGB1(src_scan[0], src_scan[1], src_scan[2], src_scan[3], |
643 dest_scan[2], dest_scan[1], dest_scan[0]); | 643 dest_scan[2], dest_scan[1], dest_scan[0]); |
644 dest_scan += 4; | 644 dest_scan += 4; |
645 src_scan += 4; | 645 src_scan += 4; |
646 } | 646 } |
647 } | 647 } |
648 return TRUE; | 648 return true; |
649 } | 649 } |
650 | 650 |
651 FX_BOOL ConvertBuffer(FXDIB_Format dest_format, | 651 bool ConvertBuffer(FXDIB_Format dest_format, |
652 uint8_t* dest_buf, | 652 uint8_t* dest_buf, |
653 int dest_pitch, | 653 int dest_pitch, |
654 int width, | 654 int width, |
655 int height, | 655 int height, |
656 const CFX_DIBSource* pSrcBitmap, | 656 const CFX_DIBSource* pSrcBitmap, |
657 int src_left, | 657 int src_left, |
658 int src_top, | 658 int src_top, |
659 std::unique_ptr<uint32_t, FxFreeDeleter>* p_pal) { | 659 std::unique_ptr<uint32_t, FxFreeDeleter>* p_pal) { |
660 FXDIB_Format src_format = pSrcBitmap->GetFormat(); | 660 FXDIB_Format src_format = pSrcBitmap->GetFormat(); |
661 switch (dest_format) { | 661 switch (dest_format) { |
662 case FXDIB_Invalid: | 662 case FXDIB_Invalid: |
663 case FXDIB_1bppCmyk: | 663 case FXDIB_1bppCmyk: |
664 case FXDIB_1bppMask: | 664 case FXDIB_1bppMask: |
665 case FXDIB_1bppRgb: | 665 case FXDIB_1bppRgb: |
666 ASSERT(FALSE); | 666 ASSERT(false); |
667 return FALSE; | 667 return false; |
668 case FXDIB_8bppMask: { | 668 case FXDIB_8bppMask: { |
669 if ((src_format & 0xff) == 1) { | 669 if ((src_format & 0xff) == 1) { |
670 if (pSrcBitmap->GetPalette()) { | 670 if (pSrcBitmap->GetPalette()) { |
671 return ConvertBuffer_1bppPlt2Gray(dest_buf, dest_pitch, width, height, | 671 return ConvertBuffer_1bppPlt2Gray(dest_buf, dest_pitch, width, height, |
672 pSrcBitmap, src_left, src_top); | 672 pSrcBitmap, src_left, src_top); |
673 } | 673 } |
674 return ConvertBuffer_1bppMask2Gray(dest_buf, dest_pitch, width, height, | 674 return ConvertBuffer_1bppMask2Gray(dest_buf, dest_pitch, width, height, |
675 pSrcBitmap, src_left, src_top); | 675 pSrcBitmap, src_left, src_top); |
676 } | 676 } |
677 if ((src_format & 0xff) == 8) { | 677 if ((src_format & 0xff) == 8) { |
678 if (pSrcBitmap->GetPalette()) { | 678 if (pSrcBitmap->GetPalette()) { |
679 return ConvertBuffer_8bppPlt2Gray(dest_buf, dest_pitch, width, height, | 679 return ConvertBuffer_8bppPlt2Gray(dest_buf, dest_pitch, width, height, |
680 pSrcBitmap, src_left, src_top); | 680 pSrcBitmap, src_left, src_top); |
681 } | 681 } |
682 return ConvertBuffer_8bppMask2Gray(dest_buf, dest_pitch, width, height, | 682 return ConvertBuffer_8bppMask2Gray(dest_buf, dest_pitch, width, height, |
683 pSrcBitmap, src_left, src_top); | 683 pSrcBitmap, src_left, src_top); |
684 } | 684 } |
685 if ((src_format & 0xff) >= 24) { | 685 if ((src_format & 0xff) >= 24) { |
686 return ConvertBuffer_RgbOrCmyk2Gray(dest_buf, dest_pitch, width, height, | 686 return ConvertBuffer_RgbOrCmyk2Gray(dest_buf, dest_pitch, width, height, |
687 pSrcBitmap, src_left, src_top); | 687 pSrcBitmap, src_left, src_top); |
688 } | 688 } |
689 return FALSE; | 689 return false; |
690 } | 690 } |
691 case FXDIB_8bppRgb: | 691 case FXDIB_8bppRgb: |
692 case FXDIB_8bppRgba: { | 692 case FXDIB_8bppRgba: { |
693 if ((src_format & 0xff) == 8 && !pSrcBitmap->GetPalette()) { | 693 if ((src_format & 0xff) == 8 && !pSrcBitmap->GetPalette()) { |
694 return ConvertBuffer(FXDIB_8bppMask, dest_buf, dest_pitch, width, | 694 return ConvertBuffer(FXDIB_8bppMask, dest_buf, dest_pitch, width, |
695 height, pSrcBitmap, src_left, src_top, p_pal); | 695 height, pSrcBitmap, src_left, src_top, p_pal); |
696 } | 696 } |
697 p_pal->reset(FX_Alloc(uint32_t, 256)); | 697 p_pal->reset(FX_Alloc(uint32_t, 256)); |
698 if (((src_format & 0xff) == 1 || (src_format & 0xff) == 8) && | 698 if (((src_format & 0xff) == 1 || (src_format & 0xff) == 8) && |
699 pSrcBitmap->GetPalette()) { | 699 pSrcBitmap->GetPalette()) { |
700 return ConvertBuffer_Plt2PltRgb8(dest_buf, dest_pitch, width, height, | 700 return ConvertBuffer_Plt2PltRgb8(dest_buf, dest_pitch, width, height, |
701 pSrcBitmap, src_left, src_top, | 701 pSrcBitmap, src_left, src_top, |
702 p_pal->get()); | 702 p_pal->get()); |
703 } | 703 } |
704 if ((src_format & 0xff) >= 24) { | 704 if ((src_format & 0xff) >= 24) { |
705 return ConvertBuffer_Rgb2PltRgb8(dest_buf, dest_pitch, width, height, | 705 return ConvertBuffer_Rgb2PltRgb8(dest_buf, dest_pitch, width, height, |
706 pSrcBitmap, src_left, src_top, | 706 pSrcBitmap, src_left, src_top, |
707 p_pal->get()); | 707 p_pal->get()); |
708 } | 708 } |
709 return FALSE; | 709 return false; |
710 } | 710 } |
711 case FXDIB_Rgb: | 711 case FXDIB_Rgb: |
712 case FXDIB_Rgba: { | 712 case FXDIB_Rgba: { |
713 if ((src_format & 0xff) == 1) { | 713 if ((src_format & 0xff) == 1) { |
714 if (pSrcBitmap->GetPalette()) { | 714 if (pSrcBitmap->GetPalette()) { |
715 return ConvertBuffer_1bppPlt2Rgb(dest_format, dest_buf, dest_pitch, | 715 return ConvertBuffer_1bppPlt2Rgb(dest_format, dest_buf, dest_pitch, |
716 width, height, pSrcBitmap, src_left, | 716 width, height, pSrcBitmap, src_left, |
717 src_top); | 717 src_top); |
718 } | 718 } |
719 return ConvertBuffer_1bppMask2Rgb(dest_format, dest_buf, dest_pitch, | 719 return ConvertBuffer_1bppMask2Rgb(dest_format, dest_buf, dest_pitch, |
(...skipping 11 matching lines...) Expand all Loading... |
731 src_top); | 731 src_top); |
732 } | 732 } |
733 if ((src_format & 0xff) == 24) { | 733 if ((src_format & 0xff) == 24) { |
734 return ConvertBuffer_24bppRgb2Rgb24(dest_buf, dest_pitch, width, height, | 734 return ConvertBuffer_24bppRgb2Rgb24(dest_buf, dest_pitch, width, height, |
735 pSrcBitmap, src_left, src_top); | 735 pSrcBitmap, src_left, src_top); |
736 } | 736 } |
737 if ((src_format & 0xff) == 32) { | 737 if ((src_format & 0xff) == 32) { |
738 return ConvertBuffer_32bppRgb2Rgb24(dest_buf, dest_pitch, width, height, | 738 return ConvertBuffer_32bppRgb2Rgb24(dest_buf, dest_pitch, width, height, |
739 pSrcBitmap, src_left, src_top); | 739 pSrcBitmap, src_left, src_top); |
740 } | 740 } |
741 return FALSE; | 741 return false; |
742 } | 742 } |
743 case FXDIB_Argb: | 743 case FXDIB_Argb: |
744 case FXDIB_Rgb32: { | 744 case FXDIB_Rgb32: { |
745 if ((src_format & 0xff) == 1) { | 745 if ((src_format & 0xff) == 1) { |
746 if (pSrcBitmap->GetPalette()) { | 746 if (pSrcBitmap->GetPalette()) { |
747 return ConvertBuffer_1bppPlt2Rgb(dest_format, dest_buf, dest_pitch, | 747 return ConvertBuffer_1bppPlt2Rgb(dest_format, dest_buf, dest_pitch, |
748 width, height, pSrcBitmap, src_left, | 748 width, height, pSrcBitmap, src_left, |
749 src_top); | 749 src_top); |
750 } | 750 } |
751 return ConvertBuffer_1bppMask2Rgb(dest_format, dest_buf, dest_pitch, | 751 return ConvertBuffer_1bppMask2Rgb(dest_format, dest_buf, dest_pitch, |
(...skipping 12 matching lines...) Expand all Loading... |
764 } | 764 } |
765 if ((src_format & 0xff) >= 24) { | 765 if ((src_format & 0xff) >= 24) { |
766 if (src_format & 0x0400) { | 766 if (src_format & 0x0400) { |
767 return ConvertBuffer_32bppCmyk2Rgb32(dest_buf, dest_pitch, width, | 767 return ConvertBuffer_32bppCmyk2Rgb32(dest_buf, dest_pitch, width, |
768 height, pSrcBitmap, src_left, | 768 height, pSrcBitmap, src_left, |
769 src_top); | 769 src_top); |
770 } | 770 } |
771 return ConvertBuffer_Rgb2Rgb32(dest_buf, dest_pitch, width, height, | 771 return ConvertBuffer_Rgb2Rgb32(dest_buf, dest_pitch, width, height, |
772 pSrcBitmap, src_left, src_top); | 772 pSrcBitmap, src_left, src_top); |
773 } | 773 } |
774 return FALSE; | 774 return false; |
775 } | 775 } |
776 default: | 776 default: |
777 return FALSE; | 777 return false; |
778 } | 778 } |
779 } | 779 } |
780 | 780 |
781 CFX_DIBitmap* CFX_DIBSource::CloneConvert(FXDIB_Format dest_format) const { | 781 CFX_DIBitmap* CFX_DIBSource::CloneConvert(FXDIB_Format dest_format) const { |
782 if (dest_format == GetFormat()) | 782 if (dest_format == GetFormat()) |
783 return Clone(nullptr); | 783 return Clone(nullptr); |
784 | 784 |
785 std::unique_ptr<CFX_DIBitmap> pClone(new CFX_DIBitmap); | 785 std::unique_ptr<CFX_DIBitmap> pClone(new CFX_DIBitmap); |
786 if (!pClone->Create(m_Width, m_Height, dest_format)) | 786 if (!pClone->Create(m_Width, m_Height, dest_format)) |
787 return nullptr; | 787 return nullptr; |
788 | 788 |
789 CFX_DIBitmap* pSrcAlpha = nullptr; | 789 CFX_DIBitmap* pSrcAlpha = nullptr; |
790 if (HasAlpha()) { | 790 if (HasAlpha()) { |
791 pSrcAlpha = (GetFormat() == FXDIB_Argb) ? GetAlphaMask() : m_pAlphaMask; | 791 pSrcAlpha = (GetFormat() == FXDIB_Argb) ? GetAlphaMask() : m_pAlphaMask; |
792 if (!pSrcAlpha) | 792 if (!pSrcAlpha) |
793 return nullptr; | 793 return nullptr; |
794 } | 794 } |
795 | 795 |
796 FX_BOOL ret = TRUE; | 796 bool ret = true; |
797 if (dest_format & 0x0200) { | 797 if (dest_format & 0x0200) { |
798 if (dest_format == FXDIB_Argb) { | 798 if (dest_format == FXDIB_Argb) { |
799 ret = pSrcAlpha ? pClone->LoadChannel(FXDIB_Alpha, pSrcAlpha, FXDIB_Alpha) | 799 ret = pSrcAlpha ? pClone->LoadChannel(FXDIB_Alpha, pSrcAlpha, FXDIB_Alpha) |
800 : pClone->LoadChannel(FXDIB_Alpha, 0xff); | 800 : pClone->LoadChannel(FXDIB_Alpha, 0xff); |
801 } else { | 801 } else { |
802 ret = pClone->CopyAlphaMask(pSrcAlpha); | 802 ret = pClone->CopyAlphaMask(pSrcAlpha); |
803 } | 803 } |
804 } | 804 } |
805 if (pSrcAlpha && pSrcAlpha != m_pAlphaMask) { | 805 if (pSrcAlpha && pSrcAlpha != m_pAlphaMask) { |
806 delete pSrcAlpha; | 806 delete pSrcAlpha; |
807 pSrcAlpha = nullptr; | 807 pSrcAlpha = nullptr; |
808 } | 808 } |
809 if (!ret) | 809 if (!ret) |
810 return nullptr; | 810 return nullptr; |
811 | 811 |
812 std::unique_ptr<uint32_t, FxFreeDeleter> pal_8bpp; | 812 std::unique_ptr<uint32_t, FxFreeDeleter> pal_8bpp; |
813 if (!ConvertBuffer(dest_format, pClone->GetBuffer(), pClone->GetPitch(), | 813 if (!ConvertBuffer(dest_format, pClone->GetBuffer(), pClone->GetPitch(), |
814 m_Width, m_Height, this, 0, 0, &pal_8bpp)) { | 814 m_Width, m_Height, this, 0, 0, &pal_8bpp)) { |
815 return nullptr; | 815 return nullptr; |
816 } | 816 } |
817 if (pal_8bpp) | 817 if (pal_8bpp) |
818 pClone->CopyPalette(pal_8bpp.get()); | 818 pClone->CopyPalette(pal_8bpp.get()); |
819 return pClone.release(); | 819 return pClone.release(); |
820 } | 820 } |
821 | 821 |
822 FX_BOOL CFX_DIBitmap::ConvertFormat(FXDIB_Format dest_format) { | 822 bool CFX_DIBitmap::ConvertFormat(FXDIB_Format dest_format) { |
823 FXDIB_Format src_format = GetFormat(); | 823 FXDIB_Format src_format = GetFormat(); |
824 if (dest_format == src_format) | 824 if (dest_format == src_format) |
825 return TRUE; | 825 return true; |
826 | 826 |
827 if (dest_format == FXDIB_8bppMask && src_format == FXDIB_8bppRgb && | 827 if (dest_format == FXDIB_8bppMask && src_format == FXDIB_8bppRgb && |
828 !m_pPalette) { | 828 !m_pPalette) { |
829 m_AlphaFlag = 1; | 829 m_AlphaFlag = 1; |
830 return TRUE; | 830 return true; |
831 } | 831 } |
832 if (dest_format == FXDIB_Argb && src_format == FXDIB_Rgb32) { | 832 if (dest_format == FXDIB_Argb && src_format == FXDIB_Rgb32) { |
833 m_AlphaFlag = 2; | 833 m_AlphaFlag = 2; |
834 for (int row = 0; row < m_Height; row++) { | 834 for (int row = 0; row < m_Height; row++) { |
835 uint8_t* scanline = m_pBuffer + row * m_Pitch + 3; | 835 uint8_t* scanline = m_pBuffer + row * m_Pitch + 3; |
836 for (int col = 0; col < m_Width; col++) { | 836 for (int col = 0; col < m_Width; col++) { |
837 *scanline = 0xff; | 837 *scanline = 0xff; |
838 scanline += 4; | 838 scanline += 4; |
839 } | 839 } |
840 } | 840 } |
841 return TRUE; | 841 return true; |
842 } | 842 } |
843 int dest_bpp = dest_format & 0xff; | 843 int dest_bpp = dest_format & 0xff; |
844 int dest_pitch = (dest_bpp * m_Width + 31) / 32 * 4; | 844 int dest_pitch = (dest_bpp * m_Width + 31) / 32 * 4; |
845 uint8_t* dest_buf = FX_TryAlloc(uint8_t, dest_pitch * m_Height + 4); | 845 uint8_t* dest_buf = FX_TryAlloc(uint8_t, dest_pitch * m_Height + 4); |
846 if (!dest_buf) { | 846 if (!dest_buf) { |
847 return FALSE; | 847 return false; |
848 } | 848 } |
849 CFX_DIBitmap* pAlphaMask = nullptr; | 849 CFX_DIBitmap* pAlphaMask = nullptr; |
850 if (dest_format == FXDIB_Argb) { | 850 if (dest_format == FXDIB_Argb) { |
851 FXSYS_memset(dest_buf, 0xff, dest_pitch * m_Height + 4); | 851 FXSYS_memset(dest_buf, 0xff, dest_pitch * m_Height + 4); |
852 if (m_pAlphaMask) { | 852 if (m_pAlphaMask) { |
853 for (int row = 0; row < m_Height; row++) { | 853 for (int row = 0; row < m_Height; row++) { |
854 uint8_t* pDstScanline = dest_buf + row * dest_pitch + 3; | 854 uint8_t* pDstScanline = dest_buf + row * dest_pitch + 3; |
855 const uint8_t* pSrcScanline = m_pAlphaMask->GetScanline(row); | 855 const uint8_t* pSrcScanline = m_pAlphaMask->GetScanline(row); |
856 for (int col = 0; col < m_Width; col++) { | 856 for (int col = 0; col < m_Width; col++) { |
857 *pDstScanline = *pSrcScanline++; | 857 *pDstScanline = *pSrcScanline++; |
858 pDstScanline += 4; | 858 pDstScanline += 4; |
859 } | 859 } |
860 } | 860 } |
861 } | 861 } |
862 } else if (dest_format & 0x0200) { | 862 } else if (dest_format & 0x0200) { |
863 if (src_format == FXDIB_Argb) { | 863 if (src_format == FXDIB_Argb) { |
864 pAlphaMask = GetAlphaMask(); | 864 pAlphaMask = GetAlphaMask(); |
865 if (!pAlphaMask) { | 865 if (!pAlphaMask) { |
866 FX_Free(dest_buf); | 866 FX_Free(dest_buf); |
867 return FALSE; | 867 return false; |
868 } | 868 } |
869 } else { | 869 } else { |
870 if (!m_pAlphaMask) { | 870 if (!m_pAlphaMask) { |
871 if (!BuildAlphaMask()) { | 871 if (!BuildAlphaMask()) { |
872 FX_Free(dest_buf); | 872 FX_Free(dest_buf); |
873 return FALSE; | 873 return false; |
874 } | 874 } |
875 pAlphaMask = m_pAlphaMask; | 875 pAlphaMask = m_pAlphaMask; |
876 m_pAlphaMask = nullptr; | 876 m_pAlphaMask = nullptr; |
877 } else { | 877 } else { |
878 pAlphaMask = m_pAlphaMask; | 878 pAlphaMask = m_pAlphaMask; |
879 } | 879 } |
880 } | 880 } |
881 } | 881 } |
882 FX_BOOL ret = FALSE; | 882 bool ret = false; |
883 std::unique_ptr<uint32_t, FxFreeDeleter> pal_8bpp; | 883 std::unique_ptr<uint32_t, FxFreeDeleter> pal_8bpp; |
884 ret = ConvertBuffer(dest_format, dest_buf, dest_pitch, m_Width, m_Height, | 884 ret = ConvertBuffer(dest_format, dest_buf, dest_pitch, m_Width, m_Height, |
885 this, 0, 0, &pal_8bpp); | 885 this, 0, 0, &pal_8bpp); |
886 if (!ret) { | 886 if (!ret) { |
887 if (pAlphaMask != m_pAlphaMask) | 887 if (pAlphaMask != m_pAlphaMask) |
888 delete pAlphaMask; | 888 delete pAlphaMask; |
889 FX_Free(dest_buf); | 889 FX_Free(dest_buf); |
890 return FALSE; | 890 return false; |
891 } | 891 } |
892 if (m_pAlphaMask && pAlphaMask != m_pAlphaMask) | 892 if (m_pAlphaMask && pAlphaMask != m_pAlphaMask) |
893 delete m_pAlphaMask; | 893 delete m_pAlphaMask; |
894 m_pAlphaMask = pAlphaMask; | 894 m_pAlphaMask = pAlphaMask; |
895 m_pPalette = std::move(pal_8bpp); | 895 m_pPalette = std::move(pal_8bpp); |
896 if (!m_bExtBuf) | 896 if (!m_bExtBuf) |
897 FX_Free(m_pBuffer); | 897 FX_Free(m_pBuffer); |
898 m_bExtBuf = FALSE; | 898 m_bExtBuf = false; |
899 m_pBuffer = dest_buf; | 899 m_pBuffer = dest_buf; |
900 m_bpp = (uint8_t)dest_format; | 900 m_bpp = (uint8_t)dest_format; |
901 m_AlphaFlag = (uint8_t)(dest_format >> 8); | 901 m_AlphaFlag = (uint8_t)(dest_format >> 8); |
902 m_Pitch = dest_pitch; | 902 m_Pitch = dest_pitch; |
903 return TRUE; | 903 return true; |
904 } | 904 } |
OLD | NEW |