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

Side by Side Diff: src/core/SkScalerContext.cpp

Issue 1880873002: Revert "Revert of Pass effects directly to fontcache (patchset #8 id:140001 of https://codereview.c… (Closed) Base URL: https://skia.googlesource.com/skia.git@master
Patch Set: Created 4 years, 8 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 | « src/core/SkScalerContext.h ('k') | src/core/SkTypeface.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 /* 1 /*
2 * Copyright 2006 The Android Open Source Project 2 * Copyright 2006 The Android Open Source Project
3 * 3 *
4 * Use of this source code is governed by a BSD-style license that can be 4 * Use of this source code is governed by a BSD-style license that can be
5 * found in the LICENSE file. 5 * found in the LICENSE file.
6 */ 6 */
7 7
8 8
9 #include "SkScalerContext.h" 9 #include "SkScalerContext.h"
10 #include "SkAutoPixmapStorage.h" 10 #include "SkAutoPixmapStorage.h"
(...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after
55 fRsbDelta = 0; 55 fRsbDelta = 0;
56 fLsbDelta = 0; 56 fLsbDelta = 0;
57 } 57 }
58 58
59 /////////////////////////////////////////////////////////////////////////////// 59 ///////////////////////////////////////////////////////////////////////////////
60 60
61 #ifdef SK_DEBUG 61 #ifdef SK_DEBUG
62 #define DUMP_RECx 62 #define DUMP_RECx
63 #endif 63 #endif
64 64
65 static SkFlattenable* load_flattenable(const SkDescriptor* desc, uint32_t tag, 65 SkScalerContext::SkScalerContext(SkTypeface* typeface, const SkScalerContextEffe cts& effects,
66 SkFlattenable::Type ft) { 66 const SkDescriptor* desc)
67 SkFlattenable* obj = nullptr;
68 uint32_t len;
69 const void* data = desc->findEntry(tag, &len);
70
71 if (data) {
72 SkReadBuffer buffer(data, len);
73 obj = buffer.readFlattenable(ft);
74 SkASSERT(buffer.offset() == buffer.size());
75 }
76 return obj;
77 }
78
79 SkScalerContext::SkScalerContext(SkTypeface* typeface, const SkDescriptor* desc)
80 : fRec(*static_cast<const Rec*>(desc->findEntry(kRec_SkDescriptorTag, nullpt r))) 67 : fRec(*static_cast<const Rec*>(desc->findEntry(kRec_SkDescriptorTag, nullpt r)))
81 68
82 , fTypeface(SkRef(typeface)) 69 , fTypeface(sk_ref_sp(typeface))
83 , fPathEffect(static_cast<SkPathEffect*>(load_flattenable(desc, kPathEffect_ SkDescriptorTag, 70 , fPathEffect(sk_ref_sp(effects.fPathEffect))
84 SkFlattenable::kSkPathEffect_Type)) ) 71 , fMaskFilter(sk_ref_sp(effects.fMaskFilter))
85 , fMaskFilter(static_cast<SkMaskFilter*>(load_flattenable(desc, kMaskFilter_ SkDescriptorTag, 72 , fRasterizer(sk_ref_sp(effects.fRasterizer))
86 SkFlattenable::kSkMaskFilter_Type)) )
87 , fRasterizer(static_cast<SkRasterizer*>(load_flattenable(desc, kRasterizer_ SkDescriptorTag,
88 SkFlattenable::kSkRasterizer_Type)) )
89 // Initialize based on our settings. Subclasses can also force this. 73 // Initialize based on our settings. Subclasses can also force this.
90 , fGenerateImageFromPath(fRec.fFrameWidth > 0 || fPathEffect != nullptr || f Rasterizer != nullptr) 74 , fGenerateImageFromPath(fRec.fFrameWidth > 0 || fPathEffect != nullptr || f Rasterizer != nullptr)
91 75
92 , fPreBlend(fMaskFilter ? SkMaskGamma::PreBlend() : SkScalerContext::GetMask PreBlend(fRec)) 76 , fPreBlend(fMaskFilter ? SkMaskGamma::PreBlend() : SkScalerContext::GetMask PreBlend(fRec))
93 , fPreBlendForFilter(fMaskFilter ? SkScalerContext::GetMaskPreBlend(fRec) 77 , fPreBlendForFilter(fMaskFilter ? SkScalerContext::GetMaskPreBlend(fRec)
94 : SkMaskGamma::PreBlend()) 78 : SkMaskGamma::PreBlend())
95 { 79 {
96 #ifdef DUMP_REC 80 #ifdef DUMP_REC
97 desc->assertChecksum(); 81 desc->assertChecksum();
98 SkDebugf("SkScalerContext checksum %x count %d length %d\n", 82 SkDebugf("SkScalerContext checksum %x count %d length %d\n",
99 desc->getChecksum(), desc->getCount(), desc->getLength()); 83 desc->getChecksum(), desc->getCount(), desc->getLength());
100 SkDebugf(" textsize %g prescale %g preskew %g post [%g %g %g %g]\n", 84 SkDebugf(" textsize %g prescale %g preskew %g post [%g %g %g %g]\n",
101 rec->fTextSize, rec->fPreScaleX, rec->fPreSkewX, rec->fPost2x2[0][0], 85 rec->fTextSize, rec->fPreScaleX, rec->fPreSkewX, rec->fPost2x2[0][0],
102 rec->fPost2x2[0][1], rec->fPost2x2[1][0], rec->fPost2x2[1][1]); 86 rec->fPost2x2[0][1], rec->fPost2x2[1][0], rec->fPost2x2[1][1]);
103 SkDebugf(" frame %g miter %g hints %d framefill %d format %d join %d cap %d \n", 87 SkDebugf(" frame %g miter %g hints %d framefill %d format %d join %d cap %d \n",
104 rec->fFrameWidth, rec->fMiterLimit, rec->fHints, rec->fFrameAndFill, 88 rec->fFrameWidth, rec->fMiterLimit, rec->fHints, rec->fFrameAndFill,
105 rec->fMaskFormat, rec->fStrokeJoin, rec->fStrokeCap); 89 rec->fMaskFormat, rec->fStrokeJoin, rec->fStrokeCap);
106 SkDebugf(" pathEffect %x maskFilter %x\n", 90 SkDebugf(" pathEffect %x maskFilter %x\n",
107 desc->findEntry(kPathEffect_SkDescriptorTag, nullptr), 91 desc->findEntry(kPathEffect_SkDescriptorTag, nullptr),
108 desc->findEntry(kMaskFilter_SkDescriptorTag, nullptr)); 92 desc->findEntry(kMaskFilter_SkDescriptorTag, nullptr));
109 #endif 93 #endif
110 } 94 }
111 95
112 SkScalerContext::~SkScalerContext() { 96 SkScalerContext::~SkScalerContext() {}
113 SkSafeUnref(fPathEffect);
114 SkSafeUnref(fMaskFilter);
115 SkSafeUnref(fRasterizer);
116 }
117 97
118 void SkScalerContext::getAdvance(SkGlyph* glyph) { 98 void SkScalerContext::getAdvance(SkGlyph* glyph) {
119 // mark us as just having a valid advance 99 // mark us as just having a valid advance
120 glyph->fMaskFormat = MASK_FORMAT_JUST_ADVANCE; 100 glyph->fMaskFormat = MASK_FORMAT_JUST_ADVANCE;
121 // we mark the format before making the call, in case the impl 101 // we mark the format before making the call, in case the impl
122 // internally ends up calling its generateMetrics, which is OK 102 // internally ends up calling its generateMetrics, which is OK
123 // albeit slower than strictly necessary 103 // albeit slower than strictly necessary
124 generateAdvance(glyph); 104 generateAdvance(glyph);
125 } 105 }
126 106
(...skipping 22 matching lines...) Expand all
149 if (fGenerateImageFromPath) { 129 if (fGenerateImageFromPath) {
150 SkPath devPath, fillPath; 130 SkPath devPath, fillPath;
151 SkMatrix fillToDevMatrix; 131 SkMatrix fillToDevMatrix;
152 132
153 this->internalGetPath(*glyph, &fillPath, &devPath, &fillToDevMatrix); 133 this->internalGetPath(*glyph, &fillPath, &devPath, &fillToDevMatrix);
154 134
155 if (fRasterizer) { 135 if (fRasterizer) {
156 SkMask mask; 136 SkMask mask;
157 137
158 if (fRasterizer->rasterize(fillPath, fillToDevMatrix, nullptr, 138 if (fRasterizer->rasterize(fillPath, fillToDevMatrix, nullptr,
159 fMaskFilter, &mask, 139 fMaskFilter.get(), &mask,
160 SkMask::kJustComputeBounds_CreateMode)) { 140 SkMask::kJustComputeBounds_CreateMode)) {
161 glyph->fLeft = mask.fBounds.fLeft; 141 glyph->fLeft = mask.fBounds.fLeft;
162 glyph->fTop = mask.fBounds.fTop; 142 glyph->fTop = mask.fBounds.fTop;
163 glyph->fWidth = SkToU16(mask.fBounds.width()); 143 glyph->fWidth = SkToU16(mask.fBounds.width());
164 glyph->fHeight = SkToU16(mask.fBounds.height()); 144 glyph->fHeight = SkToU16(mask.fBounds.height());
165 } else { 145 } else {
166 goto SK_ERROR; 146 goto SK_ERROR;
167 } 147 }
168 } else { 148 } else {
169 // just use devPath 149 // just use devPath
(...skipping 308 matching lines...) Expand 10 before | Expand all | Expand 10 after
478 // If we are going to draw-from-path, then we cannot generate color, since 458 // If we are going to draw-from-path, then we cannot generate color, since
479 // the path only makes a mask. This case should have been caught up in 459 // the path only makes a mask. This case should have been caught up in
480 // generateMetrics(). 460 // generateMetrics().
481 SkASSERT(!fGenerateImageFromPath || 461 SkASSERT(!fGenerateImageFromPath ||
482 SkMask::kARGB32_Format != origGlyph.fMaskFormat); 462 SkMask::kARGB32_Format != origGlyph.fMaskFormat);
483 463
484 if (fMaskFilter) { // restore the prefilter bounds 464 if (fMaskFilter) { // restore the prefilter bounds
485 tmpGlyph.initGlyphIdFrom(origGlyph); 465 tmpGlyph.initGlyphIdFrom(origGlyph);
486 466
487 // need the original bounds, sans our maskfilter 467 // need the original bounds, sans our maskfilter
488 SkMaskFilter* mf = fMaskFilter; 468 SkMaskFilter* mf = fMaskFilter.release(); // temp disable
489 fMaskFilter = nullptr; // temp disable
490 this->getMetrics(&tmpGlyph); 469 this->getMetrics(&tmpGlyph);
491 fMaskFilter = mf; // restore 470 fMaskFilter = sk_sp<SkMaskFilter>(mf); // restore
492 471
493 // we need the prefilter bounds to be <= filter bounds 472 // we need the prefilter bounds to be <= filter bounds
494 SkASSERT(tmpGlyph.fWidth <= origGlyph.fWidth); 473 SkASSERT(tmpGlyph.fWidth <= origGlyph.fWidth);
495 SkASSERT(tmpGlyph.fHeight <= origGlyph.fHeight); 474 SkASSERT(tmpGlyph.fHeight <= origGlyph.fHeight);
496 475
497 if (tmpGlyph.fMaskFormat == origGlyph.fMaskFormat) { 476 if (tmpGlyph.fMaskFormat == origGlyph.fMaskFormat) {
498 tmpGlyph.fImage = origGlyph.fImage; 477 tmpGlyph.fImage = origGlyph.fImage;
499 } else { 478 } else {
500 tmpGlyphImageStorage.reset(tmpGlyph.computeImageSize()); 479 tmpGlyphImageStorage.reset(tmpGlyph.computeImageSize());
501 tmpGlyph.fImage = tmpGlyphImageStorage.get(); 480 tmpGlyph.fImage = tmpGlyphImageStorage.get();
502 } 481 }
503 glyph = &tmpGlyph; 482 glyph = &tmpGlyph;
504 } 483 }
505 484
506 if (fGenerateImageFromPath) { 485 if (fGenerateImageFromPath) {
507 SkPath devPath, fillPath; 486 SkPath devPath, fillPath;
508 SkMatrix fillToDevMatrix; 487 SkMatrix fillToDevMatrix;
509 SkMask mask; 488 SkMask mask;
510 489
511 this->internalGetPath(*glyph, &fillPath, &devPath, &fillToDevMatrix); 490 this->internalGetPath(*glyph, &fillPath, &devPath, &fillToDevMatrix);
512 glyph->toMask(&mask); 491 glyph->toMask(&mask);
513 492
514 if (fRasterizer) { 493 if (fRasterizer) {
515 mask.fFormat = SkMask::kA8_Format; 494 mask.fFormat = SkMask::kA8_Format;
516 sk_bzero(glyph->fImage, mask.computeImageSize()); 495 sk_bzero(glyph->fImage, mask.computeImageSize());
517 496
518 if (!fRasterizer->rasterize(fillPath, fillToDevMatrix, nullptr, 497 if (!fRasterizer->rasterize(fillPath, fillToDevMatrix, nullptr,
519 fMaskFilter, &mask, 498 fMaskFilter.get(), &mask,
520 SkMask::kJustRenderImage_CreateMode)) { 499 SkMask::kJustRenderImage_CreateMode)) {
521 return; 500 return;
522 } 501 }
523 if (fPreBlend.isApplicable()) { 502 if (fPreBlend.isApplicable()) {
524 applyLUTToA8Mask(mask, fPreBlend.fG); 503 applyLUTToA8Mask(mask, fPreBlend.fG);
525 } 504 }
526 } else { 505 } else {
527 SkASSERT(SkMask::kARGB32_Format != mask.fFormat); 506 SkASSERT(SkMask::kARGB32_Format != mask.fFormat);
528 generateMask(mask, devPath, fPreBlend); 507 generateMask(mask, devPath, fPreBlend);
529 } 508 }
(...skipping 314 matching lines...) Expand 10 before | Expand all | Expand 10 after
844 // The x axis is mapped onto the y axis. 823 // The x axis is mapped onto the y axis.
845 return kY_SkAxisAlignment; 824 return kY_SkAxisAlignment;
846 } 825 }
847 return kNone_SkAxisAlignment; 826 return kNone_SkAxisAlignment;
848 } 827 }
849 828
850 /////////////////////////////////////////////////////////////////////////////// 829 ///////////////////////////////////////////////////////////////////////////////
851 830
852 class SkScalerContext_Empty : public SkScalerContext { 831 class SkScalerContext_Empty : public SkScalerContext {
853 public: 832 public:
854 SkScalerContext_Empty(SkTypeface* face, const SkDescriptor* desc) 833 SkScalerContext_Empty(SkTypeface* typeface, const SkScalerContextEffects& ef fects,
855 : SkScalerContext(face, desc) {} 834 const SkDescriptor* desc)
835 : SkScalerContext(typeface, effects, desc) {}
856 836
857 protected: 837 protected:
858 unsigned generateGlyphCount() override { 838 unsigned generateGlyphCount() override {
859 return 0; 839 return 0;
860 } 840 }
861 uint16_t generateCharToGlyph(SkUnichar uni) override { 841 uint16_t generateCharToGlyph(SkUnichar uni) override {
862 return 0; 842 return 0;
863 } 843 }
864 void generateAdvance(SkGlyph* glyph) override { 844 void generateAdvance(SkGlyph* glyph) override {
865 glyph->zeroMetrics(); 845 glyph->zeroMetrics();
866 } 846 }
867 void generateMetrics(SkGlyph* glyph) override { 847 void generateMetrics(SkGlyph* glyph) override {
868 glyph->zeroMetrics(); 848 glyph->zeroMetrics();
869 } 849 }
870 void generateImage(const SkGlyph& glyph) override {} 850 void generateImage(const SkGlyph& glyph) override {}
871 void generatePath(const SkGlyph& glyph, SkPath* path) override {} 851 void generatePath(const SkGlyph& glyph, SkPath* path) override {}
872 void generateFontMetrics(SkPaint::FontMetrics* metrics) override { 852 void generateFontMetrics(SkPaint::FontMetrics* metrics) override {
873 if (metrics) { 853 if (metrics) {
874 sk_bzero(metrics, sizeof(*metrics)); 854 sk_bzero(metrics, sizeof(*metrics));
875 } 855 }
876 } 856 }
877 }; 857 };
878 858
879 extern SkScalerContext* SkCreateColorScalerContext(const SkDescriptor* desc); 859 extern SkScalerContext* SkCreateColorScalerContext(const SkDescriptor* desc);
880 860
881 SkScalerContext* SkTypeface::createScalerContext(const SkDescriptor* desc, 861 SkScalerContext* SkTypeface::createScalerContext(const SkScalerContextEffects& e ffects,
862 const SkDescriptor* desc,
882 bool allowFailure) const { 863 bool allowFailure) const {
883 SkScalerContext* c = this->onCreateScalerContext(desc); 864 SkScalerContext* c = this->onCreateScalerContext(effects, desc);
884 865
885 if (!c && !allowFailure) { 866 if (!c && !allowFailure) {
886 c = new SkScalerContext_Empty(const_cast<SkTypeface*>(this), desc); 867 c = new SkScalerContext_Empty(const_cast<SkTypeface*>(this), effects, de sc);
887 } 868 }
888 return c; 869 return c;
889 } 870 }
OLDNEW
« no previous file with comments | « src/core/SkScalerContext.h ('k') | src/core/SkTypeface.cpp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698