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

Side by Side Diff: src/gpu/text/GrStencilAndCoverTextContext.cpp

Issue 1760163002: Avoid drawing NVPR DIF text when text size is 0 (Closed) Base URL: https://skia.googlesource.com/skia.git@master
Patch Set: address review comment Created 4 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « src/gpu/gl/GrGLPathRendering.cpp ('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 2014 Google Inc. 2 * Copyright 2014 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 7
8 #include "GrStencilAndCoverTextContext.h" 8 #include "GrStencilAndCoverTextContext.h"
9 #include "GrAtlasTextContext.h" 9 #include "GrAtlasTextContext.h"
10 #include "GrDrawContext.h" 10 #include "GrDrawContext.h"
(...skipping 62 matching lines...) Expand 10 before | Expand all | Expand 10 after
73 73
74 void GrStencilAndCoverTextContext::drawText(GrContext* context, GrDrawContext* d c, 74 void GrStencilAndCoverTextContext::drawText(GrContext* context, GrDrawContext* d c,
75 const GrClip& clip, const GrPaint& p aint, 75 const GrClip& clip, const GrPaint& p aint,
76 const SkPaint& skPaint, const SkMatr ix& viewMatrix, 76 const SkPaint& skPaint, const SkMatr ix& viewMatrix,
77 const SkSurfaceProps& props, 77 const SkSurfaceProps& props,
78 const char text[], size_t byteLength , 78 const char text[], size_t byteLength ,
79 SkScalar x, SkScalar y, const SkIRec t& clipBounds) { 79 SkScalar x, SkScalar y, const SkIRec t& clipBounds) {
80 if (context->abandoned()) { 80 if (context->abandoned()) {
81 return; 81 return;
82 } else if (this->canDraw(skPaint, viewMatrix)) { 82 } else if (this->canDraw(skPaint, viewMatrix)) {
83 TextRun run(skPaint); 83 if (skPaint.getTextSize() > 0) {
84 GrPipelineBuilder pipelineBuilder(paint, dc->accessRenderTarget(), clip) ; 84 TextRun run(skPaint);
85 run.setText(text, byteLength, x, y); 85 GrPipelineBuilder pipelineBuilder(paint, dc->accessRenderTarget(), c lip);
86 run.draw(context, dc, &pipelineBuilder, paint.getColor(), viewMatrix, pr ops, 0, 0, 86 run.setText(text, byteLength, x, y);
87 clipBounds, fFallbackTextContext, skPaint); 87 run.draw(context, dc, &pipelineBuilder, paint.getColor(), viewMatrix , props, 0, 0,
88 clipBounds, fFallbackTextContext, skPaint);
89 }
88 return; 90 return;
89 } else if (fFallbackTextContext->canDraw(skPaint, viewMatrix, props, 91 } else if (fFallbackTextContext->canDraw(skPaint, viewMatrix, props,
90 *context->caps()->shaderCaps())) { 92 *context->caps()->shaderCaps())) {
91 fFallbackTextContext->drawText(context, dc, clip, paint, skPaint, viewMa trix, props, text, 93 fFallbackTextContext->drawText(context, dc, clip, paint, skPaint, viewMa trix, props, text,
92 byteLength, x, y, clipBounds); 94 byteLength, x, y, clipBounds);
93 return; 95 return;
94 } 96 }
95 97
96 // fall back to drawing as a path 98 // fall back to drawing as a path
97 GrTextUtils::DrawTextAsPath(context, dc, clip, skPaint, viewMatrix, text, by teLength, x, y, 99 GrTextUtils::DrawTextAsPath(context, dc, clip, skPaint, viewMatrix, text, by teLength, x, y,
98 clipBounds); 100 clipBounds);
99 } 101 }
100 102
101 void GrStencilAndCoverTextContext::drawPosText(GrContext* context, GrDrawContext * dc, 103 void GrStencilAndCoverTextContext::drawPosText(GrContext* context, GrDrawContext * dc,
102 const GrClip& clip, 104 const GrClip& clip,
103 const GrPaint& paint, 105 const GrPaint& paint,
104 const SkPaint& skPaint, 106 const SkPaint& skPaint,
105 const SkMatrix& viewMatrix, 107 const SkMatrix& viewMatrix,
106 const SkSurfaceProps& props, 108 const SkSurfaceProps& props,
107 const char text[], 109 const char text[],
108 size_t byteLength, 110 size_t byteLength,
109 const SkScalar pos[], 111 const SkScalar pos[],
110 int scalarsPerPosition, 112 int scalarsPerPosition,
111 const SkPoint& offset, 113 const SkPoint& offset,
112 const SkIRect& clipBounds) { 114 const SkIRect& clipBounds) {
113 if (context->abandoned()) { 115 if (context->abandoned()) {
114 return; 116 return;
115 } else if (this->canDraw(skPaint, viewMatrix)) { 117 } else if (this->canDraw(skPaint, viewMatrix)) {
116 TextRun run(skPaint); 118 if (skPaint.getTextSize() > 0) {
117 GrPipelineBuilder pipelineBuilder(paint, dc->accessRenderTarget(), clip) ; 119 TextRun run(skPaint);
118 run.setPosText(text, byteLength, pos, scalarsPerPosition, offset); 120 GrPipelineBuilder pipelineBuilder(paint, dc->accessRenderTarget(), c lip);
119 run.draw(context, dc, &pipelineBuilder, paint.getColor(), viewMatrix, pr ops, 0, 0, 121 run.setPosText(text, byteLength, pos, scalarsPerPosition, offset);
120 clipBounds, fFallbackTextContext, skPaint); 122 run.draw(context, dc, &pipelineBuilder, paint.getColor(), viewMatrix , props, 0, 0,
123 clipBounds, fFallbackTextContext, skPaint);
124 }
121 return; 125 return;
122 } else if (fFallbackTextContext->canDraw(skPaint, viewMatrix, props, 126 } else if (fFallbackTextContext->canDraw(skPaint, viewMatrix, props,
123 *context->caps()->shaderCaps())) { 127 *context->caps()->shaderCaps())) {
124 fFallbackTextContext->drawPosText(context, dc, clip, paint, skPaint, vie wMatrix, props, 128 fFallbackTextContext->drawPosText(context, dc, clip, paint, skPaint, vie wMatrix, props,
125 text, byteLength, pos, 129 text, byteLength, pos,
126 scalarsPerPosition, offset, clipBounds ); 130 scalarsPerPosition, offset, clipBounds );
127 return; 131 return;
128 } 132 }
129 133
130 // fall back to drawing as a path 134 // fall back to drawing as a path
(...skipping 156 matching lines...) Expand 10 before | Expand all | Expand 10 after
287 } 291 }
288 292
289 //////////////////////////////////////////////////////////////////////////////// //////////////////// 293 //////////////////////////////////////////////////////////////////////////////// ////////////////////
290 294
291 void GrStencilAndCoverTextContext::TextBlob::init(const SkTextBlob* skBlob, 295 void GrStencilAndCoverTextContext::TextBlob::init(const SkTextBlob* skBlob,
292 const SkPaint& skPaint) { 296 const SkPaint& skPaint) {
293 fCpuMemorySize = sizeof(TextBlob); 297 fCpuMemorySize = sizeof(TextBlob);
294 SkPaint runPaint(skPaint); 298 SkPaint runPaint(skPaint);
295 for (SkTextBlobRunIterator iter(skBlob); !iter.done(); iter.next()) { 299 for (SkTextBlobRunIterator iter(skBlob); !iter.done(); iter.next()) {
296 iter.applyFontToPaint(&runPaint); // No need to re-seed the paint. 300 iter.applyFontToPaint(&runPaint); // No need to re-seed the paint.
301 if (runPaint.getTextSize() <= 0) {
302 continue;
303 }
297 TextRun* run = this->addToTail(runPaint); 304 TextRun* run = this->addToTail(runPaint);
298 305
299 const char* text = reinterpret_cast<const char*>(iter.glyphs()); 306 const char* text = reinterpret_cast<const char*>(iter.glyphs());
300 size_t byteLength = sizeof(uint16_t) * iter.glyphCount(); 307 size_t byteLength = sizeof(uint16_t) * iter.glyphCount();
301 const SkPoint& runOffset = iter.offset(); 308 const SkPoint& runOffset = iter.offset();
302 309
303 switch (iter.positioning()) { 310 switch (iter.positioning()) {
304 case SkTextBlob::kDefault_Positioning: 311 case SkTextBlob::kDefault_Positioning:
305 run->setText(text, byteLength, runOffset.fX, runOffset.fY); 312 run->setText(text, byteLength, runOffset.fX, runOffset.fY);
306 break; 313 break;
(...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after
345 352
346 //////////////////////////////////////////////////////////////////////////////// //////////////////// 353 //////////////////////////////////////////////////////////////////////////////// ////////////////////
347 354
348 GrStencilAndCoverTextContext::TextRun::TextRun(const SkPaint& fontAndStroke) 355 GrStencilAndCoverTextContext::TextRun::TextRun(const SkPaint& fontAndStroke)
349 : fStroke(fontAndStroke), 356 : fStroke(fontAndStroke),
350 fFont(fontAndStroke), 357 fFont(fontAndStroke),
351 fTotalGlyphCount(0), 358 fTotalGlyphCount(0),
352 fFallbackGlyphCount(0), 359 fFallbackGlyphCount(0),
353 fDetachedGlyphCache(nullptr), 360 fDetachedGlyphCache(nullptr),
354 fLastDrawnGlyphsID(SK_InvalidUniqueID) { 361 fLastDrawnGlyphsID(SK_InvalidUniqueID) {
362 SkASSERT(fFont.getTextSize() > 0);
355 SkASSERT(!fStroke.isHairlineStyle()); // Hairlines are not supported. 363 SkASSERT(!fStroke.isHairlineStyle()); // Hairlines are not supported.
356 364
357 // Setting to "fill" ensures that no strokes get baked into font outlines. ( We use the GPU path 365 // Setting to "fill" ensures that no strokes get baked into font outlines. ( We use the GPU path
358 // rendering API for stroking). 366 // rendering API for stroking).
359 fFont.setStyle(SkPaint::kFill_Style); 367 fFont.setStyle(SkPaint::kFill_Style);
360 368
361 if (fFont.isFakeBoldText() && SkStrokeRec::kStroke_Style != fStroke.getStyle ()) { 369 if (fFont.isFakeBoldText() && SkStrokeRec::kStroke_Style != fStroke.getStyle ()) {
362 // Instead of letting fake bold get baked into the glyph outlines, do it with GPU stroke. 370 // Instead of letting fake bold get baked into the glyph outlines, do it with GPU stroke.
363 SkScalar fakeBoldScale = SkScalarInterpFunc(fFont.getTextSize(), 371 SkScalar fakeBoldScale = SkScalarInterpFunc(fFont.getTextSize(),
364 kStdFakeBoldInterpKeys, 372 kStdFakeBoldInterpKeys,
(...skipping 331 matching lines...) Expand 10 before | Expand all | Expand 10 after
696 } 704 }
697 705
698 const SkTextBlob* GrStencilAndCoverTextContext::FallbackBlobBuilder::buildIfNeed ed(int *count) { 706 const SkTextBlob* GrStencilAndCoverTextContext::FallbackBlobBuilder::buildIfNeed ed(int *count) {
699 *count = fCount; 707 *count = fCount;
700 if (fCount) { 708 if (fCount) {
701 this->flush(); 709 this->flush();
702 return fBuilder->build(); 710 return fBuilder->build();
703 } 711 }
704 return nullptr; 712 return nullptr;
705 } 713 }
OLDNEW
« no previous file with comments | « src/gpu/gl/GrGLPathRendering.cpp ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698