Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(98)

Side by Side Diff: core/fxge/agg/fx_agg_driver.cpp

Issue 2059883004: Remove default arguments from IFX_RenderDeviceDriver. (Closed) Base URL: https://pdfium.googlesource.com/pdfium@master
Patch Set: mac Created 4 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « core/fxge/agg/fx_agg_driver.h ('k') | core/fxge/apple/apple_int.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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
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
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
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
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
OLDNEW
« no previous file with comments | « core/fxge/agg/fx_agg_driver.h ('k') | core/fxge/apple/apple_int.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698