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

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

Issue 2346483006: Create a subset of skia support for paths only (Closed)
Patch Set: use skia only for paths Created 4 years, 3 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/skia/fx_skia_device.h ('k') | pdfium.gni » ('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 #if defined(_SKIA_SUPPORT_) 5 #ifdef _SKIA_SUPPORT_
6 #include <algorithm> 6 #include <algorithm>
7 #include <vector> 7 #include <vector>
8 8
9 #include "core/fxcodec/include/fx_codec.h" 9 #include "core/fxcodec/include/fx_codec.h"
10 #include "core/fxcrt/include/fx_memory.h" 10 #include "core/fxcrt/include/fx_memory.h"
11 11
12 #include "core/fpdfapi/fpdf_page/cpdf_shadingpattern.h" 12 #include "core/fpdfapi/fpdf_page/cpdf_shadingpattern.h"
13 #include "core/fpdfapi/fpdf_page/pageint.h" 13 #include "core/fpdfapi/fpdf_page/pageint.h"
14 #include "core/fpdfapi/fpdf_parser/include/cpdf_array.h" 14 #include "core/fpdfapi/fpdf_parser/include/cpdf_array.h"
15 #include "core/fpdfapi/fpdf_parser/include/cpdf_dictionary.h" 15 #include "core/fpdfapi/fpdf_parser/include/cpdf_dictionary.h"
16 #include "core/fpdfapi/fpdf_parser/include/cpdf_stream_acc.h" 16 #include "core/fpdfapi/fpdf_parser/include/cpdf_stream_acc.h"
17 #include "core/fxge/include/cfx_fontcache.h" 17 #include "core/fxge/include/cfx_fontcache.h"
18 #endif
19
18 #include "core/fxge/include/cfx_fxgedevice.h" 20 #include "core/fxge/include/cfx_fxgedevice.h"
21
22 #ifdef _SKIA_SUPPORT_
dsinclair 2016/09/19 20:45:12 Let's consolidate all of these header if's into fe
19 #include "core/fxge/include/cfx_gemodule.h" 23 #include "core/fxge/include/cfx_gemodule.h"
24 #endif
25
20 #include "core/fxge/include/cfx_graphstatedata.h" 26 #include "core/fxge/include/cfx_graphstatedata.h"
21 #include "core/fxge/include/cfx_pathdata.h" 27 #include "core/fxge/include/cfx_pathdata.h"
28
29 #ifdef _SKIA_SUPPORT_
22 #include "core/fxge/include/cfx_renderdevice.h" 30 #include "core/fxge/include/cfx_renderdevice.h"
31 #else
32 #include "core/fxge/ge/cfx_cliprgn.h"
33 #endif
34
23 #include "core/fxge/skia/fx_skia_device.h" 35 #include "core/fxge/skia/fx_skia_device.h"
36 #include "third_party/skia/include/core/SkCanvas.h"
24 37
25 #include "third_party/skia/include/core/SkCanvas.h" 38 #ifdef _SKIA_SUPPORT_
26 #include "third_party/skia/include/core/SkColorFilter.h" 39 #include "third_party/skia/include/core/SkColorFilter.h"
27 #include "third_party/skia/include/core/SkColorPriv.h" 40 #include "third_party/skia/include/core/SkColorPriv.h"
28 #include "third_party/skia/include/core/SkMaskFilter.h" 41 #include "third_party/skia/include/core/SkMaskFilter.h"
42 #endif
43
29 #include "third_party/skia/include/core/SkPaint.h" 44 #include "third_party/skia/include/core/SkPaint.h"
30 #include "third_party/skia/include/core/SkPath.h" 45 #include "third_party/skia/include/core/SkPath.h"
46
47 #ifdef _SKIA_SUPPORT_
31 #include "third_party/skia/include/core/SkPictureRecorder.h" 48 #include "third_party/skia/include/core/SkPictureRecorder.h"
32 #include "third_party/skia/include/core/SkShader.h" 49 #include "third_party/skia/include/core/SkShader.h"
33 #include "third_party/skia/include/core/SkStream.h" 50 #include "third_party/skia/include/core/SkStream.h"
34 #include "third_party/skia/include/core/SkTypeface.h" 51 #include "third_party/skia/include/core/SkTypeface.h"
52 #endif
53
35 #include "third_party/skia/include/effects/SkDashPathEffect.h" 54 #include "third_party/skia/include/effects/SkDashPathEffect.h"
55
56 #ifdef _SKIA_SUPPORT_
36 #include "third_party/skia/include/effects/SkGradientShader.h" 57 #include "third_party/skia/include/effects/SkGradientShader.h"
58 #endif
59
37 #include "third_party/skia/include/pathops/SkPathOps.h" 60 #include "third_party/skia/include/pathops/SkPathOps.h"
38 61
39 #ifdef SK_DEBUG 62 #ifdef SK_DEBUG
40 #include "third_party/skia/include/core/SkClipStack.h" 63 #include "third_party/skia/include/core/SkClipStack.h"
41 #endif 64 #endif
42 65
43 namespace { 66 namespace {
44 67
45 #define SHOW_SKIA_PATH 0 // set to 1 to print the path contents 68 #define SHOW_SKIA_PATH 0 // set to 1 to print the path contents
46 #define DRAW_SKIA_CLIP 0 // set to 1 to draw a green rectangle around the clip 69 #define DRAW_SKIA_CLIP 0 // set to 1 to draw a green rectangle around the clip
(...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after
88 #else // DRAW_SKIA_CLIP 111 #else // DRAW_SKIA_CLIP
89 112
90 void DebugDrawSkiaClipRect(SkCanvas* canvas, const SkRect& rect) {} 113 void DebugDrawSkiaClipRect(SkCanvas* canvas, const SkRect& rect) {}
91 void DebugDrawSkiaClipPath(SkCanvas* canvas, const SkPath& path) {} 114 void DebugDrawSkiaClipPath(SkCanvas* canvas, const SkPath& path) {}
92 115
93 #endif // DRAW_SKIA_CLIP 116 #endif // DRAW_SKIA_CLIP
94 117
95 #undef SHOW_SKIA_PATH 118 #undef SHOW_SKIA_PATH
96 #undef DRAW_SKIA_CLIP 119 #undef DRAW_SKIA_CLIP
97 120
121 #ifdef _SKIA_SUPPORT_
98 static void DebugValidate(const CFX_DIBitmap* bitmap, 122 static void DebugValidate(const CFX_DIBitmap* bitmap,
99 const CFX_DIBitmap* device) { 123 const CFX_DIBitmap* device) {
100 if (bitmap) { 124 if (bitmap) {
101 SkASSERT(bitmap->GetBPP() == 8 || bitmap->GetBPP() == 32); 125 SkASSERT(bitmap->GetBPP() == 8 || bitmap->GetBPP() == 32);
102 if (bitmap->GetBPP() == 32) { 126 if (bitmap->GetBPP() == 32) {
103 bitmap->DebugVerifyBitmapIsPreMultiplied(); 127 bitmap->DebugVerifyBitmapIsPreMultiplied();
104 } 128 }
105 } 129 }
106 if (device) { 130 if (device) {
107 SkASSERT(device->GetBPP() == 8 || device->GetBPP() == 32); 131 SkASSERT(device->GetBPP() == 8 || device->GetBPP() == 32);
108 if (device->GetBPP() == 32) { 132 if (device->GetBPP() == 32) {
109 device->DebugVerifyBitmapIsPreMultiplied(); 133 device->DebugVerifyBitmapIsPreMultiplied();
110 } 134 }
111 } 135 }
112 } 136 }
137 #endif
113 138
114 SkPath BuildPath(const CFX_PathData* pPathData) { 139 SkPath BuildPath(const CFX_PathData* pPathData) {
115 SkPath skPath; 140 SkPath skPath;
116 const CFX_PathData* pFPath = pPathData; 141 const CFX_PathData* pFPath = pPathData;
117 int nPoints = pFPath->GetPointCount(); 142 int nPoints = pFPath->GetPointCount();
118 FX_PATHPOINT* pPoints = pFPath->GetPoints(); 143 FX_PATHPOINT* pPoints = pFPath->GetPoints();
119 for (int i = 0; i < nPoints; i++) { 144 for (int i = 0; i < nPoints; i++) {
120 FX_FLOAT x = pPoints[i].m_PointX; 145 FX_FLOAT x = pPoints[i].m_PointX;
121 FX_FLOAT y = pPoints[i].m_PointY; 146 FX_FLOAT y = pPoints[i].m_PointY;
122 int point_type = pPoints[i].m_Flag & FXPT_TYPE; 147 int point_type = pPoints[i].m_Flag & FXPT_TYPE;
(...skipping 58 matching lines...) Expand 10 before | Expand all | Expand 10 after
181 case FXDIB_BLEND_COLOR: 206 case FXDIB_BLEND_COLOR:
182 return SkXfermode::kColor_Mode; 207 return SkXfermode::kColor_Mode;
183 case FXDIB_BLEND_LUMINOSITY: 208 case FXDIB_BLEND_LUMINOSITY:
184 return SkXfermode::kLuminosity_Mode; 209 return SkXfermode::kLuminosity_Mode;
185 case FXDIB_BLEND_NORMAL: 210 case FXDIB_BLEND_NORMAL:
186 default: 211 default:
187 return SkXfermode::kSrcOver_Mode; 212 return SkXfermode::kSrcOver_Mode;
188 } 213 }
189 } 214 }
190 215
216 #ifdef _SKIA_SUPPORT_
191 bool AddColors(const CPDF_ExpIntFunc* pFunc, SkTDArray<SkColor>* skColors) { 217 bool AddColors(const CPDF_ExpIntFunc* pFunc, SkTDArray<SkColor>* skColors) {
192 if (pFunc->CountInputs() != 1) 218 if (pFunc->CountInputs() != 1)
193 return false; 219 return false;
194 if (pFunc->m_Exponent != 1) 220 if (pFunc->m_Exponent != 1)
195 return false; 221 return false;
196 if (pFunc->m_nOrigOutputs != 3) 222 if (pFunc->m_nOrigOutputs != 3)
197 return false; 223 return false;
198 skColors->push( 224 skColors->push(
199 SkColorSetARGB(0xFF, SkUnitScalarClampToByte(pFunc->m_pBeginValues[0]), 225 SkColorSetARGB(0xFF, SkUnitScalarClampToByte(pFunc->m_pBeginValues[0]),
200 SkUnitScalarClampToByte(pFunc->m_pBeginValues[1]), 226 SkUnitScalarClampToByte(pFunc->m_pBeginValues[1]),
(...skipping 69 matching lines...) Expand 10 before | Expand all | Expand 10 after
270 if (!AddColors(pSubFunc, skColors)) 296 if (!AddColors(pSubFunc, skColors))
271 return false; 297 return false;
272 FX_FLOAT boundsEnd = 298 FX_FLOAT boundsEnd =
273 i < inputs - 1 ? pFunc->GetBound(i) : pFunc->GetDomain(1); 299 i < inputs - 1 ? pFunc->GetBound(i) : pFunc->GetDomain(1);
274 skPos->push(boundsStart); 300 skPos->push(boundsStart);
275 skPos->push(boundsEnd); 301 skPos->push(boundsEnd);
276 boundsStart = boundsEnd; 302 boundsStart = boundsEnd;
277 } 303 }
278 return true; 304 return true;
279 } 305 }
306 #endif
280 307
281 // see https://en.wikipedia.org/wiki/Distance_from_a_point_to_a_line 308 // see https://en.wikipedia.org/wiki/Distance_from_a_point_to_a_line
282 SkScalar LineSide(const SkPoint line[2], const SkPoint& pt) { 309 SkScalar LineSide(const SkPoint line[2], const SkPoint& pt) {
283 return (line[1].fY - line[0].fY) * pt.fX - (line[1].fX - line[0].fX) * pt.fY + 310 return (line[1].fY - line[0].fY) * pt.fX - (line[1].fX - line[0].fX) * pt.fY +
284 line[1].fX * line[0].fY - line[1].fY * line[0].fX; 311 line[1].fX * line[0].fY - line[1].fY * line[0].fX;
285 } 312 }
286 313
287 SkPoint IntersectSides(const SkPoint& parallelPt, 314 SkPoint IntersectSides(const SkPoint& parallelPt,
288 const SkVector& paraRay, 315 const SkVector& paraRay,
289 const SkPoint& perpendicularPt) { 316 const SkPoint& perpendicularPt) {
290 SkVector perpRay = {paraRay.fY, -paraRay.fX}; 317 SkVector perpRay = {paraRay.fY, -paraRay.fX};
291 SkScalar denom = perpRay.fY * paraRay.fX - paraRay.fY * perpRay.fX; 318 SkScalar denom = perpRay.fY * paraRay.fX - paraRay.fY * perpRay.fX;
292 if (!denom) { 319 if (!denom) {
293 SkPoint zeroPt = {0, 0}; 320 SkPoint zeroPt = {0, 0};
294 return zeroPt; 321 return zeroPt;
295 } 322 }
296 SkVector ab0 = parallelPt - perpendicularPt; 323 SkVector ab0 = parallelPt - perpendicularPt;
297 SkScalar numerA = ab0.fY * perpRay.fX - perpRay.fY * ab0.fX; 324 SkScalar numerA = ab0.fY * perpRay.fX - perpRay.fY * ab0.fX;
298 numerA /= denom; 325 numerA /= denom;
299 SkPoint result = {parallelPt.fX + paraRay.fX * numerA, 326 SkPoint result = {parallelPt.fX + paraRay.fX * numerA,
300 parallelPt.fY + paraRay.fY * numerA}; 327 parallelPt.fY + paraRay.fY * numerA};
301 return result; 328 return result;
302 } 329 }
303 330
331 #ifdef _SKIA_SUPPORT_
304 void ClipAngledGradient(const SkPoint pts[2], 332 void ClipAngledGradient(const SkPoint pts[2],
305 SkPoint rectPts[4], 333 SkPoint rectPts[4],
306 bool clipStart, 334 bool clipStart,
307 bool clipEnd, 335 bool clipEnd,
308 SkPath* clip) { 336 SkPath* clip) {
309 // find the corners furthest from the gradient perpendiculars 337 // find the corners furthest from the gradient perpendiculars
310 SkScalar minPerpDist = SK_ScalarMax; 338 SkScalar minPerpDist = SK_ScalarMax;
311 SkScalar maxPerpDist = SK_ScalarMin; 339 SkScalar maxPerpDist = SK_ScalarMin;
312 int minPerpPtIndex = -1; 340 int minPerpPtIndex = -1;
313 int maxPerpPtIndex = -1; 341 int maxPerpPtIndex = -1;
(...skipping 150 matching lines...) Expand 10 before | Expand all | Expand 10 after
464 colorType = SkColorType::kUnknown_SkColorType; 492 colorType = SkColorType::kUnknown_SkColorType;
465 } 493 }
466 SkImageInfo imageInfo = 494 SkImageInfo imageInfo =
467 SkImageInfo::Make(width, height, colorType, alphaType); 495 SkImageInfo::Make(width, height, colorType, alphaType);
468 skBitmap->installPixels(imageInfo, buffer, rowBytes, *ctPtr, nullptr, 496 skBitmap->installPixels(imageInfo, buffer, rowBytes, *ctPtr, nullptr,
469 nullptr); 497 nullptr);
470 *widthPtr = width; 498 *widthPtr = width;
471 *heightPtr = height; 499 *heightPtr = height;
472 return true; 500 return true;
473 } 501 }
502 #else
503
504 void RgbByteOrderTransferBitmap(CFX_DIBitmap* pBitmap,
505 int dest_left,
506 int dest_top,
507 int width,
508 int height,
509 const CFX_DIBSource* pSrcBitmap,
510 int src_left,
511 int src_top) {
512 if (!pBitmap)
513 return;
514
515 pBitmap->GetOverlapRect(dest_left, dest_top, width, height,
516 pSrcBitmap->GetWidth(), pSrcBitmap->GetHeight(),
517 src_left, src_top, nullptr);
518 if (width == 0 || height == 0)
519 return;
520
521 int Bpp = pBitmap->GetBPP() / 8;
522 FXDIB_Format dest_format = pBitmap->GetFormat();
523 FXDIB_Format src_format = pSrcBitmap->GetFormat();
524 int pitch = pBitmap->GetPitch();
525 uint8_t* buffer = pBitmap->GetBuffer();
526 if (dest_format == src_format) {
527 for (int row = 0; row < height; row++) {
528 uint8_t* dest_scan = buffer + (dest_top + row) * pitch + dest_left * Bpp;
529 uint8_t* src_scan =
530 (uint8_t*)pSrcBitmap->GetScanline(src_top + row) + src_left * Bpp;
531 if (Bpp == 4) {
532 for (int col = 0; col < width; col++) {
533 FXARGB_SETDIB(dest_scan, FXARGB_MAKE(src_scan[3], src_scan[0],
534 src_scan[1], src_scan[2]));
535 dest_scan += 4;
536 src_scan += 4;
537 }
538 } else {
539 for (int col = 0; col < width; col++) {
540 *dest_scan++ = src_scan[2];
541 *dest_scan++ = src_scan[1];
542 *dest_scan++ = src_scan[0];
543 src_scan += 3;
544 }
545 }
546 }
547 return;
548 }
549 }
550
551 #endif
474 552
475 } // namespace 553 } // namespace
476 554
477 // Encapsulate the state used for successive text and path draws so that 555 // Encapsulate the state used for successive text and path draws so that
478 // they can be combined. 556 // they can be combined.
479 class SkiaState { 557 class SkiaState {
480 public: 558 public:
481 enum class Clip { 559 enum class Clip {
482 kSave, 560 kSave,
483 kPath, 561 kPath,
(...skipping 18 matching lines...) Expand all
502 const CFX_GraphStateData* pDrawState, 580 const CFX_GraphStateData* pDrawState,
503 uint32_t fill_color, 581 uint32_t fill_color,
504 uint32_t stroke_color, 582 uint32_t stroke_color,
505 int fill_mode, 583 int fill_mode,
506 int blend_type, 584 int blend_type,
507 CFX_SkiaDeviceDriver* pDriver) { 585 CFX_SkiaDeviceDriver* pDriver) {
508 if (m_debugDisable) 586 if (m_debugDisable)
509 return false; 587 return false;
510 if (m_commandIndex < m_commands.count()) 588 if (m_commandIndex < m_commands.count())
511 FlushCommands(pDriver); 589 FlushCommands(pDriver);
590 #if _SKIA_SUPPORT_
512 if (m_drawText) 591 if (m_drawText)
513 FlushText(pDriver); 592 FlushText(pDriver);
593 #endif
514 if (m_drawPath && DrawChanged(pMatrix, pDrawState, fill_color, stroke_color, 594 if (m_drawPath && DrawChanged(pMatrix, pDrawState, fill_color, stroke_color,
515 fill_mode, blend_type)) { 595 fill_mode, blend_type)) {
516 FlushPath(pDriver); 596 FlushPath(pDriver);
517 } 597 }
518 if (!m_drawPath) { 598 if (!m_drawPath) {
519 m_skPath.reset(); 599 m_skPath.reset();
520 m_fillPath = (fill_mode & 3) && fill_color; 600 m_fillPath = (fill_mode & 3) && fill_color;
521 m_skPath.setFillType((fill_mode & 3) == FXFILL_ALTERNATE 601 m_skPath.setFillType((fill_mode & 3) == FXFILL_ALTERNATE
522 ? SkPath::kEvenOdd_FillType 602 ? SkPath::kEvenOdd_FillType
523 : SkPath::kWinding_FillType); 603 : SkPath::kWinding_FillType);
(...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after
570 DebugShowSkiaPath(m_skPath); 650 DebugShowSkiaPath(m_skPath);
571 DebugShowCanvasMatrix(skCanvas); 651 DebugShowCanvasMatrix(skCanvas);
572 skPaint.setStyle(SkPaint::kStroke_Style); 652 skPaint.setStyle(SkPaint::kStroke_Style);
573 skPaint.setColor(m_strokeColor); 653 skPaint.setColor(m_strokeColor);
574 skCanvas->drawPath(m_skPath, skPaint); 654 skCanvas->drawPath(m_skPath, skPaint);
575 } 655 }
576 skCanvas->restore(); 656 skCanvas->restore();
577 m_drawPath = false; 657 m_drawPath = false;
578 } 658 }
579 659
660 #ifdef _SKIA_SUPPORT_
580 bool DrawText(int nChars, 661 bool DrawText(int nChars,
581 const FXTEXT_CHARPOS* pCharPos, 662 const FXTEXT_CHARPOS* pCharPos,
582 CFX_Font* pFont, 663 CFX_Font* pFont,
583 CFX_FontCache* pCache, 664 CFX_FontCache* pCache,
584 const CFX_Matrix* pMatrix, 665 const CFX_Matrix* pMatrix,
585 FX_FLOAT font_size, 666 FX_FLOAT font_size,
586 uint32_t color, 667 uint32_t color,
587 CFX_SkiaDeviceDriver* pDriver) { 668 CFX_SkiaDeviceDriver* pDriver) {
588 if (m_debugDisable) 669 if (m_debugDisable)
589 return false; 670 return false;
(...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after
635 skPaint.setSubpixelText(true); 716 skPaint.setSubpixelText(true);
636 skPaint.setHinting(SkPaint::kNo_Hinting); 717 skPaint.setHinting(SkPaint::kNo_Hinting);
637 SkCanvas* skCanvas = pDriver->SkiaCanvas(); 718 SkCanvas* skCanvas = pDriver->SkiaCanvas();
638 skCanvas->save(); 719 skCanvas->save();
639 skCanvas->concat(skMatrix); 720 skCanvas->concat(skMatrix);
640 skCanvas->drawPosText(m_glyphs.begin(), m_glyphs.count() * 2, 721 skCanvas->drawPosText(m_glyphs.begin(), m_glyphs.count() * 2,
641 m_positions.begin(), skPaint); 722 m_positions.begin(), skPaint);
642 skCanvas->restore(); 723 skCanvas->restore();
643 m_drawText = false; 724 m_drawText = false;
644 } 725 }
726 #endif
645 727
646 bool SetClipFill(const CFX_PathData* pPathData, 728 bool SetClipFill(const CFX_PathData* pPathData,
647 const CFX_Matrix* pMatrix, 729 const CFX_Matrix* pMatrix,
648 int fill_mode, 730 int fill_mode,
649 CFX_SkiaDeviceDriver* pDriver) { 731 CFX_SkiaDeviceDriver* pDriver) {
650 if (m_debugDisable) 732 if (m_debugDisable)
651 return false; 733 return false;
652 SkPath skClipPath = BuildPath(pPathData); 734 SkPath skClipPath = BuildPath(pPathData);
653 skClipPath.setFillType((fill_mode & 3) == FXFILL_ALTERNATE 735 skClipPath.setFillType((fill_mode & 3) == FXFILL_ALTERNATE
654 ? SkPath::kEvenOdd_FillType 736 ? SkPath::kEvenOdd_FillType
(...skipping 171 matching lines...) Expand 10 before | Expand all | Expand 10 after
826 for (int index = 0; index < pState->m_DashCount; ++index) { 908 for (int index = 0; index < pState->m_DashCount; ++index) {
827 if (pState->m_DashArray[index] != refState.m_DashArray[index]) 909 if (pState->m_DashArray[index] != refState.m_DashArray[index])
828 return false; 910 return false;
829 } 911 }
830 return true; 912 return true;
831 } 913 }
832 914
833 void Flush(CFX_SkiaDeviceDriver* pDriver) { 915 void Flush(CFX_SkiaDeviceDriver* pDriver) {
834 if (m_drawPath) 916 if (m_drawPath)
835 FlushPath(pDriver); 917 FlushPath(pDriver);
918 #ifdef _SKIA_SUPPORT_
836 if (m_drawText) 919 if (m_drawText)
837 FlushText(pDriver); 920 FlushText(pDriver);
921 #endif
838 } 922 }
839 923
840 #ifdef SK_DEBUG 924 #ifdef SK_DEBUG
841 void Dump(const CFX_SkiaDeviceDriver* pDriver) const { 925 void Dump(const CFX_SkiaDeviceDriver* pDriver) const {
842 SkDebugf("\n\nSkia Save Count %d:\n", pDriver->m_pCanvas->getSaveCount()); 926 SkDebugf("\n\nSkia Save Count %d:\n", pDriver->m_pCanvas->getSaveCount());
843 pDriver->m_pCanvas->getClipStack()->dump(); 927 pDriver->m_pCanvas->getClipStack()->dump();
844 SkDebugf("Cache:\n"); 928 SkDebugf("Cache:\n");
845 for (int index = 0; index < m_commands.count(); ++index) { 929 for (int index = 0; index < m_commands.count(); ++index) {
846 SkDebugf("%s ", m_commandIndex == index ? "-->" : " "); 930 SkDebugf("%s ", m_commandIndex == index ? "-->" : " ");
847 switch (m_commands[index]) { 931 switch (m_commands[index]) {
(...skipping 117 matching lines...) Expand 10 before | Expand all | Expand 10 after
965 pBitmap->GetBPP() == 8 ? kAlpha_8_SkColorType : kN32_SkColorType, 1049 pBitmap->GetBPP() == 8 ? kAlpha_8_SkColorType : kN32_SkColorType,
966 kOpaque_SkAlphaType); 1050 kOpaque_SkAlphaType);
967 skBitmap.installPixels(imageInfo, pBitmap->GetBuffer(), pBitmap->GetPitch(), 1051 skBitmap.installPixels(imageInfo, pBitmap->GetBuffer(), pBitmap->GetPitch(),
968 nullptr, /* to do : set color table */ 1052 nullptr, /* to do : set color table */
969 nullptr, nullptr); 1053 nullptr, nullptr);
970 m_pCanvas = new SkCanvas(skBitmap); 1054 m_pCanvas = new SkCanvas(skBitmap);
971 if (m_bGroupKnockout) 1055 if (m_bGroupKnockout)
972 SkDebugf(""); // FIXME(caryclark) suppress 'm_bGroupKnockout is unused' 1056 SkDebugf(""); // FIXME(caryclark) suppress 'm_bGroupKnockout is unused'
973 } 1057 }
974 1058
1059 #ifdef _SKIA_SUPPORT_
975 CFX_SkiaDeviceDriver::CFX_SkiaDeviceDriver(int size_x, int size_y) 1060 CFX_SkiaDeviceDriver::CFX_SkiaDeviceDriver(int size_x, int size_y)
976 : m_pBitmap(nullptr), 1061 : m_pBitmap(nullptr),
977 m_pOriDevice(nullptr), 1062 m_pOriDevice(nullptr),
978 m_pRecorder(new SkPictureRecorder), 1063 m_pRecorder(new SkPictureRecorder),
979 m_pCache(new SkiaState), 1064 m_pCache(new SkiaState),
980 m_bGroupKnockout(FALSE) { 1065 m_bGroupKnockout(FALSE) {
981 m_pRecorder->beginRecording(SkIntToScalar(size_x), SkIntToScalar(size_y)); 1066 m_pRecorder->beginRecording(SkIntToScalar(size_x), SkIntToScalar(size_y));
982 m_pCanvas = m_pRecorder->getRecordingCanvas(); 1067 m_pCanvas = m_pRecorder->getRecordingCanvas();
983 } 1068 }
984 1069
985 CFX_SkiaDeviceDriver::CFX_SkiaDeviceDriver(SkPictureRecorder* recorder) 1070 CFX_SkiaDeviceDriver::CFX_SkiaDeviceDriver(SkPictureRecorder* recorder)
986 : m_pBitmap(nullptr), 1071 : m_pBitmap(nullptr),
987 m_pOriDevice(nullptr), 1072 m_pOriDevice(nullptr),
988 m_pRecorder(recorder), 1073 m_pRecorder(recorder),
989 m_pCache(new SkiaState), 1074 m_pCache(new SkiaState),
990 m_bGroupKnockout(FALSE) { 1075 m_bGroupKnockout(FALSE) {
991 m_pCanvas = m_pRecorder->getRecordingCanvas(); 1076 m_pCanvas = m_pRecorder->getRecordingCanvas();
992 } 1077 }
1078 #endif
993 1079
994 CFX_SkiaDeviceDriver::~CFX_SkiaDeviceDriver() { 1080 CFX_SkiaDeviceDriver::~CFX_SkiaDeviceDriver() {
995 Flush(); 1081 Flush();
996 if (!m_pRecorder) 1082 if (!m_pRecorder)
997 delete m_pCanvas; 1083 delete m_pCanvas;
998 } 1084 }
999 1085
1000 void CFX_SkiaDeviceDriver::Flush() { 1086 void CFX_SkiaDeviceDriver::Flush() {
1001 m_pCache->Flush(this); 1087 m_pCache->Flush(this);
1002 m_pCache->FlushCommands(this); 1088 m_pCache->FlushCommands(this);
1003 } 1089 }
1004 1090
1005 FX_BOOL CFX_SkiaDeviceDriver::DrawDeviceText(int nChars, 1091 FX_BOOL CFX_SkiaDeviceDriver::DrawDeviceText(int nChars,
1006 const FXTEXT_CHARPOS* pCharPos, 1092 const FXTEXT_CHARPOS* pCharPos,
1007 CFX_Font* pFont, 1093 CFX_Font* pFont,
1008 CFX_FontCache* pCache, 1094 CFX_FontCache* pCache,
1009 const CFX_Matrix* pObject2Device, 1095 const CFX_Matrix* pObject2Device,
1010 FX_FLOAT font_size, 1096 FX_FLOAT font_size,
1011 uint32_t color) { 1097 uint32_t color) {
1098 #ifdef _SKIA_SUPPORT_
1012 if (!pCache) 1099 if (!pCache)
1013 pCache = CFX_GEModule::Get()->GetFontCache(); 1100 pCache = CFX_GEModule::Get()->GetFontCache();
1014 if (m_pCache->DrawText(nChars, pCharPos, pFont, pCache, pObject2Device, 1101 if (m_pCache->DrawText(nChars, pCharPos, pFont, pCache, pObject2Device,
1015 font_size, color, this)) { 1102 font_size, color, this)) {
1016 return TRUE; 1103 return TRUE;
1017 } 1104 }
1018 sk_sp<SkTypeface> typeface( 1105 sk_sp<SkTypeface> typeface(
1019 SkSafeRef(pCache ? pCache->GetDeviceCache(pFont) : nullptr)); 1106 SkSafeRef(pCache ? pCache->GetDeviceCache(pFont) : nullptr));
1020 SkPaint paint; 1107 SkPaint paint;
1021 paint.setAntiAlias(true); 1108 paint.setAntiAlias(true);
(...skipping 12 matching lines...) Expand all
1034 SkTDArray<uint16_t> glyphs; 1121 SkTDArray<uint16_t> glyphs;
1035 glyphs.setCount(nChars); 1122 glyphs.setCount(nChars);
1036 for (int index = 0; index < nChars; ++index) { 1123 for (int index = 0; index < nChars; ++index) {
1037 const FXTEXT_CHARPOS& cp = pCharPos[index]; 1124 const FXTEXT_CHARPOS& cp = pCharPos[index];
1038 positions[index] = {cp.m_OriginX * flip, cp.m_OriginY * flip}; 1125 positions[index] = {cp.m_OriginX * flip, cp.m_OriginY * flip};
1039 glyphs[index] = (uint16_t)cp.m_GlyphIndex; 1126 glyphs[index] = (uint16_t)cp.m_GlyphIndex;
1040 } 1127 }
1041 m_pCanvas->drawPosText(glyphs.begin(), nChars * 2, positions.begin(), paint); 1128 m_pCanvas->drawPosText(glyphs.begin(), nChars * 2, positions.begin(), paint);
1042 m_pCanvas->restore(); 1129 m_pCanvas->restore();
1043 return TRUE; 1130 return TRUE;
1131 #else
1132 return FALSE;
1133 #endif
1044 } 1134 }
1045 1135
1046 int CFX_SkiaDeviceDriver::GetDeviceCaps(int caps_id) const { 1136 int CFX_SkiaDeviceDriver::GetDeviceCaps(int caps_id) const {
1047 switch (caps_id) { 1137 switch (caps_id) {
1048 case FXDC_DEVICE_CLASS: 1138 case FXDC_DEVICE_CLASS:
1049 return FXDC_DISPLAY; 1139 return FXDC_DISPLAY;
1050 case FXDC_PIXEL_WIDTH: 1140 case FXDC_PIXEL_WIDTH:
1051 return m_pCanvas->imageInfo().width(); 1141 return m_pCanvas->imageInfo().width();
1052 case FXDC_PIXEL_HEIGHT: 1142 case FXDC_PIXEL_HEIGHT:
1053 return m_pCanvas->imageInfo().height(); 1143 return m_pCanvas->imageInfo().height();
(...skipping 154 matching lines...) Expand 10 before | Expand all | Expand 10 after
1208 spaint.setAntiAlias(true); 1298 spaint.setAntiAlias(true);
1209 spaint.setColor(fill_color); 1299 spaint.setColor(fill_color);
1210 spaint.setXfermodeMode(GetSkiaBlendMode(blend_type)); 1300 spaint.setXfermodeMode(GetSkiaBlendMode(blend_type));
1211 1301
1212 m_pCanvas->drawRect( 1302 m_pCanvas->drawRect(
1213 SkRect::MakeLTRB(pRect->left, pRect->top, pRect->right, pRect->bottom), 1303 SkRect::MakeLTRB(pRect->left, pRect->top, pRect->right, pRect->bottom),
1214 spaint); 1304 spaint);
1215 return TRUE; 1305 return TRUE;
1216 } 1306 }
1217 1307
1308 #ifdef _SKIA_SUPPORT_
1218 FX_BOOL CFX_SkiaDeviceDriver::DrawShading(const CPDF_ShadingPattern* pPattern, 1309 FX_BOOL CFX_SkiaDeviceDriver::DrawShading(const CPDF_ShadingPattern* pPattern,
1219 const CFX_Matrix* pMatrix, 1310 const CFX_Matrix* pMatrix,
1220 const FX_RECT& clip_rect, 1311 const FX_RECT& clip_rect,
1221 int alpha, 1312 int alpha,
1222 FX_BOOL bAlphaMode) { 1313 FX_BOOL bAlphaMode) {
1223 if (kAxialShading != pPattern->GetShadingType() && 1314 if (kAxialShading != pPattern->GetShadingType() &&
1224 kRadialShading != pPattern->GetShadingType()) { 1315 kRadialShading != pPattern->GetShadingType()) {
1225 // TODO(caryclark) more types 1316 // TODO(caryclark) more types
1226 return false; 1317 return false;
1227 } 1318 }
(...skipping 113 matching lines...) Expand 10 before | Expand all | Expand 10 after
1341 skPath.transform(inverse); 1432 skPath.transform(inverse);
1342 } 1433 }
1343 m_pCanvas->save(); 1434 m_pCanvas->save();
1344 if (!skClip.isEmpty()) 1435 if (!skClip.isEmpty())
1345 m_pCanvas->clipPath(skClip, SkRegion::kIntersect_Op, true); 1436 m_pCanvas->clipPath(skClip, SkRegion::kIntersect_Op, true);
1346 m_pCanvas->concat(skMatrix); 1437 m_pCanvas->concat(skMatrix);
1347 m_pCanvas->drawPath(skPath, paint); 1438 m_pCanvas->drawPath(skPath, paint);
1348 m_pCanvas->restore(); 1439 m_pCanvas->restore();
1349 return true; 1440 return true;
1350 } 1441 }
1442 #endif
1351 1443
1352 uint8_t* CFX_SkiaDeviceDriver::GetBuffer() const { 1444 uint8_t* CFX_SkiaDeviceDriver::GetBuffer() const {
1353 return m_pBitmap->GetBuffer(); 1445 return m_pBitmap->GetBuffer();
1354 } 1446 }
1355 1447
1356 FX_BOOL CFX_SkiaDeviceDriver::GetClipBox(FX_RECT* pRect) { 1448 FX_BOOL CFX_SkiaDeviceDriver::GetClipBox(FX_RECT* pRect) {
1357 // TODO(caryclark) call m_canvas->getClipDeviceBounds() instead 1449 // TODO(caryclark) call m_canvas->getClipDeviceBounds() instead
1358 pRect->left = 0; 1450 pRect->left = 0;
1359 pRect->top = 0; 1451 pRect->top = 0;
1360 const SkImageInfo& canvasSize = m_pCanvas->imageInfo(); 1452 const SkImageInfo& canvasSize = m_pCanvas->imageInfo();
1361 pRect->right = canvasSize.width(); 1453 pRect->right = canvasSize.width();
1362 pRect->bottom = canvasSize.height(); 1454 pRect->bottom = canvasSize.height();
1363 return TRUE; 1455 return TRUE;
1364 } 1456 }
1365 1457
1366 FX_BOOL CFX_SkiaDeviceDriver::GetDIBits(CFX_DIBitmap* pBitmap, 1458 FX_BOOL CFX_SkiaDeviceDriver::GetDIBits(CFX_DIBitmap* pBitmap,
1367 int left, 1459 int left,
1368 int top) { 1460 int top) {
1369 if (!m_pBitmap) 1461 if (!m_pBitmap)
1370 return TRUE; 1462 return TRUE;
1371 uint8_t* srcBuffer = m_pBitmap->GetBuffer(); 1463 uint8_t* srcBuffer = m_pBitmap->GetBuffer();
1372 if (!srcBuffer) 1464 if (!srcBuffer)
1373 return TRUE; 1465 return TRUE;
1466 #ifdef _SKIA_SUPPORT_
1374 int srcWidth = m_pBitmap->GetWidth(); 1467 int srcWidth = m_pBitmap->GetWidth();
1375 int srcHeight = m_pBitmap->GetHeight(); 1468 int srcHeight = m_pBitmap->GetHeight();
1376 int srcRowBytes = srcWidth * sizeof(uint32_t); 1469 int srcRowBytes = srcWidth * sizeof(uint32_t);
1377 SkImageInfo srcImageInfo = SkImageInfo::Make( 1470 SkImageInfo srcImageInfo = SkImageInfo::Make(
1378 srcWidth, srcHeight, SkColorType::kN32_SkColorType, kPremul_SkAlphaType); 1471 srcWidth, srcHeight, SkColorType::kN32_SkColorType, kPremul_SkAlphaType);
1379 SkBitmap skSrcBitmap; 1472 SkBitmap skSrcBitmap;
1380 skSrcBitmap.installPixels(srcImageInfo, srcBuffer, srcRowBytes, nullptr, 1473 skSrcBitmap.installPixels(srcImageInfo, srcBuffer, srcRowBytes, nullptr,
1381 nullptr, nullptr); 1474 nullptr, nullptr);
1382 SkASSERT(pBitmap); 1475 SkASSERT(pBitmap);
1383 uint8_t* dstBuffer = pBitmap->GetBuffer(); 1476 uint8_t* dstBuffer = pBitmap->GetBuffer();
1384 SkASSERT(dstBuffer); 1477 SkASSERT(dstBuffer);
1385 int dstWidth = pBitmap->GetWidth(); 1478 int dstWidth = pBitmap->GetWidth();
1386 int dstHeight = pBitmap->GetHeight(); 1479 int dstHeight = pBitmap->GetHeight();
1387 int dstRowBytes = dstWidth * sizeof(uint32_t); 1480 int dstRowBytes = dstWidth * sizeof(uint32_t);
1388 SkImageInfo dstImageInfo = SkImageInfo::Make( 1481 SkImageInfo dstImageInfo = SkImageInfo::Make(
1389 dstWidth, dstHeight, SkColorType::kN32_SkColorType, kPremul_SkAlphaType); 1482 dstWidth, dstHeight, SkColorType::kN32_SkColorType, kPremul_SkAlphaType);
1390 SkBitmap skDstBitmap; 1483 SkBitmap skDstBitmap;
1391 skDstBitmap.installPixels(dstImageInfo, dstBuffer, dstRowBytes, nullptr, 1484 skDstBitmap.installPixels(dstImageInfo, dstBuffer, dstRowBytes, nullptr,
1392 nullptr, nullptr); 1485 nullptr, nullptr);
1393 SkCanvas canvas(skDstBitmap); 1486 SkCanvas canvas(skDstBitmap);
1394 canvas.drawBitmap(skSrcBitmap, left, top, nullptr); 1487 canvas.drawBitmap(skSrcBitmap, left, top, nullptr);
1395 return TRUE; 1488 return TRUE;
1489 #else
1490 FX_RECT rect(left, top, left + pBitmap->GetWidth(),
1491 top + pBitmap->GetHeight());
1492 CFX_DIBitmap* pBack = nullptr;
1493 if (m_pOriDevice) {
1494 pBack = m_pOriDevice->Clone(&rect);
1495 if (!pBack)
1496 return TRUE;
1497
1498 pBack->CompositeBitmap(0, 0, pBack->GetWidth(), pBack->GetHeight(),
1499 m_pBitmap, 0, 0);
1500 } else {
1501 pBack = m_pBitmap->Clone(&rect);
1502 if (!pBack)
1503 return TRUE;
1504 }
1505
1506 FX_BOOL bRet = TRUE;
1507 left = std::min(left, 0);
1508 top = std::min(top, 0);
1509 if (m_bRgbByteOrder) {
1510 RgbByteOrderTransferBitmap(pBitmap, 0, 0, rect.Width(), rect.Height(),
1511 pBack, left, top);
1512 } else {
1513 bRet = pBitmap->TransferBitmap(0, 0, rect.Width(), rect.Height(), pBack,
1514 left, top);
1515 }
1516 delete pBack;
1517 return bRet;
1518 #endif
1396 } 1519 }
1397 1520
1398 CFX_DIBitmap* CFX_SkiaDeviceDriver::GetBackDrop() { 1521 CFX_DIBitmap* CFX_SkiaDeviceDriver::GetBackDrop() {
1399 return m_pOriDevice; 1522 return m_pOriDevice;
1400 } 1523 }
1401 1524
1402 FX_BOOL CFX_SkiaDeviceDriver::SetDIBits(const CFX_DIBSource* pBitmap, 1525 FX_BOOL CFX_SkiaDeviceDriver::SetDIBits(const CFX_DIBSource* pBitmap,
1403 uint32_t argb, 1526 uint32_t argb,
1404 const FX_RECT* pSrcRect, 1527 const FX_RECT* pSrcRect,
1405 int left, 1528 int left,
1406 int top, 1529 int top,
1407 int blend_type) { 1530 int blend_type) {
1408 if (!m_pBitmap || !m_pBitmap->GetBuffer()) 1531 if (!m_pBitmap || !m_pBitmap->GetBuffer())
1409 return TRUE; 1532 return TRUE;
1410 1533
1534 #ifdef _SKIA_SUPPORT
1411 CFX_Matrix m(pBitmap->GetWidth(), 0, 0, -pBitmap->GetHeight(), left, 1535 CFX_Matrix m(pBitmap->GetWidth(), 0, 0, -pBitmap->GetHeight(), left,
1412 top + pBitmap->GetHeight()); 1536 top + pBitmap->GetHeight());
1413 void* dummy; 1537 void* dummy;
1414 return StartDIBits(pBitmap, 0xFF, argb, &m, 0, dummy, blend_type); 1538 return StartDIBits(pBitmap, 0xFF, argb, &m, 0, dummy, blend_type);
1539 #else
1540 if (pBitmap->IsAlphaMask()) {
1541 return m_pBitmap->CompositeMask(
1542 left, top, pSrcRect->Width(), pSrcRect->Height(), pBitmap, argb,
1543 pSrcRect->left, pSrcRect->top, blend_type, m_pClipRgn.get(),
1544 m_bRgbByteOrder, 0, nullptr);
1545 }
1546 return m_pBitmap->CompositeBitmap(
1547 left, top, pSrcRect->Width(), pSrcRect->Height(), pBitmap, pSrcRect->left,
1548 pSrcRect->top, blend_type, m_pClipRgn.get(), m_bRgbByteOrder, nullptr);
1549 #endif
1415 } 1550 }
1416 1551
1417 FX_BOOL CFX_SkiaDeviceDriver::StretchDIBits(const CFX_DIBSource* pSource, 1552 FX_BOOL CFX_SkiaDeviceDriver::StretchDIBits(const CFX_DIBSource* pSource,
1418 uint32_t argb, 1553 uint32_t argb,
1419 int dest_left, 1554 int dest_left,
1420 int dest_top, 1555 int dest_top,
1421 int dest_width, 1556 int dest_width,
1422 int dest_height, 1557 int dest_height,
1423 const FX_RECT* pClipRect, 1558 const FX_RECT* pClipRect,
1424 uint32_t flags, 1559 uint32_t flags,
1425 int blend_type) { 1560 int blend_type) {
1561 #ifdef _SKIA_SUPPORT
1426 if (!m_pBitmap->GetBuffer()) 1562 if (!m_pBitmap->GetBuffer())
1427 return TRUE; 1563 return TRUE;
1428 CFX_Matrix m(dest_width, 0, 0, -dest_height, dest_left, 1564 CFX_Matrix m(dest_width, 0, 0, -dest_height, dest_left,
1429 dest_top + dest_height); 1565 dest_top + dest_height);
1430 1566
1431 m_pCanvas->save(); 1567 m_pCanvas->save();
1432 SkRect skClipRect = SkRect::MakeLTRB(pClipRect->left, pClipRect->bottom, 1568 SkRect skClipRect = SkRect::MakeLTRB(pClipRect->left, pClipRect->bottom,
1433 pClipRect->right, pClipRect->top); 1569 pClipRect->right, pClipRect->top);
1434 m_pCanvas->clipRect(skClipRect, SkRegion::kIntersect_Op, true); 1570 m_pCanvas->clipRect(skClipRect, SkRegion::kIntersect_Op, true);
1435 void* dummy; 1571 void* dummy;
1436 FX_BOOL result = StartDIBits(pSource, 0xFF, argb, &m, 0, dummy, blend_type); 1572 FX_BOOL result = StartDIBits(pSource, 0xFF, argb, &m, 0, dummy, blend_type);
1437 m_pCanvas->restore(); 1573 m_pCanvas->restore();
1438 1574
1439 return result; 1575 return result;
1576 #else
1577 if (dest_width == pSource->GetWidth() &&
1578 dest_height == pSource->GetHeight()) {
1579 FX_RECT rect(0, 0, dest_width, dest_height);
1580 return SetDIBits(pSource, argb, &rect, dest_left, dest_top, blend_type);
1581 }
1582 FX_RECT dest_rect(dest_left, dest_top, dest_left + dest_width,
1583 dest_top + dest_height);
1584 dest_rect.Normalize();
1585 FX_RECT dest_clip = dest_rect;
1586 dest_clip.Intersect(*pClipRect);
1587 CFX_BitmapComposer composer;
1588 composer.Compose(m_pBitmap, m_pClipRgn.get(), 255, argb, dest_clip, FALSE,
1589 FALSE, FALSE, m_bRgbByteOrder, 0, nullptr, blend_type);
1590 dest_clip.Offset(-dest_rect.left, -dest_rect.top);
1591 CFX_ImageStretcher stretcher(&composer, pSource, dest_width, dest_height,
1592 dest_clip, flags);
1593 if (stretcher.Start())
1594 stretcher.Continue(nullptr);
1595 return TRUE;
1596 #endif
1440 } 1597 }
1441 1598
1442 FX_BOOL CFX_SkiaDeviceDriver::StartDIBits(const CFX_DIBSource* pSource, 1599 FX_BOOL CFX_SkiaDeviceDriver::StartDIBits(const CFX_DIBSource* pSource,
1443 int bitmap_alpha, 1600 int bitmap_alpha,
1444 uint32_t argb, 1601 uint32_t argb,
1445 const CFX_Matrix* pMatrix, 1602 const CFX_Matrix* pMatrix,
1446 uint32_t render_flags, 1603 uint32_t render_flags,
1447 void*& handle, 1604 void*& handle,
1448 int blend_type) { 1605 int blend_type) {
1606 #ifdef _SKIA_SUPPORT
1449 DebugValidate(m_pBitmap, m_pOriDevice); 1607 DebugValidate(m_pBitmap, m_pOriDevice);
1450 SkColorTable* ct = nullptr; 1608 SkColorTable* ct = nullptr;
1451 std::unique_ptr<uint8_t, FxFreeDeleter> dst8Storage; 1609 std::unique_ptr<uint8_t, FxFreeDeleter> dst8Storage;
1452 std::unique_ptr<uint32_t, FxFreeDeleter> dst32Storage; 1610 std::unique_ptr<uint32_t, FxFreeDeleter> dst32Storage;
1453 SkBitmap skBitmap; 1611 SkBitmap skBitmap;
1454 int width, height; 1612 int width, height;
1455 if (!Upsample(pSource, dst8Storage, dst32Storage, &ct, &skBitmap, &width, 1613 if (!Upsample(pSource, dst8Storage, dst32Storage, &ct, &skBitmap, &width,
1456 &height, false)) { 1614 &height, false)) {
1457 return FALSE; 1615 return FALSE;
1458 } 1616 }
(...skipping 19 matching lines...) Expand all
1478 } 1636 }
1479 } 1637 }
1480 } else { 1638 } else {
1481 m_pCanvas->drawBitmap(skBitmap, 0, 0, &paint); 1639 m_pCanvas->drawBitmap(skBitmap, 0, 0, &paint);
1482 } 1640 }
1483 m_pCanvas->restore(); 1641 m_pCanvas->restore();
1484 if (ct) 1642 if (ct)
1485 ct->unref(); 1643 ct->unref();
1486 DebugValidate(m_pBitmap, m_pOriDevice); 1644 DebugValidate(m_pBitmap, m_pOriDevice);
1487 return TRUE; 1645 return TRUE;
1646 #else
1647 CFX_ImageRenderer* pRenderer = new CFX_ImageRenderer;
1648 pRenderer->Start(m_pBitmap, m_pClipRgn.get(), pSource, bitmap_alpha, argb,
1649 pMatrix, render_flags, m_bRgbByteOrder, 0, nullptr);
1650 handle = pRenderer;
1651 return TRUE;
1652 #endif
1488 } 1653 }
1489 1654
1490 FX_BOOL CFX_SkiaDeviceDriver::ContinueDIBits(void* handle, IFX_Pause* pPause) { 1655 FX_BOOL CFX_SkiaDeviceDriver::ContinueDIBits(void* pHandle, IFX_Pause* pPause) {
1656 #ifdef _SKIA_SUPPORT
1491 return FALSE; 1657 return FALSE;
1658 #else
1659 if (!m_pBitmap->GetBuffer()) {
1660 return TRUE;
1661 }
1662 return ((CFX_ImageRenderer*)pHandle)->Continue(pPause);
dsinclair 2016/09/19 20:45:12 nit: static_cast.
1663 #endif
1492 } 1664 }
1493 1665
1666 #ifdef _SKIA_SUPPORT
1494 void CFX_SkiaDeviceDriver::PreMultiply(CFX_DIBitmap* pDIBitmap) { 1667 void CFX_SkiaDeviceDriver::PreMultiply(CFX_DIBitmap* pDIBitmap) {
1495 void* buffer = pDIBitmap->GetBuffer(); 1668 void* buffer = pDIBitmap->GetBuffer();
1496 if (!buffer) 1669 if (!buffer)
1497 return; 1670 return;
1498 if (pDIBitmap->GetBPP() != 32) { 1671 if (pDIBitmap->GetBPP() != 32) {
1499 return; 1672 return;
1500 } 1673 }
1501 int height = pDIBitmap->GetHeight(); 1674 int height = pDIBitmap->GetHeight();
1502 int width = pDIBitmap->GetWidth(); 1675 int width = pDIBitmap->GetWidth();
1503 int rowBytes = pDIBitmap->GetPitch(); 1676 int rowBytes = pDIBitmap->GetPitch();
(...skipping 61 matching lines...) Expand 10 before | Expand all | Expand 10 after
1565 if (!m_pBitmap || !m_pBitmap->GetBuffer()) 1738 if (!m_pBitmap || !m_pBitmap->GetBuffer())
1566 return true; 1739 return true;
1567 CFX_Matrix m(pBitmap->GetWidth(), 0, 0, -pBitmap->GetHeight(), dest_left, 1740 CFX_Matrix m(pBitmap->GetWidth(), 0, 0, -pBitmap->GetHeight(), dest_left,
1568 dest_top + pBitmap->GetHeight()); 1741 dest_top + pBitmap->GetHeight());
1569 return DrawBitsWithMask(pBitmap, pMask, bitmap_alpha, &m, blend_type); 1742 return DrawBitsWithMask(pBitmap, pMask, bitmap_alpha, &m, blend_type);
1570 } 1743 }
1571 1744
1572 void CFX_SkiaDeviceDriver::Clear(uint32_t color) { 1745 void CFX_SkiaDeviceDriver::Clear(uint32_t color) {
1573 m_pCanvas->clear(color); 1746 m_pCanvas->clear(color);
1574 } 1747 }
1748 #endif
1575 1749
1576 void CFX_SkiaDeviceDriver::Dump() const { 1750 void CFX_SkiaDeviceDriver::Dump() const {
1577 #ifdef SK_DEBUG 1751 #ifdef SK_DEBUG
1578 if (m_pCache) 1752 if (m_pCache)
1579 m_pCache->Dump(this); 1753 m_pCache->Dump(this);
1580 #endif 1754 #endif
1581 } 1755 }
1582 1756
1757 #ifdef _SKIA_SUPPORT_
1583 void CFX_SkiaDeviceDriver::DebugVerifyBitmapIsPreMultiplied() const { 1758 void CFX_SkiaDeviceDriver::DebugVerifyBitmapIsPreMultiplied() const {
1584 if (m_pOriDevice) 1759 if (m_pOriDevice)
1585 m_pOriDevice->DebugVerifyBitmapIsPreMultiplied(); 1760 m_pOriDevice->DebugVerifyBitmapIsPreMultiplied();
1586 } 1761 }
1762 #endif
1587 1763
1588 CFX_FxgeDevice::CFX_FxgeDevice() { 1764 CFX_FxgeDevice::CFX_FxgeDevice() {
1765 #ifdef _SKIA_SUPPORT_
1589 m_bOwnedBitmap = FALSE; 1766 m_bOwnedBitmap = FALSE;
1767 #endif
1590 } 1768 }
1591 1769
1770 #ifdef _SKIA_SUPPORT_
1592 void CFX_FxgeDevice::Clear(uint32_t color) { 1771 void CFX_FxgeDevice::Clear(uint32_t color) {
1593 CFX_SkiaDeviceDriver* skDriver = 1772 CFX_SkiaDeviceDriver* skDriver =
1594 static_cast<CFX_SkiaDeviceDriver*>(GetDeviceDriver()); 1773 static_cast<CFX_SkiaDeviceDriver*>(GetDeviceDriver());
1595 skDriver->Clear(color); 1774 skDriver->Clear(color);
1596 } 1775 }
1597 1776
1598 SkPictureRecorder* CFX_FxgeDevice::CreateRecorder(int size_x, int size_y) { 1777 SkPictureRecorder* CFX_FxgeDevice::CreateRecorder(int size_x, int size_y) {
1599 CFX_SkiaDeviceDriver* skDriver = new CFX_SkiaDeviceDriver(size_x, size_y); 1778 CFX_SkiaDeviceDriver* skDriver = new CFX_SkiaDeviceDriver(size_x, size_y);
1600 SetDeviceDriver(WrapUnique(skDriver)); 1779 SetDeviceDriver(WrapUnique(skDriver));
1601 return skDriver->GetRecorder(); 1780 return skDriver->GetRecorder();
1602 } 1781 }
1782 #endif
1603 1783
1604 bool CFX_FxgeDevice::Attach(CFX_DIBitmap* pBitmap, 1784 bool CFX_FxgeDevice::Attach(CFX_DIBitmap* pBitmap,
1605 bool bRgbByteOrder, 1785 bool bRgbByteOrder,
1606 CFX_DIBitmap* pOriDevice, 1786 CFX_DIBitmap* pOriDevice,
1607 bool bGroupKnockout) { 1787 bool bGroupKnockout) {
1608 if (!pBitmap) 1788 if (!pBitmap)
1609 return false; 1789 return false;
1610 SetBitmap(pBitmap); 1790 SetBitmap(pBitmap);
1611 SetDeviceDriver(WrapUnique(new CFX_SkiaDeviceDriver( 1791 SetDeviceDriver(WrapUnique(new CFX_SkiaDeviceDriver(
1612 pBitmap, bRgbByteOrder, pOriDevice, bGroupKnockout))); 1792 pBitmap, bRgbByteOrder, pOriDevice, bGroupKnockout)));
1613 return true; 1793 return true;
1614 } 1794 }
1615 1795
1796 #ifdef _SKIA_SUPPORT_
1616 bool CFX_FxgeDevice::AttachRecorder(SkPictureRecorder* recorder) { 1797 bool CFX_FxgeDevice::AttachRecorder(SkPictureRecorder* recorder) {
1617 if (!recorder) 1798 if (!recorder)
1618 return false; 1799 return false;
1619 SetDeviceDriver(WrapUnique(new CFX_SkiaDeviceDriver(recorder))); 1800 SetDeviceDriver(WrapUnique(new CFX_SkiaDeviceDriver(recorder)));
1620 return true; 1801 return true;
1621 } 1802 }
1803 #endif
1622 1804
1623 bool CFX_FxgeDevice::Create(int width, 1805 bool CFX_FxgeDevice::Create(int width,
1624 int height, 1806 int height,
1625 FXDIB_Format format, 1807 FXDIB_Format format,
1626 CFX_DIBitmap* pOriDevice) { 1808 CFX_DIBitmap* pOriDevice) {
1627 m_bOwnedBitmap = TRUE; 1809 m_bOwnedBitmap = TRUE;
1628 CFX_DIBitmap* pBitmap = new CFX_DIBitmap; 1810 CFX_DIBitmap* pBitmap = new CFX_DIBitmap;
1629 if (!pBitmap->Create(width, height, format)) { 1811 if (!pBitmap->Create(width, height, format)) {
1630 delete pBitmap; 1812 delete pBitmap;
1631 return false; 1813 return false;
1632 } 1814 }
1633 SetBitmap(pBitmap); 1815 SetBitmap(pBitmap);
1634 SetDeviceDriver( 1816 SetDeviceDriver(
1635 WrapUnique(new CFX_SkiaDeviceDriver(pBitmap, FALSE, pOriDevice, FALSE))); 1817 WrapUnique(new CFX_SkiaDeviceDriver(pBitmap, FALSE, pOriDevice, FALSE)));
1636 return true; 1818 return true;
1637 } 1819 }
1638 1820
1639 CFX_FxgeDevice::~CFX_FxgeDevice() { 1821 CFX_FxgeDevice::~CFX_FxgeDevice() {
1822 #ifdef _SKIA_SUPPORT_
1640 Flush(); 1823 Flush();
1641 // call destructor of CFX_RenderDevice / CFX_SkiaDeviceDriver immediately 1824 // call destructor of CFX_RenderDevice / CFX_SkiaDeviceDriver immediately
1642 if (m_bOwnedBitmap && GetBitmap()) 1825 if (m_bOwnedBitmap && GetBitmap())
1643 delete GetBitmap(); 1826 delete GetBitmap();
1827 #endif
1644 } 1828 }
1645 1829
1830 #ifdef _SKIA_SUPPORT_
1646 void CFX_FxgeDevice::DebugVerifyBitmapIsPreMultiplied() const { 1831 void CFX_FxgeDevice::DebugVerifyBitmapIsPreMultiplied() const {
1647 #ifdef SK_DEBUG 1832 #ifdef SK_DEBUG
1648 CFX_SkiaDeviceDriver* skDriver = 1833 CFX_SkiaDeviceDriver* skDriver =
1649 static_cast<CFX_SkiaDeviceDriver*>(GetDeviceDriver()); 1834 static_cast<CFX_SkiaDeviceDriver*>(GetDeviceDriver());
1650 if (skDriver) 1835 if (skDriver)
1651 skDriver->DebugVerifyBitmapIsPreMultiplied(); 1836 skDriver->DebugVerifyBitmapIsPreMultiplied();
1652 #endif 1837 #endif
1653 } 1838 }
1654 1839
1655 bool CFX_FxgeDevice::SetBitsWithMask(const CFX_DIBSource* pBitmap, 1840 bool CFX_FxgeDevice::SetBitsWithMask(const CFX_DIBSource* pBitmap,
(...skipping 27 matching lines...) Expand all
1683 SkA32Assert(a); 1868 SkA32Assert(a);
1684 SkASSERT(r <= a); 1869 SkASSERT(r <= a);
1685 SkASSERT(g <= a); 1870 SkASSERT(g <= a);
1686 SkASSERT(b <= a); 1871 SkASSERT(b <= a);
1687 } 1872 }
1688 } 1873 }
1689 #endif 1874 #endif
1690 } 1875 }
1691 1876
1692 #endif 1877 #endif
OLDNEW
« no previous file with comments | « core/fxge/skia/fx_skia_device.h ('k') | pdfium.gni » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698