OLD | NEW |
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 19 matching lines...) Expand all Loading... |
30 template<typename Key, typename Val> static void delete_hash_map_entry(const Key
&, Val* val) { | 30 template<typename Key, typename Val> static void delete_hash_map_entry(const Key
&, Val* val) { |
31 SkASSERT(*val); | 31 SkASSERT(*val); |
32 delete *val; | 32 delete *val; |
33 } | 33 } |
34 | 34 |
35 template<typename T> static void delete_hash_table_entry(T* val) { | 35 template<typename T> static void delete_hash_table_entry(T* val) { |
36 SkASSERT(*val); | 36 SkASSERT(*val); |
37 delete *val; | 37 delete *val; |
38 } | 38 } |
39 | 39 |
40 GrStencilAndCoverTextContext::GrStencilAndCoverTextContext(GrContext* context, | 40 GrStencilAndCoverTextContext::GrStencilAndCoverTextContext(GrContext* context) |
41 const SkSurfaceProps&
surfaceProps) | 41 : INHERITED(context) |
42 : INHERITED(context, surfaceProps) | |
43 , fFallbackTextContext(nullptr) | 42 , fFallbackTextContext(nullptr) |
44 , fCacheSize(0) { | 43 , fCacheSize(0) { |
45 } | 44 } |
46 | 45 |
47 GrStencilAndCoverTextContext* | 46 GrStencilAndCoverTextContext* |
48 GrStencilAndCoverTextContext::Create(GrContext* context, const SkSurfaceProps& s
urfaceProps) { | 47 GrStencilAndCoverTextContext::Create(GrContext* context) { |
49 GrStencilAndCoverTextContext* textContext = | 48 GrStencilAndCoverTextContext* textContext = |
50 new GrStencilAndCoverTextContext(context, surfaceProps); | 49 new GrStencilAndCoverTextContext(context); |
51 textContext->fFallbackTextContext = GrAtlasTextContext::Create(context, surf
aceProps); | 50 textContext->fFallbackTextContext = GrAtlasTextContext::Create(context); |
52 | 51 |
53 return textContext; | 52 return textContext; |
54 } | 53 } |
55 | 54 |
56 GrStencilAndCoverTextContext::~GrStencilAndCoverTextContext() { | 55 GrStencilAndCoverTextContext::~GrStencilAndCoverTextContext() { |
57 delete fFallbackTextContext; | 56 delete fFallbackTextContext; |
58 fBlobIdCache.foreach(delete_hash_map_entry<uint32_t, TextBlob*>); | 57 fBlobIdCache.foreach(delete_hash_map_entry<uint32_t, TextBlob*>); |
59 fBlobKeyCache.foreach(delete_hash_table_entry<TextBlob*>); | 58 fBlobKeyCache.foreach(delete_hash_table_entry<TextBlob*>); |
60 } | 59 } |
61 | 60 |
62 bool GrStencilAndCoverTextContext::internalCanDraw(const SkPaint& skPaint) { | 61 bool GrStencilAndCoverTextContext::internalCanDraw(const SkPaint& skPaint) { |
63 if (skPaint.getRasterizer()) { | 62 if (skPaint.getRasterizer()) { |
64 return false; | 63 return false; |
65 } | 64 } |
66 if (skPaint.getMaskFilter()) { | 65 if (skPaint.getMaskFilter()) { |
67 return false; | 66 return false; |
68 } | 67 } |
69 if (SkPathEffect* pe = skPaint.getPathEffect()) { | 68 if (SkPathEffect* pe = skPaint.getPathEffect()) { |
70 if (pe->asADash(nullptr) != SkPathEffect::kDash_DashType) { | 69 if (pe->asADash(nullptr) != SkPathEffect::kDash_DashType) { |
71 return false; | 70 return false; |
72 } | 71 } |
73 } | 72 } |
74 // No hairlines. They would require new paths with customized strokes for ev
ery new draw matrix. | 73 // No hairlines. They would require new paths with customized strokes for ev
ery new draw matrix. |
75 return SkPaint::kStroke_Style != skPaint.getStyle() || 0 != skPaint.getStrok
eWidth(); | 74 return SkPaint::kStroke_Style != skPaint.getStyle() || 0 != skPaint.getStrok
eWidth(); |
76 } | 75 } |
77 | 76 |
78 void GrStencilAndCoverTextContext::drawText(GrDrawContext* dc, | 77 void GrStencilAndCoverTextContext::drawText(GrDrawContext* dc, |
79 const GrClip& clip, const GrPaint& p
aint, | 78 const GrClip& clip, const GrPaint& p
aint, |
80 const SkPaint& skPaint, const SkMatr
ix& viewMatrix, | 79 const SkPaint& skPaint, const SkMatr
ix& viewMatrix, |
| 80 const SkSurfaceProps& props, |
81 const char text[], size_t byteLength
, | 81 const char text[], size_t byteLength
, |
82 SkScalar x, SkScalar y, const SkIRec
t& clipBounds) { | 82 SkScalar x, SkScalar y, const SkIRec
t& clipBounds) { |
83 if (fContext->abandoned()) { | 83 if (fContext->abandoned()) { |
84 return; | 84 return; |
85 } else if (this->canDraw(skPaint, viewMatrix)) { | 85 } else if (this->canDraw(skPaint, viewMatrix)) { |
86 TextRun run(skPaint); | 86 TextRun run(skPaint); |
87 GrPipelineBuilder pipelineBuilder(paint, dc->accessRenderTarget(), clip)
; | 87 GrPipelineBuilder pipelineBuilder(paint, dc->accessRenderTarget(), clip)
; |
88 run.setText(text, byteLength, x, y); | 88 run.setText(text, byteLength, x, y); |
89 run.draw(fContext, dc, &pipelineBuilder, paint.getColor(), viewMatrix, 0
, 0, clipBounds, | 89 run.draw(fContext, dc, &pipelineBuilder, paint.getColor(), viewMatrix, p
rops, 0, 0, |
90 fFallbackTextContext, skPaint); | 90 clipBounds, fFallbackTextContext, skPaint); |
91 return; | 91 return; |
92 } else if (fFallbackTextContext->canDraw(skPaint, viewMatrix)) { | 92 } else if (fFallbackTextContext->canDraw(skPaint, viewMatrix, props)) { |
93 fFallbackTextContext->drawText(dc, clip, paint, skPaint, viewMatrix, tex
t, | 93 fFallbackTextContext->drawText(dc, clip, paint, skPaint, viewMatrix, pro
ps, text, |
94 byteLength, x, y, clipBounds); | 94 byteLength, x, y, clipBounds); |
95 return; | 95 return; |
96 } | 96 } |
97 | 97 |
98 // fall back to drawing as a path | 98 // fall back to drawing as a path |
99 GrTextUtils::DrawTextAsPath(fContext, dc, clip, skPaint, viewMatrix, text, b
yteLength, x, y, | 99 GrTextUtils::DrawTextAsPath(fContext, dc, clip, skPaint, viewMatrix, text, b
yteLength, x, y, |
100 clipBounds); | 100 clipBounds); |
101 } | 101 } |
102 | 102 |
103 void GrStencilAndCoverTextContext::drawPosText(GrDrawContext* dc, | 103 void GrStencilAndCoverTextContext::drawPosText(GrDrawContext* dc, |
104 const GrClip& clip, | 104 const GrClip& clip, |
105 const GrPaint& paint, | 105 const GrPaint& paint, |
106 const SkPaint& skPaint, | 106 const SkPaint& skPaint, |
107 const SkMatrix& viewMatrix, | 107 const SkMatrix& viewMatrix, |
| 108 const SkSurfaceProps& props, |
108 const char text[], | 109 const char text[], |
109 size_t byteLength, | 110 size_t byteLength, |
110 const SkScalar pos[], | 111 const SkScalar pos[], |
111 int scalarsPerPosition, | 112 int scalarsPerPosition, |
112 const SkPoint& offset, | 113 const SkPoint& offset, |
113 const SkIRect& clipBounds) { | 114 const SkIRect& clipBounds) { |
114 if (fContext->abandoned()) { | 115 if (fContext->abandoned()) { |
115 return; | 116 return; |
116 } else if (this->canDraw(skPaint, viewMatrix)) { | 117 } else if (this->canDraw(skPaint, viewMatrix)) { |
117 TextRun run(skPaint); | 118 TextRun run(skPaint); |
118 GrPipelineBuilder pipelineBuilder(paint, dc->accessRenderTarget(), clip)
; | 119 GrPipelineBuilder pipelineBuilder(paint, dc->accessRenderTarget(), clip)
; |
119 run.setPosText(text, byteLength, pos, scalarsPerPosition, offset); | 120 run.setPosText(text, byteLength, pos, scalarsPerPosition, offset); |
120 run.draw(fContext, dc, &pipelineBuilder, paint.getColor(), viewMatrix, 0
, 0, clipBounds, | 121 run.draw(fContext, dc, &pipelineBuilder, paint.getColor(), viewMatrix, p
rops, 0, 0, |
121 fFallbackTextContext, skPaint); | 122 clipBounds, fFallbackTextContext, skPaint); |
122 return; | 123 return; |
123 } else if (fFallbackTextContext->canDraw(skPaint, viewMatrix)) { | 124 } else if (fFallbackTextContext->canDraw(skPaint, viewMatrix, props)) { |
124 fFallbackTextContext->drawPosText(dc, clip, paint, skPaint, viewMatrix, | 125 fFallbackTextContext->drawPosText(dc, clip, paint, skPaint, viewMatrix,
props, |
125 text, byteLength, pos, | 126 text, byteLength, pos, |
126 scalarsPerPosition, offset, clipBounds
); | 127 scalarsPerPosition, offset, clipBounds
); |
127 return; | 128 return; |
128 } | 129 } |
129 | 130 |
130 // fall back to drawing as a path | 131 // fall back to drawing as a path |
131 GrTextUtils::DrawPosTextAsPath(fContext, dc, fSurfaceProps, clip, skPaint, v
iewMatrix, text, | 132 GrTextUtils::DrawPosTextAsPath(fContext, dc, props, clip, skPaint, viewMatri
x, text, |
132 byteLength, pos, scalarsPerPosition, offset,
clipBounds); | 133 byteLength, pos, scalarsPerPosition, offset,
clipBounds); |
133 } | 134 } |
134 | 135 |
135 void GrStencilAndCoverTextContext::uncachedDrawTextBlob(GrDrawContext* dc, | 136 void GrStencilAndCoverTextContext::uncachedDrawTextBlob(GrDrawContext* dc, |
136 const GrClip& clip, cons
t SkPaint& skPaint, | 137 const GrClip& clip, cons
t SkPaint& skPaint, |
137 const SkMatrix& viewMatr
ix, | 138 const SkMatrix& viewMatr
ix, |
| 139 const SkSurfaceProps& pr
ops, |
138 const SkTextBlob* blob, | 140 const SkTextBlob* blob, |
139 SkScalar x, SkScalar y, | 141 SkScalar x, SkScalar y, |
140 SkDrawFilter* drawFilter
, | 142 SkDrawFilter* drawFilter
, |
141 const SkIRect& clipBound
s) { | 143 const SkIRect& clipBound
s) { |
142 SkPaint runPaint = skPaint; | 144 SkPaint runPaint = skPaint; |
143 | 145 |
144 SkTextBlobRunIterator it(blob); | 146 SkTextBlobRunIterator it(blob); |
145 for (;!it.done(); it.next()) { | 147 for (;!it.done(); it.next()) { |
146 size_t textLen = it.glyphCount() * sizeof(uint16_t); | 148 size_t textLen = it.glyphCount() * sizeof(uint16_t); |
147 const SkPoint& offset = it.offset(); | 149 const SkPoint& offset = it.offset(); |
148 | 150 |
149 // applyFontToPaint() always overwrites the exact same attributes, | 151 // applyFontToPaint() always overwrites the exact same attributes, |
150 // so it is safe to not re-seed the paint for this reason. | 152 // so it is safe to not re-seed the paint for this reason. |
151 it.applyFontToPaint(&runPaint); | 153 it.applyFontToPaint(&runPaint); |
152 | 154 |
153 if (drawFilter && !drawFilter->filter(&runPaint, SkDrawFilter::kText_Typ
e)) { | 155 if (drawFilter && !drawFilter->filter(&runPaint, SkDrawFilter::kText_Typ
e)) { |
154 // A false return from filter() means we should abort the current dr
aw. | 156 // A false return from filter() means we should abort the current dr
aw. |
155 runPaint = skPaint; | 157 runPaint = skPaint; |
156 continue; | 158 continue; |
157 } | 159 } |
158 | 160 |
159 runPaint.setFlags(FilterTextFlags(fSurfaceProps, runPaint)); | 161 runPaint.setFlags(FilterTextFlags(props, runPaint)); |
160 | 162 |
161 GrPaint grPaint; | 163 GrPaint grPaint; |
162 if (!SkPaintToGrPaint(fContext, runPaint, viewMatrix, &grPaint)) { | 164 if (!SkPaintToGrPaint(fContext, runPaint, viewMatrix, &grPaint)) { |
163 return; | 165 return; |
164 } | 166 } |
165 | 167 |
166 switch (it.positioning()) { | 168 switch (it.positioning()) { |
167 case SkTextBlob::kDefault_Positioning: | 169 case SkTextBlob::kDefault_Positioning: |
168 this->drawText(dc, clip, grPaint, runPaint, viewMatrix, (const c
har *)it.glyphs(), | 170 this->drawText(dc, clip, grPaint, runPaint, viewMatrix, props, |
| 171 (const char *)it.glyphs(), |
169 textLen, x + offset.x(), y + offset.y(), clipBoun
ds); | 172 textLen, x + offset.x(), y + offset.y(), clipBoun
ds); |
170 break; | 173 break; |
171 case SkTextBlob::kHorizontal_Positioning: | 174 case SkTextBlob::kHorizontal_Positioning: |
172 this->drawPosText(dc, clip, grPaint, runPaint, viewMatrix, (cons
t char*)it.glyphs(), | 175 this->drawPosText(dc, clip, grPaint, runPaint, viewMatrix, props
, |
| 176 (const char*)it.glyphs(), |
173 textLen, it.pos(), 1, SkPoint::Make(x, y + off
set.y()), | 177 textLen, it.pos(), 1, SkPoint::Make(x, y + off
set.y()), |
174 clipBounds); | 178 clipBounds); |
175 break; | 179 break; |
176 case SkTextBlob::kFull_Positioning: | 180 case SkTextBlob::kFull_Positioning: |
177 this->drawPosText(dc, clip, grPaint, runPaint, viewMatrix, (cons
t char*)it.glyphs(), | 181 this->drawPosText(dc, clip, grPaint, runPaint, viewMatrix, props
, |
| 182 (const char*)it.glyphs(), |
178 textLen, it.pos(), 2, SkPoint::Make(x, y), cli
pBounds); | 183 textLen, it.pos(), 2, SkPoint::Make(x, y), cli
pBounds); |
179 break; | 184 break; |
180 } | 185 } |
181 | 186 |
182 if (drawFilter) { | 187 if (drawFilter) { |
183 // A draw filter may change the paint arbitrarily, so we must re-see
d in this case. | 188 // A draw filter may change the paint arbitrarily, so we must re-see
d in this case. |
184 runPaint = skPaint; | 189 runPaint = skPaint; |
185 } | 190 } |
186 } | 191 } |
187 } | 192 } |
188 | 193 |
189 void GrStencilAndCoverTextContext::drawTextBlob(GrDrawContext* dc, | 194 void GrStencilAndCoverTextContext::drawTextBlob(GrDrawContext* dc, |
190 const GrClip& clip, const SkPain
t& skPaint, | 195 const GrClip& clip, const SkPain
t& skPaint, |
191 const SkMatrix& viewMatrix, | 196 const SkMatrix& viewMatrix, |
| 197 const SkSurfaceProps& props, |
192 const SkTextBlob* skBlob, SkScal
ar x, SkScalar y, | 198 const SkTextBlob* skBlob, SkScal
ar x, SkScalar y, |
193 SkDrawFilter* drawFilter, | 199 SkDrawFilter* drawFilter, |
194 const SkIRect& clipBounds) { | 200 const SkIRect& clipBounds) { |
195 if (fContext->abandoned()) { | 201 if (fContext->abandoned()) { |
196 return; | 202 return; |
197 } | 203 } |
198 | 204 |
199 if (!this->internalCanDraw(skPaint)) { | 205 if (!this->internalCanDraw(skPaint)) { |
200 fFallbackTextContext->drawTextBlob(dc, clip, skPaint, viewMatrix, skBlob
, x, y, | 206 fFallbackTextContext->drawTextBlob(dc, clip, skPaint, viewMatrix, props,
skBlob, x, y, |
201 drawFilter, clipBounds); | 207 drawFilter, clipBounds); |
202 return; | 208 return; |
203 } | 209 } |
204 | 210 |
205 if (drawFilter || skPaint.getPathEffect()) { | 211 if (drawFilter || skPaint.getPathEffect()) { |
206 // This draw can't be cached. | 212 // This draw can't be cached. |
207 this->uncachedDrawTextBlob(dc, clip, skPaint, viewMatrix, skBlob, x, y,
drawFilter, | 213 this->uncachedDrawTextBlob(dc, clip, skPaint, viewMatrix, props, skBlob,
x, y, drawFilter, |
208 clipBounds); | 214 clipBounds); |
209 return; | 215 return; |
210 } | 216 } |
211 | 217 |
212 GrPaint paint; | 218 GrPaint paint; |
213 if (!SkPaintToGrPaint(fContext, skPaint, viewMatrix, &paint)) { | 219 if (!SkPaintToGrPaint(fContext, skPaint, viewMatrix, &paint)) { |
214 return; | 220 return; |
215 } | 221 } |
216 | 222 |
217 const TextBlob& blob = this->findOrCreateTextBlob(skBlob, skPaint); | 223 const TextBlob& blob = this->findOrCreateTextBlob(skBlob, skPaint); |
218 GrPipelineBuilder pipelineBuilder(paint, dc->accessRenderTarget(), clip); | 224 GrPipelineBuilder pipelineBuilder(paint, dc->accessRenderTarget(), clip); |
219 | 225 |
220 TextBlob::Iter iter(blob); | 226 TextBlob::Iter iter(blob); |
221 for (TextRun* run = iter.get(); run; run = iter.next()) { | 227 for (TextRun* run = iter.get(); run; run = iter.next()) { |
222 run->draw(fContext, dc, &pipelineBuilder, paint.getColor(), viewMatrix,
x, y, clipBounds, | 228 run->draw(fContext, dc, &pipelineBuilder, paint.getColor(), viewMatrix,
props, x, y, |
223 fFallbackTextContext, skPaint); | 229 clipBounds, fFallbackTextContext, skPaint); |
224 run->releaseGlyphCache(); | 230 run->releaseGlyphCache(); |
225 } | 231 } |
226 } | 232 } |
227 | 233 |
228 const GrStencilAndCoverTextContext::TextBlob& | 234 const GrStencilAndCoverTextContext::TextBlob& |
229 GrStencilAndCoverTextContext::findOrCreateTextBlob(const SkTextBlob* skBlob, | 235 GrStencilAndCoverTextContext::findOrCreateTextBlob(const SkTextBlob* skBlob, |
230 const SkPaint& skPaint) { | 236 const SkPaint& skPaint) { |
231 // The font-related parameters are baked into the text blob and will overrid
e this skPaint, so | 237 // The font-related parameters are baked into the text blob and will overrid
e this skPaint, so |
232 // the only remaining properties that can affect a TextBlob are the ones rel
ated to stroke. | 238 // the only remaining properties that can affect a TextBlob are the ones rel
ated to stroke. |
233 if (SkPaint::kFill_Style == skPaint.getStyle()) { // Fast path. | 239 if (SkPaint::kFill_Style == skPaint.getStyle()) { // Fast path. |
(...skipping 321 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
555 fInstanceData->append(glyph.getGlyphID(), fTextInverseRatio * pos.x(), | 561 fInstanceData->append(glyph.getGlyphID(), fTextInverseRatio * pos.x(), |
556 fTextInverseRatio * pos.y()); | 562 fTextInverseRatio * pos.y()); |
557 } | 563 } |
558 } | 564 } |
559 | 565 |
560 void GrStencilAndCoverTextContext::TextRun::draw(GrContext* ctx, | 566 void GrStencilAndCoverTextContext::TextRun::draw(GrContext* ctx, |
561 GrDrawContext* dc, | 567 GrDrawContext* dc, |
562 GrPipelineBuilder* pipelineBuil
der, | 568 GrPipelineBuilder* pipelineBuil
der, |
563 GrColor color, | 569 GrColor color, |
564 const SkMatrix& viewMatrix, | 570 const SkMatrix& viewMatrix, |
| 571 const SkSurfaceProps& props, |
565 SkScalar x, SkScalar y, | 572 SkScalar x, SkScalar y, |
566 const SkIRect& clipBounds, | 573 const SkIRect& clipBounds, |
567 GrTextContext* fallbackTextCont
ext, | 574 GrTextContext* fallbackTextCont
ext, |
568 const SkPaint& originalSkPaint)
const { | 575 const SkPaint& originalSkPaint)
const { |
569 SkASSERT(fInstanceData); | 576 SkASSERT(fInstanceData); |
570 SkASSERT(dc->accessRenderTarget()->isStencilBufferMultisampled() || !fFont.i
sAntiAlias()); | 577 SkASSERT(dc->accessRenderTarget()->isStencilBufferMultisampled() || !fFont.i
sAntiAlias()); |
571 | 578 |
572 if (fInstanceData->count()) { | 579 if (fInstanceData->count()) { |
573 pipelineBuilder->setState(GrPipelineBuilder::kHWAntialias_Flag, fFont.is
AntiAlias()); | 580 pipelineBuilder->setState(GrPipelineBuilder::kHWAntialias_Flag, fFont.is
AntiAlias()); |
574 | 581 |
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
607 } | 614 } |
608 | 615 |
609 if (fFallbackTextBlob) { | 616 if (fFallbackTextBlob) { |
610 SkPaint fallbackSkPaint(originalSkPaint); | 617 SkPaint fallbackSkPaint(originalSkPaint); |
611 fStroke.applyToPaint(&fallbackSkPaint); | 618 fStroke.applyToPaint(&fallbackSkPaint); |
612 if (!fStroke.isFillStyle()) { | 619 if (!fStroke.isFillStyle()) { |
613 fallbackSkPaint.setStrokeWidth(fStroke.getWidth() * fTextRatio); | 620 fallbackSkPaint.setStrokeWidth(fStroke.getWidth() * fTextRatio); |
614 } | 621 } |
615 | 622 |
616 fallbackTextContext->drawTextBlob(dc, pipelineBuilder->clip(), fallbackS
kPaint, viewMatrix, | 623 fallbackTextContext->drawTextBlob(dc, pipelineBuilder->clip(), fallbackS
kPaint, viewMatrix, |
617 fFallbackTextBlob, x, y, nullptr, clip
Bounds); | 624 props, fFallbackTextBlob, x, y, nullpt
r, clipBounds); |
618 } | 625 } |
619 } | 626 } |
620 | 627 |
621 SkGlyphCache* GrStencilAndCoverTextContext::TextRun::getGlyphCache() const { | 628 SkGlyphCache* GrStencilAndCoverTextContext::TextRun::getGlyphCache() const { |
622 if (!fDetachedGlyphCache) { | 629 if (!fDetachedGlyphCache) { |
623 fDetachedGlyphCache = fFont.detachCache(nullptr, nullptr, true /*ignoreG
amma*/); | 630 fDetachedGlyphCache = fFont.detachCache(nullptr, nullptr, true /*ignoreG
amma*/); |
624 } | 631 } |
625 return fDetachedGlyphCache; | 632 return fDetachedGlyphCache; |
626 } | 633 } |
627 | 634 |
(...skipping 60 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
688 } | 695 } |
689 | 696 |
690 const SkTextBlob* GrStencilAndCoverTextContext::FallbackBlobBuilder::buildIfNeed
ed(int *count) { | 697 const SkTextBlob* GrStencilAndCoverTextContext::FallbackBlobBuilder::buildIfNeed
ed(int *count) { |
691 *count = fCount; | 698 *count = fCount; |
692 if (fCount) { | 699 if (fCount) { |
693 this->flush(); | 700 this->flush(); |
694 return fBuilder->build(); | 701 return fBuilder->build(); |
695 } | 702 } |
696 return nullptr; | 703 return nullptr; |
697 } | 704 } |
OLD | NEW |