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 53 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
64 } | 64 } |
65 if (SkPathEffect* pe = skPaint.getPathEffect()) { | 65 if (SkPathEffect* pe = skPaint.getPathEffect()) { |
66 if (pe->asADash(nullptr) != SkPathEffect::kDash_DashType) { | 66 if (pe->asADash(nullptr) != SkPathEffect::kDash_DashType) { |
67 return false; | 67 return false; |
68 } | 68 } |
69 } | 69 } |
70 // No hairlines. They would require new paths with customized strokes for ev
ery new draw matrix. | 70 // No hairlines. They would require new paths with customized strokes for ev
ery new draw matrix. |
71 return SkPaint::kStroke_Style != skPaint.getStyle() || 0 != skPaint.getStrok
eWidth(); | 71 return SkPaint::kStroke_Style != skPaint.getStyle() || 0 != skPaint.getStrok
eWidth(); |
72 } | 72 } |
73 | 73 |
74 void GrStencilAndCoverTextContext::onDrawText(GrDrawContext* dc, GrRenderTarget*
rt, | 74 void GrStencilAndCoverTextContext::onDrawText(GrDrawContext* dc, |
75 const GrClip& clip, | 75 const GrClip& clip, |
76 const GrPaint& paint, | 76 const GrPaint& paint, |
77 const SkPaint& skPaint, | 77 const SkPaint& skPaint, |
78 const SkMatrix& viewMatrix, | 78 const SkMatrix& viewMatrix, |
79 const char text[], | 79 const char text[], |
80 size_t byteLength, | 80 size_t byteLength, |
81 SkScalar x, SkScalar y, | 81 SkScalar x, SkScalar y, |
82 const SkIRect& clipBounds) { | 82 const SkIRect& clipBounds) { |
83 TextRun run(skPaint); | 83 TextRun run(skPaint); |
84 GrPipelineBuilder pipelineBuilder(paint, rt, clip); | 84 GrPipelineBuilder pipelineBuilder(paint, dc->accessRenderTarget(), clip); |
85 run.setText(text, byteLength, x, y); | 85 run.setText(text, byteLength, x, y); |
86 run.draw(fContext, dc, &pipelineBuilder, paint.getColor(), viewMatrix, 0, 0,
clipBounds, | 86 run.draw(fContext, dc, &pipelineBuilder, paint.getColor(), viewMatrix, 0, 0,
clipBounds, |
87 fFallbackTextContext, skPaint); | 87 fFallbackTextContext, skPaint); |
88 } | 88 } |
89 | 89 |
90 void GrStencilAndCoverTextContext::onDrawPosText(GrDrawContext* dc, GrRenderTarg
et* rt, | 90 void GrStencilAndCoverTextContext::onDrawPosText(GrDrawContext* dc, |
91 const GrClip& clip, | 91 const GrClip& clip, |
92 const GrPaint& paint, | 92 const GrPaint& paint, |
93 const SkPaint& skPaint, | 93 const SkPaint& skPaint, |
94 const SkMatrix& viewMatrix, | 94 const SkMatrix& viewMatrix, |
95 const char text[], | 95 const char text[], |
96 size_t byteLength, | 96 size_t byteLength, |
97 const SkScalar pos[], | 97 const SkScalar pos[], |
98 int scalarsPerPosition, | 98 int scalarsPerPosition, |
99 const SkPoint& offset, | 99 const SkPoint& offset, |
100 const SkIRect& clipBounds) { | 100 const SkIRect& clipBounds) { |
101 TextRun run(skPaint); | 101 TextRun run(skPaint); |
102 GrPipelineBuilder pipelineBuilder(paint, rt, clip); | 102 GrPipelineBuilder pipelineBuilder(paint, dc->accessRenderTarget(), clip); |
103 run.setPosText(text, byteLength, pos, scalarsPerPosition, offset); | 103 run.setPosText(text, byteLength, pos, scalarsPerPosition, offset); |
104 run.draw(fContext, dc, &pipelineBuilder, paint.getColor(), viewMatrix, 0, 0,
clipBounds, | 104 run.draw(fContext, dc, &pipelineBuilder, paint.getColor(), viewMatrix, 0, 0,
clipBounds, |
105 fFallbackTextContext, skPaint); | 105 fFallbackTextContext, skPaint); |
106 } | 106 } |
107 | 107 |
108 void GrStencilAndCoverTextContext::drawTextBlob(GrDrawContext* dc, GrRenderTarge
t* rt, | 108 void GrStencilAndCoverTextContext::drawTextBlob(GrDrawContext* dc, |
109 const GrClip& clip, const SkPain
t& skPaint, | 109 const GrClip& clip, const SkPain
t& skPaint, |
110 const SkMatrix& viewMatrix, | 110 const SkMatrix& viewMatrix, |
111 const SkTextBlob* skBlob, SkScal
ar x, SkScalar y, | 111 const SkTextBlob* skBlob, SkScal
ar x, SkScalar y, |
112 SkDrawFilter* drawFilter, | 112 SkDrawFilter* drawFilter, |
113 const SkIRect& clipBounds) { | 113 const SkIRect& clipBounds) { |
114 if (!this->internalCanDraw(skPaint)) { | 114 if (!this->internalCanDraw(skPaint)) { |
115 fFallbackTextContext->drawTextBlob(dc, rt, clip, skPaint, viewMatrix, sk
Blob, x, y, | 115 fFallbackTextContext->drawTextBlob(dc, clip, skPaint, viewMatrix, skBlob
, x, y, |
116 drawFilter, clipBounds); | 116 drawFilter, clipBounds); |
117 return; | 117 return; |
118 } | 118 } |
119 | 119 |
120 if (drawFilter || skPaint.getPathEffect()) { | 120 if (drawFilter || skPaint.getPathEffect()) { |
121 // This draw can't be cached. | 121 // This draw can't be cached. |
122 INHERITED::drawTextBlob(dc, rt, clip, skPaint, viewMatrix, skBlob, x, y,
drawFilter, | 122 INHERITED::drawTextBlob(dc, clip, skPaint, viewMatrix, skBlob, x, y, dra
wFilter, |
123 clipBounds); | 123 clipBounds); |
124 return; | 124 return; |
125 } | 125 } |
126 | 126 |
127 if (fContext->abandoned()) { | 127 if (fContext->abandoned()) { |
128 return; | 128 return; |
129 } | 129 } |
130 | 130 |
131 GrPaint paint; | 131 GrPaint paint; |
132 if (!SkPaintToGrPaint(fContext, skPaint, viewMatrix, &paint)) { | 132 if (!SkPaintToGrPaint(fContext, skPaint, viewMatrix, &paint)) { |
133 return; | 133 return; |
134 } | 134 } |
135 | 135 |
136 const TextBlob& blob = this->findOrCreateTextBlob(skBlob, skPaint); | 136 const TextBlob& blob = this->findOrCreateTextBlob(skBlob, skPaint); |
137 GrPipelineBuilder pipelineBuilder(paint, rt, clip); | 137 GrPipelineBuilder pipelineBuilder(paint, dc->accessRenderTarget(), clip); |
138 | 138 |
139 TextBlob::Iter iter(blob); | 139 TextBlob::Iter iter(blob); |
140 for (TextRun* run = iter.get(); run; run = iter.next()) { | 140 for (TextRun* run = iter.get(); run; run = iter.next()) { |
141 run->draw(fContext, dc, &pipelineBuilder, paint.getColor(), viewMatrix,
x, y, clipBounds, | 141 run->draw(fContext, dc, &pipelineBuilder, paint.getColor(), viewMatrix,
x, y, clipBounds, |
142 fFallbackTextContext, skPaint); | 142 fFallbackTextContext, skPaint); |
143 run->releaseGlyphCache(); | 143 run->releaseGlyphCache(); |
144 } | 144 } |
145 } | 145 } |
146 | 146 |
147 const GrStencilAndCoverTextContext::TextBlob& | 147 const GrStencilAndCoverTextContext::TextBlob& |
(...skipping 330 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
478 void GrStencilAndCoverTextContext::TextRun::draw(GrContext* ctx, | 478 void GrStencilAndCoverTextContext::TextRun::draw(GrContext* ctx, |
479 GrDrawContext* dc, | 479 GrDrawContext* dc, |
480 GrPipelineBuilder* pipelineBuil
der, | 480 GrPipelineBuilder* pipelineBuil
der, |
481 GrColor color, | 481 GrColor color, |
482 const SkMatrix& viewMatrix, | 482 const SkMatrix& viewMatrix, |
483 SkScalar x, SkScalar y, | 483 SkScalar x, SkScalar y, |
484 const SkIRect& clipBounds, | 484 const SkIRect& clipBounds, |
485 GrTextContext* fallbackTextCont
ext, | 485 GrTextContext* fallbackTextCont
ext, |
486 const SkPaint& originalSkPaint)
const { | 486 const SkPaint& originalSkPaint)
const { |
487 SkASSERT(fDraw); | 487 SkASSERT(fDraw); |
488 SkASSERT(pipelineBuilder->getRenderTarget()->isStencilBufferMultisampled() |
| | 488 SkASSERT(dc->accessRenderTarget()->isStencilBufferMultisampled() || !fFont.i
sAntiAlias()); |
489 !fFont.isAntiAlias()); | |
490 | 489 |
491 if (fDraw->count()) { | 490 if (fDraw->count()) { |
492 pipelineBuilder->setState(GrPipelineBuilder::kHWAntialias_Flag, fFont.is
AntiAlias()); | 491 pipelineBuilder->setState(GrPipelineBuilder::kHWAntialias_Flag, fFont.is
AntiAlias()); |
493 | 492 |
494 GR_STATIC_CONST_SAME_STENCIL(kStencilPass, | 493 GR_STATIC_CONST_SAME_STENCIL(kStencilPass, |
495 kZero_StencilOp, | 494 kZero_StencilOp, |
496 kKeep_StencilOp, | 495 kKeep_StencilOp, |
497 kNotEqual_StencilFunc, | 496 kNotEqual_StencilFunc, |
498 0xffff, | 497 0xffff, |
499 0x0000, | 498 0x0000, |
(...skipping 28 matching lines...) Expand all Loading... |
528 GrPathRendering::kWinding_FillType, bounds); | 527 GrPathRendering::kWinding_FillType, bounds); |
529 } | 528 } |
530 | 529 |
531 if (fFallbackTextBlob) { | 530 if (fFallbackTextBlob) { |
532 SkPaint fallbackSkPaint(originalSkPaint); | 531 SkPaint fallbackSkPaint(originalSkPaint); |
533 fStroke.applyToPaint(&fallbackSkPaint); | 532 fStroke.applyToPaint(&fallbackSkPaint); |
534 if (!fStroke.isFillStyle()) { | 533 if (!fStroke.isFillStyle()) { |
535 fallbackSkPaint.setStrokeWidth(fStroke.getWidth() * fTextRatio); | 534 fallbackSkPaint.setStrokeWidth(fStroke.getWidth() * fTextRatio); |
536 } | 535 } |
537 | 536 |
538 fallbackTextContext->drawTextBlob(dc, pipelineBuilder->getRenderTarget()
, | 537 fallbackTextContext->drawTextBlob(dc, pipelineBuilder->clip(), fallbackS
kPaint, viewMatrix, |
539 pipelineBuilder->clip(), fallbackSkPai
nt, viewMatrix, | |
540 fFallbackTextBlob, x, y, nullptr, clip
Bounds); | 538 fFallbackTextBlob, x, y, nullptr, clip
Bounds); |
541 } | 539 } |
542 } | 540 } |
543 | 541 |
544 SkGlyphCache* GrStencilAndCoverTextContext::TextRun::getGlyphCache() const { | 542 SkGlyphCache* GrStencilAndCoverTextContext::TextRun::getGlyphCache() const { |
545 if (!fDetachedGlyphCache) { | 543 if (!fDetachedGlyphCache) { |
546 fDetachedGlyphCache = fFont.detachCache(nullptr, nullptr, true /*ignoreG
amma*/); | 544 fDetachedGlyphCache = fFont.detachCache(nullptr, nullptr, true /*ignoreG
amma*/); |
547 } | 545 } |
548 return fDetachedGlyphCache; | 546 return fDetachedGlyphCache; |
549 } | 547 } |
(...skipping 59 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
609 fBuffIdx = 0; | 607 fBuffIdx = 0; |
610 } | 608 } |
611 | 609 |
612 const SkTextBlob* GrStencilAndCoverTextContext::FallbackBlobBuilder::buildIfInit
ialized() { | 610 const SkTextBlob* GrStencilAndCoverTextContext::FallbackBlobBuilder::buildIfInit
ialized() { |
613 if (!this->isInitialized()) { | 611 if (!this->isInitialized()) { |
614 return nullptr; | 612 return nullptr; |
615 } | 613 } |
616 this->flush(); | 614 this->flush(); |
617 return fBuilder->build(); | 615 return fBuilder->build(); |
618 } | 616 } |
OLD | NEW |