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

Side by Side Diff: core/fxge/skia/fx_skia_device.cpp

Issue 1806843002: fix paths and remove dead code (Closed) Base URL: https://pdfium.googlesource.com/pdfium.git@master
Patch Set: address comment Created 4 years, 9 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
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 #include "core/include/fxge/fx_ge.h" 5 #include "core/include/fxge/fx_ge.h"
6 6
7 #if defined(_SKIA_SUPPORT_) 7 #if defined(_SKIA_SUPPORT_)
8 #include "core/include/fxcodec/fx_codec.h" 8 #include "core/include/fxcodec/fx_codec.h"
9 9
10 #include "core/fxge/agg/fx_agg_driver.h" 10 #include "core/fxge/agg/fx_agg_driver.h"
(...skipping 14 matching lines...) Expand all
25 static void DebugShowSkiaPath(const SkPath& path) { 25 static void DebugShowSkiaPath(const SkPath& path) {
26 #if SHOW_SKIA_PATH 26 #if SHOW_SKIA_PATH
27 char buffer[4096]; 27 char buffer[4096];
28 sk_bzero(buffer, sizeof(buffer)); 28 sk_bzero(buffer, sizeof(buffer));
29 SkMemoryWStream stream(buffer, sizeof(buffer)); 29 SkMemoryWStream stream(buffer, sizeof(buffer));
30 path.dump(&stream, false, false); 30 path.dump(&stream, false, false);
31 printf("%s\n", buffer); 31 printf("%s\n", buffer);
32 #endif // SHOW_SKIA_PATH 32 #endif // SHOW_SKIA_PATH
33 } 33 }
34 34
35 static void DebugShowCanvasMatrix(const SkCanvas* canvas) {
36 #if SHOW_SKIA_PATH
37 SkMatrix matrix = canvas->getTotalMatrix();
38 SkScalar m[9];
39 matrix.get9(m);
40 printf("(%g,%g,%g) (%g,%g,%g) (%g,%g,%g)\n", m[0], m[1], m[2], m[3], m[4], m[5 ], m[6],
Tom Sepez 2016/03/17 16:05:50 nit: 80 cols.
caryclark 2016/03/18 18:22:12 Done.
41 m[7], m[8]);
42 #endif // SHOW_SKIA_PATH
43 }
44
35 #if DRAW_SKIA_CLIP 45 #if DRAW_SKIA_CLIP
36 46
37 static SkPaint DebugClipPaint() { 47 static SkPaint DebugClipPaint() {
38 SkPaint paint; 48 SkPaint paint;
39 paint.setAntiAlias(true); 49 paint.setAntiAlias(true);
40 paint.setColor(SK_ColorGREEN); 50 paint.setColor(SK_ColorGREEN);
41 paint.setStyle(SkPaint::kStroke_Style); 51 paint.setStyle(SkPaint::kStroke_Style);
42 return paint; 52 return paint;
43 } 53 }
44 54
(...skipping 10 matching lines...) Expand all
55 #else // DRAW_SKIA_CLIP 65 #else // DRAW_SKIA_CLIP
56 66
57 static void DebugDrawSkiaClipRect(SkCanvas* canvas, const SkRect& rect) {} 67 static void DebugDrawSkiaClipRect(SkCanvas* canvas, const SkRect& rect) {}
58 static void DebugDrawSkiaClipPath(SkCanvas* canvas, const SkPath& path) {} 68 static void DebugDrawSkiaClipPath(SkCanvas* canvas, const SkPath& path) {}
59 69
60 #endif // DRAW_SKIA_CLIP 70 #endif // DRAW_SKIA_CLIP
61 71
62 #undef SHOW_SKIA_PATH 72 #undef SHOW_SKIA_PATH
63 #undef DRAW_SKIA_CLIP 73 #undef DRAW_SKIA_CLIP
64 74
65 static SkPath BuildPath(const CFX_PathData* pPathData, 75 static SkPath BuildPath(const CFX_PathData* pPathData) {
66 const CFX_Matrix* pObject2Device) {
67 SkPath skPath; 76 SkPath skPath;
68 const CFX_PathData* pFPath = pPathData; 77 const CFX_PathData* pFPath = pPathData;
69 int nPoints = pFPath->GetPointCount(); 78 int nPoints = pFPath->GetPointCount();
70 FX_PATHPOINT* pPoints = pFPath->GetPoints(); 79 FX_PATHPOINT* pPoints = pFPath->GetPoints();
71 for (int i = 0; i < nPoints; i++) { 80 for (int i = 0; i < nPoints; i++) {
72 FX_FLOAT x = pPoints[i].m_PointX; 81 FX_FLOAT x = pPoints[i].m_PointX;
73 FX_FLOAT y = pPoints[i].m_PointY; 82 FX_FLOAT y = pPoints[i].m_PointY;
74 if (pObject2Device)
75 pObject2Device->Transform(x, y);
76 int point_type = pPoints[i].m_Flag & FXPT_TYPE; 83 int point_type = pPoints[i].m_Flag & FXPT_TYPE;
77 if (point_type == FXPT_MOVETO) { 84 if (point_type == FXPT_MOVETO) {
78 skPath.moveTo(x, y); 85 skPath.moveTo(x, y);
79 } else if (point_type == FXPT_LINETO) { 86 } else if (point_type == FXPT_LINETO) {
80 skPath.lineTo(x, y); 87 skPath.lineTo(x, y);
81 } else if (point_type == FXPT_BEZIERTO) { 88 } else if (point_type == FXPT_BEZIERTO) {
82 FX_FLOAT x2 = pPoints[i + 1].m_PointX, y2 = pPoints[i + 1].m_PointY; 89 FX_FLOAT x2 = pPoints[i + 1].m_PointX, y2 = pPoints[i + 1].m_PointY;
83 FX_FLOAT x3 = pPoints[i + 2].m_PointX, y3 = pPoints[i + 2].m_PointY; 90 FX_FLOAT x3 = pPoints[i + 2].m_PointX, y3 = pPoints[i + 2].m_PointY;
84 if (pObject2Device) {
85 pObject2Device->Transform(x2, y2);
86 pObject2Device->Transform(x3, y3);
87 }
88 skPath.cubicTo(x, y, x2, y2, x3, y3); 91 skPath.cubicTo(x, y, x2, y2, x3, y3);
89 i += 2; 92 i += 2;
90 } 93 }
91 if (pPoints[i].m_Flag & FXPT_CLOSEFIGURE) 94 if (pPoints[i].m_Flag & FXPT_CLOSEFIGURE)
92 skPath.close(); 95 skPath.close();
93 } 96 }
94 return skPath; 97 return skPath;
95 } 98 }
96 99
97 // convert a stroking path to scanlines 100 // convert a stroking path to scanlines
98 void CFX_SkiaDeviceDriver::PaintStroke(SkPaint* spaint, 101 void CFX_SkiaDeviceDriver::PaintStroke(SkPaint* spaint,
99 const CFX_GraphStateData* pGraphState) { 102 const CFX_GraphStateData* pGraphState,
103 const SkMatrix& matrix) {
100 SkPaint::Cap cap; 104 SkPaint::Cap cap;
101 switch (pGraphState->m_LineCap) { 105 switch (pGraphState->m_LineCap) {
102 case CFX_GraphStateData::LineCapRound: 106 case CFX_GraphStateData::LineCapRound:
103 cap = SkPaint::kRound_Cap; 107 cap = SkPaint::kRound_Cap;
104 break; 108 break;
105 case CFX_GraphStateData::LineCapSquare: 109 case CFX_GraphStateData::LineCapSquare:
106 cap = SkPaint::kSquare_Cap; 110 cap = SkPaint::kSquare_Cap;
107 break; 111 break;
108 default: 112 default:
109 cap = SkPaint::kButt_Cap; 113 cap = SkPaint::kButt_Cap;
110 break; 114 break;
111 } 115 }
112 SkPaint::Join join; 116 SkPaint::Join join;
113 switch (pGraphState->m_LineJoin) { 117 switch (pGraphState->m_LineJoin) {
114 case CFX_GraphStateData::LineJoinRound: 118 case CFX_GraphStateData::LineJoinRound:
115 join = SkPaint::kRound_Join; 119 join = SkPaint::kRound_Join;
116 break; 120 break;
117 case CFX_GraphStateData::LineJoinBevel: 121 case CFX_GraphStateData::LineJoinBevel:
118 join = SkPaint::kBevel_Join; 122 join = SkPaint::kBevel_Join;
119 break; 123 break;
120 default: 124 default:
121 join = SkPaint::kMiter_Join; 125 join = SkPaint::kMiter_Join;
122 break; 126 break;
123 } 127 }
124 FX_FLOAT width = pGraphState->m_LineWidth; 128 SkMatrix inverse;
125 129 if (!matrix.invert(&inverse))
130 return; // give up if the matrix is degenerate, and not invertable
131 inverse.set(SkMatrix::kMTransX, 0);
132 inverse.set(SkMatrix::kMTransY, 0);
133 SkVector deviceUnits[2] = {{0, 1}, {1, 0}};
134 inverse.mapPoints(deviceUnits, SK_ARRAY_COUNT(deviceUnits));
135 FX_FLOAT width = SkTMax(pGraphState->m_LineWidth,
136 SkTMin(deviceUnits[0].length(), deviceUnits[1].length( )));
Tom Sepez 2016/03/17 16:05:50 nit: ditto. git cl format should have fixed these
caryclark 2016/03/18 18:22:12 Done.
126 if (pGraphState->m_DashArray) { 137 if (pGraphState->m_DashArray) {
127 int count = (pGraphState->m_DashCount + 1) / 2; 138 int count = (pGraphState->m_DashCount + 1) / 2;
128 SkScalar* intervals = FX_Alloc2D(SkScalar, count, sizeof(SkScalar)); 139 SkScalar* intervals = FX_Alloc2D(SkScalar, count, sizeof(SkScalar));
129 // Set dash pattern 140 // Set dash pattern
130 for (int i = 0; i < count; i++) { 141 for (int i = 0; i < count; i++) {
131 FX_FLOAT on = pGraphState->m_DashArray[i * 2]; 142 FX_FLOAT on = pGraphState->m_DashArray[i * 2];
132 if (on <= 0.000001f) 143 if (on <= 0.000001f)
133 on = 1.f / 10; 144 on = 1.f / 10;
134 FX_FLOAT off = i * 2 + 1 == pGraphState->m_DashCount 145 FX_FLOAT off = i * 2 + 1 == pGraphState->m_DashCount
135 ? on 146 ? on
(...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after
185 m_pCanvas = m_pRecorder->getRecordingCanvas(); 196 m_pCanvas = m_pRecorder->getRecordingCanvas();
186 m_ditherBits = 0; 197 m_ditherBits = 0;
187 } 198 }
188 199
189 CFX_SkiaDeviceDriver::~CFX_SkiaDeviceDriver() { 200 CFX_SkiaDeviceDriver::~CFX_SkiaDeviceDriver() {
190 if (!m_pRecorder) 201 if (!m_pRecorder)
191 delete m_pCanvas; 202 delete m_pCanvas;
192 delete m_pAggDriver; 203 delete m_pAggDriver;
193 } 204 }
194 205
206 static SkMatrix ToSkMatrix(const CFX_Matrix& m) {
Tom Sepez 2016/03/17 16:05:50 nit: an we put these up top in the file with the
caryclark 2016/03/18 18:22:12 Done.
207 SkMatrix skMatrix;
208 skMatrix.setAll(m.a, m.b, m.e, m.c, m.d, m.f, 0, 0, 1);
Tom Sepez 2016/03/17 16:05:50 nit: Pity SkMatrix doesn't have a constructor of t
caryclark 2016/03/18 18:22:12 Would you like a bug filed to request this feature
209 return skMatrix;
210 }
211
212 // use when pdf's y-axis points up insead of down
213 static SkMatrix ToFlippedSkMatrix(const CFX_Matrix& m) {
214 SkMatrix skMatrix;
215 skMatrix.setAll(m.a, m.b, m.e, -m.c, -m.d, m.f, 0, 0, 1);
216 return skMatrix;
217 }
218
195 FX_BOOL CFX_SkiaDeviceDriver::DrawDeviceText(int nChars, 219 FX_BOOL CFX_SkiaDeviceDriver::DrawDeviceText(int nChars,
196 const FXTEXT_CHARPOS* pCharPos, 220 const FXTEXT_CHARPOS* pCharPos,
197 CFX_Font* pFont, 221 CFX_Font* pFont,
198 CFX_FontCache* pCache, 222 CFX_FontCache* pCache,
199 const CFX_Matrix* pObject2Device, 223 const CFX_Matrix* pObject2Device,
200 FX_FLOAT font_size, 224 FX_FLOAT font_size,
201 FX_DWORD color, 225 FX_DWORD color,
202 int alpha_flag, 226 int alpha_flag,
203 void* pIccTransform) { 227 void* pIccTransform) {
204 SkAutoTUnref<SkTypeface> typeface(SkTypeface::CreateFromStream( 228 SkAutoTUnref<SkTypeface> typeface(SkTypeface::CreateFromStream(
205 new SkMemoryStream(pFont->GetFontData(), pFont->GetSize()))); 229 new SkMemoryStream(pFont->GetFontData(), pFont->GetSize())));
206 SkPaint paint; 230 SkPaint paint;
207 paint.setAntiAlias(true); 231 paint.setAntiAlias(true);
208 paint.setColor(color); 232 paint.setColor(color);
209 paint.setTypeface(typeface); 233 paint.setTypeface(typeface);
210 paint.setTextEncoding(SkPaint::kGlyphID_TextEncoding); 234 paint.setTextEncoding(SkPaint::kGlyphID_TextEncoding);
211 paint.setTextSize(font_size); 235 paint.setTextSize(font_size);
212 m_pCanvas->save(); 236 m_pCanvas->save();
213 SkMatrix skMatrix; 237 SkMatrix skMatrix = ToFlippedSkMatrix(*pObject2Device);
214 const CFX_Matrix& m = *pObject2Device;
215 // note that PDF's y-axis goes up; Skia's y-axis goes down
216 skMatrix.setAll(m.a, m.b, m.e, -m.c, -m.d, m.f, 0, 0, 1);
217 m_pCanvas->concat(skMatrix); 238 m_pCanvas->concat(skMatrix);
218 for (int index = 0; index < nChars; ++index) { 239 for (int index = 0; index < nChars; ++index) {
219 const FXTEXT_CHARPOS& cp = pCharPos[index]; 240 const FXTEXT_CHARPOS& cp = pCharPos[index];
220 uint16_t glyph = (uint16_t)cp.m_GlyphIndex; 241 uint16_t glyph = (uint16_t)cp.m_GlyphIndex;
221 m_pCanvas->drawText(&glyph, 2, cp.m_OriginX, cp.m_OriginY, paint); 242 m_pCanvas->drawText(&glyph, 2, cp.m_OriginX, cp.m_OriginY, paint);
222 } 243 }
223 m_pCanvas->restore(); 244 m_pCanvas->restore();
224 return TRUE; 245 return TRUE;
225 } 246 }
226 247
(...skipping 14 matching lines...) Expand all
241 return FXRC_GET_BITS | FXRC_ALPHA_PATH | FXRC_ALPHA_IMAGE | 262 return FXRC_GET_BITS | FXRC_ALPHA_PATH | FXRC_ALPHA_IMAGE |
242 FXRC_BLEND_MODE | FXRC_SOFT_CLIP | FXRC_ALPHA_OUTPUT; 263 FXRC_BLEND_MODE | FXRC_SOFT_CLIP | FXRC_ALPHA_OUTPUT;
243 case FXDC_DITHER_BITS: 264 case FXDC_DITHER_BITS:
244 return m_ditherBits; 265 return m_ditherBits;
245 } 266 }
246 return 0; 267 return 0;
247 } 268 }
248 269
249 void CFX_SkiaDeviceDriver::SaveState() { 270 void CFX_SkiaDeviceDriver::SaveState() {
250 m_pCanvas->save(); 271 m_pCanvas->save();
251 if (m_pAggDriver)
252 m_pAggDriver->SaveState();
253 } 272 }
254 273
255 void CFX_SkiaDeviceDriver::RestoreState(FX_BOOL bKeepSaved) { 274 void CFX_SkiaDeviceDriver::RestoreState(FX_BOOL bKeepSaved) {
256 if (m_pAggDriver)
257 m_pAggDriver->RestoreState(bKeepSaved);
258 m_pCanvas->restore(); 275 m_pCanvas->restore();
259 if (bKeepSaved) 276 if (bKeepSaved)
260 m_pCanvas->save(); 277 m_pCanvas->save();
261 } 278 }
262 279
263 void CFX_SkiaDeviceDriver::SetClipMask(
264 agg::rasterizer_scanline_aa& rasterizer) {
265 if (m_pAggDriver)
266 m_pAggDriver->SetClipMask(rasterizer);
267 }
268
269 FX_BOOL CFX_SkiaDeviceDriver::SetClip_PathFill( 280 FX_BOOL CFX_SkiaDeviceDriver::SetClip_PathFill(
270 const CFX_PathData* pPathData, // path info 281 const CFX_PathData* pPathData, // path info
271 const CFX_Matrix* pObject2Device, // flips object's y-axis 282 const CFX_Matrix* pObject2Device, // flips object's y-axis
272 int fill_mode // fill mode, WINDING or ALTERNATE 283 int fill_mode // fill mode, WINDING or ALTERNATE
273 ) { 284 ) {
274 if (pPathData->GetPointCount() == 5 || pPathData->GetPointCount() == 4) { 285 if (pPathData->GetPointCount() == 5 || pPathData->GetPointCount() == 4) {
275 CFX_FloatRect rectf; 286 CFX_FloatRect rectf;
276 if (pPathData->IsRect(pObject2Device, &rectf)) { 287 if (pPathData->IsRect(pObject2Device, &rectf)) {
277 rectf.Intersect( 288 rectf.Intersect(
278 CFX_FloatRect(0, 0, (FX_FLOAT)GetDeviceCaps(FXDC_PIXEL_WIDTH), 289 CFX_FloatRect(0, 0, (FX_FLOAT)GetDeviceCaps(FXDC_PIXEL_WIDTH),
279 (FX_FLOAT)GetDeviceCaps(FXDC_PIXEL_HEIGHT))); 290 (FX_FLOAT)GetDeviceCaps(FXDC_PIXEL_HEIGHT)));
280 // note that PDF's y-axis goes up; Skia's y-axis goes down 291 // note that PDF's y-axis goes up; Skia's y-axis goes down
281 SkRect skClipRect = 292 SkRect skClipRect =
282 SkRect::MakeLTRB(rectf.left, rectf.bottom, rectf.right, rectf.top); 293 SkRect::MakeLTRB(rectf.left, rectf.bottom, rectf.right, rectf.top);
283 DebugDrawSkiaClipRect(m_pCanvas, skClipRect); 294 DebugDrawSkiaClipRect(m_pCanvas, skClipRect);
284 m_pCanvas->clipRect(skClipRect); 295 m_pCanvas->clipRect(skClipRect);
285 return TRUE; 296 return TRUE;
286 } 297 }
287 } 298 }
288 SkPath skClipPath = BuildPath(pPathData, pObject2Device); 299 SkPath skClipPath = BuildPath(pPathData);
289 skClipPath.setFillType((fill_mode & 3) == FXFILL_WINDING 300 skClipPath.setFillType((fill_mode & 3) == FXFILL_WINDING
290 ? SkPath::kWinding_FillType 301 ? SkPath::kWinding_FillType
291 : SkPath::kEvenOdd_FillType); 302 : SkPath::kEvenOdd_FillType);
303 SkMatrix skMatrix = ToSkMatrix(*pObject2Device);
Tom Sepez 2016/03/17 16:05:50 nit: local not needed.
caryclark 2016/03/18 18:22:12 While that's strictly true, it is easier to debug
304 skClipPath.transform(skMatrix);
292 DebugShowSkiaPath(skClipPath); 305 DebugShowSkiaPath(skClipPath);
293 DebugDrawSkiaClipPath(m_pCanvas, skClipPath); 306 DebugDrawSkiaClipPath(m_pCanvas, skClipPath);
294 m_pCanvas->clipPath(skClipPath); 307 m_pCanvas->clipPath(skClipPath);
295 308
296 return TRUE; 309 return TRUE;
297 } 310 }
298 311
299 FX_BOOL CFX_SkiaDeviceDriver::SetClip_PathStroke( 312 FX_BOOL CFX_SkiaDeviceDriver::SetClip_PathStroke(
300 const CFX_PathData* pPathData, // path info 313 const CFX_PathData* pPathData, // path info
301 const CFX_Matrix* pObject2Device, // optional transformation 314 const CFX_Matrix* pObject2Device, // optional transformation
302 const CFX_GraphStateData* pGraphState // graphic state, for pen attributes 315 const CFX_GraphStateData* pGraphState // graphic state, for pen attributes
303 ) { 316 ) {
304 // build path data 317 // build path data
305 SkPath skPath = BuildPath(pPathData, NULL); 318 SkPath skPath = BuildPath(pPathData);
306 skPath.setFillType(SkPath::kWinding_FillType); 319 skPath.setFillType(SkPath::kWinding_FillType);
307 320
321 SkMatrix skMatrix = ToSkMatrix(*pObject2Device);
308 SkPaint spaint; 322 SkPaint spaint;
309 PaintStroke(&spaint, pGraphState); 323 PaintStroke(&spaint, pGraphState, skMatrix);
310 SkPath dst_path; 324 SkPath dst_path;
311 spaint.getFillPath(skPath, &dst_path); 325 spaint.getFillPath(skPath, &dst_path);
326 dst_path.transform(skMatrix);
312 DebugDrawSkiaClipPath(m_pCanvas, dst_path); 327 DebugDrawSkiaClipPath(m_pCanvas, dst_path);
313 m_pCanvas->clipPath(dst_path); 328 m_pCanvas->clipPath(dst_path);
314 return TRUE; 329 return TRUE;
315 } 330 }
316 331
317 FX_BOOL CFX_SkiaDeviceDriver::RenderRasterizer(
318 agg::rasterizer_scanline_aa& rasterizer,
319 FX_DWORD color,
320 FX_BOOL bFullCover,
321 FX_BOOL bGroupKnockout,
322 int alpha_flag,
323 void* pIccTransform) {
324 return m_pAggDriver &&
325 m_pAggDriver->RenderRasterizer(rasterizer, color, bFullCover,
326 bGroupKnockout, alpha_flag,
327 pIccTransform);
328 }
329
330 FX_BOOL CFX_SkiaDeviceDriver::DrawPath( 332 FX_BOOL CFX_SkiaDeviceDriver::DrawPath(
331 const CFX_PathData* pPathData, // path info 333 const CFX_PathData* pPathData, // path info
332 const CFX_Matrix* pObject2Device, // optional transformation 334 const CFX_Matrix* pObject2Device, // optional transformation
333 const CFX_GraphStateData* pGraphState, // graphic state, for pen attributes 335 const CFX_GraphStateData* pGraphState, // graphic state, for pen attributes
334 FX_DWORD fill_color, // fill color 336 FX_DWORD fill_color, // fill color
335 FX_DWORD stroke_color, // stroke color 337 FX_DWORD stroke_color, // stroke color
336 int fill_mode, // fill mode, WINDING or ALTERNATE. 0 for not filled 338 int fill_mode, // fill mode, WINDING or ALTERNATE. 0 for not filled
337 int alpha_flag, 339 int alpha_flag,
338 void* pIccTransform, 340 void* pIccTransform,
339 int blend_type) { 341 int blend_type) {
340 SkIRect rect; 342 SkIRect rect;
341 rect.set(0, 0, GetDeviceCaps(FXDC_PIXEL_WIDTH), 343 rect.set(0, 0, GetDeviceCaps(FXDC_PIXEL_WIDTH),
342 GetDeviceCaps(FXDC_PIXEL_HEIGHT)); 344 GetDeviceCaps(FXDC_PIXEL_HEIGHT));
343 SkPath skPath = BuildPath(pPathData, pObject2Device); 345 SkPath skPath = BuildPath(pPathData);
344 SkPaint spaint; 346 SkPaint spaint;
345 spaint.setAntiAlias(true); 347 spaint.setAntiAlias(true);
348 m_pCanvas->save();
349 SkMatrix skMatrix = ToSkMatrix(*pObject2Device);
350 m_pCanvas->concat(skMatrix);
346 if ((fill_mode & 3) && fill_color) { 351 if ((fill_mode & 3) && fill_color) {
347 skPath.setFillType((fill_mode & 3) == FXFILL_WINDING 352 skPath.setFillType((fill_mode & 3) == FXFILL_WINDING
348 ? SkPath::kWinding_FillType 353 ? SkPath::kWinding_FillType
349 : SkPath::kEvenOdd_FillType); 354 : SkPath::kEvenOdd_FillType);
350 355
351 spaint.setStyle(SkPaint::kFill_Style); 356 spaint.setStyle(SkPaint::kFill_Style);
352 spaint.setColor(fill_color); 357 spaint.setColor(fill_color);
353 m_pCanvas->drawPath(skPath, spaint); 358 m_pCanvas->drawPath(skPath, spaint);
354 } 359 }
355 int stroke_alpha = FXGETFLAG_COLORTYPE(alpha_flag) 360 int stroke_alpha = FXGETFLAG_COLORTYPE(alpha_flag)
356 ? FXGETFLAG_ALPHA_STROKE(alpha_flag) 361 ? FXGETFLAG_ALPHA_STROKE(alpha_flag)
357 : FXARGB_A(stroke_color); 362 : FXARGB_A(stroke_color);
358 363
359 if (pGraphState && stroke_alpha) { 364 if (pGraphState && stroke_alpha) {
360 spaint.setColor(stroke_color); 365 spaint.setColor(stroke_color);
361 PaintStroke(&spaint, pGraphState); 366 PaintStroke(&spaint, pGraphState, skMatrix);
367 DebugShowSkiaPath(skPath);
368 DebugShowCanvasMatrix(m_pCanvas);
362 m_pCanvas->drawPath(skPath, spaint); 369 m_pCanvas->drawPath(skPath, spaint);
363 } 370 }
364 371 m_pCanvas->restore();
365 return TRUE; 372 return TRUE;
366 } 373 }
367 374
368 FX_BOOL CFX_SkiaDeviceDriver::SetPixel(int x,
369 int y,
370 FX_DWORD color,
371 int alpha_flag,
372 void* pIccTransform) {
373 return m_pAggDriver &&
374 m_pAggDriver->SetPixel(x, y, color, alpha_flag, pIccTransform);
375 }
376
377 FX_BOOL CFX_SkiaDeviceDriver::FillRect(const FX_RECT* pRect, 375 FX_BOOL CFX_SkiaDeviceDriver::FillRect(const FX_RECT* pRect,
378 FX_DWORD fill_color, 376 FX_DWORD fill_color,
379 int alpha_flag, 377 int alpha_flag,
380 void* pIccTransform, 378 void* pIccTransform,
381 int blend_type) { 379 int blend_type) {
382 SkPaint spaint; 380 SkPaint spaint;
383 spaint.setAntiAlias(true); 381 spaint.setAntiAlias(true);
384 spaint.setColor(fill_color); 382 spaint.setColor(fill_color);
385 383
386 m_pCanvas->drawRect( 384 m_pCanvas->drawRect(
(...skipping 120 matching lines...) Expand 10 before | Expand all | Expand 10 after
507 m_pCanvas->concat(skMatrix); 505 m_pCanvas->concat(skMatrix);
508 const CFX_Matrix& m = *pMatrix; 506 const CFX_Matrix& m = *pMatrix;
509 // note that PDF's y-axis goes up; Skia's y-axis goes down 507 // note that PDF's y-axis goes up; Skia's y-axis goes down
510 if (landscape) 508 if (landscape)
511 skMatrix.setAll(-m.a, -m.b, m.e, m.c, m.d, m.f, 0, 0, 1); 509 skMatrix.setAll(-m.a, -m.b, m.e, m.c, m.d, m.f, 0, 0, 1);
512 else 510 else
513 skMatrix.setAll(m.a, m.b, 0, -m.c, -m.d, 0, 0, 0, 1); 511 skMatrix.setAll(m.a, m.b, 0, -m.c, -m.d, 0, 0, 0, 1);
514 m_pCanvas->concat(skMatrix); 512 m_pCanvas->concat(skMatrix);
515 SkPaint paint; 513 SkPaint paint;
516 paint.setAntiAlias(true); 514 paint.setAntiAlias(true);
517 paint.setFilterQuality(kLow_SkFilterQuality); 515 paint.setFilterQuality(kHigh_SkFilterQuality);
518 m_pCanvas->drawBitmap(skBitmap, 0, 0, &paint); 516 m_pCanvas->drawBitmap(skBitmap, 0, 0, &paint);
519 m_pCanvas->restore(); 517 m_pCanvas->restore();
520 return TRUE; 518 return TRUE;
521 } 519 }
522 520
523 FX_BOOL CFX_SkiaDeviceDriver::ContinueDIBits(void* pHandle, IFX_Pause* pPause) { 521 FX_BOOL CFX_SkiaDeviceDriver::ContinueDIBits(void* pHandle, IFX_Pause* pPause) {
524 return m_pAggDriver && m_pAggDriver->ContinueDIBits(pHandle, pPause); 522 return m_pAggDriver && m_pAggDriver->ContinueDIBits(pHandle, pPause);
525 } 523 }
526 524
527 void CFX_SkiaDeviceDriver::CancelDIBits(void* pHandle) { 525 void CFX_SkiaDeviceDriver::CancelDIBits(void* pHandle) {
(...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after
576 SetDeviceDriver(pDriver); 574 SetDeviceDriver(pDriver);
577 return TRUE; 575 return TRUE;
578 } 576 }
579 577
580 CFX_SkiaDevice::~CFX_SkiaDevice() { 578 CFX_SkiaDevice::~CFX_SkiaDevice() {
581 if (m_bOwnedBitmap && GetBitmap()) 579 if (m_bOwnedBitmap && GetBitmap())
582 delete GetBitmap(); 580 delete GetBitmap();
583 } 581 }
584 582
585 #endif 583 #endif
OLDNEW
« core/fxge/skia/fx_skia_device.h ('K') | « core/fxge/skia/fx_skia_device.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698