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/agg/fx_agg_driver.h" | 7 #include "core/fxge/agg/fx_agg_driver.h" |
8 | 8 |
9 #include <algorithm> | 9 #include <algorithm> |
10 | 10 |
(...skipping 10 matching lines...) Expand all Loading... | |
21 #include "third_party/agg23/agg_renderer_scanline.h" | 21 #include "third_party/agg23/agg_renderer_scanline.h" |
22 #include "third_party/agg23/agg_scanline_u.h" | 22 #include "third_party/agg23/agg_scanline_u.h" |
23 | 23 |
24 namespace { | 24 namespace { |
25 | 25 |
26 void HardClip(FX_FLOAT& x, FX_FLOAT& y) { | 26 void HardClip(FX_FLOAT& x, FX_FLOAT& y) { |
27 x = std::max(std::min(x, 50000.0f), -50000.0f); | 27 x = std::max(std::min(x, 50000.0f), -50000.0f); |
28 y = std::max(std::min(y, 50000.0f), -50000.0f); | 28 y = std::max(std::min(y, 50000.0f), -50000.0f); |
29 } | 29 } |
30 | 30 |
31 void RgbByteOrderSetPixel(CFX_DIBitmap* pBitmap, int x, int y, uint32_t argb) { | |
32 if (x < 0 || x >= pBitmap->GetWidth() || y < 0 || y >= pBitmap->GetHeight()) { | |
33 return; | |
34 } | |
dsinclair
2016/06/13 13:21:37
nit: no {}'s
Lei Zhang
2016/06/13 18:14:42
Done.
| |
35 uint8_t* pos = (uint8_t*)pBitmap->GetBuffer() + y * pBitmap->GetPitch() + | |
36 x * pBitmap->GetBPP() / 8; | |
37 if (pBitmap->GetFormat() == FXDIB_Argb) { | |
38 FXARGB_SETRGBORDERDIB(pos, argb); | |
39 } else { | |
dsinclair
2016/06/13 13:21:38
nit: early return?
Lei Zhang
2016/06/13 18:14:42
Done.
| |
40 int alpha = FXARGB_A(argb); | |
41 pos[0] = (FXARGB_R(argb) * alpha + pos[0] * (255 - alpha)) / 255; | |
42 pos[1] = (FXARGB_G(argb) * alpha + pos[1] * (255 - alpha)) / 255; | |
43 pos[2] = (FXARGB_B(argb) * alpha + pos[2] * (255 - alpha)) / 255; | |
44 } | |
45 } | |
46 | |
47 void RgbByteOrderCompositeRect(CFX_DIBitmap* pBitmap, | |
48 int left, | |
49 int top, | |
50 int width, | |
51 int height, | |
52 FX_ARGB argb) { | |
53 int src_alpha = FXARGB_A(argb); | |
54 if (src_alpha == 0) { | |
55 return; | |
56 } | |
dsinclair
2016/06/13 13:21:37
nit: {}'s
Lei Zhang
2016/06/13 18:14:42
Done.
| |
57 FX_RECT rect(left, top, left + width, top + height); | |
58 rect.Intersect(0, 0, pBitmap->GetWidth(), pBitmap->GetHeight()); | |
59 width = rect.Width(); | |
60 int src_r = FXARGB_R(argb), src_g = FXARGB_G(argb), src_b = FXARGB_B(argb); | |
dsinclair
2016/06/13 13:21:37
nit: one per line
Lei Zhang
2016/06/13 18:14:42
Done.
| |
61 int Bpp = pBitmap->GetBPP() / 8; | |
62 FX_BOOL bAlpha = pBitmap->HasAlpha(); | |
63 int dib_argb = FXARGB_TOBGRORDERDIB(argb); | |
64 uint8_t* pBuffer = pBitmap->GetBuffer(); | |
65 if (src_alpha == 255) { | |
66 for (int row = rect.top; row < rect.bottom; row++) { | |
67 uint8_t* dest_scan = | |
68 pBuffer + row * pBitmap->GetPitch() + rect.left * Bpp; | |
69 if (Bpp == 4) { | |
70 uint32_t* scan = (uint32_t*)dest_scan; | |
71 for (int col = 0; col < width; col++) { | |
dsinclair
2016/06/13 13:21:38
nit: {}'s
Lei Zhang
2016/06/13 18:14:42
Done.
| |
72 *scan++ = dib_argb; | |
73 } | |
74 } else { | |
dsinclair
2016/06/13 13:21:38
continue and remove else { ?
Lei Zhang
2016/06/13 18:14:42
Meh. Both blocks are pretty small.
| |
75 for (int col = 0; col < width; col++) { | |
76 *dest_scan++ = src_r; | |
77 *dest_scan++ = src_g; | |
78 *dest_scan++ = src_b; | |
79 } | |
80 } | |
81 } | |
82 return; | |
83 } | |
84 for (int row = rect.top; row < rect.bottom; row++) { | |
85 uint8_t* dest_scan = pBuffer + row * pBitmap->GetPitch() + rect.left * Bpp; | |
86 if (bAlpha) { | |
87 for (int col = 0; col < width; col++) { | |
88 uint8_t back_alpha = dest_scan[3]; | |
89 if (back_alpha == 0) { | |
90 FXARGB_SETRGBORDERDIB(dest_scan, | |
91 FXARGB_MAKE(src_alpha, src_r, src_g, src_b)); | |
92 dest_scan += 4; | |
93 continue; | |
94 } | |
95 uint8_t dest_alpha = | |
96 back_alpha + src_alpha - back_alpha * src_alpha / 255; | |
97 dest_scan[3] = dest_alpha; | |
98 int alpha_ratio = src_alpha * 255 / dest_alpha; | |
99 *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, src_r, alpha_ratio); | |
100 dest_scan++; | |
101 *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, src_g, alpha_ratio); | |
102 dest_scan++; | |
103 *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, src_b, alpha_ratio); | |
104 dest_scan += 2; | |
105 } | |
106 } else { | |
107 for (int col = 0; col < width; col++) { | |
108 *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, src_r, src_alpha); | |
109 dest_scan++; | |
110 *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, src_g, src_alpha); | |
111 dest_scan++; | |
112 *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, src_b, src_alpha); | |
113 dest_scan++; | |
114 if (Bpp == 4) { | |
115 dest_scan++; | |
116 } | |
dsinclair
2016/06/13 13:21:37
nit: {}'s
Lei Zhang
2016/06/13 18:14:42
Done.
| |
117 } | |
118 } | |
119 } | |
120 } | |
121 | |
122 void RgbByteOrderTransferBitmap(CFX_DIBitmap* pBitmap, | |
123 int dest_left, | |
124 int dest_top, | |
125 int width, | |
126 int height, | |
127 const CFX_DIBSource* pSrcBitmap, | |
128 int src_left, | |
129 int src_top) { | |
130 if (!pBitmap) { | |
dsinclair
2016/06/13 13:21:38
nit: {}'s
Lei Zhang
2016/06/13 18:14:42
Done.
| |
131 return; | |
132 } | |
133 pBitmap->GetOverlapRect(dest_left, dest_top, width, height, | |
134 pSrcBitmap->GetWidth(), pSrcBitmap->GetHeight(), | |
135 src_left, src_top, nullptr); | |
136 if (width == 0 || height == 0) { | |
137 return; | |
138 } | |
dsinclair
2016/06/13 13:21:37
ditto
Lei Zhang
2016/06/13 18:14:42
Done.
| |
139 int Bpp = pBitmap->GetBPP() / 8; | |
140 FXDIB_Format dest_format = pBitmap->GetFormat(); | |
141 FXDIB_Format src_format = pSrcBitmap->GetFormat(); | |
142 int pitch = pBitmap->GetPitch(); | |
143 uint8_t* buffer = pBitmap->GetBuffer(); | |
144 if (dest_format == src_format) { | |
145 for (int row = 0; row < height; row++) { | |
146 uint8_t* dest_scan = buffer + (dest_top + row) * pitch + dest_left * Bpp; | |
147 uint8_t* src_scan = | |
148 (uint8_t*)pSrcBitmap->GetScanline(src_top + row) + src_left * Bpp; | |
149 if (Bpp == 4) { | |
150 for (int col = 0; col < width; col++) { | |
151 FXARGB_SETDIB(dest_scan, FXARGB_MAKE(src_scan[3], src_scan[0], | |
152 src_scan[1], src_scan[2])); | |
153 dest_scan += 4; | |
154 src_scan += 4; | |
155 } | |
156 } else { | |
157 for (int col = 0; col < width; col++) { | |
158 *dest_scan++ = src_scan[2]; | |
159 *dest_scan++ = src_scan[1]; | |
160 *dest_scan++ = src_scan[0]; | |
161 src_scan += 3; | |
162 } | |
163 } | |
164 } | |
165 return; | |
166 } | |
167 uint8_t* dest_buf = buffer + dest_top * pitch + dest_left * Bpp; | |
168 if (dest_format == FXDIB_Rgb) { | |
169 if (src_format == FXDIB_Rgb32) { | |
170 for (int row = 0; row < height; row++) { | |
171 uint8_t* dest_scan = dest_buf + row * pitch; | |
172 uint8_t* src_scan = | |
173 (uint8_t*)pSrcBitmap->GetScanline(src_top + row) + src_left * 4; | |
174 for (int col = 0; col < width; col++) { | |
175 *dest_scan++ = src_scan[2]; | |
176 *dest_scan++ = src_scan[1]; | |
177 *dest_scan++ = src_scan[0]; | |
178 src_scan += 4; | |
179 } | |
180 } | |
181 } else { | |
182 ASSERT(FALSE); | |
183 } | |
184 } else if (dest_format == FXDIB_Argb || dest_format == FXDIB_Rgb32) { | |
185 if (src_format == FXDIB_Rgb) { | |
186 for (int row = 0; row < height; row++) { | |
187 uint8_t* dest_scan = (uint8_t*)(dest_buf + row * pitch); | |
188 uint8_t* src_scan = | |
189 (uint8_t*)pSrcBitmap->GetScanline(src_top + row) + src_left * 3; | |
190 for (int col = 0; col < width; col++) { | |
191 FXARGB_SETDIB(dest_scan, FXARGB_MAKE(0xff, src_scan[0], src_scan[1], | |
192 src_scan[2])); | |
193 dest_scan += 4; | |
194 src_scan += 3; | |
195 } | |
196 } | |
197 } else if (src_format == FXDIB_Rgb32) { | |
198 ASSERT(dest_format == FXDIB_Argb); | |
199 for (int row = 0; row < height; row++) { | |
200 uint8_t* dest_scan = dest_buf + row * pitch; | |
201 uint8_t* src_scan = | |
202 (uint8_t*)(pSrcBitmap->GetScanline(src_top + row) + src_left * 4); | |
203 for (int col = 0; col < width; col++) { | |
204 FXARGB_SETDIB(dest_scan, FXARGB_MAKE(0xff, src_scan[0], src_scan[1], | |
205 src_scan[2])); | |
206 src_scan += 4; | |
207 dest_scan += 4; | |
208 } | |
209 } | |
210 } | |
211 } else { | |
212 ASSERT(FALSE); | |
213 } | |
214 } | |
215 | |
216 FX_ARGB DefaultCMYK2ARGB(FX_CMYK cmyk, uint8_t alpha) { | |
217 uint8_t r, g, b; | |
218 AdobeCMYK_to_sRGB1(FXSYS_GetCValue(cmyk), FXSYS_GetMValue(cmyk), | |
219 FXSYS_GetYValue(cmyk), FXSYS_GetKValue(cmyk), r, g, b); | |
220 return ArgbEncode(alpha, r, g, b); | |
221 } | |
222 | |
223 FX_BOOL DibSetPixel(CFX_DIBitmap* pDevice, | |
224 int x, | |
225 int y, | |
226 uint32_t color, | |
227 int alpha_flag, | |
228 void* pIccTransform) { | |
229 FX_BOOL bObjCMYK = FXGETFLAG_COLORTYPE(alpha_flag); | |
230 int alpha = bObjCMYK ? FXGETFLAG_ALPHA_FILL(alpha_flag) : FXARGB_A(color); | |
231 if (pIccTransform) { | |
232 CCodec_IccModule* pIccModule = | |
233 CFX_GEModule::Get()->GetCodecModule()->GetIccModule(); | |
234 color = bObjCMYK ? FXCMYK_TODIB(color) : FXARGB_TODIB(color); | |
235 pIccModule->TranslateScanline(pIccTransform, (uint8_t*)&color, | |
236 (uint8_t*)&color, 1); | |
237 color = bObjCMYK ? FXCMYK_TODIB(color) : FXARGB_TODIB(color); | |
238 if (!pDevice->IsCmykImage()) { | |
239 color = (color & 0xffffff) | (alpha << 24); | |
240 } | |
dsinclair
2016/06/13 13:21:37
nit: {}s
Lei Zhang
2016/06/13 18:14:42
Done.
| |
241 } else { | |
242 if (pDevice->IsCmykImage()) { | |
243 if (!bObjCMYK) | |
244 return FALSE; | |
245 } else { | |
246 if (bObjCMYK) | |
247 color = DefaultCMYK2ARGB(color, alpha); | |
248 } | |
249 } | |
250 pDevice->SetPixel(x, y, color); | |
251 if (pDevice->m_pAlphaMask) { | |
252 pDevice->m_pAlphaMask->SetPixel(x, y, alpha << 24); | |
253 } | |
254 return TRUE; | |
255 } | |
256 | |
31 } // namespace | 257 } // namespace |
32 | 258 |
33 void CAgg_PathData::BuildPath(const CFX_PathData* pPathData, | 259 void CAgg_PathData::BuildPath(const CFX_PathData* pPathData, |
34 const CFX_Matrix* pObject2Device) { | 260 const CFX_Matrix* pObject2Device) { |
35 int nPoints = pPathData->GetPointCount(); | 261 int nPoints = pPathData->GetPointCount(); |
36 FX_PATHPOINT* pPoints = pPathData->GetPoints(); | 262 FX_PATHPOINT* pPoints = pPathData->GetPoints(); |
37 for (int i = 0; i < nPoints; i++) { | 263 for (int i = 0; i < nPoints; i++) { |
38 FX_FLOAT x = pPoints[i].m_PointX, y = pPoints[i].m_PointY; | 264 FX_FLOAT x = pPoints[i].m_PointX, y = pPoints[i].m_PointY; |
39 if (pObject2Device) { | 265 if (pObject2Device) { |
40 pObject2Device->Transform(x, y); | 266 pObject2Device->Transform(x, y); |
(...skipping 183 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
224 void CFX_AggDeviceDriver::InitPlatform() {} | 450 void CFX_AggDeviceDriver::InitPlatform() {} |
225 | 451 |
226 void CFX_AggDeviceDriver::DestroyPlatform() {} | 452 void CFX_AggDeviceDriver::DestroyPlatform() {} |
227 | 453 |
228 FX_BOOL CFX_AggDeviceDriver::DrawDeviceText(int nChars, | 454 FX_BOOL CFX_AggDeviceDriver::DrawDeviceText(int nChars, |
229 const FXTEXT_CHARPOS* pCharPos, | 455 const FXTEXT_CHARPOS* pCharPos, |
230 CFX_Font* pFont, | 456 CFX_Font* pFont, |
231 CFX_FontCache* pCache, | 457 CFX_FontCache* pCache, |
232 const CFX_Matrix* pObject2Device, | 458 const CFX_Matrix* pObject2Device, |
233 FX_FLOAT font_size, | 459 FX_FLOAT font_size, |
234 uint32_t color, | 460 uint32_t color) { |
235 int alpha_flag, | |
236 void* pIccTransform) { | |
237 return FALSE; | 461 return FALSE; |
238 } // _FXM_PLATFORM_ != _FXM_PLATFORM_APPLE_ | 462 } |
239 #endif | 463 #endif // _FXM_PLATFORM_ != _FXM_PLATFORM_APPLE_ |
240 | 464 |
241 int CFX_AggDeviceDriver::GetDeviceCaps(int caps_id) { | 465 int CFX_AggDeviceDriver::GetDeviceCaps(int caps_id) { |
242 switch (caps_id) { | 466 switch (caps_id) { |
243 case FXDC_DEVICE_CLASS: | 467 case FXDC_DEVICE_CLASS: |
244 return FXDC_DISPLAY; | 468 return FXDC_DISPLAY; |
245 case FXDC_PIXEL_WIDTH: | 469 case FXDC_PIXEL_WIDTH: |
246 return m_pBitmap->GetWidth(); | 470 return m_pBitmap->GetWidth(); |
247 case FXDC_PIXEL_HEIGHT: | 471 case FXDC_PIXEL_HEIGHT: |
248 return m_pBitmap->GetHeight(); | 472 return m_pBitmap->GetHeight(); |
249 case FXDC_BITS_PIXEL: | 473 case FXDC_BITS_PIXEL: |
(...skipping 973 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1223 (m_FillFlags & FXFILL_NOPATHSMOOTH) != 0); | 1447 (m_FillFlags & FXFILL_NOPATHSMOOTH) != 0); |
1224 return TRUE; | 1448 return TRUE; |
1225 } | 1449 } |
1226 | 1450 |
1227 FX_BOOL CFX_AggDeviceDriver::DrawPath(const CFX_PathData* pPathData, | 1451 FX_BOOL CFX_AggDeviceDriver::DrawPath(const CFX_PathData* pPathData, |
1228 const CFX_Matrix* pObject2Device, | 1452 const CFX_Matrix* pObject2Device, |
1229 const CFX_GraphStateData* pGraphState, | 1453 const CFX_GraphStateData* pGraphState, |
1230 uint32_t fill_color, | 1454 uint32_t fill_color, |
1231 uint32_t stroke_color, | 1455 uint32_t stroke_color, |
1232 int fill_mode, | 1456 int fill_mode, |
1233 int alpha_flag, | |
1234 void* pIccTransform, | |
1235 int blend_type) { | 1457 int blend_type) { |
1236 if (blend_type != FXDIB_BLEND_NORMAL) { | 1458 if (blend_type != FXDIB_BLEND_NORMAL) |
1237 return FALSE; | 1459 return FALSE; |
1238 } | 1460 |
1239 if (!GetBuffer()) { | 1461 if (!GetBuffer()) |
1240 return TRUE; | 1462 return TRUE; |
1241 } | 1463 |
1242 m_FillFlags = fill_mode; | 1464 m_FillFlags = fill_mode; |
1243 if ((fill_mode & 3) && fill_color) { | 1465 if ((fill_mode & 3) && fill_color) { |
1244 CAgg_PathData path_data; | 1466 CAgg_PathData path_data; |
1245 path_data.BuildPath(pPathData, pObject2Device); | 1467 path_data.BuildPath(pPathData, pObject2Device); |
1246 agg::rasterizer_scanline_aa rasterizer; | 1468 agg::rasterizer_scanline_aa rasterizer; |
1247 rasterizer.clip_box(0.0f, 0.0f, (FX_FLOAT)(GetDeviceCaps(FXDC_PIXEL_WIDTH)), | 1469 rasterizer.clip_box(0.0f, 0.0f, (FX_FLOAT)(GetDeviceCaps(FXDC_PIXEL_WIDTH)), |
1248 (FX_FLOAT)(GetDeviceCaps(FXDC_PIXEL_HEIGHT))); | 1470 (FX_FLOAT)(GetDeviceCaps(FXDC_PIXEL_HEIGHT))); |
1249 rasterizer.add_path(path_data.m_PathData); | 1471 rasterizer.add_path(path_data.m_PathData); |
1250 rasterizer.filling_rule((fill_mode & 3) == FXFILL_WINDING | 1472 rasterizer.filling_rule((fill_mode & 3) == FXFILL_WINDING |
1251 ? agg::fill_non_zero | 1473 ? agg::fill_non_zero |
1252 : agg::fill_even_odd); | 1474 : agg::fill_even_odd); |
1253 if (!RenderRasterizer(rasterizer, fill_color, fill_mode & FXFILL_FULLCOVER, | 1475 if (!RenderRasterizer(rasterizer, fill_color, fill_mode & FXFILL_FULLCOVER, |
1254 FALSE, alpha_flag, pIccTransform)) { | 1476 FALSE, 0, nullptr)) { |
1255 return FALSE; | 1477 return FALSE; |
1256 } | 1478 } |
1257 } | 1479 } |
1258 int stroke_alpha = FXGETFLAG_COLORTYPE(alpha_flag) | 1480 int stroke_alpha = FXARGB_A(stroke_color); |
1259 ? FXGETFLAG_ALPHA_STROKE(alpha_flag) | 1481 if (!pGraphState || !stroke_alpha) |
1260 : FXARGB_A(stroke_color); | 1482 return TRUE; |
1261 if (pGraphState && stroke_alpha) { | 1483 |
1262 if (fill_mode & FX_ZEROAREA_FILL) { | 1484 if (fill_mode & FX_ZEROAREA_FILL) { |
1263 CAgg_PathData path_data; | |
1264 path_data.BuildPath(pPathData, pObject2Device); | |
1265 agg::rasterizer_scanline_aa rasterizer; | |
1266 rasterizer.clip_box(0.0f, 0.0f, | |
1267 (FX_FLOAT)(GetDeviceCaps(FXDC_PIXEL_WIDTH)), | |
1268 (FX_FLOAT)(GetDeviceCaps(FXDC_PIXEL_HEIGHT))); | |
1269 RasterizeStroke(rasterizer, path_data.m_PathData, nullptr, pGraphState, 1, | |
1270 FALSE, fill_mode & FX_STROKE_TEXT_MODE); | |
1271 int fill_flag = FXGETFLAG_COLORTYPE(alpha_flag) << 8 | | |
1272 FXGETFLAG_ALPHA_STROKE(alpha_flag); | |
1273 if (!RenderRasterizer(rasterizer, stroke_color, | |
1274 fill_mode & FXFILL_FULLCOVER, m_bGroupKnockout, | |
1275 fill_flag, pIccTransform)) { | |
1276 return FALSE; | |
1277 } | |
1278 return TRUE; | |
1279 } | |
1280 CFX_Matrix matrix1, matrix2; | |
1281 if (pObject2Device) { | |
1282 matrix1.a = std::max(FXSYS_fabs(pObject2Device->a), | |
1283 FXSYS_fabs(pObject2Device->b)); | |
1284 matrix1.d = matrix1.a; | |
1285 matrix2.Set(pObject2Device->a / matrix1.a, pObject2Device->b / matrix1.a, | |
1286 pObject2Device->c / matrix1.d, pObject2Device->d / matrix1.d, | |
1287 0, 0); | |
1288 CFX_Matrix mtRervese; | |
1289 mtRervese.SetReverse(matrix2); | |
1290 matrix1 = *pObject2Device; | |
1291 matrix1.Concat(mtRervese); | |
1292 } | |
1293 CAgg_PathData path_data; | 1485 CAgg_PathData path_data; |
1294 path_data.BuildPath(pPathData, &matrix1); | 1486 path_data.BuildPath(pPathData, pObject2Device); |
1295 agg::rasterizer_scanline_aa rasterizer; | 1487 agg::rasterizer_scanline_aa rasterizer; |
1296 rasterizer.clip_box(0.0f, 0.0f, (FX_FLOAT)(GetDeviceCaps(FXDC_PIXEL_WIDTH)), | 1488 rasterizer.clip_box(0.0f, 0.0f, (FX_FLOAT)(GetDeviceCaps(FXDC_PIXEL_WIDTH)), |
1297 (FX_FLOAT)(GetDeviceCaps(FXDC_PIXEL_HEIGHT))); | 1489 (FX_FLOAT)(GetDeviceCaps(FXDC_PIXEL_HEIGHT))); |
1298 RasterizeStroke(rasterizer, path_data.m_PathData, &matrix2, pGraphState, | 1490 RasterizeStroke(rasterizer, path_data.m_PathData, nullptr, pGraphState, 1, |
1299 matrix1.a, FALSE, fill_mode & FX_STROKE_TEXT_MODE); | 1491 FALSE, fill_mode & FX_STROKE_TEXT_MODE); |
1300 int fill_flag = FXGETFLAG_COLORTYPE(alpha_flag) << 8 | | |
1301 FXGETFLAG_ALPHA_STROKE(alpha_flag); | |
1302 if (!RenderRasterizer(rasterizer, stroke_color, | 1492 if (!RenderRasterizer(rasterizer, stroke_color, |
1303 fill_mode & FXFILL_FULLCOVER, m_bGroupKnockout, | 1493 fill_mode & FXFILL_FULLCOVER, m_bGroupKnockout, 0, |
1304 fill_flag, pIccTransform)) { | 1494 nullptr)) { |
1305 return FALSE; | 1495 return FALSE; |
1306 } | 1496 } |
1497 return TRUE; | |
1498 } | |
1499 CFX_Matrix matrix1; | |
1500 CFX_Matrix matrix2; | |
1501 if (pObject2Device) { | |
1502 matrix1.a = | |
1503 std::max(FXSYS_fabs(pObject2Device->a), FXSYS_fabs(pObject2Device->b)); | |
1504 matrix1.d = matrix1.a; | |
1505 matrix2.Set(pObject2Device->a / matrix1.a, pObject2Device->b / matrix1.a, | |
1506 pObject2Device->c / matrix1.d, pObject2Device->d / matrix1.d, 0, | |
1507 0); | |
1508 CFX_Matrix mtRervese; | |
1509 mtRervese.SetReverse(matrix2); | |
1510 matrix1 = *pObject2Device; | |
1511 matrix1.Concat(mtRervese); | |
1512 } | |
1513 CAgg_PathData path_data; | |
1514 path_data.BuildPath(pPathData, &matrix1); | |
1515 agg::rasterizer_scanline_aa rasterizer; | |
1516 rasterizer.clip_box(0.0f, 0.0f, (FX_FLOAT)(GetDeviceCaps(FXDC_PIXEL_WIDTH)), | |
1517 (FX_FLOAT)(GetDeviceCaps(FXDC_PIXEL_HEIGHT))); | |
1518 RasterizeStroke(rasterizer, path_data.m_PathData, &matrix2, pGraphState, | |
1519 matrix1.a, FALSE, fill_mode & FX_STROKE_TEXT_MODE); | |
1520 if (!RenderRasterizer(rasterizer, stroke_color, fill_mode & FXFILL_FULLCOVER, | |
1521 m_bGroupKnockout, 0, nullptr)) { | |
1522 return FALSE; | |
1307 } | 1523 } |
1308 return TRUE; | 1524 return TRUE; |
1309 } | 1525 } |
1310 | 1526 |
1311 void RgbByteOrderSetPixel(CFX_DIBitmap* pBitmap, int x, int y, uint32_t argb) { | 1527 FX_BOOL CFX_AggDeviceDriver::SetPixel(int x, int y, uint32_t color) { |
1312 if (x < 0 || x >= pBitmap->GetWidth() || y < 0 || y >= pBitmap->GetHeight()) { | 1528 if (!m_pBitmap->GetBuffer()) |
1313 return; | 1529 return TRUE; |
1530 | |
1531 if (!m_pClipRgn) { | |
1532 if (!m_bRgbByteOrder) | |
1533 return DibSetPixel(m_pBitmap, x, y, color, 0, nullptr); | |
1534 RgbByteOrderSetPixel(m_pBitmap, x, y, color); | |
1535 return TRUE; | |
1314 } | 1536 } |
1315 uint8_t* pos = (uint8_t*)pBitmap->GetBuffer() + y * pBitmap->GetPitch() + | 1537 if (!m_pClipRgn->GetBox().Contains(x, y)) |
1316 x * pBitmap->GetBPP() / 8; | 1538 return TRUE; |
1317 if (pBitmap->GetFormat() == FXDIB_Argb) { | 1539 |
1318 FXARGB_SETRGBORDERDIB(pos, argb); | 1540 if (m_pClipRgn->GetType() == CFX_ClipRgn::RectI) { |
1319 } else { | 1541 if (!m_bRgbByteOrder) |
1320 int alpha = FXARGB_A(argb); | 1542 return DibSetPixel(m_pBitmap, x, y, color, 0, nullptr); |
1321 pos[0] = (FXARGB_R(argb) * alpha + pos[0] * (255 - alpha)) / 255; | 1543 RgbByteOrderSetPixel(m_pBitmap, x, y, color); |
1322 pos[1] = (FXARGB_G(argb) * alpha + pos[1] * (255 - alpha)) / 255; | 1544 return TRUE; |
1323 pos[2] = (FXARGB_B(argb) * alpha + pos[2] * (255 - alpha)) / 255; | |
1324 } | 1545 } |
1546 if (m_pClipRgn->GetType() != CFX_ClipRgn::MaskF) | |
1547 return TRUE; | |
1548 | |
1549 const CFX_DIBitmap* pMask = m_pClipRgn->GetMask().GetObject(); | |
1550 int new_alpha = FXARGB_A(color) * pMask->GetScanline(y)[x] / 255; | |
1551 color = (color & 0xffffff) | (new_alpha << 24); | |
1552 if (m_bRgbByteOrder) { | |
1553 RgbByteOrderSetPixel(m_pBitmap, x, y, color); | |
1554 return TRUE; | |
1555 } | |
1556 return DibSetPixel(m_pBitmap, x, y, color, 0, nullptr); | |
1325 } | 1557 } |
1326 | 1558 |
1327 void RgbByteOrderCompositeRect(CFX_DIBitmap* pBitmap, | 1559 FX_BOOL CFX_AggDeviceDriver::FillRectWithBlend(const FX_RECT* pRect, |
1328 int left, | 1560 uint32_t fill_color, |
1329 int top, | 1561 int blend_type) { |
1330 int width, | 1562 if (blend_type != FXDIB_BLEND_NORMAL) |
1331 int height, | 1563 return FALSE; |
1332 FX_ARGB argb) { | |
1333 int src_alpha = FXARGB_A(argb); | |
1334 if (src_alpha == 0) { | |
1335 return; | |
1336 } | |
1337 FX_RECT rect(left, top, left + width, top + height); | |
1338 rect.Intersect(0, 0, pBitmap->GetWidth(), pBitmap->GetHeight()); | |
1339 width = rect.Width(); | |
1340 int src_r = FXARGB_R(argb), src_g = FXARGB_G(argb), src_b = FXARGB_B(argb); | |
1341 int Bpp = pBitmap->GetBPP() / 8; | |
1342 FX_BOOL bAlpha = pBitmap->HasAlpha(); | |
1343 int dib_argb = FXARGB_TOBGRORDERDIB(argb); | |
1344 uint8_t* pBuffer = pBitmap->GetBuffer(); | |
1345 if (src_alpha == 255) { | |
1346 for (int row = rect.top; row < rect.bottom; row++) { | |
1347 uint8_t* dest_scan = | |
1348 pBuffer + row * pBitmap->GetPitch() + rect.left * Bpp; | |
1349 if (Bpp == 4) { | |
1350 uint32_t* scan = (uint32_t*)dest_scan; | |
1351 for (int col = 0; col < width; col++) { | |
1352 *scan++ = dib_argb; | |
1353 } | |
1354 } else { | |
1355 for (int col = 0; col < width; col++) { | |
1356 *dest_scan++ = src_r; | |
1357 *dest_scan++ = src_g; | |
1358 *dest_scan++ = src_b; | |
1359 } | |
1360 } | |
1361 } | |
1362 return; | |
1363 } | |
1364 for (int row = rect.top; row < rect.bottom; row++) { | |
1365 uint8_t* dest_scan = pBuffer + row * pBitmap->GetPitch() + rect.left * Bpp; | |
1366 if (bAlpha) { | |
1367 for (int col = 0; col < width; col++) { | |
1368 uint8_t back_alpha = dest_scan[3]; | |
1369 if (back_alpha == 0) { | |
1370 FXARGB_SETRGBORDERDIB(dest_scan, | |
1371 FXARGB_MAKE(src_alpha, src_r, src_g, src_b)); | |
1372 dest_scan += 4; | |
1373 continue; | |
1374 } | |
1375 uint8_t dest_alpha = | |
1376 back_alpha + src_alpha - back_alpha * src_alpha / 255; | |
1377 dest_scan[3] = dest_alpha; | |
1378 int alpha_ratio = src_alpha * 255 / dest_alpha; | |
1379 *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, src_r, alpha_ratio); | |
1380 dest_scan++; | |
1381 *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, src_g, alpha_ratio); | |
1382 dest_scan++; | |
1383 *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, src_b, alpha_ratio); | |
1384 dest_scan += 2; | |
1385 } | |
1386 } else { | |
1387 for (int col = 0; col < width; col++) { | |
1388 *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, src_r, src_alpha); | |
1389 dest_scan++; | |
1390 *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, src_g, src_alpha); | |
1391 dest_scan++; | |
1392 *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, src_b, src_alpha); | |
1393 dest_scan++; | |
1394 if (Bpp == 4) { | |
1395 dest_scan++; | |
1396 } | |
1397 } | |
1398 } | |
1399 } | |
1400 } | |
1401 | 1564 |
1402 void RgbByteOrderTransferBitmap(CFX_DIBitmap* pBitmap, | 1565 if (!m_pBitmap->GetBuffer()) |
1403 int dest_left, | 1566 return TRUE; |
1404 int dest_top, | |
1405 int width, | |
1406 int height, | |
1407 const CFX_DIBSource* pSrcBitmap, | |
1408 int src_left, | |
1409 int src_top) { | |
1410 if (!pBitmap) { | |
1411 return; | |
1412 } | |
1413 pBitmap->GetOverlapRect(dest_left, dest_top, width, height, | |
1414 pSrcBitmap->GetWidth(), pSrcBitmap->GetHeight(), | |
1415 src_left, src_top, nullptr); | |
1416 if (width == 0 || height == 0) { | |
1417 return; | |
1418 } | |
1419 int Bpp = pBitmap->GetBPP() / 8; | |
1420 FXDIB_Format dest_format = pBitmap->GetFormat(); | |
1421 FXDIB_Format src_format = pSrcBitmap->GetFormat(); | |
1422 int pitch = pBitmap->GetPitch(); | |
1423 uint8_t* buffer = pBitmap->GetBuffer(); | |
1424 if (dest_format == src_format) { | |
1425 for (int row = 0; row < height; row++) { | |
1426 uint8_t* dest_scan = buffer + (dest_top + row) * pitch + dest_left * Bpp; | |
1427 uint8_t* src_scan = | |
1428 (uint8_t*)pSrcBitmap->GetScanline(src_top + row) + src_left * Bpp; | |
1429 if (Bpp == 4) { | |
1430 for (int col = 0; col < width; col++) { | |
1431 FXARGB_SETDIB(dest_scan, FXARGB_MAKE(src_scan[3], src_scan[0], | |
1432 src_scan[1], src_scan[2])); | |
1433 dest_scan += 4; | |
1434 src_scan += 4; | |
1435 } | |
1436 } else { | |
1437 for (int col = 0; col < width; col++) { | |
1438 *dest_scan++ = src_scan[2]; | |
1439 *dest_scan++ = src_scan[1]; | |
1440 *dest_scan++ = src_scan[0]; | |
1441 src_scan += 3; | |
1442 } | |
1443 } | |
1444 } | |
1445 return; | |
1446 } | |
1447 uint8_t* dest_buf = buffer + dest_top * pitch + dest_left * Bpp; | |
1448 if (dest_format == FXDIB_Rgb) { | |
1449 if (src_format == FXDIB_Rgb32) { | |
1450 for (int row = 0; row < height; row++) { | |
1451 uint8_t* dest_scan = dest_buf + row * pitch; | |
1452 uint8_t* src_scan = | |
1453 (uint8_t*)pSrcBitmap->GetScanline(src_top + row) + src_left * 4; | |
1454 for (int col = 0; col < width; col++) { | |
1455 *dest_scan++ = src_scan[2]; | |
1456 *dest_scan++ = src_scan[1]; | |
1457 *dest_scan++ = src_scan[0]; | |
1458 src_scan += 4; | |
1459 } | |
1460 } | |
1461 } else { | |
1462 ASSERT(FALSE); | |
1463 } | |
1464 } else if (dest_format == FXDIB_Argb || dest_format == FXDIB_Rgb32) { | |
1465 if (src_format == FXDIB_Rgb) { | |
1466 for (int row = 0; row < height; row++) { | |
1467 uint8_t* dest_scan = (uint8_t*)(dest_buf + row * pitch); | |
1468 uint8_t* src_scan = | |
1469 (uint8_t*)pSrcBitmap->GetScanline(src_top + row) + src_left * 3; | |
1470 for (int col = 0; col < width; col++) { | |
1471 FXARGB_SETDIB(dest_scan, FXARGB_MAKE(0xff, src_scan[0], src_scan[1], | |
1472 src_scan[2])); | |
1473 dest_scan += 4; | |
1474 src_scan += 3; | |
1475 } | |
1476 } | |
1477 } else if (src_format == FXDIB_Rgb32) { | |
1478 ASSERT(dest_format == FXDIB_Argb); | |
1479 for (int row = 0; row < height; row++) { | |
1480 uint8_t* dest_scan = dest_buf + row * pitch; | |
1481 uint8_t* src_scan = | |
1482 (uint8_t*)(pSrcBitmap->GetScanline(src_top + row) + src_left * 4); | |
1483 for (int col = 0; col < width; col++) { | |
1484 FXARGB_SETDIB(dest_scan, FXARGB_MAKE(0xff, src_scan[0], src_scan[1], | |
1485 src_scan[2])); | |
1486 src_scan += 4; | |
1487 dest_scan += 4; | |
1488 } | |
1489 } | |
1490 } | |
1491 } else { | |
1492 ASSERT(FALSE); | |
1493 } | |
1494 } | |
1495 | 1567 |
1496 FX_ARGB _DefaultCMYK2ARGB(FX_CMYK cmyk, uint8_t alpha) { | |
1497 uint8_t r, g, b; | |
1498 AdobeCMYK_to_sRGB1(FXSYS_GetCValue(cmyk), FXSYS_GetMValue(cmyk), | |
1499 FXSYS_GetYValue(cmyk), FXSYS_GetKValue(cmyk), r, g, b); | |
1500 return ArgbEncode(alpha, r, g, b); | |
1501 } | |
1502 | |
1503 FX_BOOL _DibSetPixel(CFX_DIBitmap* pDevice, | |
1504 int x, | |
1505 int y, | |
1506 uint32_t color, | |
1507 int alpha_flag, | |
1508 void* pIccTransform) { | |
1509 FX_BOOL bObjCMYK = FXGETFLAG_COLORTYPE(alpha_flag); | |
1510 int alpha = bObjCMYK ? FXGETFLAG_ALPHA_FILL(alpha_flag) : FXARGB_A(color); | |
1511 if (pIccTransform) { | |
1512 CCodec_IccModule* pIccModule = | |
1513 CFX_GEModule::Get()->GetCodecModule()->GetIccModule(); | |
1514 color = bObjCMYK ? FXCMYK_TODIB(color) : FXARGB_TODIB(color); | |
1515 pIccModule->TranslateScanline(pIccTransform, (uint8_t*)&color, | |
1516 (uint8_t*)&color, 1); | |
1517 color = bObjCMYK ? FXCMYK_TODIB(color) : FXARGB_TODIB(color); | |
1518 if (!pDevice->IsCmykImage()) { | |
1519 color = (color & 0xffffff) | (alpha << 24); | |
1520 } | |
1521 } else { | |
1522 if (pDevice->IsCmykImage()) { | |
1523 if (!bObjCMYK) { | |
1524 return FALSE; | |
1525 } | |
1526 } else { | |
1527 if (bObjCMYK) { | |
1528 color = _DefaultCMYK2ARGB(color, alpha); | |
1529 } | |
1530 } | |
1531 } | |
1532 pDevice->SetPixel(x, y, color); | |
1533 if (pDevice->m_pAlphaMask) { | |
1534 pDevice->m_pAlphaMask->SetPixel(x, y, alpha << 24); | |
1535 } | |
1536 return TRUE; | |
1537 } | |
1538 | |
1539 FX_BOOL CFX_AggDeviceDriver::SetPixel(int x, | |
1540 int y, | |
1541 uint32_t color, | |
1542 int alpha_flag, | |
1543 void* pIccTransform) { | |
1544 if (!m_pBitmap->GetBuffer()) { | |
1545 return TRUE; | |
1546 } | |
1547 if (!CFX_GEModule::Get()->GetCodecModule() || | |
1548 !CFX_GEModule::Get()->GetCodecModule()->GetIccModule()) { | |
1549 pIccTransform = nullptr; | |
1550 } | |
1551 if (!m_pClipRgn) { | |
1552 if (m_bRgbByteOrder) { | |
1553 RgbByteOrderSetPixel(m_pBitmap, x, y, color); | |
1554 } else { | |
1555 return _DibSetPixel(m_pBitmap, x, y, color, alpha_flag, pIccTransform); | |
1556 } | |
1557 } else if (m_pClipRgn->GetBox().Contains(x, y)) { | |
1558 if (m_pClipRgn->GetType() == CFX_ClipRgn::RectI) { | |
1559 if (m_bRgbByteOrder) { | |
1560 RgbByteOrderSetPixel(m_pBitmap, x, y, color); | |
1561 } else { | |
1562 return _DibSetPixel(m_pBitmap, x, y, color, alpha_flag, pIccTransform); | |
1563 } | |
1564 } else if (m_pClipRgn->GetType() == CFX_ClipRgn::MaskF) { | |
1565 const CFX_DIBitmap* pMask = m_pClipRgn->GetMask().GetObject(); | |
1566 FX_BOOL bCMYK = FXGETFLAG_COLORTYPE(alpha_flag); | |
1567 int new_alpha = | |
1568 bCMYK ? FXGETFLAG_ALPHA_FILL(alpha_flag) : FXARGB_A(color); | |
1569 new_alpha = new_alpha * pMask->GetScanline(y)[x] / 255; | |
1570 if (m_bRgbByteOrder) { | |
1571 RgbByteOrderSetPixel(m_pBitmap, x, y, | |
1572 (color & 0xffffff) | (new_alpha << 24)); | |
1573 return TRUE; | |
1574 } | |
1575 if (bCMYK) { | |
1576 FXSETFLAG_ALPHA_FILL(alpha_flag, new_alpha); | |
1577 } else { | |
1578 color = (color & 0xffffff) | (new_alpha << 24); | |
1579 } | |
1580 return _DibSetPixel(m_pBitmap, x, y, color, alpha_flag, pIccTransform); | |
1581 } | |
1582 } | |
1583 return TRUE; | |
1584 } | |
1585 | |
1586 FX_BOOL CFX_AggDeviceDriver::FillRect(const FX_RECT* pRect, | |
1587 uint32_t fill_color, | |
1588 int alpha_flag, | |
1589 void* pIccTransform, | |
1590 int blend_type) { | |
1591 if (blend_type != FXDIB_BLEND_NORMAL) { | |
1592 return FALSE; | |
1593 } | |
1594 if (!m_pBitmap->GetBuffer()) { | |
1595 return TRUE; | |
1596 } | |
1597 FX_RECT clip_rect; | 1568 FX_RECT clip_rect; |
1598 GetClipBox(&clip_rect); | 1569 GetClipBox(&clip_rect); |
1599 FX_RECT draw_rect = clip_rect; | 1570 FX_RECT draw_rect = clip_rect; |
1600 if (pRect) { | 1571 if (pRect) |
1601 draw_rect.Intersect(*pRect); | 1572 draw_rect.Intersect(*pRect); |
1602 } | 1573 if (draw_rect.IsEmpty()) |
1603 if (draw_rect.IsEmpty()) { | |
1604 return TRUE; | 1574 return TRUE; |
1605 } | 1575 |
1606 if (!m_pClipRgn || m_pClipRgn->GetType() == CFX_ClipRgn::RectI) { | 1576 if (!m_pClipRgn || m_pClipRgn->GetType() == CFX_ClipRgn::RectI) { |
1607 if (m_bRgbByteOrder) { | 1577 if (m_bRgbByteOrder) { |
1608 RgbByteOrderCompositeRect(m_pBitmap, draw_rect.left, draw_rect.top, | 1578 RgbByteOrderCompositeRect(m_pBitmap, draw_rect.left, draw_rect.top, |
1609 draw_rect.Width(), draw_rect.Height(), | 1579 draw_rect.Width(), draw_rect.Height(), |
1610 fill_color); | 1580 fill_color); |
1611 } else { | 1581 } else { |
1612 m_pBitmap->CompositeRect(draw_rect.left, draw_rect.top, draw_rect.Width(), | 1582 m_pBitmap->CompositeRect(draw_rect.left, draw_rect.top, draw_rect.Width(), |
1613 draw_rect.Height(), fill_color, alpha_flag, | 1583 draw_rect.Height(), fill_color, 0, nullptr); |
1614 pIccTransform); | |
1615 } | 1584 } |
1616 return TRUE; | 1585 return TRUE; |
1617 } | 1586 } |
1618 m_pBitmap->CompositeMask( | 1587 m_pBitmap->CompositeMask( |
1619 draw_rect.left, draw_rect.top, draw_rect.Width(), draw_rect.Height(), | 1588 draw_rect.left, draw_rect.top, draw_rect.Width(), draw_rect.Height(), |
1620 m_pClipRgn->GetMask().GetObject(), fill_color, | 1589 m_pClipRgn->GetMask().GetObject(), fill_color, |
1621 draw_rect.left - clip_rect.left, draw_rect.top - clip_rect.top, | 1590 draw_rect.left - clip_rect.left, draw_rect.top - clip_rect.top, |
1622 FXDIB_BLEND_NORMAL, nullptr, m_bRgbByteOrder, alpha_flag, pIccTransform); | 1591 FXDIB_BLEND_NORMAL, nullptr, m_bRgbByteOrder, 0, nullptr); |
1623 return TRUE; | 1592 return TRUE; |
1624 } | 1593 } |
1625 | 1594 |
1626 FX_BOOL CFX_AggDeviceDriver::GetClipBox(FX_RECT* pRect) { | 1595 FX_BOOL CFX_AggDeviceDriver::GetClipBox(FX_RECT* pRect) { |
1627 if (!m_pClipRgn) { | 1596 if (!m_pClipRgn) { |
1628 pRect->left = pRect->top = 0; | 1597 pRect->left = pRect->top = 0; |
1629 pRect->right = GetDeviceCaps(FXDC_PIXEL_WIDTH); | 1598 pRect->right = GetDeviceCaps(FXDC_PIXEL_WIDTH); |
1630 pRect->bottom = GetDeviceCaps(FXDC_PIXEL_HEIGHT); | 1599 pRect->bottom = GetDeviceCaps(FXDC_PIXEL_HEIGHT); |
1631 return TRUE; | 1600 return TRUE; |
1632 } | 1601 } |
1633 *pRect = m_pClipRgn->GetBox(); | 1602 *pRect = m_pClipRgn->GetBox(); |
1634 return TRUE; | 1603 return TRUE; |
1635 } | 1604 } |
1636 | 1605 |
1637 FX_BOOL CFX_AggDeviceDriver::GetDIBits(CFX_DIBitmap* pBitmap, | 1606 FX_BOOL CFX_AggDeviceDriver::GetDIBits(CFX_DIBitmap* pBitmap, |
1638 int left, | 1607 int left, |
1639 int top, | 1608 int top) { |
1640 void* pIccTransform, | 1609 if (!m_pBitmap || !m_pBitmap->GetBuffer()) |
1641 FX_BOOL bDEdge) { | |
1642 if (!m_pBitmap->GetBuffer()) { | |
1643 return TRUE; | 1610 return TRUE; |
1644 } | 1611 |
1645 if (bDEdge) { | |
1646 if (m_bRgbByteOrder) { | |
1647 RgbByteOrderTransferBitmap(pBitmap, 0, 0, pBitmap->GetWidth(), | |
1648 pBitmap->GetHeight(), m_pBitmap, left, top); | |
1649 } else { | |
1650 return pBitmap->TransferBitmap(0, 0, pBitmap->GetWidth(), | |
1651 pBitmap->GetHeight(), m_pBitmap, left, top, | |
1652 pIccTransform); | |
1653 } | |
1654 return TRUE; | |
1655 } | |
1656 FX_RECT rect(left, top, left + pBitmap->GetWidth(), | 1612 FX_RECT rect(left, top, left + pBitmap->GetWidth(), |
1657 top + pBitmap->GetHeight()); | 1613 top + pBitmap->GetHeight()); |
1658 CFX_DIBitmap* pBack = nullptr; | 1614 CFX_DIBitmap* pBack = nullptr; |
1659 if (m_pOriDevice) { | 1615 if (m_pOriDevice) { |
1660 pBack = m_pOriDevice->Clone(&rect); | 1616 pBack = m_pOriDevice->Clone(&rect); |
1661 if (!pBack) { | 1617 if (!pBack) |
1662 return TRUE; | 1618 return TRUE; |
1663 } | 1619 |
1664 pBack->CompositeBitmap(0, 0, pBack->GetWidth(), pBack->GetHeight(), | 1620 pBack->CompositeBitmap(0, 0, pBack->GetWidth(), pBack->GetHeight(), |
1665 m_pBitmap, 0, 0); | 1621 m_pBitmap, 0, 0); |
1666 } else { | 1622 } else { |
1667 pBack = m_pBitmap->Clone(&rect); | 1623 pBack = m_pBitmap->Clone(&rect); |
1624 if (!pBack) | |
1625 return TRUE; | |
1668 } | 1626 } |
1669 if (!pBack) { | 1627 |
1670 return TRUE; | |
1671 } | |
1672 FX_BOOL bRet = TRUE; | 1628 FX_BOOL bRet = TRUE; |
1673 left = left >= 0 ? 0 : left; | 1629 left = std::min(left, 0); |
1674 top = top >= 0 ? 0 : top; | 1630 top = std::min(top, 0); |
1675 if (m_bRgbByteOrder) { | 1631 if (m_bRgbByteOrder) { |
1676 RgbByteOrderTransferBitmap(pBitmap, 0, 0, rect.Width(), rect.Height(), | 1632 RgbByteOrderTransferBitmap(pBitmap, 0, 0, rect.Width(), rect.Height(), |
1677 pBack, left, top); | 1633 pBack, left, top); |
1678 } else { | 1634 } else { |
1679 bRet = pBitmap->TransferBitmap(0, 0, rect.Width(), rect.Height(), pBack, | 1635 bRet = pBitmap->TransferBitmap(0, 0, rect.Width(), rect.Height(), pBack, |
1680 left, top, pIccTransform); | 1636 left, top, nullptr); |
1681 } | 1637 } |
1682 delete pBack; | 1638 delete pBack; |
1683 return bRet; | 1639 return bRet; |
1684 } | 1640 } |
1685 | 1641 |
1686 FX_BOOL CFX_AggDeviceDriver::SetDIBits(const CFX_DIBSource* pBitmap, | 1642 FX_BOOL CFX_AggDeviceDriver::SetDIBits(const CFX_DIBSource* pBitmap, |
1687 uint32_t argb, | 1643 uint32_t argb, |
1688 const FX_RECT* pSrcRect, | 1644 const FX_RECT* pSrcRect, |
1689 int left, | 1645 int left, |
1690 int top, | 1646 int top, |
1691 int blend_type, | 1647 int blend_type) { |
1692 int alpha_flag, | 1648 if (!m_pBitmap->GetBuffer()) |
1693 void* pIccTransform) { | |
1694 if (!m_pBitmap->GetBuffer()) { | |
1695 return TRUE; | 1649 return TRUE; |
1650 | |
1651 if (pBitmap->IsAlphaMask()) { | |
1652 return m_pBitmap->CompositeMask(left, top, pSrcRect->Width(), | |
1653 pSrcRect->Height(), pBitmap, argb, | |
1654 pSrcRect->left, pSrcRect->top, blend_type, | |
1655 m_pClipRgn, m_bRgbByteOrder, 0, nullptr); | |
1696 } | 1656 } |
1697 if (pBitmap->IsAlphaMask()) | |
1698 return m_pBitmap->CompositeMask( | |
1699 left, top, pSrcRect->Width(), pSrcRect->Height(), pBitmap, argb, | |
1700 pSrcRect->left, pSrcRect->top, blend_type, m_pClipRgn, m_bRgbByteOrder, | |
1701 alpha_flag, pIccTransform); | |
1702 return m_pBitmap->CompositeBitmap( | 1657 return m_pBitmap->CompositeBitmap( |
1703 left, top, pSrcRect->Width(), pSrcRect->Height(), pBitmap, pSrcRect->left, | 1658 left, top, pSrcRect->Width(), pSrcRect->Height(), pBitmap, pSrcRect->left, |
1704 pSrcRect->top, blend_type, m_pClipRgn, m_bRgbByteOrder, pIccTransform); | 1659 pSrcRect->top, blend_type, m_pClipRgn, m_bRgbByteOrder, nullptr); |
1705 } | 1660 } |
1706 | 1661 |
1707 FX_BOOL CFX_AggDeviceDriver::StretchDIBits(const CFX_DIBSource* pSource, | 1662 FX_BOOL CFX_AggDeviceDriver::StretchDIBits(const CFX_DIBSource* pSource, |
1708 uint32_t argb, | 1663 uint32_t argb, |
1709 int dest_left, | 1664 int dest_left, |
1710 int dest_top, | 1665 int dest_top, |
1711 int dest_width, | 1666 int dest_width, |
1712 int dest_height, | 1667 int dest_height, |
1713 const FX_RECT* pClipRect, | 1668 const FX_RECT* pClipRect, |
1714 uint32_t flags, | 1669 uint32_t flags, |
1715 int alpha_flag, | |
1716 void* pIccTransform, | |
1717 int blend_type) { | 1670 int blend_type) { |
1718 if (!m_pBitmap->GetBuffer()) { | 1671 if (!m_pBitmap->GetBuffer()) |
1719 return TRUE; | 1672 return TRUE; |
1720 } | 1673 |
1721 if (dest_width == pSource->GetWidth() && | 1674 if (dest_width == pSource->GetWidth() && |
1722 dest_height == pSource->GetHeight()) { | 1675 dest_height == pSource->GetHeight()) { |
1723 FX_RECT rect(0, 0, dest_width, dest_height); | 1676 FX_RECT rect(0, 0, dest_width, dest_height); |
1724 return SetDIBits(pSource, argb, &rect, dest_left, dest_top, blend_type, | 1677 return SetDIBits(pSource, argb, &rect, dest_left, dest_top, blend_type); |
1725 alpha_flag, pIccTransform); | |
1726 } | 1678 } |
1727 FX_RECT dest_rect(dest_left, dest_top, dest_left + dest_width, | 1679 FX_RECT dest_rect(dest_left, dest_top, dest_left + dest_width, |
1728 dest_top + dest_height); | 1680 dest_top + dest_height); |
1729 dest_rect.Normalize(); | 1681 dest_rect.Normalize(); |
1730 FX_RECT dest_clip = dest_rect; | 1682 FX_RECT dest_clip = dest_rect; |
1731 dest_clip.Intersect(*pClipRect); | 1683 dest_clip.Intersect(*pClipRect); |
1732 CFX_BitmapComposer composer; | 1684 CFX_BitmapComposer composer; |
1733 composer.Compose(m_pBitmap, m_pClipRgn, 255, argb, dest_clip, FALSE, FALSE, | 1685 composer.Compose(m_pBitmap, m_pClipRgn, 255, argb, dest_clip, FALSE, FALSE, |
1734 FALSE, m_bRgbByteOrder, alpha_flag, pIccTransform, | 1686 FALSE, m_bRgbByteOrder, 0, nullptr, blend_type); |
1735 blend_type); | |
1736 dest_clip.Offset(-dest_rect.left, -dest_rect.top); | 1687 dest_clip.Offset(-dest_rect.left, -dest_rect.top); |
1737 CFX_ImageStretcher stretcher(&composer, pSource, dest_width, dest_height, | 1688 CFX_ImageStretcher stretcher(&composer, pSource, dest_width, dest_height, |
1738 dest_clip, flags); | 1689 dest_clip, flags); |
1739 if (stretcher.Start()) | 1690 if (stretcher.Start()) |
1740 stretcher.Continue(nullptr); | 1691 stretcher.Continue(nullptr); |
1741 return TRUE; | 1692 return TRUE; |
1742 } | 1693 } |
1743 | 1694 |
1744 FX_BOOL CFX_AggDeviceDriver::StartDIBits(const CFX_DIBSource* pSource, | 1695 FX_BOOL CFX_AggDeviceDriver::StartDIBits(const CFX_DIBSource* pSource, |
1745 int bitmap_alpha, | 1696 int bitmap_alpha, |
1746 uint32_t argb, | 1697 uint32_t argb, |
1747 const CFX_Matrix* pMatrix, | 1698 const CFX_Matrix* pMatrix, |
1748 uint32_t render_flags, | 1699 uint32_t render_flags, |
1749 void*& handle, | 1700 void*& handle, |
1750 int alpha_flag, | |
1751 void* pIccTransform, | |
1752 int blend_type) { | 1701 int blend_type) { |
1753 if (!m_pBitmap->GetBuffer()) { | 1702 if (!m_pBitmap->GetBuffer()) |
1754 return TRUE; | 1703 return TRUE; |
1755 } | 1704 |
1756 CFX_ImageRenderer* pRenderer = new CFX_ImageRenderer; | 1705 CFX_ImageRenderer* pRenderer = new CFX_ImageRenderer; |
1757 pRenderer->Start(m_pBitmap, m_pClipRgn, pSource, bitmap_alpha, argb, pMatrix, | 1706 pRenderer->Start(m_pBitmap, m_pClipRgn, pSource, bitmap_alpha, argb, pMatrix, |
1758 render_flags, m_bRgbByteOrder, alpha_flag, pIccTransform); | 1707 render_flags, m_bRgbByteOrder, 0, nullptr); |
1759 handle = pRenderer; | 1708 handle = pRenderer; |
1760 return TRUE; | 1709 return TRUE; |
1761 } | 1710 } |
1762 | 1711 |
1763 FX_BOOL CFX_AggDeviceDriver::ContinueDIBits(void* pHandle, IFX_Pause* pPause) { | 1712 FX_BOOL CFX_AggDeviceDriver::ContinueDIBits(void* pHandle, IFX_Pause* pPause) { |
1764 if (!m_pBitmap->GetBuffer()) { | 1713 if (!m_pBitmap->GetBuffer()) { |
1765 return TRUE; | 1714 return TRUE; |
1766 } | 1715 } |
1767 return ((CFX_ImageRenderer*)pHandle)->Continue(pPause); | 1716 return ((CFX_ImageRenderer*)pHandle)->Continue(pPause); |
1768 } | 1717 } |
(...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1809 SetDeviceDriver(pDriver); | 1758 SetDeviceDriver(pDriver); |
1810 return true; | 1759 return true; |
1811 } | 1760 } |
1812 | 1761 |
1813 CFX_FxgeDevice::~CFX_FxgeDevice() { | 1762 CFX_FxgeDevice::~CFX_FxgeDevice() { |
1814 if (m_bOwnedBitmap) { | 1763 if (m_bOwnedBitmap) { |
1815 delete GetBitmap(); | 1764 delete GetBitmap(); |
1816 } | 1765 } |
1817 } | 1766 } |
1818 #endif | 1767 #endif |
OLD | NEW |