OLD | NEW |
1 /* | 1 /* |
2 * Copyright 2013 Google Inc. | 2 * Copyright 2013 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 "GrDistanceFieldTextContext.h" | 8 #include "GrDistanceFieldTextContext.h" |
9 #include "GrAtlas.h" | 9 #include "GrAtlas.h" |
10 #include "GrBitmapTextContext.h" | 10 #include "GrBitmapTextContext.h" |
(...skipping 94 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
105 } | 105 } |
106 | 106 |
107 // TODO: add some stroking support | 107 // TODO: add some stroking support |
108 if (paint.getStyle() != SkPaint::kFill_Style) { | 108 if (paint.getStyle() != SkPaint::kFill_Style) { |
109 return false; | 109 return false; |
110 } | 110 } |
111 | 111 |
112 return true; | 112 return true; |
113 } | 113 } |
114 | 114 |
115 inline void GrDistanceFieldTextContext::init(const GrPaint& paint, const SkPaint
& skPaint) { | 115 inline void GrDistanceFieldTextContext::init(GrRenderTarget* rt, const GrPaint&
paint, |
116 GrTextContext::init(paint, skPaint); | 116 const SkPaint& skPaint) { |
| 117 GrTextContext::init(rt, paint, skPaint); |
117 | 118 |
118 fStrike = NULL; | 119 fStrike = NULL; |
119 | 120 |
120 const SkMatrix& ctm = fViewMatrix; | 121 const SkMatrix& ctm = fViewMatrix; |
121 | 122 |
122 // getMaxScale doesn't support perspective, so neither do we at the moment | 123 // getMaxScale doesn't support perspective, so neither do we at the moment |
123 SkASSERT(!ctm.hasPerspective()); | 124 SkASSERT(!ctm.hasPerspective()); |
124 SkScalar maxScale = ctm.getMaxScale(); | 125 SkScalar maxScale = ctm.getMaxScale(); |
125 SkScalar textSize = fSkPaint.getTextSize(); | 126 SkScalar textSize = fSkPaint.getTextSize(); |
126 SkScalar scaledTextSize = textSize; | 127 SkScalar scaledTextSize = textSize; |
(...skipping 72 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
199 if (NULL == *gammaTexture) { | 200 if (NULL == *gammaTexture) { |
200 return; | 201 return; |
201 } | 202 } |
202 | 203 |
203 (*gammaTexture)->writePixels(0, 0, width, height, | 204 (*gammaTexture)->writePixels(0, 0, width, height, |
204 (*gammaTexture)->config(), data.get(), 0, | 205 (*gammaTexture)->config(), data.get(), 0, |
205 GrContext::kDontFlush_PixelOpsFlag); | 206 GrContext::kDontFlush_PixelOpsFlag); |
206 } | 207 } |
207 } | 208 } |
208 | 209 |
209 void GrDistanceFieldTextContext::onDrawText(const GrPaint& paint, const SkPaint&
skPaint, | 210 void GrDistanceFieldTextContext::onDrawText(GrRenderTarget* rt, const GrPaint& p
aint, |
210 const SkMatrix& viewMatrix, | 211 const SkPaint& skPaint, const SkMatr
ix& viewMatrix, |
211 const char text[], size_t byteLength
, | 212 const char text[], size_t byteLength
, |
212 SkScalar x, SkScalar y) { | 213 SkScalar x, SkScalar y) { |
213 SkASSERT(byteLength == 0 || text != NULL); | 214 SkASSERT(byteLength == 0 || text != NULL); |
214 | 215 |
215 // nothing to draw | 216 // nothing to draw |
216 if (text == NULL || byteLength == 0) { | 217 if (text == NULL || byteLength == 0) { |
217 return; | 218 return; |
218 } | 219 } |
219 | 220 |
220 fViewMatrix = viewMatrix; | 221 fViewMatrix = viewMatrix; |
(...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
260 alignX = SkScalarHalf(alignX); | 261 alignX = SkScalarHalf(alignX); |
261 alignY = SkScalarHalf(alignY); | 262 alignY = SkScalarHalf(alignY); |
262 } else if (skPaint.getTextAlign() == SkPaint::kLeft_Align) { | 263 } else if (skPaint.getTextAlign() == SkPaint::kLeft_Align) { |
263 alignX = 0; | 264 alignX = 0; |
264 alignY = 0; | 265 alignY = 0; |
265 } | 266 } |
266 x -= alignX; | 267 x -= alignX; |
267 y -= alignY; | 268 y -= alignY; |
268 SkPoint offset = SkPoint::Make(x, y); | 269 SkPoint offset = SkPoint::Make(x, y); |
269 | 270 |
270 this->drawPosText(paint, skPaint, viewMatrix, text, byteLength, positions.be
gin(), 2, offset); | 271 this->drawPosText(rt, paint, skPaint, viewMatrix, text, byteLength, position
s.begin(), 2, |
| 272 offset); |
271 } | 273 } |
272 | 274 |
273 void GrDistanceFieldTextContext::onDrawPosText(const GrPaint& paint, const SkPai
nt& skPaint, | 275 void GrDistanceFieldTextContext::onDrawPosText(GrRenderTarget* rt, const GrPaint
& paint, |
274 const SkMatrix& viewMatrix, | 276 const SkPaint& skPaint, const SkM
atrix& viewMatrix, |
275 const char text[], size_t byteLen
gth, | 277 const char text[], size_t byteLen
gth, |
276 const SkScalar pos[], int scalars
PerPosition, | 278 const SkScalar pos[], int scalars
PerPosition, |
277 const SkPoint& offset) { | 279 const SkPoint& offset) { |
278 | 280 |
279 SkASSERT(byteLength == 0 || text != NULL); | 281 SkASSERT(byteLength == 0 || text != NULL); |
280 SkASSERT(1 == scalarsPerPosition || 2 == scalarsPerPosition); | 282 SkASSERT(1 == scalarsPerPosition || 2 == scalarsPerPosition); |
281 | 283 |
282 // nothing to draw | 284 // nothing to draw |
283 if (text == NULL || byteLength == 0 /* no raster clip? || fRC->isEmpty()*/)
{ | 285 if (text == NULL || byteLength == 0 /* no raster clip? || fRC->isEmpty()*/)
{ |
284 return; | 286 return; |
285 } | 287 } |
286 | 288 |
287 fViewMatrix = viewMatrix; | 289 fViewMatrix = viewMatrix; |
288 this->init(paint, skPaint); | 290 this->init(rt, paint, skPaint); |
289 | 291 |
290 SkDrawCacheProc glyphCacheProc = fSkPaint.getDrawCacheProc(); | 292 SkDrawCacheProc glyphCacheProc = fSkPaint.getDrawCacheProc(); |
291 | 293 |
292 SkAutoGlyphCacheNoGamma autoCache(fSkPaint, &fDeviceProperties, NULL); | 294 SkAutoGlyphCacheNoGamma autoCache(fSkPaint, &fDeviceProperties, NULL); |
293 SkGlyphCache* cache = autoCache.getCache(); | 295 SkGlyphCache* cache = autoCache.getCache(); |
294 GrFontScaler* fontScaler = GetGrFontScaler(cache); | 296 GrFontScaler* fontScaler = GetGrFontScaler(cache); |
295 | 297 |
296 setup_gamma_texture(fContext, cache, fDeviceProperties, &fGammaTexture); | 298 setup_gamma_texture(fContext, cache, fDeviceProperties, &fGammaTexture); |
297 | 299 |
298 int numGlyphs = fSkPaint.textToGlyphs(text, byteLength, NULL); | 300 int numGlyphs = fSkPaint.textToGlyphs(text, byteLength, NULL); |
(...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
353 } | 355 } |
354 } | 356 } |
355 } | 357 } |
356 pos += scalarsPerPosition; | 358 pos += scalarsPerPosition; |
357 } | 359 } |
358 } | 360 } |
359 | 361 |
360 this->finish(); | 362 this->finish(); |
361 | 363 |
362 if (fallbackTxt.count() > 0) { | 364 if (fallbackTxt.count() > 0) { |
363 fFallbackTextContext->drawPosText(paint, skPaint, viewMatrix, fallbackTx
t.begin(), | 365 fFallbackTextContext->drawPosText(rt, paint, skPaint, viewMatrix, fallba
ckTxt.begin(), |
364 fallbackTxt.count(), fallbackPos.begin
(), | 366 fallbackTxt.count(), fallbackPos.begin
(), |
365 scalarsPerPosition, offset); | 367 scalarsPerPosition, offset); |
366 } | 368 } |
367 } | 369 } |
368 | 370 |
369 static inline GrColor skcolor_to_grcolor_nopremultiply(SkColor c) { | 371 static inline GrColor skcolor_to_grcolor_nopremultiply(SkColor c) { |
370 unsigned r = SkColorGetR(c); | 372 unsigned r = SkColorGetR(c); |
371 unsigned g = SkColorGetG(c); | 373 unsigned g = SkColorGetG(c); |
372 unsigned b = SkColorGetB(c); | 374 unsigned b = SkColorGetB(c); |
373 return GrColorPackRGBA(r, g, b, 0xff); | 375 return GrColorPackRGBA(r, g, b, 0xff); |
(...skipping 188 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
562 this->flush(); | 564 this->flush(); |
563 | 565 |
564 SkMatrix ctm; | 566 SkMatrix ctm; |
565 ctm.setScale(fTextRatio, fTextRatio); | 567 ctm.setScale(fTextRatio, fTextRatio); |
566 ctm.postTranslate(sx - dx, sy - dy); | 568 ctm.postTranslate(sx - dx, sy - dy); |
567 | 569 |
568 SkPath tmpPath(*glyph->fPath); | 570 SkPath tmpPath(*glyph->fPath); |
569 tmpPath.transform(ctm); | 571 tmpPath.transform(ctm); |
570 | 572 |
571 GrStrokeInfo strokeInfo(SkStrokeRec::kFill_InitStyle); | 573 GrStrokeInfo strokeInfo(SkStrokeRec::kFill_InitStyle); |
572 fContext->drawPath(fPaint, fViewMatrix, tmpPath, strokeInfo); | 574 fContext->drawPath(fRenderTarget, fPaint, fViewMatrix, tmpPath, stro
keInfo); |
573 | 575 |
574 // remove this glyph from the vertices we need to allocate | 576 // remove this glyph from the vertices we need to allocate |
575 fTotalVertexCount -= kVerticesPerGlyph; | 577 fTotalVertexCount -= kVerticesPerGlyph; |
576 return true; | 578 return true; |
577 } | 579 } |
578 } | 580 } |
579 | 581 |
580 SkASSERT(glyph->fPlot); | 582 SkASSERT(glyph->fPlot); |
581 GrDrawTarget::DrawToken drawToken = fDrawTarget->getCurrentDrawToken(); | 583 GrDrawTarget::DrawToken drawToken = fDrawTarget->getCurrentDrawToken(); |
582 glyph->fPlot->setDrawToken(drawToken); | 584 glyph->fPlot->setDrawToken(drawToken); |
(...skipping 76 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
659 return true; | 661 return true; |
660 } | 662 } |
661 | 663 |
662 void GrDistanceFieldTextContext::flush() { | 664 void GrDistanceFieldTextContext::flush() { |
663 if (NULL == fDrawTarget) { | 665 if (NULL == fDrawTarget) { |
664 return; | 666 return; |
665 } | 667 } |
666 | 668 |
667 if (fCurrVertex > 0) { | 669 if (fCurrVertex > 0) { |
668 GrPipelineBuilder pipelineBuilder; | 670 GrPipelineBuilder pipelineBuilder; |
669 pipelineBuilder.setFromPaint(fPaint, fContext->getRenderTarget()); | 671 pipelineBuilder.setFromPaint(fPaint, fRenderTarget); |
670 | 672 |
671 // setup our sampler state for our text texture/atlas | 673 // setup our sampler state for our text texture/atlas |
672 SkASSERT(SkIsAlign4(fCurrVertex)); | 674 SkASSERT(SkIsAlign4(fCurrVertex)); |
673 | 675 |
674 // get our current color | 676 // get our current color |
675 SkColor filteredColor; | 677 SkColor filteredColor; |
676 SkColorFilter* colorFilter = fSkPaint.getColorFilter(); | 678 SkColorFilter* colorFilter = fSkPaint.getColorFilter(); |
677 if (colorFilter) { | 679 if (colorFilter) { |
678 filteredColor = colorFilter->filterColor(fSkPaint.getColor()); | 680 filteredColor = colorFilter->filterColor(fSkPaint.getColor()); |
679 } else { | 681 } else { |
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
713 } | 715 } |
714 } | 716 } |
715 | 717 |
716 inline void GrDistanceFieldTextContext::finish() { | 718 inline void GrDistanceFieldTextContext::finish() { |
717 this->flush(); | 719 this->flush(); |
718 fTotalVertexCount = 0; | 720 fTotalVertexCount = 0; |
719 | 721 |
720 GrTextContext::finish(); | 722 GrTextContext::finish(); |
721 } | 723 } |
722 | 724 |
OLD | NEW |