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

Side by Side Diff: src/gpu/GrAtlasTextContext.cpp

Issue 1057613002: Handle large paths in textblobs (Closed) Base URL: https://skia.googlesource.com/skia.git@bmptextrename
Patch Set: rebase Created 5 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/gpu/GrAtlasTextContext.h ('k') | no next file » | 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 2015 Google Inc. 2 * Copyright 2015 Google Inc.
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 #include "GrAtlasTextContext.h" 7 #include "GrAtlasTextContext.h"
8 8
9 #include "GrAtlas.h" 9 #include "GrAtlas.h"
10 #include "GrBatch.h" 10 #include "GrBatch.h"
(...skipping 75 matching lines...) Expand 10 before | Expand all | Expand 10 after
86 } 86 }
87 87
88 bool GrAtlasTextContext::canDraw(const GrRenderTarget*, 88 bool GrAtlasTextContext::canDraw(const GrRenderTarget*,
89 const GrClip&, 89 const GrClip&,
90 const GrPaint&, 90 const GrPaint&,
91 const SkPaint& skPaint, 91 const SkPaint& skPaint,
92 const SkMatrix& viewMatrix) { 92 const SkMatrix& viewMatrix) {
93 return !SkDraw::ShouldDrawTextAsPaths(skPaint, viewMatrix); 93 return !SkDraw::ShouldDrawTextAsPaths(skPaint, viewMatrix);
94 } 94 }
95 95
96 inline void GrAtlasTextContext::init(GrRenderTarget* rt, const GrClip& clip,
97 const GrPaint& paint, const SkPaint& skPain t,
98 const SkIRect& regionClipBounds) {
99 INHERITED::init(rt, clip, paint, skPaint, regionClipBounds);
100
101 fCurrStrike = NULL;
102 }
103
104 bool GrAtlasTextContext::MustRegenerateBlob(const BitmapTextBlob& blob, const Sk Paint& paint, 96 bool GrAtlasTextContext::MustRegenerateBlob(const BitmapTextBlob& blob, const Sk Paint& paint,
105 const SkMatrix& viewMatrix, SkScalar x, SkScalar y) { 97 const SkMatrix& viewMatrix, SkScalar x, SkScalar y) {
106 // We always regenerate blobs with patheffects or mask filters we could cach e these 98 // We always regenerate blobs with patheffects or mask filters we could cach e these
107 // TODO find some way to cache the maskfilter / patheffects on the textblob 99 // TODO find some way to cache the maskfilter / patheffects on the textblob
108 return !blob.fViewMatrix.cheapEqualTo(viewMatrix) || blob.fX != x || blob.fY != y || 100 return !blob.fViewMatrix.cheapEqualTo(viewMatrix) || blob.fX != x || blob.fY != y ||
109 paint.getMaskFilter() || paint.getPathEffect() || paint.getStyle() ! = blob.fStyle; 101 paint.getMaskFilter() || paint.getPathEffect() || paint.getStyle() ! = blob.fStyle;
110 } 102 }
111 103
112 104
113 inline SkGlyphCache* GrAtlasTextContext::setupCache(BitmapTextBlob::Run* run, 105 inline SkGlyphCache* GrAtlasTextContext::setupCache(BitmapTextBlob::Run* run,
(...skipping 71 matching lines...) Expand 10 before | Expand all | Expand 10 after
185 cacheBlob = CreateBlob(glyphCount, runCount); 177 cacheBlob = CreateBlob(glyphCount, runCount);
186 fCache.set(blob->uniqueID(), cacheBlob); 178 fCache.set(blob->uniqueID(), cacheBlob);
187 this->regenerateTextBlob(cacheBlob, skPaint, viewMatrix, blob, x, y, dra wFilter, clipRect); 179 this->regenerateTextBlob(cacheBlob, skPaint, viewMatrix, blob, x, y, dra wFilter, clipRect);
188 } 180 }
189 181
190 // Though for the time being runs in the textblob can override the paint, th ey only touch font 182 // Though for the time being runs in the textblob can override the paint, th ey only touch font
191 // info. 183 // info.
192 GrPaint grPaint; 184 GrPaint grPaint;
193 SkPaint2GrPaintShader(fContext, rt, skPaint, viewMatrix, true, &grPaint); 185 SkPaint2GrPaintShader(fContext, rt, skPaint, viewMatrix, true, &grPaint);
194 186
195 this->flush(fContext->getTextTarget(), cacheBlob, rt, grPaint, clip, viewMat rix, 187 this->flush(fContext->getTextTarget(), blob, cacheBlob, rt, skPaint, grPaint , drawFilter,
196 fSkPaint.getAlpha()); 188 clip, viewMatrix, clipBounds, x, y);
197 } 189 }
198 190
199 void GrAtlasTextContext::regenerateTextBlob(BitmapTextBlob* cacheBlob, 191 void GrAtlasTextContext::regenerateTextBlob(BitmapTextBlob* cacheBlob,
200 const SkPaint& skPaint, const SkMatr ix& viewMatrix, 192 const SkPaint& skPaint, const SkMatr ix& viewMatrix,
201 const SkTextBlob* blob, SkScalar x, SkScalar y, 193 const SkTextBlob* blob, SkScalar x, SkScalar y,
202 SkDrawFilter* drawFilter, const SkIR ect& clipRect) { 194 SkDrawFilter* drawFilter, const SkIR ect& clipRect) {
203 cacheBlob->fViewMatrix = viewMatrix; 195 cacheBlob->fViewMatrix = viewMatrix;
204 cacheBlob->fX = x; 196 cacheBlob->fX = x;
205 cacheBlob->fY = y; 197 cacheBlob->fY = y;
206 cacheBlob->fStyle = skPaint.getStyle(); 198 cacheBlob->fStyle = skPaint.getStyle();
(...skipping 24 matching lines...) Expand all
231 PerSubRunInfo& newRun = cacheBlob->fRuns[run].fSubRunInfo.back(); 223 PerSubRunInfo& newRun = cacheBlob->fRuns[run].fSubRunInfo.back();
232 PerSubRunInfo& lastRun = cacheBlob->fRuns[run - 1].fSubRunInfo.back( ); 224 PerSubRunInfo& lastRun = cacheBlob->fRuns[run - 1].fSubRunInfo.back( );
233 225
234 newRun.fVertexStartIndex = lastRun.fVertexEndIndex; 226 newRun.fVertexStartIndex = lastRun.fVertexEndIndex;
235 newRun.fVertexEndIndex = lastRun.fVertexEndIndex; 227 newRun.fVertexEndIndex = lastRun.fVertexEndIndex;
236 228
237 newRun.fGlyphStartIndex = lastRun.fGlyphEndIndex; 229 newRun.fGlyphStartIndex = lastRun.fGlyphEndIndex;
238 newRun.fGlyphEndIndex = lastRun.fGlyphEndIndex; 230 newRun.fGlyphEndIndex = lastRun.fGlyphEndIndex;
239 } 231 }
240 232
233 if (SkDraw::ShouldDrawTextAsPaths(skPaint, viewMatrix)) {
234 cacheBlob->fRuns[run].fDrawAsPaths = true;
235 continue;
236 }
237 cacheBlob->fRuns[run].fDrawAsPaths = false;
238
241 switch (it.positioning()) { 239 switch (it.positioning()) {
242 case SkTextBlob::kDefault_Positioning: 240 case SkTextBlob::kDefault_Positioning:
243 this->internalDrawText(cacheBlob, run, cache, runPaint, viewMatr ix, 241 this->internalDrawText(cacheBlob, run, cache, runPaint, viewMatr ix,
244 (const char *)it.glyphs(), textLen, 242 (const char *)it.glyphs(), textLen,
245 x + offset.x(), y + offset.y(), clipRect) ; 243 x + offset.x(), y + offset.y(), clipRect) ;
246 break; 244 break;
247 case SkTextBlob::kHorizontal_Positioning: 245 case SkTextBlob::kHorizontal_Positioning:
248 this->internalDrawPosText(cacheBlob, run, cache, runPaint, viewM atrix, 246 this->internalDrawPosText(cacheBlob, run, cache, runPaint, viewM atrix,
249 (const char*)it.glyphs(), textLen, it. pos(), 1, 247 (const char*)it.glyphs(), textLen, it. pos(), 1,
250 SkPoint::Make(x, y + offset.y()), clip Rect); 248 SkPoint::Make(x, y + offset.y()), clip Rect);
(...skipping 27 matching lines...) Expand all
278 blob->fStyle = skPaint.getStyle(); 276 blob->fStyle = skPaint.getStyle();
279 277
280 SkIRect clipRect; 278 SkIRect clipRect;
281 clip.getConservativeBounds(rt->width(), rt->height(), &clipRect); 279 clip.getConservativeBounds(rt->width(), rt->height(), &clipRect);
282 280
283 // setup cache 281 // setup cache
284 SkGlyphCache* cache = this->setupCache(&blob->fRuns[0], skPaint, viewMatrix) ; 282 SkGlyphCache* cache = this->setupCache(&blob->fRuns[0], skPaint, viewMatrix) ;
285 this->internalDrawText(blob, 0, cache, skPaint, viewMatrix, text, byteLength , x, y, clipRect); 283 this->internalDrawText(blob, 0, cache, skPaint, viewMatrix, text, byteLength , x, y, clipRect);
286 SkGlyphCache::AttachCache(cache); 284 SkGlyphCache::AttachCache(cache);
287 285
288 this->flush(fContext->getTextTarget(), blob, rt, paint, clip, viewMatrix, sk Paint.getAlpha()); 286 this->flush(fContext->getTextTarget(), blob, rt, skPaint, paint, clip, viewM atrix);
289 } 287 }
290 288
291 void GrAtlasTextContext::internalDrawText(BitmapTextBlob* blob, int runIndex, 289 void GrAtlasTextContext::internalDrawText(BitmapTextBlob* blob, int runIndex,
292 SkGlyphCache* cache, const SkPaint& sk Paint, 290 SkGlyphCache* cache, const SkPaint& sk Paint,
293 const SkMatrix& viewMatrix, 291 const SkMatrix& viewMatrix,
294 const char text[], size_t byteLength, 292 const char text[], size_t byteLength,
295 SkScalar x, SkScalar y, const SkIRect& clipRect) { 293 SkScalar x, SkScalar y, const SkIRect& clipRect) {
296 SkASSERT(byteLength == 0 || text != NULL); 294 SkASSERT(byteLength == 0 || text != NULL);
297 295
298 // nothing to draw 296 // nothing to draw
(...skipping 92 matching lines...) Expand 10 before | Expand all | Expand 10 after
391 389
392 SkIRect clipRect; 390 SkIRect clipRect;
393 clip.getConservativeBounds(rt->width(), rt->height(), &clipRect); 391 clip.getConservativeBounds(rt->width(), rt->height(), &clipRect);
394 392
395 // setup cache 393 // setup cache
396 SkGlyphCache* cache = this->setupCache(&blob->fRuns[0], skPaint, viewMatrix) ; 394 SkGlyphCache* cache = this->setupCache(&blob->fRuns[0], skPaint, viewMatrix) ;
397 this->internalDrawPosText(blob, 0, cache, skPaint, viewMatrix, text, byteLen gth, pos, 395 this->internalDrawPosText(blob, 0, cache, skPaint, viewMatrix, text, byteLen gth, pos,
398 scalarsPerPosition, offset, clipRect); 396 scalarsPerPosition, offset, clipRect);
399 SkGlyphCache::AttachCache(cache); 397 SkGlyphCache::AttachCache(cache);
400 398
401 this->flush(fContext->getTextTarget(), blob, rt, paint, clip, viewMatrix, fS kPaint.getAlpha()); 399 this->flush(fContext->getTextTarget(), blob, rt, skPaint, paint, clip, viewM atrix);
402 } 400 }
403 401
404 void GrAtlasTextContext::internalDrawPosText(BitmapTextBlob* blob, int runIndex, 402 void GrAtlasTextContext::internalDrawPosText(BitmapTextBlob* blob, int runIndex,
405 SkGlyphCache* cache, const SkPaint& skPaint, 403 SkGlyphCache* cache, const SkPaint& skPaint,
406 const SkMatrix& viewMatrix, 404 const SkMatrix& viewMatrix,
407 const char text[], size_t byteLengt h, 405 const char text[], size_t byteLengt h,
408 const SkScalar pos[], int scalarsPe rPosition, 406 const SkScalar pos[], int scalarsPe rPosition,
409 const SkPoint& offset, const SkIRec t& clipRect) { 407 const SkPoint& offset, const SkIRec t& clipRect) {
410 SkASSERT(byteLength == 0 || text != NULL); 408 SkASSERT(byteLength == 0 || text != NULL);
411 SkASSERT(1 == scalarsPerPosition || 2 == scalarsPerPosition); 409 SkASSERT(1 == scalarsPerPosition || 2 == scalarsPerPosition);
(...skipping 275 matching lines...) Expand 10 before | Expand all | Expand 10 after
687 : fBlob(SkRef(geometry.fBlob.get())) 685 : fBlob(SkRef(geometry.fBlob.get()))
688 , fRun(geometry.fRun) 686 , fRun(geometry.fRun)
689 , fSubRun(geometry.fSubRun) 687 , fSubRun(geometry.fSubRun)
690 , fColor(geometry.fColor) {} 688 , fColor(geometry.fColor) {}
691 SkAutoTUnref<Blob> fBlob; 689 SkAutoTUnref<Blob> fBlob;
692 int fRun; 690 int fRun;
693 int fSubRun; 691 int fSubRun;
694 GrColor fColor; 692 GrColor fColor;
695 }; 693 };
696 694
697 static GrBatch* Create(const Geometry& geometry, GrColor color, GrMaskFormat maskFormat, 695 static GrBatch* Create(const Geometry& geometry, GrMaskFormat maskFormat,
698 int glyphCount, GrBatchFontCache* fontCache) { 696 int glyphCount, GrBatchFontCache* fontCache) {
699 return SkNEW_ARGS(BitmapTextBatch, (geometry, color, maskFormat, glyphCo unt, fontCache)); 697 return SkNEW_ARGS(BitmapTextBatch, (geometry, maskFormat, glyphCount, fo ntCache));
700 } 698 }
701 699
702 const char* name() const override { return "BitmapTextBatch"; } 700 const char* name() const override { return "BitmapTextBatch"; }
703 701
704 void getInvariantOutputColor(GrInitInvariantOutput* out) const override { 702 void getInvariantOutputColor(GrInitInvariantOutput* out) const override {
705 if (kARGB_GrMaskFormat == fMaskFormat) { 703 if (kARGB_GrMaskFormat == fMaskFormat) {
706 out->setUnknownFourComponents(); 704 out->setUnknownFourComponents();
707 } else { 705 } else {
708 out->setKnownFourComponents(fBatch.fColor); 706 out->setKnownFourComponents(fBatch.fColor);
709 } 707 }
(...skipping 176 matching lines...) Expand 10 before | Expand all | Expand 10 after
886 884
887 currVertex += byteCount; 885 currVertex += byteCount;
888 } 886 }
889 887
890 this->flush(batchTarget, &drawInfo, instancesToFlush, maxInstancesPerDra w); 888 this->flush(batchTarget, &drawInfo, instancesToFlush, maxInstancesPerDra w);
891 } 889 }
892 890
893 SkSTArray<1, Geometry, true>* geoData() { return &fGeoData; } 891 SkSTArray<1, Geometry, true>* geoData() { return &fGeoData; }
894 892
895 private: 893 private:
896 BitmapTextBatch(const Geometry& geometry, GrColor color, GrMaskFormat maskFo rmat, 894 BitmapTextBatch(const Geometry& geometry, GrMaskFormat maskFormat,
897 int glyphCount, GrBatchFontCache* fontCache) 895 int glyphCount, GrBatchFontCache* fontCache)
898 : fMaskFormat(maskFormat) 896 : fMaskFormat(maskFormat)
899 , fPixelConfig(fontCache->getPixelConfig(maskFormat)) 897 , fPixelConfig(fontCache->getPixelConfig(maskFormat))
900 , fFontCache(fontCache) { 898 , fFontCache(fontCache) {
901 this->initClassID<BitmapTextBatch>(); 899 this->initClassID<BitmapTextBatch>();
902 fGeoData.push_back(geometry); 900 fGeoData.push_back(geometry);
903 fBatch.fColor = color; 901 fBatch.fColor = geometry.fColor;
904 fBatch.fViewMatrix = geometry.fBlob->fViewMatrix; 902 fBatch.fViewMatrix = geometry.fBlob->fViewMatrix;
905 fBatch.fNumGlyphs = glyphCount; 903 fBatch.fNumGlyphs = glyphCount;
906 } 904 }
907 905
908 void regenerateTextureCoords(GrGlyph* glyph, intptr_t vertex, size_t vertexS tride) { 906 void regenerateTextureCoords(GrGlyph* glyph, intptr_t vertex, size_t vertexS tride) {
909 int width = glyph->fBounds.width(); 907 int width = glyph->fBounds.width();
910 int height = glyph->fBounds.height(); 908 int height = glyph->fBounds.height();
911 int u0 = glyph->fAtlasLocation.fX; 909 int u0 = glyph->fAtlasLocation.fX;
912 int v0 = glyph->fAtlasLocation.fY; 910 int v0 = glyph->fAtlasLocation.fY;
913 int u1 = u0 + width; 911 int u1 = u0 + width;
(...skipping 94 matching lines...) Expand 10 before | Expand all | Expand 10 after
1008 int fNumGlyphs; 1006 int fNumGlyphs;
1009 }; 1007 };
1010 1008
1011 BatchTracker fBatch; 1009 BatchTracker fBatch;
1012 SkSTArray<1, Geometry, true> fGeoData; 1010 SkSTArray<1, Geometry, true> fGeoData;
1013 GrMaskFormat fMaskFormat; 1011 GrMaskFormat fMaskFormat;
1014 GrPixelConfig fPixelConfig; 1012 GrPixelConfig fPixelConfig;
1015 GrBatchFontCache* fFontCache; 1013 GrBatchFontCache* fFontCache;
1016 }; 1014 };
1017 1015
1018 void GrAtlasTextContext::flush(GrDrawTarget* target, BitmapTextBlob* blob, GrRen derTarget* rt, 1016 void GrAtlasTextContext::flushRunAsPaths(const SkTextBlob::RunIterator& it, cons t SkPaint& skPaint,
1019 const GrPaint& paint, const GrClip& clip, 1017 SkDrawFilter* drawFilter, const SkMatri x& viewMatrix,
1020 const SkMatrix& viewMatrix, int paintAlpha) { 1018 const SkIRect& clipBounds, SkScalar x, SkScalar y) {
1021 GrPipelineBuilder pipelineBuilder; 1019 SkPaint runPaint = skPaint;
1022 pipelineBuilder.setFromPaint(paint, rt, clip);
1023 1020
1024 GrColor color = paint.getColor(); 1021 size_t textLen = it.glyphCount() * sizeof(uint16_t);
1025 for (uint32_t run = 0; run < blob->fRunCount; run++) { 1022 const SkPoint& offset = it.offset();
1026 for (int subRun = 0; subRun < blob->fRuns[run].fSubRunInfo.count(); subR un++) {
1027 PerSubRunInfo& info = blob->fRuns[run].fSubRunInfo[subRun];
1028 int glyphCount = info.fGlyphEndIndex - info.fGlyphStartIndex;
1029 if (0 == glyphCount) {
1030 continue;
1031 }
1032 1023
1033 GrMaskFormat format = info.fMaskFormat; 1024 it.applyFontToPaint(&runPaint);
1034 GrColor subRunColor = kARGB_GrMaskFormat == format ?
1035 SkColorSetARGB(paintAlpha, paintAlpha, paintAl pha, paintAlpha) :
1036 color;
1037 1025
1038 BitmapTextBatch::Geometry geometry; 1026 if (drawFilter && !drawFilter->filter(&runPaint, SkDrawFilter::kText_Type)) {
1039 geometry.fBlob.reset(SkRef(blob)); 1027 return;
1040 geometry.fRun = run;
1041 geometry.fSubRun = subRun;
1042 geometry.fColor = color;
1043 SkAutoTUnref<GrBatch> batch(BitmapTextBatch::Create(geometry, subRun Color, format,
1044 glyphCount,
1045 fContext->getBat chFontCache()));
1046
1047 target->drawBatch(&pipelineBuilder, batch, &blob->fRuns[run].fVertex Bounds);
1048 }
1049 } 1028 }
1050 1029
1051 // Now flush big glyphs 1030 runPaint.setFlags(fGpuDevice->filterTextFlags(runPaint));
1052 for (int i = 0; i < blob->fBigGlyphs.count(); i++) { 1031
1053 BitmapTextBlob::BigGlyph& bigGlyph = blob->fBigGlyphs[i]; 1032 switch (it.positioning()) {
1033 case SkTextBlob::kDefault_Positioning:
1034 this->drawTextAsPath(runPaint, viewMatrix, (const char *)it.glyphs() ,
1035 textLen, x + offset.x(), y + offset.y(), clipBo unds);
1036 break;
1037 case SkTextBlob::kHorizontal_Positioning:
1038 this->drawPosTextAsPath(runPaint, viewMatrix, (const char*)it.glyphs (),
1039 textLen, it.pos(), 1, SkPoint::Make(x, y + o ffset.y()),
1040 clipBounds);
1041 break;
1042 case SkTextBlob::kFull_Positioning:
1043 this->drawPosTextAsPath(runPaint, viewMatrix, (const char*)it.glyphs (),
1044 textLen, it.pos(), 2, SkPoint::Make(x, y), c lipBounds);
1045 break;
1046 }
1047 }
1048
1049 inline void GrAtlasTextContext::flushRun(GrDrawTarget* target, GrPipelineBuilder * pipelineBuilder,
1050 BitmapTextBlob* cacheBlob, int run, GrC olor color,
1051 uint8_t paintAlpha) {
1052 for (int subRun = 0; subRun < cacheBlob->fRuns[run].fSubRunInfo.count(); sub Run++) {
1053 const PerSubRunInfo& info = cacheBlob->fRuns[run].fSubRunInfo[subRun];
1054 int glyphCount = info.fGlyphEndIndex - info.fGlyphStartIndex;
1055 if (0 == glyphCount) {
1056 continue;
1057 }
1058
1059 GrMaskFormat format = info.fMaskFormat;
1060 GrColor subRunColor = kARGB_GrMaskFormat == format ?
1061 SkColorSetARGB(paintAlpha, paintAlpha, paintAlpha, paintAlpha) :
1062 color;
1063
1064 BitmapTextBatch::Geometry geometry;
1065 geometry.fBlob.reset(SkRef(cacheBlob));
1066 geometry.fRun = run;
1067 geometry.fSubRun = subRun;
1068 geometry.fColor = subRunColor;
1069 SkAutoTUnref<GrBatch> batch(BitmapTextBatch::Create(geometry, format, gl yphCount,
1070 fContext->getBatchFo ntCache()));
1071
1072 target->drawBatch(pipelineBuilder, batch, &cacheBlob->fRuns[run].fVertex Bounds);
1073 }
1074 }
1075
1076 inline void GrAtlasTextContext::flushBigGlyphs(BitmapTextBlob* cacheBlob, GrRend erTarget* rt,
1077 const GrPaint& grPaint, const GrC lip& clip) {
1078 for (int i = 0; i < cacheBlob->fBigGlyphs.count(); i++) {
1079 const BitmapTextBlob::BigGlyph& bigGlyph = cacheBlob->fBigGlyphs[i];
1054 SkMatrix translate; 1080 SkMatrix translate;
1055 translate.setTranslate(SkIntToScalar(bigGlyph.fVx), SkIntToScalar(bigGly ph.fVy)); 1081 translate.setTranslate(SkIntToScalar(bigGlyph.fVx), SkIntToScalar(bigGly ph.fVy));
1056 SkPath tmpPath(bigGlyph.fPath); 1082 SkPath tmpPath(bigGlyph.fPath);
1057 tmpPath.transform(translate); 1083 tmpPath.transform(translate);
1058 GrStrokeInfo strokeInfo(SkStrokeRec::kFill_InitStyle); 1084 GrStrokeInfo strokeInfo(SkStrokeRec::kFill_InitStyle);
1059 fContext->drawPath(rt, clip, paint, SkMatrix::I(), tmpPath, strokeInfo); 1085 fContext->drawPath(rt, clip, grPaint, SkMatrix::I(), tmpPath, strokeInfo );
1060 } 1086 }
1061 } 1087 }
1088
1089 void GrAtlasTextContext::flush(GrDrawTarget* target,
1090 const SkTextBlob* blob,
1091 BitmapTextBlob* cacheBlob,
1092 GrRenderTarget* rt,
1093 const SkPaint& skPaint,
1094 const GrPaint& grPaint,
1095 SkDrawFilter* drawFilter,
1096 const GrClip& clip,
1097 const SkMatrix& viewMatrix,
1098 const SkIRect& clipBounds,
1099 SkScalar x,
1100 SkScalar y) {
1101 // We loop through the runs of the blob, flushing each. If any run is too l arge, then we flush
1102 // it as paths
1103 GrPipelineBuilder pipelineBuilder;
1104 pipelineBuilder.setFromPaint(grPaint, rt, clip);
1105
1106 GrColor color = grPaint.getColor();
1107 uint8_t paintAlpha = skPaint.getAlpha();
1108
1109 SkTextBlob::RunIterator it(blob);
1110 for (int run = 0; !it.done(); it.next(), run++) {
1111 if (cacheBlob->fRuns[run].fDrawAsPaths) {
1112 this->flushRunAsPaths(it, skPaint, drawFilter, viewMatrix, clipBound s, x, y);
1113 continue;
1114 }
1115 this->flushRun(target, &pipelineBuilder, cacheBlob, run, color, paintAlp ha);
1116 }
1117
1118 // Now flush big glyphs
1119 this->flushBigGlyphs(cacheBlob, rt, grPaint, clip);
1120 }
1121
1122 void GrAtlasTextContext::flush(GrDrawTarget* target,
1123 BitmapTextBlob* cacheBlob,
1124 GrRenderTarget* rt,
1125 const SkPaint& skPaint,
1126 const GrPaint& grPaint,
1127 const GrClip& clip,
1128 const SkMatrix& viewMatrix) {
1129 GrPipelineBuilder pipelineBuilder;
1130 pipelineBuilder.setFromPaint(grPaint, rt, clip);
1131
1132 GrColor color = grPaint.getColor();
1133 uint8_t paintAlpha = skPaint.getAlpha();
1134 for (int run = 0; run < cacheBlob->fRunCount; run++) {
1135 this->flushRun(target, &pipelineBuilder, cacheBlob, run, color, paintAlp ha);
1136 }
1137
1138 // Now flush big glyphs
1139 this->flushBigGlyphs(cacheBlob, rt, grPaint, clip);
1140 }
OLDNEW
« no previous file with comments | « src/gpu/GrAtlasTextContext.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698