OLD | NEW |
| (Empty) |
1 // Copyright 2014 PDFium Authors. All rights reserved. | |
2 // Use of this source code is governed by a BSD-style license that can be | |
3 // found in the LICENSE file. | |
4 | |
5 // Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com | |
6 | |
7 #include "core/src/fxge/dib/dib_int.h" | |
8 | |
9 #include "core/include/fxge/fx_dib.h" | |
10 | |
11 namespace { | |
12 | |
13 uint8_t bilinear_interpol(const uint8_t* buf, | |
14 int row_offset_l, | |
15 int row_offset_r, | |
16 int src_col_l, | |
17 int src_col_r, | |
18 int res_x, | |
19 int res_y, | |
20 int bpp, | |
21 int c_offset) { | |
22 int i_resx = 255 - res_x; | |
23 int col_bpp_l = src_col_l * bpp; | |
24 int col_bpp_r = src_col_r * bpp; | |
25 const uint8_t* buf_u = buf + row_offset_l + c_offset; | |
26 const uint8_t* buf_d = buf + row_offset_r + c_offset; | |
27 const uint8_t* src_pos0 = buf_u + col_bpp_l; | |
28 const uint8_t* src_pos1 = buf_u + col_bpp_r; | |
29 const uint8_t* src_pos2 = buf_d + col_bpp_l; | |
30 const uint8_t* src_pos3 = buf_d + col_bpp_r; | |
31 uint8_t r_pos_0 = (*src_pos0 * i_resx + *src_pos1 * res_x) >> 8; | |
32 uint8_t r_pos_1 = (*src_pos2 * i_resx + *src_pos3 * res_x) >> 8; | |
33 return (r_pos_0 * (255 - res_y) + r_pos_1 * res_y) >> 8; | |
34 } | |
35 | |
36 uint8_t bicubic_interpol(const uint8_t* buf, | |
37 int pitch, | |
38 int pos_pixel[], | |
39 int u_w[], | |
40 int v_w[], | |
41 int res_x, | |
42 int res_y, | |
43 int bpp, | |
44 int c_offset) { | |
45 int s_result = 0; | |
46 for (int i = 0; i < 4; i++) { | |
47 int a_result = 0; | |
48 for (int j = 0; j < 4; j++) { | |
49 a_result += u_w[j] * (*(uint8_t*)(buf + pos_pixel[i + 4] * pitch + | |
50 pos_pixel[j] * bpp + c_offset)); | |
51 } | |
52 s_result += a_result * v_w[i]; | |
53 } | |
54 s_result >>= 16; | |
55 return (uint8_t)(s_result < 0 ? 0 : s_result > 255 ? 255 : s_result); | |
56 } | |
57 | |
58 void bicubic_get_pos_weight(int pos_pixel[], | |
59 int u_w[], | |
60 int v_w[], | |
61 int src_col_l, | |
62 int src_row_l, | |
63 int res_x, | |
64 int res_y, | |
65 int stretch_width, | |
66 int stretch_height) { | |
67 pos_pixel[0] = src_col_l - 1; | |
68 pos_pixel[1] = src_col_l; | |
69 pos_pixel[2] = src_col_l + 1; | |
70 pos_pixel[3] = src_col_l + 2; | |
71 pos_pixel[4] = src_row_l - 1; | |
72 pos_pixel[5] = src_row_l; | |
73 pos_pixel[6] = src_row_l + 1; | |
74 pos_pixel[7] = src_row_l + 2; | |
75 for (int i = 0; i < 4; i++) { | |
76 if (pos_pixel[i] < 0) { | |
77 pos_pixel[i] = 0; | |
78 } | |
79 if (pos_pixel[i] >= stretch_width) { | |
80 pos_pixel[i] = stretch_width - 1; | |
81 } | |
82 if (pos_pixel[i + 4] < 0) { | |
83 pos_pixel[i + 4] = 0; | |
84 } | |
85 if (pos_pixel[i + 4] >= stretch_height) { | |
86 pos_pixel[i + 4] = stretch_height - 1; | |
87 } | |
88 } | |
89 u_w[0] = SDP_Table[256 + res_x]; | |
90 u_w[1] = SDP_Table[res_x]; | |
91 u_w[2] = SDP_Table[256 - res_x]; | |
92 u_w[3] = SDP_Table[512 - res_x]; | |
93 v_w[0] = SDP_Table[256 + res_y]; | |
94 v_w[1] = SDP_Table[res_y]; | |
95 v_w[2] = SDP_Table[256 - res_y]; | |
96 v_w[3] = SDP_Table[512 - res_y]; | |
97 } | |
98 | |
99 FXDIB_Format GetTransformedFormat(const CFX_DIBSource* pDrc) { | |
100 FXDIB_Format format = pDrc->GetFormat(); | |
101 if (pDrc->IsAlphaMask()) { | |
102 format = FXDIB_8bppMask; | |
103 } else if (format >= 1025) { | |
104 format = FXDIB_Cmyka; | |
105 } else if (format <= 32 || format == FXDIB_Argb) { | |
106 format = FXDIB_Argb; | |
107 } else { | |
108 format = FXDIB_Rgba; | |
109 } | |
110 return format; | |
111 } | |
112 | |
113 } // namespace | |
114 | |
115 const int16_t SDP_Table[513] = { | |
116 256, 256, 256, 256, 256, 256, 256, 256, 256, 255, 255, 255, 255, 255, 255, | |
117 254, 254, 254, 254, 253, 253, 253, 252, 252, 252, 251, 251, 251, 250, 250, | |
118 249, 249, 249, 248, 248, 247, 247, 246, 246, 245, 244, 244, 243, 243, 242, | |
119 242, 241, 240, 240, 239, 238, 238, 237, 236, 236, 235, 234, 233, 233, 232, | |
120 231, 230, 230, 229, 228, 227, 226, 226, 225, 224, 223, 222, 221, 220, 219, | |
121 218, 218, 217, 216, 215, 214, 213, 212, 211, 210, 209, 208, 207, 206, 205, | |
122 204, 203, 202, 201, 200, 199, 198, 196, 195, 194, 193, 192, 191, 190, 189, | |
123 188, 186, 185, 184, 183, 182, 181, 179, 178, 177, 176, 175, 173, 172, 171, | |
124 170, 169, 167, 166, 165, 164, 162, 161, 160, 159, 157, 156, 155, 154, 152, | |
125 151, 150, 149, 147, 146, 145, 143, 142, 141, 140, 138, 137, 136, 134, 133, | |
126 132, 130, 129, 128, 126, 125, 124, 122, 121, 120, 119, 117, 116, 115, 113, | |
127 112, 111, 109, 108, 107, 105, 104, 103, 101, 100, 99, 97, 96, 95, 93, | |
128 92, 91, 89, 88, 87, 85, 84, 83, 81, 80, 79, 77, 76, 75, 73, | |
129 72, 71, 69, 68, 67, 66, 64, 63, 62, 60, 59, 58, 57, 55, 54, | |
130 53, 52, 50, 49, 48, 47, 45, 44, 43, 42, 40, 39, 38, 37, 36, | |
131 34, 33, 32, 31, 30, 28, 27, 26, 25, 24, 23, 21, 20, 19, 18, | |
132 17, 16, 15, 14, 13, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, | |
133 1, 0, 0, -1, -2, -3, -4, -5, -6, -7, -7, -8, -9, -10, -11, | |
134 -12, -12, -13, -14, -15, -15, -16, -17, -17, -18, -19, -19, -20, -21, -21, | |
135 -22, -22, -23, -24, -24, -25, -25, -26, -26, -27, -27, -27, -28, -28, -29, | |
136 -29, -30, -30, -30, -31, -31, -31, -32, -32, -32, -33, -33, -33, -33, -34, | |
137 -34, -34, -34, -35, -35, -35, -35, -35, -36, -36, -36, -36, -36, -36, -36, | |
138 -36, -36, -37, -37, -37, -37, -37, -37, -37, -37, -37, -37, -37, -37, -37, | |
139 -37, -37, -37, -37, -37, -37, -37, -37, -36, -36, -36, -36, -36, -36, -36, | |
140 -36, -36, -35, -35, -35, -35, -35, -35, -34, -34, -34, -34, -34, -33, -33, | |
141 -33, -33, -33, -32, -32, -32, -32, -31, -31, -31, -31, -30, -30, -30, -30, | |
142 -29, -29, -29, -29, -28, -28, -28, -27, -27, -27, -27, -26, -26, -26, -25, | |
143 -25, -25, -24, -24, -24, -23, -23, -23, -22, -22, -22, -22, -21, -21, -21, | |
144 -20, -20, -20, -19, -19, -19, -18, -18, -18, -17, -17, -17, -16, -16, -16, | |
145 -15, -15, -15, -14, -14, -14, -13, -13, -13, -12, -12, -12, -11, -11, -11, | |
146 -10, -10, -10, -9, -9, -9, -9, -8, -8, -8, -7, -7, -7, -7, -6, | |
147 -6, -6, -6, -5, -5, -5, -5, -4, -4, -4, -4, -3, -3, -3, -3, | |
148 -3, -2, -2, -2, -2, -2, -1, -1, -1, -1, -1, -1, 0, 0, 0, | |
149 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, | |
150 0, 0, 0, | |
151 }; | |
152 | |
153 class CFX_BilinearMatrix : public CPDF_FixedMatrix { | |
154 public: | |
155 CFX_BilinearMatrix(const CFX_Matrix& src, int bits) | |
156 : CPDF_FixedMatrix(src, bits) {} | |
157 inline void Transform(int x, | |
158 int y, | |
159 int& x1, | |
160 int& y1, | |
161 int& res_x, | |
162 int& res_y) { | |
163 x1 = a * x + c * y + e + base / 2; | |
164 y1 = b * x + d * y + f + base / 2; | |
165 res_x = x1 % base; | |
166 res_y = y1 % base; | |
167 if (res_x < 0 && res_x > -base) { | |
168 res_x = base + res_x; | |
169 } | |
170 if (res_y < 0 && res_x > -base) { | |
171 res_y = base + res_y; | |
172 } | |
173 x1 /= base; | |
174 y1 /= base; | |
175 } | |
176 }; | |
177 CFX_DIBitmap* CFX_DIBSource::SwapXY(FX_BOOL bXFlip, | |
178 FX_BOOL bYFlip, | |
179 const FX_RECT* pDestClip) const { | |
180 FX_RECT dest_clip(0, 0, m_Height, m_Width); | |
181 if (pDestClip) { | |
182 dest_clip.Intersect(*pDestClip); | |
183 } | |
184 if (dest_clip.IsEmpty()) { | |
185 return NULL; | |
186 } | |
187 CFX_DIBitmap* pTransBitmap = new CFX_DIBitmap; | |
188 int result_height = dest_clip.Height(), result_width = dest_clip.Width(); | |
189 if (!pTransBitmap->Create(result_width, result_height, GetFormat())) { | |
190 delete pTransBitmap; | |
191 return NULL; | |
192 } | |
193 pTransBitmap->CopyPalette(m_pPalette); | |
194 int dest_pitch = pTransBitmap->GetPitch(); | |
195 uint8_t* dest_buf = pTransBitmap->GetBuffer(); | |
196 int row_start = bXFlip ? m_Height - dest_clip.right : dest_clip.left; | |
197 int row_end = bXFlip ? m_Height - dest_clip.left : dest_clip.right; | |
198 int col_start = bYFlip ? m_Width - dest_clip.bottom : dest_clip.top; | |
199 int col_end = bYFlip ? m_Width - dest_clip.top : dest_clip.bottom; | |
200 if (GetBPP() == 1) { | |
201 FXSYS_memset(dest_buf, 0xff, dest_pitch * result_height); | |
202 for (int row = row_start; row < row_end; row++) { | |
203 const uint8_t* src_scan = GetScanline(row); | |
204 int dest_col = (bXFlip ? dest_clip.right - (row - row_start) - 1 : row) - | |
205 dest_clip.left; | |
206 uint8_t* dest_scan = dest_buf; | |
207 if (bYFlip) { | |
208 dest_scan += (result_height - 1) * dest_pitch; | |
209 } | |
210 int dest_step = bYFlip ? -dest_pitch : dest_pitch; | |
211 for (int col = col_start; col < col_end; col++) { | |
212 if (!(src_scan[col / 8] & (1 << (7 - col % 8)))) { | |
213 dest_scan[dest_col / 8] &= ~(1 << (7 - dest_col % 8)); | |
214 } | |
215 dest_scan += dest_step; | |
216 } | |
217 } | |
218 } else { | |
219 int nBytes = GetBPP() / 8; | |
220 int dest_step = bYFlip ? -dest_pitch : dest_pitch; | |
221 if (nBytes == 3) { | |
222 dest_step -= 2; | |
223 } | |
224 for (int row = row_start; row < row_end; row++) { | |
225 int dest_col = (bXFlip ? dest_clip.right - (row - row_start) - 1 : row) - | |
226 dest_clip.left; | |
227 uint8_t* dest_scan = dest_buf + dest_col * nBytes; | |
228 if (bYFlip) { | |
229 dest_scan += (result_height - 1) * dest_pitch; | |
230 } | |
231 if (nBytes == 4) { | |
232 FX_DWORD* src_scan = (FX_DWORD*)GetScanline(row) + col_start; | |
233 for (int col = col_start; col < col_end; col++) { | |
234 *(FX_DWORD*)dest_scan = *src_scan++; | |
235 dest_scan += dest_step; | |
236 } | |
237 } else { | |
238 const uint8_t* src_scan = GetScanline(row) + col_start * nBytes; | |
239 if (nBytes == 1) { | |
240 for (int col = col_start; col < col_end; col++) { | |
241 *dest_scan = *src_scan++; | |
242 dest_scan += dest_step; | |
243 } | |
244 } else { | |
245 for (int col = col_start; col < col_end; col++) { | |
246 *dest_scan++ = *src_scan++; | |
247 *dest_scan++ = *src_scan++; | |
248 *dest_scan = *src_scan++; | |
249 dest_scan += dest_step; | |
250 } | |
251 } | |
252 } | |
253 } | |
254 } | |
255 if (m_pAlphaMask) { | |
256 dest_pitch = pTransBitmap->m_pAlphaMask->GetPitch(); | |
257 dest_buf = pTransBitmap->m_pAlphaMask->GetBuffer(); | |
258 int dest_step = bYFlip ? -dest_pitch : dest_pitch; | |
259 for (int row = row_start; row < row_end; row++) { | |
260 int dest_col = (bXFlip ? dest_clip.right - (row - row_start) - 1 : row) - | |
261 dest_clip.left; | |
262 uint8_t* dest_scan = dest_buf + dest_col; | |
263 if (bYFlip) { | |
264 dest_scan += (result_height - 1) * dest_pitch; | |
265 } | |
266 const uint8_t* src_scan = m_pAlphaMask->GetScanline(row) + col_start; | |
267 for (int col = col_start; col < col_end; col++) { | |
268 *dest_scan = *src_scan++; | |
269 dest_scan += dest_step; | |
270 } | |
271 } | |
272 } | |
273 return pTransBitmap; | |
274 } | |
275 #define FIX16_005 0.05f | |
276 FX_RECT FXDIB_SwapClipBox(FX_RECT& clip, | |
277 int width, | |
278 int height, | |
279 FX_BOOL bFlipX, | |
280 FX_BOOL bFlipY) { | |
281 FX_RECT rect; | |
282 if (bFlipY) { | |
283 rect.left = height - clip.top; | |
284 rect.right = height - clip.bottom; | |
285 } else { | |
286 rect.left = clip.top; | |
287 rect.right = clip.bottom; | |
288 } | |
289 if (bFlipX) { | |
290 rect.top = width - clip.left; | |
291 rect.bottom = width - clip.right; | |
292 } else { | |
293 rect.top = clip.left; | |
294 rect.bottom = clip.right; | |
295 } | |
296 rect.Normalize(); | |
297 return rect; | |
298 } | |
299 CFX_DIBitmap* CFX_DIBSource::TransformTo(const CFX_Matrix* pDestMatrix, | |
300 int& result_left, | |
301 int& result_top, | |
302 FX_DWORD flags, | |
303 const FX_RECT* pDestClip) const { | |
304 CFX_ImageTransformer transformer; | |
305 transformer.Start(this, pDestMatrix, flags, pDestClip); | |
306 transformer.Continue(NULL); | |
307 result_left = transformer.m_ResultLeft; | |
308 result_top = transformer.m_ResultTop; | |
309 CFX_DIBitmap* pTransformed = transformer.m_Storer.Detach(); | |
310 return pTransformed; | |
311 } | |
312 CFX_DIBitmap* CFX_DIBSource::StretchTo(int dest_width, | |
313 int dest_height, | |
314 FX_DWORD flags, | |
315 const FX_RECT* pClip) const { | |
316 FX_RECT clip_rect(0, 0, FXSYS_abs(dest_width), FXSYS_abs(dest_height)); | |
317 if (pClip) { | |
318 clip_rect.Intersect(*pClip); | |
319 } | |
320 if (clip_rect.IsEmpty()) { | |
321 return NULL; | |
322 } | |
323 if (dest_width == m_Width && dest_height == m_Height) { | |
324 return Clone(&clip_rect); | |
325 } | |
326 CFX_ImageStretcher stretcher; | |
327 CFX_BitmapStorer storer; | |
328 if (stretcher.Start(&storer, this, dest_width, dest_height, clip_rect, | |
329 flags)) { | |
330 stretcher.Continue(NULL); | |
331 } | |
332 return storer.Detach(); | |
333 } | |
334 CFX_ImageTransformer::CFX_ImageTransformer() { | |
335 m_Status = 0; | |
336 m_pMatrix = NULL; | |
337 } | |
338 CFX_ImageTransformer::~CFX_ImageTransformer() {} | |
339 FX_BOOL CFX_ImageTransformer::Start(const CFX_DIBSource* pSrc, | |
340 const CFX_Matrix* pDestMatrix, | |
341 int flags, | |
342 const FX_RECT* pDestClip) { | |
343 m_pMatrix = (CFX_Matrix*)pDestMatrix; | |
344 CFX_FloatRect unit_rect = pDestMatrix->GetUnitRect(); | |
345 FX_RECT result_rect = unit_rect.GetClosestRect(); | |
346 FX_RECT result_clip = result_rect; | |
347 if (pDestClip) { | |
348 result_clip.Intersect(*pDestClip); | |
349 } | |
350 if (result_clip.IsEmpty()) { | |
351 return FALSE; | |
352 } | |
353 m_ResultLeft = result_clip.left; | |
354 m_ResultTop = result_clip.top; | |
355 m_ResultWidth = result_clip.Width(); | |
356 m_ResultHeight = result_clip.Height(); | |
357 m_Flags = flags; | |
358 if (FXSYS_fabs(pDestMatrix->a) < FXSYS_fabs(pDestMatrix->b) / 20 && | |
359 FXSYS_fabs(pDestMatrix->d) < FXSYS_fabs(pDestMatrix->c) / 20 && | |
360 FXSYS_fabs(pDestMatrix->a) < 0.5f && FXSYS_fabs(pDestMatrix->d) < 0.5f) { | |
361 int dest_width = result_rect.Width(); | |
362 int dest_height = result_rect.Height(); | |
363 result_clip.Offset(-result_rect.left, -result_rect.top); | |
364 result_clip = FXDIB_SwapClipBox(result_clip, dest_width, dest_height, | |
365 pDestMatrix->c > 0, pDestMatrix->b < 0); | |
366 m_Stretcher.Start(&m_Storer, pSrc, dest_height, dest_width, result_clip, | |
367 flags); | |
368 m_Status = 1; | |
369 return TRUE; | |
370 } | |
371 if (FXSYS_fabs(pDestMatrix->b) < FIX16_005 && | |
372 FXSYS_fabs(pDestMatrix->c) < FIX16_005) { | |
373 int dest_width = pDestMatrix->a > 0 ? (int)FXSYS_ceil(pDestMatrix->a) | |
374 : (int)FXSYS_floor(pDestMatrix->a); | |
375 int dest_height = pDestMatrix->d > 0 ? (int)-FXSYS_ceil(pDestMatrix->d) | |
376 : (int)-FXSYS_floor(pDestMatrix->d); | |
377 result_clip.Offset(-result_rect.left, -result_rect.top); | |
378 m_Stretcher.Start(&m_Storer, pSrc, dest_width, dest_height, result_clip, | |
379 flags); | |
380 m_Status = 2; | |
381 return TRUE; | |
382 } | |
383 int stretch_width = | |
384 (int)FXSYS_ceil(FXSYS_sqrt2(pDestMatrix->a, pDestMatrix->b)); | |
385 int stretch_height = | |
386 (int)FXSYS_ceil(FXSYS_sqrt2(pDestMatrix->c, pDestMatrix->d)); | |
387 CFX_Matrix stretch2dest(1.0f, 0.0f, 0.0f, -1.0f, 0.0f, | |
388 (FX_FLOAT)(stretch_height)); | |
389 stretch2dest.Concat( | |
390 pDestMatrix->a / stretch_width, pDestMatrix->b / stretch_width, | |
391 pDestMatrix->c / stretch_height, pDestMatrix->d / stretch_height, | |
392 pDestMatrix->e, pDestMatrix->f); | |
393 m_dest2stretch.SetReverse(stretch2dest); | |
394 CFX_FloatRect clip_rect_f(result_clip); | |
395 clip_rect_f.Transform(&m_dest2stretch); | |
396 m_StretchClip = clip_rect_f.GetOutterRect(); | |
397 m_StretchClip.Intersect(0, 0, stretch_width, stretch_height); | |
398 m_Stretcher.Start(&m_Storer, pSrc, stretch_width, stretch_height, | |
399 m_StretchClip, flags); | |
400 m_Status = 3; | |
401 return TRUE; | |
402 } | |
403 | |
404 FX_BOOL CFX_ImageTransformer::Continue(IFX_Pause* pPause) { | |
405 if (m_Status == 1) { | |
406 if (m_Stretcher.Continue(pPause)) { | |
407 return TRUE; | |
408 } | |
409 if (m_Storer.GetBitmap()) { | |
410 m_Storer.Replace( | |
411 m_Storer.GetBitmap()->SwapXY(m_pMatrix->c > 0, m_pMatrix->b < 0)); | |
412 } | |
413 return FALSE; | |
414 } | |
415 if (m_Status == 2) { | |
416 return m_Stretcher.Continue(pPause); | |
417 } | |
418 if (m_Status != 3) { | |
419 return FALSE; | |
420 } | |
421 if (m_Stretcher.Continue(pPause)) { | |
422 return TRUE; | |
423 } | |
424 int stretch_width = m_StretchClip.Width(); | |
425 int stretch_height = m_StretchClip.Height(); | |
426 if (!m_Storer.GetBitmap()) { | |
427 return FALSE; | |
428 } | |
429 const uint8_t* stretch_buf = m_Storer.GetBitmap()->GetBuffer(); | |
430 const uint8_t* stretch_buf_mask = NULL; | |
431 if (m_Storer.GetBitmap()->m_pAlphaMask) { | |
432 stretch_buf_mask = m_Storer.GetBitmap()->m_pAlphaMask->GetBuffer(); | |
433 } | |
434 int stretch_pitch = m_Storer.GetBitmap()->GetPitch(); | |
435 CFX_DIBitmap* pTransformed = new CFX_DIBitmap; | |
436 FXDIB_Format transformF = GetTransformedFormat(m_Stretcher.m_pSource); | |
437 if (!pTransformed->Create(m_ResultWidth, m_ResultHeight, transformF)) { | |
438 delete pTransformed; | |
439 return FALSE; | |
440 } | |
441 pTransformed->Clear(0); | |
442 if (pTransformed->m_pAlphaMask) { | |
443 pTransformed->m_pAlphaMask->Clear(0); | |
444 } | |
445 CFX_Matrix result2stretch(1.0f, 0.0f, 0.0f, 1.0f, (FX_FLOAT)(m_ResultLeft), | |
446 (FX_FLOAT)(m_ResultTop)); | |
447 result2stretch.Concat(m_dest2stretch); | |
448 result2stretch.TranslateI(-m_StretchClip.left, -m_StretchClip.top); | |
449 if (!stretch_buf_mask && pTransformed->m_pAlphaMask) { | |
450 pTransformed->m_pAlphaMask->Clear(0xff000000); | |
451 } else if (pTransformed->m_pAlphaMask) { | |
452 int stretch_pitch_mask = m_Storer.GetBitmap()->m_pAlphaMask->GetPitch(); | |
453 if (!(m_Flags & FXDIB_DOWNSAMPLE) && !(m_Flags & FXDIB_BICUBIC_INTERPOL)) { | |
454 CFX_BilinearMatrix result2stretch_fix(result2stretch, 8); | |
455 for (int row = 0; row < m_ResultHeight; row++) { | |
456 uint8_t* dest_pos_mask = | |
457 (uint8_t*)pTransformed->m_pAlphaMask->GetScanline(row); | |
458 for (int col = 0; col < m_ResultWidth; col++) { | |
459 int src_col_l, src_row_l, res_x, res_y; | |
460 result2stretch_fix.Transform(col, row, src_col_l, src_row_l, res_x, | |
461 res_y); | |
462 if (src_col_l >= 0 && src_col_l <= stretch_width && src_row_l >= 0 && | |
463 src_row_l <= stretch_height) { | |
464 if (src_col_l == stretch_width) { | |
465 src_col_l--; | |
466 } | |
467 if (src_row_l == stretch_height) { | |
468 src_row_l--; | |
469 } | |
470 int src_col_r = src_col_l + 1; | |
471 int src_row_r = src_row_l + 1; | |
472 if (src_col_r == stretch_width) { | |
473 src_col_r--; | |
474 } | |
475 if (src_row_r == stretch_height) { | |
476 src_row_r--; | |
477 } | |
478 int row_offset_l = src_row_l * stretch_pitch_mask; | |
479 int row_offset_r = src_row_r * stretch_pitch_mask; | |
480 *dest_pos_mask = | |
481 bilinear_interpol(stretch_buf_mask, row_offset_l, row_offset_r, | |
482 src_col_l, src_col_r, res_x, res_y, 1, 0); | |
483 } | |
484 dest_pos_mask++; | |
485 } | |
486 } | |
487 } else if (m_Flags & FXDIB_BICUBIC_INTERPOL) { | |
488 CFX_BilinearMatrix result2stretch_fix(result2stretch, 8); | |
489 for (int row = 0; row < m_ResultHeight; row++) { | |
490 uint8_t* dest_pos_mask = | |
491 (uint8_t*)pTransformed->m_pAlphaMask->GetScanline(row); | |
492 for (int col = 0; col < m_ResultWidth; col++) { | |
493 int src_col_l, src_row_l, res_x, res_y; | |
494 result2stretch_fix.Transform(col, row, src_col_l, src_row_l, res_x, | |
495 res_y); | |
496 if (src_col_l >= 0 && src_col_l <= stretch_width && src_row_l >= 0 && | |
497 src_row_l <= stretch_height) { | |
498 int pos_pixel[8]; | |
499 int u_w[4], v_w[4]; | |
500 if (src_col_l == stretch_width) { | |
501 src_col_l--; | |
502 } | |
503 if (src_row_l == stretch_height) { | |
504 src_row_l--; | |
505 } | |
506 bicubic_get_pos_weight(pos_pixel, u_w, v_w, src_col_l, src_row_l, | |
507 res_x, res_y, stretch_width, stretch_height); | |
508 *dest_pos_mask = | |
509 bicubic_interpol(stretch_buf_mask, stretch_pitch_mask, | |
510 pos_pixel, u_w, v_w, res_x, res_y, 1, 0); | |
511 } | |
512 dest_pos_mask++; | |
513 } | |
514 } | |
515 } else { | |
516 CPDF_FixedMatrix result2stretch_fix(result2stretch, 8); | |
517 for (int row = 0; row < m_ResultHeight; row++) { | |
518 uint8_t* dest_pos_mask = | |
519 (uint8_t*)pTransformed->m_pAlphaMask->GetScanline(row); | |
520 for (int col = 0; col < m_ResultWidth; col++) { | |
521 int src_col, src_row; | |
522 result2stretch_fix.Transform(col, row, src_col, src_row); | |
523 if (src_col >= 0 && src_col <= stretch_width && src_row >= 0 && | |
524 src_row <= stretch_height) { | |
525 if (src_col == stretch_width) { | |
526 src_col--; | |
527 } | |
528 if (src_row == stretch_height) { | |
529 src_row--; | |
530 } | |
531 *dest_pos_mask = | |
532 stretch_buf_mask[src_row * stretch_pitch_mask + src_col]; | |
533 } | |
534 dest_pos_mask++; | |
535 } | |
536 } | |
537 } | |
538 } | |
539 if (m_Storer.GetBitmap()->IsAlphaMask()) { | |
540 if (!(m_Flags & FXDIB_DOWNSAMPLE) && !(m_Flags & FXDIB_BICUBIC_INTERPOL)) { | |
541 CFX_BilinearMatrix result2stretch_fix(result2stretch, 8); | |
542 for (int row = 0; row < m_ResultHeight; row++) { | |
543 uint8_t* dest_scan = (uint8_t*)pTransformed->GetScanline(row); | |
544 for (int col = 0; col < m_ResultWidth; col++) { | |
545 int src_col_l, src_row_l, res_x, res_y; | |
546 result2stretch_fix.Transform(col, row, src_col_l, src_row_l, res_x, | |
547 res_y); | |
548 if (src_col_l >= 0 && src_col_l <= stretch_width && src_row_l >= 0 && | |
549 src_row_l <= stretch_height) { | |
550 if (src_col_l == stretch_width) { | |
551 src_col_l--; | |
552 } | |
553 if (src_row_l == stretch_height) { | |
554 src_row_l--; | |
555 } | |
556 int src_col_r = src_col_l + 1; | |
557 int src_row_r = src_row_l + 1; | |
558 if (src_col_r == stretch_width) { | |
559 src_col_r--; | |
560 } | |
561 if (src_row_r == stretch_height) { | |
562 src_row_r--; | |
563 } | |
564 int row_offset_l = src_row_l * stretch_pitch; | |
565 int row_offset_r = src_row_r * stretch_pitch; | |
566 *dest_scan = | |
567 bilinear_interpol(stretch_buf, row_offset_l, row_offset_r, | |
568 src_col_l, src_col_r, res_x, res_y, 1, 0); | |
569 } | |
570 dest_scan++; | |
571 } | |
572 } | |
573 } else if (m_Flags & FXDIB_BICUBIC_INTERPOL) { | |
574 CFX_BilinearMatrix result2stretch_fix(result2stretch, 8); | |
575 for (int row = 0; row < m_ResultHeight; row++) { | |
576 uint8_t* dest_scan = (uint8_t*)pTransformed->GetScanline(row); | |
577 for (int col = 0; col < m_ResultWidth; col++) { | |
578 int src_col_l, src_row_l, res_x, res_y; | |
579 result2stretch_fix.Transform(col, row, src_col_l, src_row_l, res_x, | |
580 res_y); | |
581 if (src_col_l >= 0 && src_col_l <= stretch_width && src_row_l >= 0 && | |
582 src_row_l <= stretch_height) { | |
583 int pos_pixel[8]; | |
584 int u_w[4], v_w[4]; | |
585 if (src_col_l == stretch_width) { | |
586 src_col_l--; | |
587 } | |
588 if (src_row_l == stretch_height) { | |
589 src_row_l--; | |
590 } | |
591 bicubic_get_pos_weight(pos_pixel, u_w, v_w, src_col_l, src_row_l, | |
592 res_x, res_y, stretch_width, stretch_height); | |
593 *dest_scan = bicubic_interpol(stretch_buf, stretch_pitch, pos_pixel, | |
594 u_w, v_w, res_x, res_y, 1, 0); | |
595 } | |
596 dest_scan++; | |
597 } | |
598 } | |
599 } else { | |
600 CPDF_FixedMatrix result2stretch_fix(result2stretch, 8); | |
601 for (int row = 0; row < m_ResultHeight; row++) { | |
602 uint8_t* dest_scan = (uint8_t*)pTransformed->GetScanline(row); | |
603 for (int col = 0; col < m_ResultWidth; col++) { | |
604 int src_col, src_row; | |
605 result2stretch_fix.Transform(col, row, src_col, src_row); | |
606 if (src_col >= 0 && src_col <= stretch_width && src_row >= 0 && | |
607 src_row <= stretch_height) { | |
608 if (src_col == stretch_width) { | |
609 src_col--; | |
610 } | |
611 if (src_row == stretch_height) { | |
612 src_row--; | |
613 } | |
614 const uint8_t* src_pixel = | |
615 stretch_buf + stretch_pitch * src_row + src_col; | |
616 *dest_scan = *src_pixel; | |
617 } | |
618 dest_scan++; | |
619 } | |
620 } | |
621 } | |
622 } else { | |
623 int Bpp = m_Storer.GetBitmap()->GetBPP() / 8; | |
624 int destBpp = pTransformed->GetBPP() / 8; | |
625 if (Bpp == 1) { | |
626 FX_DWORD argb[256]; | |
627 FX_ARGB* pPal = m_Storer.GetBitmap()->GetPalette(); | |
628 if (pPal) { | |
629 for (int i = 0; i < 256; i++) { | |
630 argb[i] = pPal[i]; | |
631 } | |
632 } else { | |
633 if (m_Storer.GetBitmap()->IsCmykImage()) { | |
634 for (int i = 0; i < 256; i++) { | |
635 argb[i] = 255 - i; | |
636 } | |
637 } else { | |
638 for (int i = 0; i < 256; i++) { | |
639 argb[i] = 0xff000000 | (i * 0x010101); | |
640 } | |
641 } | |
642 } | |
643 if (!(m_Flags & FXDIB_DOWNSAMPLE) && | |
644 !(m_Flags & FXDIB_BICUBIC_INTERPOL)) { | |
645 CFX_BilinearMatrix result2stretch_fix(result2stretch, 8); | |
646 for (int row = 0; row < m_ResultHeight; row++) { | |
647 uint8_t* dest_pos = (uint8_t*)pTransformed->GetScanline(row); | |
648 for (int col = 0; col < m_ResultWidth; col++) { | |
649 int src_col_l, src_row_l, res_x, res_y; | |
650 result2stretch_fix.Transform(col, row, src_col_l, src_row_l, res_x, | |
651 res_y); | |
652 if (src_col_l >= 0 && src_col_l <= stretch_width && | |
653 src_row_l >= 0 && src_row_l <= stretch_height) { | |
654 if (src_col_l == stretch_width) { | |
655 src_col_l--; | |
656 } | |
657 if (src_row_l == stretch_height) { | |
658 src_row_l--; | |
659 } | |
660 int src_col_r = src_col_l + 1; | |
661 int src_row_r = src_row_l + 1; | |
662 if (src_col_r == stretch_width) { | |
663 src_col_r--; | |
664 } | |
665 if (src_row_r == stretch_height) { | |
666 src_row_r--; | |
667 } | |
668 int row_offset_l = src_row_l * stretch_pitch; | |
669 int row_offset_r = src_row_r * stretch_pitch; | |
670 FX_DWORD r_bgra_cmyk = argb[bilinear_interpol( | |
671 stretch_buf, row_offset_l, row_offset_r, src_col_l, src_col_r, | |
672 res_x, res_y, 1, 0)]; | |
673 if (transformF == FXDIB_Rgba) { | |
674 dest_pos[0] = (uint8_t)(r_bgra_cmyk >> 24); | |
675 dest_pos[1] = (uint8_t)(r_bgra_cmyk >> 16); | |
676 dest_pos[2] = (uint8_t)(r_bgra_cmyk >> 8); | |
677 } else { | |
678 *(FX_DWORD*)dest_pos = r_bgra_cmyk; | |
679 } | |
680 } | |
681 dest_pos += destBpp; | |
682 } | |
683 } | |
684 } else if (m_Flags & FXDIB_BICUBIC_INTERPOL) { | |
685 CFX_BilinearMatrix result2stretch_fix(result2stretch, 8); | |
686 for (int row = 0; row < m_ResultHeight; row++) { | |
687 uint8_t* dest_pos = (uint8_t*)pTransformed->GetScanline(row); | |
688 for (int col = 0; col < m_ResultWidth; col++) { | |
689 int src_col_l, src_row_l, res_x, res_y; | |
690 result2stretch_fix.Transform(col, row, src_col_l, src_row_l, res_x, | |
691 res_y); | |
692 if (src_col_l >= 0 && src_col_l <= stretch_width && | |
693 src_row_l >= 0 && src_row_l <= stretch_height) { | |
694 int pos_pixel[8]; | |
695 int u_w[4], v_w[4]; | |
696 if (src_col_l == stretch_width) { | |
697 src_col_l--; | |
698 } | |
699 if (src_row_l == stretch_height) { | |
700 src_row_l--; | |
701 } | |
702 bicubic_get_pos_weight(pos_pixel, u_w, v_w, src_col_l, src_row_l, | |
703 res_x, res_y, stretch_width, | |
704 stretch_height); | |
705 FX_DWORD r_bgra_cmyk = | |
706 argb[bicubic_interpol(stretch_buf, stretch_pitch, pos_pixel, | |
707 u_w, v_w, res_x, res_y, 1, 0)]; | |
708 if (transformF == FXDIB_Rgba) { | |
709 dest_pos[0] = (uint8_t)(r_bgra_cmyk >> 24); | |
710 dest_pos[1] = (uint8_t)(r_bgra_cmyk >> 16); | |
711 dest_pos[2] = (uint8_t)(r_bgra_cmyk >> 8); | |
712 } else { | |
713 *(FX_DWORD*)dest_pos = r_bgra_cmyk; | |
714 } | |
715 } | |
716 dest_pos += destBpp; | |
717 } | |
718 } | |
719 } else { | |
720 CPDF_FixedMatrix result2stretch_fix(result2stretch, 8); | |
721 for (int row = 0; row < m_ResultHeight; row++) { | |
722 uint8_t* dest_pos = (uint8_t*)pTransformed->GetScanline(row); | |
723 for (int col = 0; col < m_ResultWidth; col++) { | |
724 int src_col, src_row; | |
725 result2stretch_fix.Transform(col, row, src_col, src_row); | |
726 if (src_col >= 0 && src_col <= stretch_width && src_row >= 0 && | |
727 src_row <= stretch_height) { | |
728 if (src_col == stretch_width) { | |
729 src_col--; | |
730 } | |
731 if (src_row == stretch_height) { | |
732 src_row--; | |
733 } | |
734 FX_DWORD r_bgra_cmyk = | |
735 argb[stretch_buf[src_row * stretch_pitch + src_col]]; | |
736 if (transformF == FXDIB_Rgba) { | |
737 dest_pos[0] = (uint8_t)(r_bgra_cmyk >> 24); | |
738 dest_pos[1] = (uint8_t)(r_bgra_cmyk >> 16); | |
739 dest_pos[2] = (uint8_t)(r_bgra_cmyk >> 8); | |
740 } else { | |
741 *(FX_DWORD*)dest_pos = r_bgra_cmyk; | |
742 } | |
743 } | |
744 dest_pos += destBpp; | |
745 } | |
746 } | |
747 } | |
748 } else { | |
749 FX_BOOL bHasAlpha = m_Storer.GetBitmap()->HasAlpha(); | |
750 int destBpp = pTransformed->GetBPP() / 8; | |
751 if (!(m_Flags & FXDIB_DOWNSAMPLE) && | |
752 !(m_Flags & FXDIB_BICUBIC_INTERPOL)) { | |
753 CFX_BilinearMatrix result2stretch_fix(result2stretch, 8); | |
754 for (int row = 0; row < m_ResultHeight; row++) { | |
755 uint8_t* dest_pos = (uint8_t*)pTransformed->GetScanline(row); | |
756 for (int col = 0; col < m_ResultWidth; col++) { | |
757 int src_col_l, src_row_l, res_x, res_y, r_pos_k_r = 0; | |
758 result2stretch_fix.Transform(col, row, src_col_l, src_row_l, res_x, | |
759 res_y); | |
760 if (src_col_l >= 0 && src_col_l <= stretch_width && | |
761 src_row_l >= 0 && src_row_l <= stretch_height) { | |
762 if (src_col_l == stretch_width) { | |
763 src_col_l--; | |
764 } | |
765 if (src_row_l == stretch_height) { | |
766 src_row_l--; | |
767 } | |
768 int src_col_r = src_col_l + 1; | |
769 int src_row_r = src_row_l + 1; | |
770 if (src_col_r == stretch_width) { | |
771 src_col_r--; | |
772 } | |
773 if (src_row_r == stretch_height) { | |
774 src_row_r--; | |
775 } | |
776 int row_offset_l = src_row_l * stretch_pitch; | |
777 int row_offset_r = src_row_r * stretch_pitch; | |
778 uint8_t r_pos_red_y_r = | |
779 bilinear_interpol(stretch_buf, row_offset_l, row_offset_r, | |
780 src_col_l, src_col_r, res_x, res_y, Bpp, 2); | |
781 uint8_t r_pos_green_m_r = | |
782 bilinear_interpol(stretch_buf, row_offset_l, row_offset_r, | |
783 src_col_l, src_col_r, res_x, res_y, Bpp, 1); | |
784 uint8_t r_pos_blue_c_r = | |
785 bilinear_interpol(stretch_buf, row_offset_l, row_offset_r, | |
786 src_col_l, src_col_r, res_x, res_y, Bpp, 0); | |
787 if (bHasAlpha) { | |
788 if (transformF != FXDIB_Argb) { | |
789 if (transformF == FXDIB_Rgba) { | |
790 dest_pos[0] = r_pos_blue_c_r; | |
791 dest_pos[1] = r_pos_green_m_r; | |
792 dest_pos[2] = r_pos_red_y_r; | |
793 } else { | |
794 r_pos_k_r = bilinear_interpol( | |
795 stretch_buf, row_offset_l, row_offset_r, src_col_l, | |
796 src_col_r, res_x, res_y, Bpp, 3); | |
797 *(FX_DWORD*)dest_pos = | |
798 FXCMYK_TODIB(CmykEncode(r_pos_blue_c_r, r_pos_green_m_r, | |
799 r_pos_red_y_r, r_pos_k_r)); | |
800 } | |
801 } else { | |
802 uint8_t r_pos_a_r = bilinear_interpol( | |
803 stretch_buf, row_offset_l, row_offset_r, src_col_l, | |
804 src_col_r, res_x, res_y, Bpp, 3); | |
805 *(FX_DWORD*)dest_pos = FXARGB_TODIB( | |
806 FXARGB_MAKE(r_pos_a_r, r_pos_red_y_r, r_pos_green_m_r, | |
807 r_pos_blue_c_r)); | |
808 } | |
809 } else { | |
810 r_pos_k_r = 0xff; | |
811 if (transformF == FXDIB_Cmyka) { | |
812 r_pos_k_r = bilinear_interpol( | |
813 stretch_buf, row_offset_l, row_offset_r, src_col_l, | |
814 src_col_r, res_x, res_y, Bpp, 3); | |
815 *(FX_DWORD*)dest_pos = | |
816 FXCMYK_TODIB(CmykEncode(r_pos_blue_c_r, r_pos_green_m_r, | |
817 r_pos_red_y_r, r_pos_k_r)); | |
818 } else { | |
819 *(FX_DWORD*)dest_pos = FXARGB_TODIB( | |
820 FXARGB_MAKE(r_pos_k_r, r_pos_red_y_r, r_pos_green_m_r, | |
821 r_pos_blue_c_r)); | |
822 } | |
823 } | |
824 } | |
825 dest_pos += destBpp; | |
826 } | |
827 } | |
828 } else if (m_Flags & FXDIB_BICUBIC_INTERPOL) { | |
829 CFX_BilinearMatrix result2stretch_fix(result2stretch, 8); | |
830 for (int row = 0; row < m_ResultHeight; row++) { | |
831 uint8_t* dest_pos = (uint8_t*)pTransformed->GetScanline(row); | |
832 for (int col = 0; col < m_ResultWidth; col++) { | |
833 int src_col_l, src_row_l, res_x, res_y, r_pos_k_r = 0; | |
834 result2stretch_fix.Transform(col, row, src_col_l, src_row_l, res_x, | |
835 res_y); | |
836 if (src_col_l >= 0 && src_col_l <= stretch_width && | |
837 src_row_l >= 0 && src_row_l <= stretch_height) { | |
838 int pos_pixel[8]; | |
839 int u_w[4], v_w[4]; | |
840 if (src_col_l == stretch_width) { | |
841 src_col_l--; | |
842 } | |
843 if (src_row_l == stretch_height) { | |
844 src_row_l--; | |
845 } | |
846 bicubic_get_pos_weight(pos_pixel, u_w, v_w, src_col_l, src_row_l, | |
847 res_x, res_y, stretch_width, | |
848 stretch_height); | |
849 uint8_t r_pos_red_y_r = | |
850 bicubic_interpol(stretch_buf, stretch_pitch, pos_pixel, u_w, | |
851 v_w, res_x, res_y, Bpp, 2); | |
852 uint8_t r_pos_green_m_r = | |
853 bicubic_interpol(stretch_buf, stretch_pitch, pos_pixel, u_w, | |
854 v_w, res_x, res_y, Bpp, 1); | |
855 uint8_t r_pos_blue_c_r = | |
856 bicubic_interpol(stretch_buf, stretch_pitch, pos_pixel, u_w, | |
857 v_w, res_x, res_y, Bpp, 0); | |
858 if (bHasAlpha) { | |
859 if (transformF != FXDIB_Argb) { | |
860 if (transformF == FXDIB_Rgba) { | |
861 dest_pos[0] = r_pos_blue_c_r; | |
862 dest_pos[1] = r_pos_green_m_r; | |
863 dest_pos[2] = r_pos_red_y_r; | |
864 } else { | |
865 r_pos_k_r = | |
866 bicubic_interpol(stretch_buf, stretch_pitch, pos_pixel, | |
867 u_w, v_w, res_x, res_y, Bpp, 3); | |
868 *(FX_DWORD*)dest_pos = | |
869 FXCMYK_TODIB(CmykEncode(r_pos_blue_c_r, r_pos_green_m_r, | |
870 r_pos_red_y_r, r_pos_k_r)); | |
871 } | |
872 } else { | |
873 uint8_t r_pos_a_r = | |
874 bicubic_interpol(stretch_buf, stretch_pitch, pos_pixel, | |
875 u_w, v_w, res_x, res_y, Bpp, 3); | |
876 *(FX_DWORD*)dest_pos = FXARGB_TODIB( | |
877 FXARGB_MAKE(r_pos_a_r, r_pos_red_y_r, r_pos_green_m_r, | |
878 r_pos_blue_c_r)); | |
879 } | |
880 } else { | |
881 r_pos_k_r = 0xff; | |
882 if (transformF == FXDIB_Cmyka) { | |
883 r_pos_k_r = | |
884 bicubic_interpol(stretch_buf, stretch_pitch, pos_pixel, | |
885 u_w, v_w, res_x, res_y, Bpp, 3); | |
886 *(FX_DWORD*)dest_pos = | |
887 FXCMYK_TODIB(CmykEncode(r_pos_blue_c_r, r_pos_green_m_r, | |
888 r_pos_red_y_r, r_pos_k_r)); | |
889 } else { | |
890 *(FX_DWORD*)dest_pos = FXARGB_TODIB( | |
891 FXARGB_MAKE(r_pos_k_r, r_pos_red_y_r, r_pos_green_m_r, | |
892 r_pos_blue_c_r)); | |
893 } | |
894 } | |
895 } | |
896 dest_pos += destBpp; | |
897 } | |
898 } | |
899 } else { | |
900 CPDF_FixedMatrix result2stretch_fix(result2stretch, 8); | |
901 for (int row = 0; row < m_ResultHeight; row++) { | |
902 uint8_t* dest_pos = (uint8_t*)pTransformed->GetScanline(row); | |
903 for (int col = 0; col < m_ResultWidth; col++) { | |
904 int src_col, src_row; | |
905 result2stretch_fix.Transform(col, row, src_col, src_row); | |
906 if (src_col >= 0 && src_col <= stretch_width && src_row >= 0 && | |
907 src_row <= stretch_height) { | |
908 if (src_col == stretch_width) { | |
909 src_col--; | |
910 } | |
911 if (src_row == stretch_height) { | |
912 src_row--; | |
913 } | |
914 const uint8_t* src_pos = | |
915 stretch_buf + src_row * stretch_pitch + src_col * Bpp; | |
916 if (bHasAlpha) { | |
917 if (transformF != FXDIB_Argb) { | |
918 if (transformF == FXDIB_Rgba) { | |
919 dest_pos[0] = src_pos[0]; | |
920 dest_pos[1] = src_pos[1]; | |
921 dest_pos[2] = src_pos[2]; | |
922 } else { | |
923 *(FX_DWORD*)dest_pos = FXCMYK_TODIB(CmykEncode( | |
924 src_pos[0], src_pos[1], src_pos[2], src_pos[3])); | |
925 } | |
926 } else { | |
927 *(FX_DWORD*)dest_pos = FXARGB_TODIB(FXARGB_MAKE( | |
928 src_pos[3], src_pos[2], src_pos[1], src_pos[0])); | |
929 } | |
930 } else { | |
931 if (transformF == FXDIB_Cmyka) { | |
932 *(FX_DWORD*)dest_pos = FXCMYK_TODIB(CmykEncode( | |
933 src_pos[0], src_pos[1], src_pos[2], src_pos[3])); | |
934 } else { | |
935 *(FX_DWORD*)dest_pos = FXARGB_TODIB( | |
936 FXARGB_MAKE(0xff, src_pos[2], src_pos[1], src_pos[0])); | |
937 } | |
938 } | |
939 } | |
940 dest_pos += destBpp; | |
941 } | |
942 } | |
943 } | |
944 } | |
945 } | |
946 m_Storer.Replace(pTransformed); | |
947 return FALSE; | |
948 } | |
OLD | NEW |