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

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

Issue 2546803003: re-enable skia caching (Closed)
Patch Set: fix antialiasing, dashing for cache Created 4 years 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') | fpdfsdk/fpdfformfill.cpp » ('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 #include <algorithm> 5 #include <algorithm>
6 #include <utility> 6 #include <utility>
7 #include <vector> 7 #include <vector>
8 8
9 #include "core/fpdfapi/page/cpdf_meshstream.h" 9 #include "core/fpdfapi/page/cpdf_meshstream.h"
10 #include "core/fpdfapi/page/cpdf_shadingpattern.h" 10 #include "core/fpdfapi/page/cpdf_shadingpattern.h"
(...skipping 137 matching lines...) Expand 10 before | Expand all | Expand 10 after
148 } 148 }
149 149
150 ASSERT(false); 150 ASSERT(false);
151 } 151 }
152 152
153 #endif // _SKIA_SUPPORT_PATHS_ 153 #endif // _SKIA_SUPPORT_PATHS_
154 154
155 #define SHOW_SKIA_PATH 0 // set to 1 to print the path contents 155 #define SHOW_SKIA_PATH 0 // set to 1 to print the path contents
156 #define DRAW_SKIA_CLIP 0 // set to 1 to draw a green rectangle around the clip 156 #define DRAW_SKIA_CLIP 0 // set to 1 to draw a green rectangle around the clip
157 157
158 #if SHOW_SKIA_PATH
159 void DebugShowSkiaPaint(const SkPaint& paint) {
160 if (SkPaint::kFill_Style == paint.getStyle()) {
161 printf("fill 0x%08x\n", paint.getColor());
162 } else {
163 printf("stroke 0x%08x width %g\n", paint.getColor(),
164 paint.getStrokeWidth());
165 }
166 }
167 #endif // SHOW_SKIA_PATH
168
158 void DebugShowSkiaPath(const SkPath& path) { 169 void DebugShowSkiaPath(const SkPath& path) {
159 #if SHOW_SKIA_PATH 170 #if SHOW_SKIA_PATH
160 char buffer[4096]; 171 char buffer[4096];
161 sk_bzero(buffer, sizeof(buffer)); 172 sk_bzero(buffer, sizeof(buffer));
162 SkMemoryWStream stream(buffer, sizeof(buffer)); 173 SkMemoryWStream stream(buffer, sizeof(buffer));
163 path.dump(&stream, false, false); 174 path.dump(&stream, false, false);
164 printf("%s", buffer); 175 printf("%s", buffer);
165 #endif // SHOW_SKIA_PATH 176 #endif // SHOW_SKIA_PATH
166 } 177 }
167 178
168 void DebugShowCanvasMatrix(const SkCanvas* canvas) { 179 void DebugShowCanvasMatrix(const SkCanvas* canvas) {
169 #if SHOW_SKIA_PATH 180 #if SHOW_SKIA_PATH
170 SkMatrix matrix = canvas->getTotalMatrix(); 181 SkMatrix matrix = canvas->getTotalMatrix();
171 SkScalar m[9]; 182 SkScalar m[9];
172 matrix.get9(m); 183 matrix.get9(m);
173 printf("matrix (%g,%g,%g) (%g,%g,%g) (%g,%g,%g)\n", m[0], m[1], m[2], m[3], 184 printf("matrix (%g,%g,%g) (%g,%g,%g) (%g,%g,%g)\n", m[0], m[1], m[2], m[3],
174 m[4], m[5], m[6], m[7], m[8]); 185 m[4], m[5], m[6], m[7], m[8]);
175 #endif // SHOW_SKIA_PATH 186 #endif // SHOW_SKIA_PATH
176 } 187 }
177 188
189 void DebugShowCanvasClip(const SkCanvas* canvas) {
178 #if SHOW_SKIA_PATH 190 #if SHOW_SKIA_PATH
179 void DebugShowCanvasClip(const SkCanvas* canvas) {
180 SkRect local; 191 SkRect local;
181 SkIRect device; 192 SkIRect device;
182 canvas->getClipBounds(&local); 193 canvas->getClipBounds(&local);
183 printf("local bounds %g %g %g %g\n", local.fLeft, local.fTop, local.fRight, 194 printf("local bounds %g %g %g %g\n", local.fLeft, local.fTop, local.fRight,
184 local.fBottom); 195 local.fBottom);
185 canvas->getClipDeviceBounds(&device); 196 canvas->getClipDeviceBounds(&device);
186 printf("device bounds %d %d %d %d\n", device.fLeft, device.fTop, 197 printf("device bounds %d %d %d %d\n", device.fLeft, device.fTop,
187 device.fRight, device.fBottom); 198 device.fRight, device.fBottom);
188 const SkClipStack* clipStack = canvas->getClipStack(); 199 const SkClipStack* clipStack = canvas->getClipStack();
189 clipStack->dump(); 200 clipStack->dump();
201 #endif // SHOW_SKIA_PATH
190 } 202 }
191 203
204 #if SHOW_SKIA_PATH
192 void DebugShowSkiaPaint(const SkPaint& paint) { 205 void DebugShowSkiaPaint(const SkPaint& paint) {
193 if (SkPaint::kFill_Style == paint.getStyle()) { 206 if (SkPaint::kFill_Style == paint.getStyle()) {
194 printf("fill 0x%08x\n", paint.getColor()); 207 printf("fill 0x%08x\n", paint.getColor());
195 } else { 208 } else {
196 printf("stroke 0x%08x width %g\n", paint.getColor(), 209 printf("stroke 0x%08x width %g\n", paint.getColor(),
197 paint.getStrokeWidth()); 210 paint.getStrokeWidth());
198 } 211 }
199 } 212 }
200 #endif // SHOW_SKIA_PATH 213 #endif // SHOW_SKIA_PATH
201 214
(...skipping 425 matching lines...) Expand 10 before | Expand all | Expand 10 after
627 skBitmap->installPixels(imageInfo, buffer, rowBytes, *ctPtr, nullptr, 640 skBitmap->installPixels(imageInfo, buffer, rowBytes, *ctPtr, nullptr,
628 nullptr); 641 nullptr);
629 *widthPtr = width; 642 *widthPtr = width;
630 *heightPtr = height; 643 *heightPtr = height;
631 return true; 644 return true;
632 } 645 }
633 #endif // _SKIA_SUPPORT_ 646 #endif // _SKIA_SUPPORT_
634 647
635 } // namespace 648 } // namespace
636 649
637 #ifdef _SKIA_SUPPORT_
638 // Encapsulate the state used for successive text and path draws so that 650 // Encapsulate the state used for successive text and path draws so that
639 // they can be combined. 651 // they can be combined.
640 class SkiaState { 652 class SkiaState {
641 public: 653 public:
642 enum class Clip { 654 enum class Clip {
643 kSave, 655 kSave,
644 kPath, 656 kPath,
645 }; 657 };
646 658
659 enum class Accumulator {
660 kNone,
661 kPath,
662 kText,
663 kOther,
664 };
665
647 // mark all cached state as uninitialized 666 // mark all cached state as uninitialized
648 SkiaState() 667 explicit SkiaState(CFX_SkiaDeviceDriver* pDriver)
dsinclair 2016/12/06 18:48:26 I think the explicit is only needed in the .h file
caryclark 2016/12/06 19:00:37 The upload lint complained.
649 : m_pFont(nullptr), 668 : m_pDriver(pDriver),
669 m_pFont(nullptr),
650 m_fontSize(0), 670 m_fontSize(0),
651 m_fillColor(0), 671 m_fillColor(0),
652 m_strokeColor(0), 672 m_strokeColor(0),
653 m_blendType(0), 673 m_blendType(0),
654 m_commandIndex(0), 674 m_commandIndex(0),
655 m_drawText(false), 675 m_drawIndex(INT_MAX),
656 m_drawPath(false), 676 m_clipIndex(0),
677 m_type(Accumulator::kNone),
678 m_fillFullCover(false),
657 m_fillPath(false), 679 m_fillPath(false),
658 m_groupKnockout(false), 680 m_groupKnockout(false),
659 m_debugDisable(false) {} 681 m_debugDisable(false)
682 #if SHOW_SKIA_PATH
683 ,
684 m_debugSaveCounter(0)
685 #endif
686 {
687 }
660 688
661 bool DrawPath(const CFX_PathData* pPathData, 689 bool DrawPath(const CFX_PathData* pPathData,
662 const CFX_Matrix* pMatrix, 690 const CFX_Matrix* pMatrix,
663 const CFX_GraphStateData* pDrawState, 691 const CFX_GraphStateData* pDrawState,
664 uint32_t fill_color, 692 uint32_t fill_color,
665 uint32_t stroke_color, 693 uint32_t stroke_color,
666 int fill_mode, 694 int fill_mode,
667 int blend_type, 695 int blend_type) {
668 CFX_SkiaDeviceDriver* pDriver) {
669 if (m_debugDisable) 696 if (m_debugDisable)
670 return false; 697 return false;
671 if (m_commandIndex < m_commands.count()) 698 Dump(__func__);
672 FlushCommands(pDriver); 699 int drawIndex = SkTMin(m_drawIndex, m_commands.count());
673 if (m_drawText) 700 if (Accumulator::kText == m_type || drawIndex != m_commandIndex ||
674 FlushText(pDriver); 701 (Accumulator::kPath == m_type &&
675 if (m_drawPath && 702 DrawChanged(pMatrix, pDrawState, fill_color, stroke_color, fill_mode,
676 DrawChanged(pMatrix, pDrawState, fill_color, stroke_color, fill_mode, 703 blend_type, m_pDriver->m_bGroupKnockout))) {
677 blend_type, pDriver->m_bGroupKnockout)) { 704 Flush();
678 FlushPath(pDriver);
679 } 705 }
680 if (!m_drawPath) { 706 if (Accumulator::kPath != m_type) {
681 m_skPath.reset(); 707 m_skPath.reset();
708 m_fillFullCover = !!(fill_mode & FXFILL_FULLCOVER);
682 m_fillPath = (fill_mode & 3) && fill_color; 709 m_fillPath = (fill_mode & 3) && fill_color;
683 m_skPath.setFillType((fill_mode & 3) == FXFILL_ALTERNATE 710 m_skPath.setFillType((fill_mode & 3) == FXFILL_ALTERNATE
684 ? SkPath::kEvenOdd_FillType 711 ? SkPath::kEvenOdd_FillType
685 : SkPath::kWinding_FillType); 712 : SkPath::kWinding_FillType);
686 if (pDrawState) 713 if (pDrawState)
687 m_drawState.Copy(*pDrawState); 714 m_drawState.Copy(*pDrawState);
688 m_fillColor = fill_color; 715 m_fillColor = fill_color;
689 m_strokeColor = stroke_color; 716 m_strokeColor = stroke_color;
690 m_blendType = blend_type; 717 m_blendType = blend_type;
691 m_groupKnockout = pDriver->m_bGroupKnockout; 718 m_groupKnockout = m_pDriver->m_bGroupKnockout;
692 if (pMatrix) 719 if (pMatrix)
693 m_drawMatrix = *pMatrix; 720 m_drawMatrix = *pMatrix;
721 m_drawIndex = m_commandIndex;
722 m_type = Accumulator::kPath;
694 } 723 }
695 SkPath skPath = BuildPath(pPathData); 724 SkPath skPath = BuildPath(pPathData);
696 SkPoint delta; 725 SkPoint delta;
697 if (MatrixOffset(pMatrix, &delta)) 726 if (MatrixOffset(pMatrix, &delta))
698 skPath.offset(delta.fX, delta.fY); 727 skPath.offset(delta.fX, delta.fY);
699 m_skPath.addPath(skPath); 728 m_skPath.addPath(skPath);
700 m_drawPath = true;
701 return true; 729 return true;
702 } 730 }
703 731
704 void FlushPath(CFX_SkiaDeviceDriver* pDriver) { 732 void FlushPath() {
733 Dump(__func__);
705 SkMatrix skMatrix = ToSkMatrix(m_drawMatrix); 734 SkMatrix skMatrix = ToSkMatrix(m_drawMatrix);
706 SkPaint skPaint; 735 SkPaint skPaint;
707 skPaint.setAntiAlias(true); 736 skPaint.setAntiAlias(true);
737 if (m_fillFullCover)
738 skPaint.setBlendMode(SkBlendMode::kPlus);
708 int stroke_alpha = FXARGB_A(m_strokeColor); 739 int stroke_alpha = FXARGB_A(m_strokeColor);
709 if (stroke_alpha) 740 if (stroke_alpha)
710 pDriver->PaintStroke(&skPaint, &m_drawState, skMatrix); 741 m_pDriver->PaintStroke(&skPaint, &m_drawState, skMatrix);
711 SkCanvas* skCanvas = pDriver->SkiaCanvas(); 742 SkCanvas* skCanvas = m_pDriver->SkiaCanvas();
712 skCanvas->save(); 743 skCanvas->save();
713 skCanvas->concat(skMatrix); 744 skCanvas->concat(skMatrix);
714 if (m_fillPath) { 745 if (m_fillPath) {
715 SkPath strokePath; 746 SkPath strokePath;
716 const SkPath* fillPath = &m_skPath; 747 const SkPath* fillPath = &m_skPath;
717 if (stroke_alpha) { 748 if (stroke_alpha) {
718 if (m_groupKnockout) { 749 if (m_groupKnockout) {
719 skPaint.getFillPath(m_skPath, &strokePath); 750 skPaint.getFillPath(m_skPath, &strokePath);
720 if (Op(m_skPath, strokePath, SkPathOp::kDifference_SkPathOp, 751 if (Op(m_skPath, strokePath, SkPathOp::kDifference_SkPathOp,
721 &strokePath)) { 752 &strokePath)) {
722 fillPath = &strokePath; 753 fillPath = &strokePath;
723 } 754 }
724 } 755 }
725 } 756 }
726 skPaint.setStyle(SkPaint::kFill_Style); 757 skPaint.setStyle(SkPaint::kFill_Style);
727 skPaint.setColor(m_fillColor); 758 skPaint.setColor(m_fillColor);
759 #ifdef _SKIA_SUPPORT_PATHS_
760 m_pDriver->PreMultiply();
761 #endif // _SKIA_SUPPORT_PATHS_
762 DebugShowSkiaDrawPath(skCanvas, skPaint, *fillPath);
728 skCanvas->drawPath(*fillPath, skPaint); 763 skCanvas->drawPath(*fillPath, skPaint);
729 } 764 }
730 if (stroke_alpha) { 765 if (stroke_alpha) {
731 DebugShowSkiaPath(m_skPath);
732 DebugShowCanvasMatrix(skCanvas);
733 skPaint.setStyle(SkPaint::kStroke_Style); 766 skPaint.setStyle(SkPaint::kStroke_Style);
734 skPaint.setColor(m_strokeColor); 767 skPaint.setColor(m_strokeColor);
768 #ifdef _SKIA_SUPPORT_PATHS_
769 m_pDriver->PreMultiply();
770 #endif // _SKIA_SUPPORT_PATHS_
771 DebugShowSkiaDrawPath(skCanvas, skPaint, m_skPath);
735 skCanvas->drawPath(m_skPath, skPaint); 772 skCanvas->drawPath(m_skPath, skPaint);
736 } 773 }
737 skCanvas->restore(); 774 skCanvas->restore();
738 m_drawPath = false; 775 m_drawIndex = INT_MAX;
776 m_type = Accumulator::kNone;
739 } 777 }
740 778
741 bool DrawText(int nChars, 779 bool DrawText(int nChars,
742 const FXTEXT_CHARPOS* pCharPos, 780 const FXTEXT_CHARPOS* pCharPos,
743 CFX_Font* pFont, 781 CFX_Font* pFont,
744 const CFX_Matrix* pMatrix, 782 const CFX_Matrix* pMatrix,
745 FX_FLOAT font_size, 783 FX_FLOAT font_size,
746 uint32_t color, 784 uint32_t color) {
747 CFX_SkiaDeviceDriver* pDriver) {
748 if (m_debugDisable) 785 if (m_debugDisable)
749 return false; 786 return false;
750 if (m_commandIndex < m_commands.count()) 787 Dump(__func__);
751 FlushCommands(pDriver); 788 int drawIndex = SkTMin(m_drawIndex, m_commands.count());
752 if (m_drawPath) 789 if (Accumulator::kPath == m_type || drawIndex != m_commandIndex ||
753 FlushPath(pDriver); 790 (Accumulator::kText == m_type &&
754 if (m_drawText && FontChanged(pFont, pMatrix, font_size, color)) 791 FontChanged(pFont, pMatrix, font_size, color))) {
755 FlushText(pDriver); 792 Flush();
756 if (!m_drawText) { 793 }
794 if (Accumulator::kText != m_type) {
757 m_positions.setCount(0); 795 m_positions.setCount(0);
758 m_glyphs.setCount(0); 796 m_glyphs.setCount(0);
759 m_pFont = pFont; 797 m_pFont = pFont;
760 m_fontSize = font_size; 798 m_fontSize = font_size;
761 m_fillColor = color; 799 m_fillColor = color;
762 m_drawMatrix = *pMatrix; 800 m_drawMatrix = *pMatrix;
801 m_drawIndex = m_commandIndex;
802 m_type = Accumulator::kText;
763 } 803 }
764 int count = m_positions.count(); 804 int count = m_positions.count();
765 m_positions.setCount(nChars + count); 805 m_positions.setCount(nChars + count);
766 m_glyphs.setCount(nChars + count); 806 m_glyphs.setCount(nChars + count);
767 SkScalar flip = m_fontSize < 0 ? -1 : 1; 807 SkScalar flip = m_fontSize < 0 ? -1 : 1;
808 SkScalar vFlip = flip;
809 if (pFont->IsVertical())
810 vFlip *= -1;
768 for (int index = 0; index < nChars; ++index) { 811 for (int index = 0; index < nChars; ++index) {
769 const FXTEXT_CHARPOS& cp = pCharPos[index]; 812 const FXTEXT_CHARPOS& cp = pCharPos[index];
770 m_positions[index + count] = {cp.m_OriginX * flip, cp.m_OriginY * flip}; 813 m_positions[index + count] = {cp.m_OriginX * flip, cp.m_OriginY * vFlip};
771 m_glyphs[index + count] = (uint16_t)cp.m_GlyphIndex; 814 m_glyphs[index + count] = (uint16_t)cp.m_GlyphIndex;
772 } 815 }
773 SkPoint delta; 816 SkPoint delta;
774 if (MatrixOffset(pMatrix, &delta)) { 817 if (MatrixOffset(pMatrix, &delta)) {
775 for (int index = 0; index < nChars; ++index) 818 for (int index = 0; index < nChars; ++index)
776 m_positions[index + count].offset(delta.fX * flip, -delta.fY * flip); 819 m_positions[index + count].offset(delta.fX * flip, -delta.fY * flip);
777 } 820 }
778 m_drawText = true;
779 return true; 821 return true;
780 } 822 }
781 823
782 void FlushText(CFX_SkiaDeviceDriver* pDriver) { 824 void FlushText() {
783 SkScalar flip = m_fontSize < 0 ? -1 : 1; 825 Dump(__func__);
784 SkMatrix skMatrix = ToFlippedSkMatrix(m_drawMatrix, flip);
785 SkPaint skPaint; 826 SkPaint skPaint;
786 skPaint.setAntiAlias(true); 827 skPaint.setAntiAlias(true);
787 skPaint.setColor(m_fillColor); 828 skPaint.setColor(m_fillColor);
788 if (m_pFont->GetFace()) { // exclude placeholder test fonts 829 if (m_pFont->GetFace()) { // exclude placeholder test fonts
789 sk_sp<SkTypeface> typeface(SkSafeRef(m_pFont->GetDeviceCache())); 830 sk_sp<SkTypeface> typeface(SkSafeRef(m_pFont->GetDeviceCache()));
790 skPaint.setTypeface(typeface); 831 skPaint.setTypeface(typeface);
791 } 832 }
792 skPaint.setTextEncoding(SkPaint::kGlyphID_TextEncoding); 833 skPaint.setTextEncoding(SkPaint::kGlyphID_TextEncoding);
793 skPaint.setHinting(SkPaint::kNo_Hinting); 834 skPaint.setHinting(SkPaint::kNo_Hinting);
794 skPaint.setTextSize(SkTAbs(m_fontSize)); 835 skPaint.setTextSize(SkTAbs(m_fontSize));
795 skPaint.setSubpixelText(true); 836 skPaint.setSubpixelText(true);
796 SkCanvas* skCanvas = pDriver->SkiaCanvas(); 837 SkCanvas* skCanvas = m_pDriver->SkiaCanvas();
797 skCanvas->save(); 838 skCanvas->save();
839 SkScalar flip = m_fontSize < 0 ? -1 : 1;
840 SkMatrix skMatrix = ToFlippedSkMatrix(m_drawMatrix, flip);
798 skCanvas->concat(skMatrix); 841 skCanvas->concat(skMatrix);
842 #ifdef _SKIA_SUPPORT_PATHS_
843 m_pDriver->PreMultiply();
844 #endif // _SKIA_SUPPORT_PATHS_
799 skCanvas->drawPosText(m_glyphs.begin(), m_glyphs.count() * 2, 845 skCanvas->drawPosText(m_glyphs.begin(), m_glyphs.count() * 2,
800 m_positions.begin(), skPaint); 846 m_positions.begin(), skPaint);
801 skCanvas->restore(); 847 skCanvas->restore();
802 m_drawText = false; 848 m_drawIndex = INT_MAX;
849 m_type = Accumulator::kNone;
803 } 850 }
804 851
805 bool SetClipFill(const CFX_PathData* pPathData, 852 bool SetClipFill(const CFX_PathData* pPathData,
806 const CFX_Matrix* pMatrix, 853 const CFX_Matrix* pMatrix,
807 int fill_mode, 854 int fill_mode) {
808 CFX_SkiaDeviceDriver* pDriver) {
809 if (m_debugDisable) 855 if (m_debugDisable)
810 return false; 856 return false;
857 Dump(__func__);
811 SkPath skClipPath = BuildPath(pPathData); 858 SkPath skClipPath = BuildPath(pPathData);
812 skClipPath.setFillType((fill_mode & 3) == FXFILL_ALTERNATE 859 skClipPath.setFillType((fill_mode & 3) == FXFILL_ALTERNATE
813 ? SkPath::kEvenOdd_FillType 860 ? SkPath::kEvenOdd_FillType
814 : SkPath::kWinding_FillType); 861 : SkPath::kWinding_FillType);
815 SkMatrix skMatrix = ToSkMatrix(*pMatrix); 862 SkMatrix skMatrix = ToSkMatrix(*pMatrix);
816 skClipPath.transform(skMatrix); 863 skClipPath.transform(skMatrix);
817 return SetClip(skClipPath, pDriver); 864 return SetClip(skClipPath);
818 } 865 }
819 866
820 bool SetClip(const SkPath& skClipPath, CFX_SkiaDeviceDriver* pDriver) { 867 bool SetClip(const SkPath& skClipPath) {
868 // if a pending draw depends on clip state that is cached, flush it and draw
821 if (m_commandIndex < m_commands.count()) { 869 if (m_commandIndex < m_commands.count()) {
822 if (m_commands[m_commandIndex] == Clip::kPath && 870 if (m_commands[m_commandIndex] == Clip::kPath &&
823 m_clips[m_commandIndex] == skClipPath) { 871 m_clips[m_commandIndex] == skClipPath) {
824 ++m_commandIndex; 872 ++m_commandIndex;
825 return true; 873 return true;
826 } 874 }
827 FlushCommands(pDriver); 875 Flush();
828 } 876 }
829 Flush(pDriver); 877 while (m_clipIndex > m_commandIndex) {
830 m_commands.push(Clip::kPath); 878 do {
879 --m_clipIndex;
880 SkASSERT(m_clipIndex >= 0);
881 } while (m_commands[m_clipIndex] != Clip::kSave);
882 m_pDriver->SkiaCanvas()->restore();
883 }
884 if (m_commandIndex < m_commands.count()) {
885 m_commands[m_commandIndex] = Clip::kPath;
886 m_clips[m_commandIndex] = skClipPath;
887 } else {
888 m_commands.push(Clip::kPath);
889 m_clips.push_back(skClipPath);
890 }
831 ++m_commandIndex; 891 ++m_commandIndex;
832 m_clips.push_back(skClipPath); 892 return true;
833 return false;
834 } 893 }
835 894
836 bool SetClipStroke(const CFX_PathData* pPathData, 895 bool SetClipStroke(const CFX_PathData* pPathData,
837 const CFX_Matrix* pMatrix, 896 const CFX_Matrix* pMatrix,
838 const CFX_GraphStateData* pGraphState, 897 const CFX_GraphStateData* pGraphState) {
839 CFX_SkiaDeviceDriver* pDriver) {
840 if (m_debugDisable) 898 if (m_debugDisable)
841 return false; 899 return false;
900 Dump(__func__);
842 SkPath skPath = BuildPath(pPathData); 901 SkPath skPath = BuildPath(pPathData);
843 SkMatrix skMatrix = ToSkMatrix(*pMatrix); 902 SkMatrix skMatrix = ToSkMatrix(*pMatrix);
844 SkPaint skPaint; 903 SkPaint skPaint;
845 pDriver->PaintStroke(&skPaint, pGraphState, skMatrix); 904 m_pDriver->PaintStroke(&skPaint, pGraphState, skMatrix);
846 SkPath dst_path; 905 SkPath dst_path;
847 skPaint.getFillPath(skPath, &dst_path); 906 skPaint.getFillPath(skPath, &dst_path);
848 dst_path.transform(skMatrix); 907 dst_path.transform(skMatrix);
849 return SetClip(dst_path, pDriver); 908 return SetClip(dst_path);
850 } 909 }
851 910
852 bool MatrixOffset(const CFX_Matrix* pMatrix, SkPoint* delta) { 911 bool MatrixOffset(const CFX_Matrix* pMatrix, SkPoint* delta) {
853 CFX_Matrix identityMatrix; 912 CFX_Matrix identityMatrix;
854 if (!pMatrix) 913 if (!pMatrix)
855 pMatrix = &identityMatrix; 914 pMatrix = &identityMatrix;
856 delta->set(pMatrix->e - m_drawMatrix.e, pMatrix->f - m_drawMatrix.f); 915 delta->set(pMatrix->e - m_drawMatrix.e, pMatrix->f - m_drawMatrix.f);
857 if (!delta->fX && !delta->fY) 916 if (!delta->fX && !delta->fY)
858 return true; 917 return true;
859 SkMatrix drawMatrix = ToSkMatrix(m_drawMatrix); 918 SkMatrix drawMatrix = ToSkMatrix(m_drawMatrix);
860 if (!(drawMatrix.getType() & ~SkMatrix::kTranslate_Mask)) 919 if (!(drawMatrix.getType() & ~SkMatrix::kTranslate_Mask))
861 return true; 920 return true;
862 SkMatrix invDrawMatrix; 921 SkMatrix invDrawMatrix;
863 if (!drawMatrix.invert(&invDrawMatrix)) 922 if (!drawMatrix.invert(&invDrawMatrix))
864 return false; 923 return false;
865 SkMatrix invNewMatrix; 924 SkMatrix invNewMatrix;
866 SkMatrix newMatrix = ToSkMatrix(*pMatrix); 925 SkMatrix newMatrix = ToSkMatrix(*pMatrix);
867 if (!newMatrix.invert(&invNewMatrix)) 926 if (!newMatrix.invert(&invNewMatrix))
868 return false; 927 return false;
869 delta->set(invDrawMatrix.getTranslateX() - invNewMatrix.getTranslateX(), 928 delta->set(invDrawMatrix.getTranslateX() - invNewMatrix.getTranslateX(),
870 invDrawMatrix.getTranslateY() - invNewMatrix.getTranslateY()); 929 invDrawMatrix.getTranslateY() - invNewMatrix.getTranslateY());
871 return true; 930 return true;
872 } 931 }
873 932
874 void FlushCommands(CFX_SkiaDeviceDriver* pDriver) {
875 if (m_commandIndex == m_commands.count())
876 return;
877 if (m_commandIndex < m_commands.count())
878 pDriver->SkiaCanvas()->restore();
879 int index = m_commands.count() - 1;
880 if (m_commandIndex == index && m_commands[index] == Clip::kSave)
881 return;
882 for (; index > m_commandIndex; --index) {
883 if (m_commands[index] == Clip::kSave)
884 pDriver->SkiaCanvas()->restore();
885 }
886
887 if (m_commandIndex > 0)
888 pDriver->SkiaCanvas()->save();
889 while (index > 0 && m_commands[index] != Clip::kSave)
890 --index;
891 while (++index < m_commandIndex) {
892 SkASSERT(m_commands[index] == Clip::kPath);
893 pDriver->SkiaCanvas()->clipPath(m_clips[index], SkCanvas::kIntersect_Op,
894 true);
895 }
896 m_commands.setCount(m_commandIndex);
897 m_clips.resize_back(m_commandIndex);
898 }
899
900 // returns true if caller should apply command to skia canvas 933 // returns true if caller should apply command to skia canvas
901 bool ClipSave(CFX_SkiaDeviceDriver* pDriver) { 934 bool ClipSave() {
902 if (m_debugDisable) 935 if (m_debugDisable)
903 return false; 936 return false;
937 Dump(__func__);
904 int count = m_commands.count(); 938 int count = m_commands.count();
905 if (m_commandIndex < count) { 939 if (m_commandIndex < count - 1) {
906 if (m_commands[m_commandIndex] == Clip::kSave) { 940 if (Clip::kSave == m_commands[m_commandIndex + 1]) {
907 ++m_commandIndex; 941 ++m_commandIndex;
908 return true; 942 return true;
909 } 943 }
910 FlushCommands(pDriver); 944 Flush();
945 AdjustClip(m_commandIndex);
946 m_commands[++m_commandIndex] = Clip::kSave;
947 m_clips[m_commandIndex] = m_skEmptyPath;
948 } else {
949 AdjustClip(m_commandIndex);
950 m_commands.push(Clip::kSave);
951 m_clips.push_back(m_skEmptyPath);
952 ++m_commandIndex;
911 } 953 }
912 Flush(pDriver); 954 return true;
913 m_commands.push(Clip::kSave);
914 ++m_commandIndex;
915 m_clips.push_back(m_skEmptyPath);
916 return false;
917 } 955 }
918 956
919 bool ClipRestore(CFX_SkiaDeviceDriver* pDriver) { 957 bool ClipRestore() {
920 if (m_debugDisable) 958 if (m_debugDisable)
921 return false; 959 return false;
922 while (m_commandIndex > 0) { 960 Dump(__func__);
923 if (m_commands[--m_commandIndex] == Clip::kSave) 961 while (Clip::kSave != m_commands[--m_commandIndex]) {
924 return true; 962 SkASSERT(m_commandIndex > 0);
925 } 963 }
926 Flush(pDriver); 964 return true;
927 return false;
928 } 965 }
929 966
930 bool DrawChanged(const CFX_Matrix* pMatrix, 967 bool DrawChanged(const CFX_Matrix* pMatrix,
931 const CFX_GraphStateData* pState, 968 const CFX_GraphStateData* pState,
932 uint32_t fill_color, 969 uint32_t fill_color,
933 uint32_t stroke_color, 970 uint32_t stroke_color,
934 int fill_mode, 971 int fill_mode,
935 int blend_type, 972 int blend_type,
936 bool group_knockout) { 973 bool group_knockout) const {
937 return MatrixChanged(pMatrix, m_drawMatrix) || 974 return MatrixChanged(pMatrix, m_drawMatrix) ||
938 StateChanged(pState, m_drawState) || fill_color != m_fillColor || 975 StateChanged(pState, m_drawState) || fill_color != m_fillColor ||
939 stroke_color != m_strokeColor || 976 stroke_color != m_strokeColor ||
940 ((fill_mode & 3) == FXFILL_ALTERNATE) != 977 ((fill_mode & 3) == FXFILL_ALTERNATE) !=
941 (m_skPath.getFillType() == SkPath::kEvenOdd_FillType) || 978 (m_skPath.getFillType() == SkPath::kEvenOdd_FillType) ||
942 blend_type != m_blendType || group_knockout != m_groupKnockout; 979 blend_type != m_blendType || group_knockout != m_groupKnockout;
943 } 980 }
944 981
945 bool FontChanged(CFX_Font* pFont, 982 bool FontChanged(CFX_Font* pFont,
946 const CFX_Matrix* pMatrix, 983 const CFX_Matrix* pMatrix,
947 FX_FLOAT font_size, 984 FX_FLOAT font_size,
948 uint32_t color) { 985 uint32_t color) const {
949 return pFont != m_pFont || MatrixChanged(pMatrix, m_drawMatrix) || 986 return pFont != m_pFont || MatrixChanged(pMatrix, m_drawMatrix) ||
950 font_size != m_fontSize || color != m_fillColor; 987 font_size != m_fontSize || color != m_fillColor;
951 } 988 }
952 989
953 bool MatrixChanged(const CFX_Matrix* pMatrix, const CFX_Matrix& refMatrix) { 990 bool MatrixChanged(const CFX_Matrix* pMatrix,
991 const CFX_Matrix& refMatrix) const {
954 CFX_Matrix identityMatrix; 992 CFX_Matrix identityMatrix;
955 if (!pMatrix) 993 if (!pMatrix)
956 pMatrix = &identityMatrix; 994 pMatrix = &identityMatrix;
957 return pMatrix->a != refMatrix.a || pMatrix->b != refMatrix.b || 995 return pMatrix->a != refMatrix.a || pMatrix->b != refMatrix.b ||
958 pMatrix->c != refMatrix.c || pMatrix->d != refMatrix.d; 996 pMatrix->c != refMatrix.c || pMatrix->d != refMatrix.d;
959 } 997 }
960 998
961 bool StateChanged(const CFX_GraphStateData* pState, 999 bool StateChanged(const CFX_GraphStateData* pState,
962 const CFX_GraphStateData& refState) { 1000 const CFX_GraphStateData& refState) const {
963 CFX_GraphStateData identityState; 1001 CFX_GraphStateData identityState;
964 if (!pState) 1002 if (!pState)
965 pState = &identityState; 1003 pState = &identityState;
966 return pState->m_LineWidth != refState.m_LineWidth || 1004 return pState->m_LineWidth != refState.m_LineWidth ||
967 pState->m_LineCap != refState.m_LineCap || 1005 pState->m_LineCap != refState.m_LineCap ||
968 pState->m_LineJoin != refState.m_LineJoin || 1006 pState->m_LineJoin != refState.m_LineJoin ||
969 pState->m_MiterLimit != refState.m_MiterLimit || 1007 pState->m_MiterLimit != refState.m_MiterLimit ||
970 DashChanged(pState, refState); 1008 DashChanged(pState, refState);
971 } 1009 }
972 1010
973 bool DashChanged(const CFX_GraphStateData* pState, 1011 bool DashChanged(const CFX_GraphStateData* pState,
974 const CFX_GraphStateData& refState) { 1012 const CFX_GraphStateData& refState) const {
975 bool dashArray = pState && pState->m_DashArray; 1013 bool dashArray = pState && pState->m_DashArray;
976 if (!dashArray && !refState.m_DashArray) 1014 if (!dashArray && !refState.m_DashArray)
977 return false; 1015 return false;
978 if (!dashArray || !refState.m_DashArray) 1016 if (!dashArray || !refState.m_DashArray)
979 return true; 1017 return true;
980 if (pState->m_DashPhase != refState.m_DashPhase || 1018 if (pState->m_DashPhase != refState.m_DashPhase ||
981 pState->m_DashCount != refState.m_DashCount) { 1019 pState->m_DashCount != refState.m_DashCount) {
982 return true; 1020 return true;
983 } 1021 }
984 for (int index = 0; index < pState->m_DashCount; ++index) { 1022 for (int index = 0; index < pState->m_DashCount; ++index) {
985 if (pState->m_DashArray[index] != refState.m_DashArray[index]) 1023 if (pState->m_DashArray[index] != refState.m_DashArray[index])
986 return false; 1024 return true;
987 } 1025 }
988 return true; 1026 return true;
989 } 1027 }
990 1028
991 void Flush(CFX_SkiaDeviceDriver* pDriver) { 1029 void AdjustClip(int limit) {
992 if (m_drawPath) 1030 while (m_clipIndex > limit) {
993 FlushPath(pDriver); 1031 do {
994 if (m_drawText) 1032 --m_clipIndex;
995 FlushText(pDriver); 1033 SkASSERT(m_clipIndex >= 0);
1034 } while (m_commands[m_clipIndex] != Clip::kSave);
1035 m_pDriver->SkiaCanvas()->restore();
1036 }
1037 while (m_clipIndex < limit) {
1038 if (Clip::kSave == m_commands[m_clipIndex]) {
1039 m_pDriver->SkiaCanvas()->save();
1040 } else {
1041 SkASSERT(Clip::kPath == m_commands[m_clipIndex]);
1042 m_pDriver->SkiaCanvas()->clipPath(m_clips[m_clipIndex],
1043 SkCanvas::kIntersect_Op, true);
1044 }
1045 ++m_clipIndex;
1046 }
996 } 1047 }
997 1048
998 void Dump(const CFX_SkiaDeviceDriver* pDriver) const { 1049 void Flush() {
1050 if (m_debugDisable)
1051 return;
1052 Dump(__func__);
1053 if (Accumulator::kPath == m_type || Accumulator::kText == m_type) {
1054 AdjustClip(SkTMin(m_drawIndex, m_commands.count()));
1055 Accumulator::kPath == m_type ? FlushPath() : FlushText();
1056 }
1057 }
1058
1059 void FlushForDraw() {
1060 if (m_debugDisable)
1061 return;
1062 Flush(); // draw any pending text or path
1063 AdjustClip(m_commandIndex); // set up clip stack with any pending state
1064 }
1065
999 #if SHOW_SKIA_PATH 1066 #if SHOW_SKIA_PATH
1000 SkDebugf("\n\nSkia Save Count %d:\n", pDriver->m_pCanvas->getSaveCount()); 1067 void DumpPrefix(int index) const {
1001 pDriver->m_pCanvas->getClipStack()->dump(); 1068 if (index != m_commandIndex && index != m_drawIndex &&
1002 SkDebugf("Cache:\n"); 1069 index != m_clipIndex) {
1070 printf(" ");
1071 return;
1072 }
1073 printf("%c%c%c> ", index == m_commandIndex ? 'x' : '-',
1074 index == m_drawIndex ? 'd' : '-', index == m_clipIndex ? 'c' : '-');
1075 }
1076
1077 void DumpEndPrefix() const {
1078 int index = m_commands.count();
1079 if (index != m_commandIndex && index > m_drawIndex && index != m_clipIndex)
1080 return;
1081 printf("%c%c%c>\n", index == m_commandIndex ? 'x' : '-',
1082 index <= m_drawIndex ? 'd' : '-', index == m_clipIndex ? 'c' : '-');
1083 }
1084 #endif // SHOW_SKIA_PATH
1085
1086 void Dump(const char* where) const {
1087 #if SHOW_SKIA_PATH
1088 printf("\n%s\nSkia Save Count %d:\n", where,
1089 m_pDriver->m_pCanvas->getSaveCount());
1090 m_pDriver->m_pCanvas->getClipStack()->dump();
1091 printf("Cache:\n");
1003 for (int index = 0; index < m_commands.count(); ++index) { 1092 for (int index = 0; index < m_commands.count(); ++index) {
1004 SkDebugf("%s ", m_commandIndex == index ? "-->" : " "); 1093 DumpPrefix(index);
1005 switch (m_commands[index]) { 1094 switch (m_commands[index]) {
1006 case Clip::kSave: 1095 case Clip::kSave:
1007 SkDebugf("Save\n"); 1096 printf("Save %d\n", ++m_debugSaveCounter);
1008 break; 1097 break;
1009 case Clip::kPath: 1098 case Clip::kPath:
1010 m_clips[index].dump(); 1099 m_clips[index].dump();
1011 break; 1100 break;
1012 default: 1101 default:
1013 SkDebugf("unknown\n"); 1102 printf("unknown\n");
1014 } 1103 }
1015 } 1104 }
1016 if (m_commandIndex == m_commands.count()) 1105 DumpEndPrefix();
1017 SkDebugf("-->\n");
1018 #endif // SHOW_SKIA_PATH 1106 #endif // SHOW_SKIA_PATH
1107 #ifdef SK_DEBUG
1108 int skCanvasSaveCount = m_pDriver->m_pCanvas->getSaveCount();
1109 int cacheSaveCount = 1;
1110 SkASSERT(m_clipIndex <= m_commands.count());
1111 for (int index = 0; index < m_clipIndex; ++index)
1112 cacheSaveCount += Clip::kSave == m_commands[index];
1113 SkASSERT(skCanvasSaveCount == cacheSaveCount);
1114 #endif
1019 } 1115 }
1020 1116
1021 private: 1117 private:
1022 SkTArray<SkPath> m_clips; // stack of clips that may be reused 1118 SkTArray<SkPath> m_clips; // stack of clips that may be reused
1023 SkTDArray<Clip> m_commands; // stack of clip-related commands 1119 SkTDArray<Clip> m_commands; // stack of clip-related commands
1024 SkTDArray<SkPoint> m_positions; // accumulator for text positions 1120 SkTDArray<SkPoint> m_positions; // accumulator for text positions
1025 SkTDArray<uint16_t> m_glyphs; // accumulator for text glyphs 1121 SkTDArray<uint16_t> m_glyphs; // accumulator for text glyphs
1026 SkPath m_skPath; // accumulator for path contours 1122 SkPath m_skPath; // accumulator for path contours
1027 SkPath m_skEmptyPath; // used as placehold in the clips array 1123 SkPath m_skEmptyPath; // used as placehold in the clips array
1028 CFX_Matrix m_drawMatrix; 1124 CFX_Matrix m_drawMatrix;
1029 CFX_GraphStateData m_clipState; 1125 CFX_GraphStateData m_clipState;
1030 CFX_GraphStateData m_drawState; 1126 CFX_GraphStateData m_drawState;
1031 CFX_Matrix m_clipMatrix; 1127 CFX_Matrix m_clipMatrix;
1128 CFX_SkiaDeviceDriver* m_pDriver;
1032 CFX_Font* m_pFont; 1129 CFX_Font* m_pFont;
1033 FX_FLOAT m_fontSize; 1130 FX_FLOAT m_fontSize;
1034 uint32_t m_fillColor; 1131 uint32_t m_fillColor;
1035 uint32_t m_strokeColor; 1132 uint32_t m_strokeColor;
1036 int m_blendType; 1133 int m_blendType;
1037 int m_commandIndex; // active position in clip command stack 1134 int m_commandIndex; // active position in clip command stack
1038 bool m_drawText; 1135 int m_drawIndex; // position of the pending path or text draw
1039 bool m_drawPath; 1136 int m_clipIndex; // position reflecting depth of canvas clip stacck
1137 Accumulator m_type; // type of pending draw
1138 bool m_fillFullCover;
1040 bool m_fillPath; 1139 bool m_fillPath;
1041 bool m_groupKnockout; 1140 bool m_groupKnockout;
1042 bool m_debugDisable; // turn off cache for debugging 1141 bool m_debugDisable; // turn off cache for debugging
1142 #if SHOW_SKIA_PATH
1143 mutable int m_debugSaveCounter;
1144 #endif
1043 }; 1145 };
1044 #endif // _SKIA_SUPPORT_
1045 1146
1046 // convert a stroking path to scanlines 1147 // convert a stroking path to scanlines
1047 void CFX_SkiaDeviceDriver::PaintStroke(SkPaint* spaint, 1148 void CFX_SkiaDeviceDriver::PaintStroke(SkPaint* spaint,
1048 const CFX_GraphStateData* pGraphState, 1149 const CFX_GraphStateData* pGraphState,
1049 const SkMatrix& matrix) { 1150 const SkMatrix& matrix) {
1050 SkPaint::Cap cap; 1151 SkPaint::Cap cap;
1051 switch (pGraphState->m_LineCap) { 1152 switch (pGraphState->m_LineCap) {
1052 case CFX_GraphStateData::LineCapRound: 1153 case CFX_GraphStateData::LineCapRound:
1053 cap = SkPaint::kRound_Cap; 1154 cap = SkPaint::kRound_Cap;
1054 break; 1155 break;
(...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after
1108 spaint->setStrokeJoin(join); 1209 spaint->setStrokeJoin(join);
1109 } 1210 }
1110 1211
1111 CFX_SkiaDeviceDriver::CFX_SkiaDeviceDriver(CFX_DIBitmap* pBitmap, 1212 CFX_SkiaDeviceDriver::CFX_SkiaDeviceDriver(CFX_DIBitmap* pBitmap,
1112 bool bRgbByteOrder, 1213 bool bRgbByteOrder,
1113 CFX_DIBitmap* pOriDevice, 1214 CFX_DIBitmap* pOriDevice,
1114 bool bGroupKnockout) 1215 bool bGroupKnockout)
1115 : m_pBitmap(pBitmap), 1216 : m_pBitmap(pBitmap),
1116 m_pOriDevice(pOriDevice), 1217 m_pOriDevice(pOriDevice),
1117 m_pRecorder(nullptr), 1218 m_pRecorder(nullptr),
1118 #ifdef _SKIA_SUPPORT_ 1219 m_pCache(new SkiaState(this)),
1119 m_pCache(new SkiaState),
1120 #endif
1121 #ifdef _SKIA_SUPPORT_PATHS_ 1220 #ifdef _SKIA_SUPPORT_PATHS_
1122 m_pClipRgn(nullptr), 1221 m_pClipRgn(nullptr),
1123 m_FillFlags(0), 1222 m_FillFlags(0),
1124 m_bRgbByteOrder(bRgbByteOrder), 1223 m_bRgbByteOrder(bRgbByteOrder),
1125 #endif // _SKIA_SUPPORT_PATHS_ 1224 #endif // _SKIA_SUPPORT_PATHS_
1126 m_bGroupKnockout(bGroupKnockout) { 1225 m_bGroupKnockout(bGroupKnockout) {
1127 SkBitmap skBitmap; 1226 SkBitmap skBitmap;
1128 SkASSERT(pBitmap->GetBPP() == 8 || pBitmap->GetBPP() == 32); 1227 SkASSERT(pBitmap->GetBPP() == 8 || pBitmap->GetBPP() == 32);
1129 SkImageInfo imageInfo = SkImageInfo::Make( 1228 SkImageInfo imageInfo = SkImageInfo::Make(
1130 pBitmap->GetWidth(), pBitmap->GetHeight(), 1229 pBitmap->GetWidth(), pBitmap->GetHeight(),
1131 pBitmap->GetBPP() == 8 ? kAlpha_8_SkColorType : kN32_SkColorType, 1230 pBitmap->GetBPP() == 8 ? kAlpha_8_SkColorType : kN32_SkColorType,
1132 kOpaque_SkAlphaType); 1231 kOpaque_SkAlphaType);
1133 skBitmap.installPixels(imageInfo, pBitmap->GetBuffer(), pBitmap->GetPitch(), 1232 skBitmap.installPixels(imageInfo, pBitmap->GetBuffer(), pBitmap->GetPitch(),
1134 nullptr, // FIXME(caryclark) set color table 1233 nullptr, // FIXME(caryclark) set color table
1135 nullptr, nullptr); 1234 nullptr, nullptr);
1136 m_pCanvas = new SkCanvas(skBitmap); 1235 m_pCanvas = new SkCanvas(skBitmap);
1137 } 1236 }
1138 1237
1139 #ifdef _SKIA_SUPPORT_ 1238 #ifdef _SKIA_SUPPORT_
1140 CFX_SkiaDeviceDriver::CFX_SkiaDeviceDriver(int size_x, int size_y) 1239 CFX_SkiaDeviceDriver::CFX_SkiaDeviceDriver(int size_x, int size_y)
1141 : m_pBitmap(nullptr), 1240 : m_pBitmap(nullptr),
1142 m_pOriDevice(nullptr), 1241 m_pOriDevice(nullptr),
1143 m_pRecorder(new SkPictureRecorder), 1242 m_pRecorder(new SkPictureRecorder),
1144 m_pCache(new SkiaState), 1243 m_pCache(new SkiaState(this)),
1145 m_bGroupKnockout(false) { 1244 m_bGroupKnockout(false) {
1146 m_pRecorder->beginRecording(SkIntToScalar(size_x), SkIntToScalar(size_y)); 1245 m_pRecorder->beginRecording(SkIntToScalar(size_x), SkIntToScalar(size_y));
1147 m_pCanvas = m_pRecorder->getRecordingCanvas(); 1246 m_pCanvas = m_pRecorder->getRecordingCanvas();
1148 } 1247 }
1149 1248
1150 CFX_SkiaDeviceDriver::CFX_SkiaDeviceDriver(SkPictureRecorder* recorder) 1249 CFX_SkiaDeviceDriver::CFX_SkiaDeviceDriver(SkPictureRecorder* recorder)
1151 : m_pBitmap(nullptr), 1250 : m_pBitmap(nullptr),
1152 m_pOriDevice(nullptr), 1251 m_pOriDevice(nullptr),
1153 m_pRecorder(recorder), 1252 m_pRecorder(recorder),
1154 m_pCache(new SkiaState), 1253 m_pCache(new SkiaState(this)),
1155 m_bGroupKnockout(false) { 1254 m_bGroupKnockout(false) {
1156 m_pCanvas = m_pRecorder->getRecordingCanvas(); 1255 m_pCanvas = m_pRecorder->getRecordingCanvas();
1157 } 1256 }
1158 #endif // _SKIA_SUPPORT_ 1257 #endif // _SKIA_SUPPORT_
1159 1258
1160 CFX_SkiaDeviceDriver::~CFX_SkiaDeviceDriver() { 1259 CFX_SkiaDeviceDriver::~CFX_SkiaDeviceDriver() {
1161 Flush(); 1260 Flush();
1162 if (!m_pRecorder) 1261 if (!m_pRecorder)
1163 delete m_pCanvas; 1262 delete m_pCanvas;
1164 } 1263 }
1165 1264
1166 void CFX_SkiaDeviceDriver::Flush() { 1265 void CFX_SkiaDeviceDriver::Flush() {
1167 #ifdef _SKIA_SUPPORT_ 1266 m_pCache->Flush();
1168 m_pCache->Flush(this);
1169 m_pCache->FlushCommands(this);
1170 #endif
1171 } 1267 }
1172 1268
1173 bool CFX_SkiaDeviceDriver::DrawDeviceText(int nChars, 1269 bool CFX_SkiaDeviceDriver::DrawDeviceText(int nChars,
1174 const FXTEXT_CHARPOS* pCharPos, 1270 const FXTEXT_CHARPOS* pCharPos,
1175 CFX_Font* pFont, 1271 CFX_Font* pFont,
1176 const CFX_Matrix* pObject2Device, 1272 const CFX_Matrix* pObject2Device,
1177 FX_FLOAT font_size, 1273 FX_FLOAT font_size,
1178 uint32_t color) { 1274 uint32_t color) {
1179 #ifdef _SKIA_SUPPORT_
1180 if (m_pCache->DrawText(nChars, pCharPos, pFont, pObject2Device, font_size, 1275 if (m_pCache->DrawText(nChars, pCharPos, pFont, pObject2Device, font_size,
1181 color, this)) { 1276 color)) {
1182 return true; 1277 return true;
1183 } 1278 }
1184 #endif
1185 sk_sp<SkTypeface> typeface(SkSafeRef(pFont->GetDeviceCache())); 1279 sk_sp<SkTypeface> typeface(SkSafeRef(pFont->GetDeviceCache()));
1186 SkPaint paint; 1280 SkPaint paint;
1187 paint.setAntiAlias(true); 1281 paint.setAntiAlias(true);
1188 paint.setColor(color); 1282 paint.setColor(color);
1189 paint.setTypeface(typeface); 1283 paint.setTypeface(typeface);
1190 paint.setTextEncoding(SkPaint::kGlyphID_TextEncoding); 1284 paint.setTextEncoding(SkPaint::kGlyphID_TextEncoding);
1191 paint.setHinting(SkPaint::kNo_Hinting); 1285 paint.setHinting(SkPaint::kNo_Hinting);
1192 paint.setTextSize(SkTAbs(font_size)); 1286 paint.setTextSize(SkTAbs(font_size));
1193 paint.setSubpixelText(true); 1287 paint.setSubpixelText(true);
1194 m_pCanvas->save(); 1288 m_pCanvas->save();
(...skipping 67 matching lines...) Expand 10 before | Expand all | Expand 10 after
1262 flags |= FXRC_CMYK_OUTPUT; 1356 flags |= FXRC_CMYK_OUTPUT;
1263 } 1357 }
1264 return flags; 1358 return flags;
1265 } 1359 }
1266 #endif // _SKIA_SUPPORT_PATHS_ 1360 #endif // _SKIA_SUPPORT_PATHS_
1267 } 1361 }
1268 return 0; 1362 return 0;
1269 } 1363 }
1270 1364
1271 void CFX_SkiaDeviceDriver::SaveState() { 1365 void CFX_SkiaDeviceDriver::SaveState() {
1272 #ifdef _SKIA_SUPPORT_ 1366 if (!m_pCache->ClipSave())
1273 if (!m_pCache->ClipSave(this))
1274 #endif
1275 m_pCanvas->save(); 1367 m_pCanvas->save();
1276 1368
1277 #ifdef _SKIA_SUPPORT_PATHS_ 1369 #ifdef _SKIA_SUPPORT_PATHS_
1278 std::unique_ptr<CFX_ClipRgn> pClip; 1370 std::unique_ptr<CFX_ClipRgn> pClip;
1279 if (m_pClipRgn) 1371 if (m_pClipRgn)
1280 pClip = pdfium::MakeUnique<CFX_ClipRgn>(*m_pClipRgn); 1372 pClip = pdfium::MakeUnique<CFX_ClipRgn>(*m_pClipRgn);
1281 m_StateStack.push_back(std::move(pClip)); 1373 m_StateStack.push_back(std::move(pClip));
1282 #endif // _SKIA_SUPPORT_PATHS_ 1374 #endif // _SKIA_SUPPORT_PATHS_
1283 } 1375 }
1284 1376
1285 void CFX_SkiaDeviceDriver::RestoreState(bool bKeepSaved) { 1377 void CFX_SkiaDeviceDriver::RestoreState(bool bKeepSaved) {
1286 #ifdef _SKIA_SUPPORT_ 1378 if (!m_pCache->ClipRestore())
1287 if (!m_pCache->ClipRestore(this))
1288 #endif
1289 m_pCanvas->restore(); 1379 m_pCanvas->restore();
1290 if (bKeepSaved 1380 if (bKeepSaved && !m_pCache->ClipSave())
1291 #ifdef _SKIA_SUPPORT_
1292 && !m_pCache->ClipSave(this)
1293 #endif
1294 ) {
1295 m_pCanvas->save(); 1381 m_pCanvas->save();
1296 }
1297 #ifdef _SKIA_SUPPORT_PATHS_ 1382 #ifdef _SKIA_SUPPORT_PATHS_
1298 m_pClipRgn.reset(); 1383 m_pClipRgn.reset();
1299 1384
1300 if (m_StateStack.empty()) 1385 if (m_StateStack.empty())
1301 return; 1386 return;
1302 1387
1303 if (bKeepSaved) { 1388 if (bKeepSaved) {
1304 if (m_StateStack.back()) 1389 if (m_StateStack.back())
1305 m_pClipRgn = pdfium::MakeUnique<CFX_ClipRgn>(*m_StateStack.back()); 1390 m_pClipRgn = pdfium::MakeUnique<CFX_ClipRgn>(*m_StateStack.back());
1306 } else { 1391 } else {
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after
1339 } 1424 }
1340 #endif // _SKIA_SUPPORT_PATHS_ 1425 #endif // _SKIA_SUPPORT_PATHS_
1341 1426
1342 bool CFX_SkiaDeviceDriver::SetClip_PathFill( 1427 bool CFX_SkiaDeviceDriver::SetClip_PathFill(
1343 const CFX_PathData* pPathData, // path info 1428 const CFX_PathData* pPathData, // path info
1344 const CFX_Matrix* pObject2Device, // flips object's y-axis 1429 const CFX_Matrix* pObject2Device, // flips object's y-axis
1345 int fill_mode // fill mode, WINDING or ALTERNATE 1430 int fill_mode // fill mode, WINDING or ALTERNATE
1346 ) { 1431 ) {
1347 CFX_Matrix identity; 1432 CFX_Matrix identity;
1348 const CFX_Matrix* deviceMatrix = pObject2Device ? pObject2Device : &identity; 1433 const CFX_Matrix* deviceMatrix = pObject2Device ? pObject2Device : &identity;
1349 #ifdef _SKIA_SUPPORT_ 1434 bool cached = m_pCache->SetClipFill(pPathData, deviceMatrix, fill_mode);
1350 if (m_pCache->SetClipFill(pPathData, deviceMatrix, fill_mode, this))
1351 return true;
1352 #endif // _SKIA_SUPPORT_
1353 1435
1354 #ifdef _SKIA_SUPPORT_PATHS_ 1436 #ifdef _SKIA_SUPPORT_PATHS_
1355 m_FillFlags = fill_mode; 1437 m_FillFlags = fill_mode;
1356 if (!m_pClipRgn) { 1438 if (!m_pClipRgn) {
1357 m_pClipRgn = pdfium::MakeUnique<CFX_ClipRgn>( 1439 m_pClipRgn = pdfium::MakeUnique<CFX_ClipRgn>(
1358 GetDeviceCaps(FXDC_PIXEL_WIDTH), GetDeviceCaps(FXDC_PIXEL_HEIGHT)); 1440 GetDeviceCaps(FXDC_PIXEL_WIDTH), GetDeviceCaps(FXDC_PIXEL_HEIGHT));
1359 } 1441 }
1360 #endif // _SKIA_SUPPORT_PATHS_ 1442 #endif // _SKIA_SUPPORT_PATHS_
1361 if (pPathData->GetPointCount() == 5 || pPathData->GetPointCount() == 4) { 1443 if (pPathData->GetPointCount() == 5 || pPathData->GetPointCount() == 4) {
1362 CFX_FloatRect rectf; 1444 CFX_FloatRect rectf;
1363 if (pPathData->IsRect(deviceMatrix, &rectf)) { 1445 if (pPathData->IsRect(deviceMatrix, &rectf)) {
1364 rectf.Intersect( 1446 rectf.Intersect(
1365 CFX_FloatRect(0, 0, (FX_FLOAT)GetDeviceCaps(FXDC_PIXEL_WIDTH), 1447 CFX_FloatRect(0, 0, (FX_FLOAT)GetDeviceCaps(FXDC_PIXEL_WIDTH),
1366 (FX_FLOAT)GetDeviceCaps(FXDC_PIXEL_HEIGHT))); 1448 (FX_FLOAT)GetDeviceCaps(FXDC_PIXEL_HEIGHT)));
1367 // note that PDF's y-axis goes up; Skia's y-axis goes down 1449 // note that PDF's y-axis goes up; Skia's y-axis goes down
1368 SkRect skClipRect = 1450 if (!cached) {
1369 SkRect::MakeLTRB(rectf.left, rectf.bottom, rectf.right, rectf.top); 1451 SkRect skClipRect =
1370 DebugDrawSkiaClipRect(m_pCanvas, skClipRect); 1452 SkRect::MakeLTRB(rectf.left, rectf.bottom, rectf.right, rectf.top);
1371 m_pCanvas->clipRect(skClipRect, SkCanvas::kIntersect_Op, true); 1453 DebugDrawSkiaClipRect(m_pCanvas, skClipRect);
1454 m_pCanvas->clipRect(skClipRect, SkCanvas::kIntersect_Op, true);
1455 }
1372 1456
1373 #ifdef _SKIA_SUPPORT_PATHS_ 1457 #ifdef _SKIA_SUPPORT_PATHS_
1374 FX_RECT rect = rectf.GetOuterRect(); 1458 FX_RECT rect = rectf.GetOuterRect();
1375 m_pClipRgn->IntersectRect(rect); 1459 m_pClipRgn->IntersectRect(rect);
1376 #endif // _SKIA_SUPPORT_PATHS_ 1460 #endif // _SKIA_SUPPORT_PATHS_
1461 DebugShowCanvasClip(m_pCanvas);
1377 return true; 1462 return true;
1378 } 1463 }
1379 } 1464 }
1380 SkPath skClipPath = BuildPath(pPathData); 1465 SkPath skClipPath = BuildPath(pPathData);
1381 skClipPath.setFillType((fill_mode & 3) == FXFILL_ALTERNATE 1466 skClipPath.setFillType((fill_mode & 3) == FXFILL_ALTERNATE
1382 ? SkPath::kEvenOdd_FillType 1467 ? SkPath::kEvenOdd_FillType
1383 : SkPath::kWinding_FillType); 1468 : SkPath::kWinding_FillType);
1384 SkMatrix skMatrix = ToSkMatrix(*deviceMatrix); 1469 SkMatrix skMatrix = ToSkMatrix(*deviceMatrix);
1385 skClipPath.transform(skMatrix); 1470 skClipPath.transform(skMatrix);
1386 DebugShowSkiaPath(skClipPath); 1471 DebugShowSkiaPath(skClipPath);
1387 DebugDrawSkiaClipPath(m_pCanvas, skClipPath); 1472 if (!cached) {
1388 m_pCanvas->clipPath(skClipPath, SkCanvas::kIntersect_Op, true); 1473 DebugDrawSkiaClipPath(m_pCanvas, skClipPath);
1474 m_pCanvas->clipPath(skClipPath, SkCanvas::kIntersect_Op, true);
1475 }
1389 #ifdef _SKIA_SUPPORT_PATHS_ 1476 #ifdef _SKIA_SUPPORT_PATHS_
1390 FX_RECT clipBox(0, 0, GetDeviceCaps(FXDC_PIXEL_WIDTH), 1477 FX_RECT clipBox(0, 0, GetDeviceCaps(FXDC_PIXEL_WIDTH),
1391 GetDeviceCaps(FXDC_PIXEL_HEIGHT)); 1478 GetDeviceCaps(FXDC_PIXEL_HEIGHT));
1392 SetClipMask(clipBox, skClipPath); 1479 SetClipMask(clipBox, skClipPath);
1393 #endif // _SKIA_SUPPORT_PATHS_ 1480 #endif // _SKIA_SUPPORT_PATHS_
1481 DebugShowCanvasClip(m_pCanvas);
1394 return true; 1482 return true;
1395 } 1483 }
1396 1484
1397 bool CFX_SkiaDeviceDriver::SetClip_PathStroke( 1485 bool CFX_SkiaDeviceDriver::SetClip_PathStroke(
1398 const CFX_PathData* pPathData, // path info 1486 const CFX_PathData* pPathData, // path info
1399 const CFX_Matrix* pObject2Device, // optional transformation 1487 const CFX_Matrix* pObject2Device, // optional transformation
1400 const CFX_GraphStateData* pGraphState // graphic state, for pen attributes 1488 const CFX_GraphStateData* pGraphState // graphic state, for pen attributes
1401 ) { 1489 ) {
1402 #ifdef _SKIA_SUPPORT_ 1490 bool cached = m_pCache->SetClipStroke(pPathData, pObject2Device, pGraphState);
1403 if (m_pCache->SetClipStroke(pPathData, pObject2Device, pGraphState, this))
1404 return true;
1405 #endif // _SKIA_SUPPORT_
1406 1491
1407 #ifdef _SKIA_SUPPORT_PATHS_ 1492 #ifdef _SKIA_SUPPORT_PATHS_
1408 if (!m_pClipRgn) { 1493 if (!m_pClipRgn) {
1409 m_pClipRgn = pdfium::MakeUnique<CFX_ClipRgn>( 1494 m_pClipRgn = pdfium::MakeUnique<CFX_ClipRgn>(
1410 GetDeviceCaps(FXDC_PIXEL_WIDTH), GetDeviceCaps(FXDC_PIXEL_HEIGHT)); 1495 GetDeviceCaps(FXDC_PIXEL_WIDTH), GetDeviceCaps(FXDC_PIXEL_HEIGHT));
1411 } 1496 }
1412 #endif // _SKIA_SUPPORT_PATHS_ 1497 #endif // _SKIA_SUPPORT_PATHS_
1413 // build path data 1498 // build path data
1414 SkPath skPath = BuildPath(pPathData); 1499 SkPath skPath = BuildPath(pPathData);
1415 SkMatrix skMatrix = ToSkMatrix(*pObject2Device); 1500 SkMatrix skMatrix = ToSkMatrix(*pObject2Device);
1416 SkPaint skPaint; 1501 SkPaint skPaint;
1417 PaintStroke(&skPaint, pGraphState, skMatrix); 1502 PaintStroke(&skPaint, pGraphState, skMatrix);
1418 SkPath dst_path; 1503 SkPath dst_path;
1419 skPaint.getFillPath(skPath, &dst_path); 1504 skPaint.getFillPath(skPath, &dst_path);
1420 dst_path.transform(skMatrix); 1505 dst_path.transform(skMatrix);
1421 DebugDrawSkiaClipPath(m_pCanvas, dst_path); 1506 if (!cached) {
1422 #ifdef _SKIA_SUPPORT_ 1507 DebugDrawSkiaClipPath(m_pCanvas, dst_path);
1423 m_pCanvas->clipPath(dst_path, SkCanvas::kIntersect_Op, true); 1508 m_pCanvas->clipPath(dst_path, SkCanvas::kIntersect_Op, true);
1424 #endif // _SKIA_SUPPORT_ 1509 }
1425
1426 #ifdef _SKIA_SUPPORT_PATHS_ 1510 #ifdef _SKIA_SUPPORT_PATHS_
1427 FX_RECT clipBox(0, 0, GetDeviceCaps(FXDC_PIXEL_WIDTH), 1511 FX_RECT clipBox(0, 0, GetDeviceCaps(FXDC_PIXEL_WIDTH),
1428 GetDeviceCaps(FXDC_PIXEL_HEIGHT)); 1512 GetDeviceCaps(FXDC_PIXEL_HEIGHT));
1429 SetClipMask(clipBox, dst_path); 1513 SetClipMask(clipBox, dst_path);
1430 #endif // _SKIA_SUPPORT_PATHS_ 1514 #endif // _SKIA_SUPPORT_PATHS_
1515 DebugShowCanvasClip(m_pCanvas);
1431 return true; 1516 return true;
1432 } 1517 }
1433 1518
1434 bool CFX_SkiaDeviceDriver::DrawPath( 1519 bool CFX_SkiaDeviceDriver::DrawPath(
1435 const CFX_PathData* pPathData, // path info 1520 const CFX_PathData* pPathData, // path info
1436 const CFX_Matrix* pObject2Device, // optional transformation 1521 const CFX_Matrix* pObject2Device, // optional transformation
1437 const CFX_GraphStateData* pGraphState, // graphic state, for pen attributes 1522 const CFX_GraphStateData* pGraphState, // graphic state, for pen attributes
1438 uint32_t fill_color, // fill color 1523 uint32_t fill_color, // fill color
1439 uint32_t stroke_color, // stroke color 1524 uint32_t stroke_color, // stroke color
1440 int fill_mode, // fill mode, WINDING or ALTERNATE. 0 for not filled 1525 int fill_mode, // fill mode, WINDING or ALTERNATE. 0 for not filled
1441 int blend_type) { 1526 int blend_type) {
1442 if (fill_mode & FX_ZEROAREA_FILL) 1527 if (fill_mode & FX_ZEROAREA_FILL)
1443 return true; 1528 return true;
1444 #ifdef _SKIA_SUPPORT_
1445 if (m_pCache->DrawPath(pPathData, pObject2Device, pGraphState, fill_color, 1529 if (m_pCache->DrawPath(pPathData, pObject2Device, pGraphState, fill_color,
1446 stroke_color, fill_mode, blend_type, this)) { 1530 stroke_color, fill_mode, blend_type)) {
1447 return true; 1531 return true;
1448 } 1532 }
1449 #endif
1450 SkIRect rect;
1451 rect.set(0, 0, GetDeviceCaps(FXDC_PIXEL_WIDTH),
1452 GetDeviceCaps(FXDC_PIXEL_HEIGHT));
1453 SkMatrix skMatrix; 1533 SkMatrix skMatrix;
1454 if (pObject2Device) 1534 if (pObject2Device)
1455 skMatrix = ToSkMatrix(*pObject2Device); 1535 skMatrix = ToSkMatrix(*pObject2Device);
1456 else 1536 else
1457 skMatrix.setIdentity(); 1537 skMatrix.setIdentity();
1458 SkPaint skPaint; 1538 SkPaint skPaint;
1459 skPaint.setAntiAlias(true); 1539 skPaint.setAntiAlias(true);
1460 if (fill_mode & FXFILL_FULLCOVER) 1540 if (fill_mode & FXFILL_FULLCOVER)
1461 skPaint.setBlendMode(SkBlendMode::kPlus); 1541 skPaint.setBlendMode(SkBlendMode::kPlus);
1462 int stroke_alpha = FXARGB_A(stroke_color); 1542 int stroke_alpha = FXARGB_A(stroke_color);
(...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after
1506 FX_FLOAT x2, 1586 FX_FLOAT x2,
1507 FX_FLOAT y2, 1587 FX_FLOAT y2,
1508 uint32_t color, 1588 uint32_t color,
1509 int blend_type) { 1589 int blend_type) {
1510 return false; 1590 return false;
1511 } 1591 }
1512 1592
1513 bool CFX_SkiaDeviceDriver::FillRectWithBlend(const FX_RECT* pRect, 1593 bool CFX_SkiaDeviceDriver::FillRectWithBlend(const FX_RECT* pRect,
1514 uint32_t fill_color, 1594 uint32_t fill_color,
1515 int blend_type) { 1595 int blend_type) {
1596 m_pCache->FlushForDraw();
1516 SkPaint spaint; 1597 SkPaint spaint;
1517 spaint.setAntiAlias(true); 1598 spaint.setAntiAlias(true);
1518 spaint.setColor(fill_color); 1599 spaint.setColor(fill_color);
1519 spaint.setBlendMode(GetSkiaBlendMode(blend_type)); 1600 spaint.setBlendMode(GetSkiaBlendMode(blend_type));
1520 SkRect rect = 1601 SkRect rect =
1521 SkRect::MakeLTRB(pRect->left, SkTMin(pRect->top, pRect->bottom), 1602 SkRect::MakeLTRB(pRect->left, SkTMin(pRect->top, pRect->bottom),
1522 pRect->right, SkTMax(pRect->bottom, pRect->top)); 1603 pRect->right, SkTMax(pRect->bottom, pRect->top));
1523 DebugShowSkiaDrawRect(m_pCanvas, spaint, rect); 1604 DebugShowSkiaDrawRect(m_pCanvas, spaint, rect);
1524 m_pCanvas->drawRect(rect, spaint); 1605 m_pCanvas->drawRect(rect, spaint);
1525 return true; 1606 return true;
1526 } 1607 }
1527 1608
1528 bool CFX_SkiaDeviceDriver::DrawShading(const CPDF_ShadingPattern* pPattern, 1609 bool CFX_SkiaDeviceDriver::DrawShading(const CPDF_ShadingPattern* pPattern,
1529 const CFX_Matrix* pMatrix, 1610 const CFX_Matrix* pMatrix,
1530 const FX_RECT& clip_rect, 1611 const FX_RECT& clip_rect,
1531 int alpha, 1612 int alpha,
1532 bool bAlphaMode) { 1613 bool bAlphaMode) {
1614 m_pCache->FlushForDraw();
1533 ShadingType shadingType = pPattern->GetShadingType(); 1615 ShadingType shadingType = pPattern->GetShadingType();
1534 if (kAxialShading != shadingType && kRadialShading != shadingType && 1616 if (kAxialShading != shadingType && kRadialShading != shadingType &&
1535 kCoonsPatchMeshShading != shadingType) { 1617 kCoonsPatchMeshShading != shadingType) {
1536 // TODO(caryclark) more types 1618 // TODO(caryclark) more types
1537 return false; 1619 return false;
1538 } 1620 }
1539 int csFamily = pPattern->GetCS()->GetFamily(); 1621 int csFamily = pPattern->GetCS()->GetFamily();
1540 if (PDFCS_DEVICERGB != csFamily && PDFCS_DEVICEGRAY != csFamily) 1622 if (PDFCS_DEVICERGB != csFamily && PDFCS_DEVICEGRAY != csFamily)
1541 return false; 1623 return false;
1542 const std::vector<std::unique_ptr<CPDF_Function>>& pFuncs = 1624 const std::vector<std::unique_ptr<CPDF_Function>>& pFuncs =
(...skipping 174 matching lines...) Expand 10 before | Expand all | Expand 10 after
1717 return true; 1799 return true;
1718 } 1800 }
1719 1801
1720 bool CFX_SkiaDeviceDriver::GetDIBits(CFX_DIBitmap* pBitmap, int left, int top) { 1802 bool CFX_SkiaDeviceDriver::GetDIBits(CFX_DIBitmap* pBitmap, int left, int top) {
1721 if (!m_pBitmap) 1803 if (!m_pBitmap)
1722 return true; 1804 return true;
1723 uint8_t* srcBuffer = m_pBitmap->GetBuffer(); 1805 uint8_t* srcBuffer = m_pBitmap->GetBuffer();
1724 if (!srcBuffer) 1806 if (!srcBuffer)
1725 return true; 1807 return true;
1726 #ifdef _SKIA_SUPPORT_ 1808 #ifdef _SKIA_SUPPORT_
1809 m_pCache->FlushForDraw();
1727 int srcWidth = m_pBitmap->GetWidth(); 1810 int srcWidth = m_pBitmap->GetWidth();
1728 int srcHeight = m_pBitmap->GetHeight(); 1811 int srcHeight = m_pBitmap->GetHeight();
1729 int srcRowBytes = srcWidth * sizeof(uint32_t); 1812 int srcRowBytes = srcWidth * sizeof(uint32_t);
1730 SkImageInfo srcImageInfo = SkImageInfo::Make( 1813 SkImageInfo srcImageInfo = SkImageInfo::Make(
1731 srcWidth, srcHeight, SkColorType::kN32_SkColorType, kPremul_SkAlphaType); 1814 srcWidth, srcHeight, SkColorType::kN32_SkColorType, kPremul_SkAlphaType);
1732 SkBitmap skSrcBitmap; 1815 SkBitmap skSrcBitmap;
1733 skSrcBitmap.installPixels(srcImageInfo, srcBuffer, srcRowBytes, nullptr, 1816 skSrcBitmap.installPixels(srcImageInfo, srcBuffer, srcRowBytes, nullptr,
1734 nullptr, nullptr); 1817 nullptr, nullptr);
1735 SkASSERT(pBitmap); 1818 SkASSERT(pBitmap);
1736 uint8_t* dstBuffer = pBitmap->GetBuffer(); 1819 uint8_t* dstBuffer = pBitmap->GetBuffer();
1737 SkASSERT(dstBuffer); 1820 SkASSERT(dstBuffer);
1738 int dstWidth = pBitmap->GetWidth(); 1821 int dstWidth = pBitmap->GetWidth();
1739 int dstHeight = pBitmap->GetHeight(); 1822 int dstHeight = pBitmap->GetHeight();
1740 int dstRowBytes = dstWidth * sizeof(uint32_t); 1823 int dstRowBytes = dstWidth * sizeof(uint32_t);
1741 SkImageInfo dstImageInfo = SkImageInfo::Make( 1824 SkImageInfo dstImageInfo = SkImageInfo::Make(
1742 dstWidth, dstHeight, SkColorType::kN32_SkColorType, kPremul_SkAlphaType); 1825 dstWidth, dstHeight, SkColorType::kN32_SkColorType, kPremul_SkAlphaType);
1743 SkBitmap skDstBitmap; 1826 SkBitmap skDstBitmap;
1744 skDstBitmap.installPixels(dstImageInfo, dstBuffer, dstRowBytes, nullptr, 1827 skDstBitmap.installPixels(dstImageInfo, dstBuffer, dstRowBytes, nullptr,
1745 nullptr, nullptr); 1828 nullptr, nullptr);
1746 SkCanvas canvas(skDstBitmap); 1829 SkCanvas canvas(skDstBitmap);
1747 canvas.drawBitmap(skSrcBitmap, left, top, nullptr); 1830 canvas.drawBitmap(skSrcBitmap, left, top, nullptr);
1748 return true; 1831 return true;
1749 #endif // _SKIA_SUPPORT_ 1832 #endif // _SKIA_SUPPORT_
1750 1833
1751 #ifdef _SKIA_SUPPORT_PATHS_ 1834 #ifdef _SKIA_SUPPORT_PATHS_
1835 Flush();
1752 m_pBitmap->UnPreMultiply(); 1836 m_pBitmap->UnPreMultiply();
1753 FX_RECT rect(left, top, left + pBitmap->GetWidth(), 1837 FX_RECT rect(left, top, left + pBitmap->GetWidth(),
1754 top + pBitmap->GetHeight()); 1838 top + pBitmap->GetHeight());
1755 CFX_DIBitmap* pBack = nullptr; 1839 std::unique_ptr<CFX_DIBitmap> pBack = nullptr;
dsinclair 2016/12/06 18:48:26 I dont' think you need the = nullptr here.
caryclark 2016/12/06 19:00:37 Done.
1756 if (m_pOriDevice) { 1840 if (m_pOriDevice) {
1757 pBack = m_pOriDevice->Clone(&rect); 1841 pBack = m_pOriDevice->Clone(&rect);
1758 if (!pBack) 1842 if (!pBack)
1759 return true; 1843 return true;
1760 1844
1761 pBack->CompositeBitmap(0, 0, pBack->GetWidth(), pBack->GetHeight(), 1845 pBack->CompositeBitmap(0, 0, pBack->GetWidth(), pBack->GetHeight(),
1762 m_pBitmap, 0, 0); 1846 m_pBitmap, 0, 0);
1763 } else { 1847 } else {
1764 pBack = m_pBitmap->Clone(&rect); 1848 pBack = m_pBitmap->Clone(&rect);
1765 if (!pBack) 1849 if (!pBack)
1766 return true; 1850 return true;
1767 } 1851 }
1768 1852
1769 bool bRet = true; 1853 bool bRet = true;
1770 left = std::min(left, 0); 1854 left = std::min(left, 0);
1771 top = std::min(top, 0); 1855 top = std::min(top, 0);
1772 if (m_bRgbByteOrder) { 1856 if (m_bRgbByteOrder) {
1773 RgbByteOrderTransferBitmap(pBitmap, 0, 0, rect.Width(), rect.Height(), 1857 RgbByteOrderTransferBitmap(pBitmap, 0, 0, rect.Width(), rect.Height(),
1774 pBack, left, top); 1858 pBack.get(), left, top);
1775 } else { 1859 } else {
1776 bRet = pBitmap->TransferBitmap(0, 0, rect.Width(), rect.Height(), pBack, 1860 bRet = pBitmap->TransferBitmap(0, 0, rect.Width(), rect.Height(),
1777 left, top); 1861 pBack.get(), left, top);
1778 } 1862 }
1779 delete pBack;
1780 return bRet; 1863 return bRet;
1781 #endif // _SKIA_SUPPORT_PATHS_ 1864 #endif // _SKIA_SUPPORT_PATHS_
1782 } 1865 }
1783 1866
1784 CFX_DIBitmap* CFX_SkiaDeviceDriver::GetBackDrop() { 1867 CFX_DIBitmap* CFX_SkiaDeviceDriver::GetBackDrop() {
1785 return m_pOriDevice; 1868 return m_pOriDevice;
1786 } 1869 }
1787 1870
1788 bool CFX_SkiaDeviceDriver::SetDIBits(const CFX_DIBSource* pBitmap, 1871 bool CFX_SkiaDeviceDriver::SetDIBits(const CFX_DIBSource* pBitmap,
1789 uint32_t argb, 1872 uint32_t argb,
1790 const FX_RECT* pSrcRect, 1873 const FX_RECT* pSrcRect,
1791 int left, 1874 int left,
1792 int top, 1875 int top,
1793 int blend_type) { 1876 int blend_type) {
1794 if (!m_pBitmap || !m_pBitmap->GetBuffer()) 1877 if (!m_pBitmap || !m_pBitmap->GetBuffer())
1795 return true; 1878 return true;
1796 1879
1797 #ifdef _SKIA_SUPPORT_ 1880 #ifdef _SKIA_SUPPORT_
1798 CFX_Matrix m(pBitmap->GetWidth(), 0, 0, -pBitmap->GetHeight(), left, 1881 CFX_Matrix m(pBitmap->GetWidth(), 0, 0, -pBitmap->GetHeight(), left,
1799 top + pBitmap->GetHeight()); 1882 top + pBitmap->GetHeight());
1800 void* dummy; 1883 void* dummy;
1801 return StartDIBits(pBitmap, 0xFF, argb, &m, 0, dummy, blend_type); 1884 return StartDIBits(pBitmap, 0xFF, argb, &m, 0, dummy, blend_type);
1802 #endif // _SKIA_SUPPORT_ 1885 #endif // _SKIA_SUPPORT_
1803 1886
1804 #ifdef _SKIA_SUPPORT_PATHS_ 1887 #ifdef _SKIA_SUPPORT_PATHS_
1888 Flush();
1805 if (pBitmap->IsAlphaMask()) { 1889 if (pBitmap->IsAlphaMask()) {
1806 return m_pBitmap->CompositeMask( 1890 return m_pBitmap->CompositeMask(
1807 left, top, pSrcRect->Width(), pSrcRect->Height(), pBitmap, argb, 1891 left, top, pSrcRect->Width(), pSrcRect->Height(), pBitmap, argb,
1808 pSrcRect->left, pSrcRect->top, blend_type, m_pClipRgn.get(), 1892 pSrcRect->left, pSrcRect->top, blend_type, m_pClipRgn.get(),
1809 m_bRgbByteOrder, 0, nullptr); 1893 m_bRgbByteOrder, 0, nullptr);
1810 } 1894 }
1811 return m_pBitmap->CompositeBitmap( 1895 return m_pBitmap->CompositeBitmap(
1812 left, top, pSrcRect->Width(), pSrcRect->Height(), pBitmap, pSrcRect->left, 1896 left, top, pSrcRect->Width(), pSrcRect->Height(), pBitmap, pSrcRect->left,
1813 pSrcRect->top, blend_type, m_pClipRgn.get(), m_bRgbByteOrder, nullptr); 1897 pSrcRect->top, blend_type, m_pClipRgn.get(), m_bRgbByteOrder, nullptr);
1814 #endif // _SKIA_SUPPORT_PATHS_ 1898 #endif // _SKIA_SUPPORT_PATHS_
1815 } 1899 }
1816 1900
1817 bool CFX_SkiaDeviceDriver::StretchDIBits(const CFX_DIBSource* pSource, 1901 bool CFX_SkiaDeviceDriver::StretchDIBits(const CFX_DIBSource* pSource,
1818 uint32_t argb, 1902 uint32_t argb,
1819 int dest_left, 1903 int dest_left,
1820 int dest_top, 1904 int dest_top,
1821 int dest_width, 1905 int dest_width,
1822 int dest_height, 1906 int dest_height,
1823 const FX_RECT* pClipRect, 1907 const FX_RECT* pClipRect,
1824 uint32_t flags, 1908 uint32_t flags,
1825 int blend_type) { 1909 int blend_type) {
1826 #ifdef _SKIA_SUPPORT_ 1910 #ifdef _SKIA_SUPPORT_
1911 m_pCache->FlushForDraw();
1827 if (!m_pBitmap->GetBuffer()) 1912 if (!m_pBitmap->GetBuffer())
1828 return true; 1913 return true;
1829 CFX_Matrix m(dest_width, 0, 0, -dest_height, dest_left, 1914 CFX_Matrix m(dest_width, 0, 0, -dest_height, dest_left,
1830 dest_top + dest_height); 1915 dest_top + dest_height);
1831 1916
1832 m_pCanvas->save(); 1917 m_pCanvas->save();
1833 SkRect skClipRect = SkRect::MakeLTRB(pClipRect->left, pClipRect->bottom, 1918 SkRect skClipRect = SkRect::MakeLTRB(pClipRect->left, pClipRect->bottom,
1834 pClipRect->right, pClipRect->top); 1919 pClipRect->right, pClipRect->top);
1835 m_pCanvas->clipRect(skClipRect, SkCanvas::kIntersect_Op, true); 1920 m_pCanvas->clipRect(skClipRect, SkCanvas::kIntersect_Op, true);
1836 void* dummy; 1921 void* dummy;
1837 bool result = StartDIBits(pSource, 0xFF, argb, &m, 0, dummy, blend_type); 1922 bool result = StartDIBits(pSource, 0xFF, argb, &m, 0, dummy, blend_type);
1838 m_pCanvas->restore(); 1923 m_pCanvas->restore();
1839 1924
1840 return result; 1925 return result;
1841 #endif // _SKIA_SUPPORT_ 1926 #endif // _SKIA_SUPPORT_
1842 1927
1843 #ifdef _SKIA_SUPPORT_PATHS_ 1928 #ifdef _SKIA_SUPPORT_PATHS_
1844 if (dest_width == pSource->GetWidth() && 1929 if (dest_width == pSource->GetWidth() &&
1845 dest_height == pSource->GetHeight()) { 1930 dest_height == pSource->GetHeight()) {
1846 FX_RECT rect(0, 0, dest_width, dest_height); 1931 FX_RECT rect(0, 0, dest_width, dest_height);
1847 return SetDIBits(pSource, argb, &rect, dest_left, dest_top, blend_type); 1932 return SetDIBits(pSource, argb, &rect, dest_left, dest_top, blend_type);
1848 } 1933 }
1934 Flush();
1849 FX_RECT dest_rect(dest_left, dest_top, dest_left + dest_width, 1935 FX_RECT dest_rect(dest_left, dest_top, dest_left + dest_width,
1850 dest_top + dest_height); 1936 dest_top + dest_height);
1851 dest_rect.Normalize(); 1937 dest_rect.Normalize();
1852 FX_RECT dest_clip = dest_rect; 1938 FX_RECT dest_clip = dest_rect;
1853 dest_clip.Intersect(*pClipRect); 1939 dest_clip.Intersect(*pClipRect);
1854 CFX_BitmapComposer composer; 1940 CFX_BitmapComposer composer;
1855 composer.Compose(m_pBitmap, m_pClipRgn.get(), 255, argb, dest_clip, false, 1941 composer.Compose(m_pBitmap, m_pClipRgn.get(), 255, argb, dest_clip, false,
1856 false, false, m_bRgbByteOrder, 0, nullptr, blend_type); 1942 false, false, m_bRgbByteOrder, 0, nullptr, blend_type);
1857 dest_clip.Offset(-dest_rect.left, -dest_rect.top); 1943 dest_clip.Offset(-dest_rect.left, -dest_rect.top);
1858 CFX_ImageStretcher stretcher(&composer, pSource, dest_width, dest_height, 1944 CFX_ImageStretcher stretcher(&composer, pSource, dest_width, dest_height,
1859 dest_clip, flags); 1945 dest_clip, flags);
1860 if (stretcher.Start()) 1946 if (stretcher.Start())
1861 stretcher.Continue(nullptr); 1947 stretcher.Continue(nullptr);
1862 return true; 1948 return true;
1863 #endif // _SKIA_SUPPORT_PATHS_ 1949 #endif // _SKIA_SUPPORT_PATHS_
1864 } 1950 }
1865 1951
1866 bool CFX_SkiaDeviceDriver::StartDIBits(const CFX_DIBSource* pSource, 1952 bool CFX_SkiaDeviceDriver::StartDIBits(const CFX_DIBSource* pSource,
1867 int bitmap_alpha, 1953 int bitmap_alpha,
1868 uint32_t argb, 1954 uint32_t argb,
1869 const CFX_Matrix* pMatrix, 1955 const CFX_Matrix* pMatrix,
1870 uint32_t render_flags, 1956 uint32_t render_flags,
1871 void*& handle, 1957 void*& handle,
1872 int blend_type) { 1958 int blend_type) {
1873 #ifdef _SKIA_SUPPORT_ 1959 #ifdef _SKIA_SUPPORT_
1960 m_pCache->FlushForDraw();
1874 DebugValidate(m_pBitmap, m_pOriDevice); 1961 DebugValidate(m_pBitmap, m_pOriDevice);
1875 SkColorTable* ct = nullptr; 1962 SkColorTable* ct = nullptr;
1876 std::unique_ptr<uint8_t, FxFreeDeleter> dst8Storage; 1963 std::unique_ptr<uint8_t, FxFreeDeleter> dst8Storage;
1877 std::unique_ptr<uint32_t, FxFreeDeleter> dst32Storage; 1964 std::unique_ptr<uint32_t, FxFreeDeleter> dst32Storage;
1878 SkBitmap skBitmap; 1965 SkBitmap skBitmap;
1879 int width, height; 1966 int width, height;
1880 if (!Upsample(pSource, dst8Storage, dst32Storage, &ct, &skBitmap, &width, 1967 if (!Upsample(pSource, dst8Storage, dst32Storage, &ct, &skBitmap, &width,
1881 &height, false)) { 1968 &height, false)) {
1882 return false; 1969 return false;
1883 } 1970 }
(...skipping 21 matching lines...) Expand all
1905 } else { 1992 } else {
1906 m_pCanvas->drawBitmap(skBitmap, 0, 0, &paint); 1993 m_pCanvas->drawBitmap(skBitmap, 0, 0, &paint);
1907 } 1994 }
1908 m_pCanvas->restore(); 1995 m_pCanvas->restore();
1909 if (ct) 1996 if (ct)
1910 ct->unref(); 1997 ct->unref();
1911 DebugValidate(m_pBitmap, m_pOriDevice); 1998 DebugValidate(m_pBitmap, m_pOriDevice);
1912 #endif // _SKIA_SUPPORT_ 1999 #endif // _SKIA_SUPPORT_
1913 2000
1914 #ifdef _SKIA_SUPPORT_PATHS_ 2001 #ifdef _SKIA_SUPPORT_PATHS_
2002 Flush();
1915 if (!m_pBitmap->GetBuffer()) 2003 if (!m_pBitmap->GetBuffer())
1916 return true; 2004 return true;
1917 m_pBitmap->UnPreMultiply(); 2005 m_pBitmap->UnPreMultiply();
1918 CFX_ImageRenderer* pRenderer = new CFX_ImageRenderer; 2006 CFX_ImageRenderer* pRenderer = new CFX_ImageRenderer;
1919 pRenderer->Start(m_pBitmap, m_pClipRgn.get(), pSource, bitmap_alpha, argb, 2007 pRenderer->Start(m_pBitmap, m_pClipRgn.get(), pSource, bitmap_alpha, argb,
1920 pMatrix, render_flags, m_bRgbByteOrder, 0, nullptr); 2008 pMatrix, render_flags, m_bRgbByteOrder, 0, nullptr);
1921 handle = pRenderer; 2009 handle = pRenderer;
1922 #endif // _SKIA_SUPPORT_PATHS_ 2010 #endif // _SKIA_SUPPORT_PATHS_
1923 return true; 2011 return true;
1924 } 2012 }
1925 2013
1926 bool CFX_SkiaDeviceDriver::ContinueDIBits(void* handle, IFX_Pause* pPause) { 2014 bool CFX_SkiaDeviceDriver::ContinueDIBits(void* handle, IFX_Pause* pPause) {
1927 #ifdef _SKIA_SUPPORT_ 2015 #ifdef _SKIA_SUPPORT_
2016 m_pCache->FlushForDraw();
1928 return false; 2017 return false;
1929 #endif // _SKIA_SUPPORT_ 2018 #endif // _SKIA_SUPPORT_
1930 2019
1931 #ifdef _SKIA_SUPPORT_PATHS_ 2020 #ifdef _SKIA_SUPPORT_PATHS_
2021 Flush();
1932 if (!m_pBitmap->GetBuffer()) { 2022 if (!m_pBitmap->GetBuffer()) {
1933 return true; 2023 return true;
1934 } 2024 }
1935 return static_cast<CFX_ImageRenderer*>(handle)->Continue(pPause); 2025 return static_cast<CFX_ImageRenderer*>(handle)->Continue(pPause);
1936 #endif // _SKIA_SUPPORT_PATHS_ 2026 #endif // _SKIA_SUPPORT_PATHS_
1937 } 2027 }
1938 2028
1939 #if defined _SKIA_SUPPORT_ 2029 #if defined _SKIA_SUPPORT_
1940 void CFX_SkiaDeviceDriver::PreMultiply(CFX_DIBitmap* pDIBitmap) { 2030 void CFX_SkiaDeviceDriver::PreMultiply(CFX_DIBitmap* pDIBitmap) {
1941 pDIBitmap->PreMultiply(); 2031 pDIBitmap->PreMultiply();
(...skipping 1064 matching lines...) Expand 10 before | Expand all | Expand 10 after
3006 } 3096 }
3007 } 3097 }
3008 if (m_pDevice->GetBPP() == 1) { 3098 if (m_pDevice->GetBPP() == 1) {
3009 composite_span = &CFX_Renderer::CompositeSpan1bpp; 3099 composite_span = &CFX_Renderer::CompositeSpan1bpp;
3010 } 3100 }
3011 return true; 3101 return true;
3012 } 3102 }
3013 }; 3103 };
3014 3104
3015 #endif // _SKIA_SUPPORT_PATHS_ 3105 #endif // _SKIA_SUPPORT_PATHS_
OLDNEW
« no previous file with comments | « core/fxge/skia/fx_skia_device.h ('k') | fpdfsdk/fpdfformfill.cpp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698