| 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 24 matching lines...) Expand all Loading... |
| 35 static const int kSmallDFFontSize = 32; | 35 static const int kSmallDFFontSize = 32; |
| 36 static const int kSmallDFFontLimit = 32; | 36 static const int kSmallDFFontLimit = 32; |
| 37 static const int kMediumDFFontSize = 72; | 37 static const int kMediumDFFontSize = 72; |
| 38 static const int kMediumDFFontLimit = 72; | 38 static const int kMediumDFFontLimit = 72; |
| 39 static const int kLargeDFFontSize = 162; | 39 static const int kLargeDFFontSize = 162; |
| 40 | 40 |
| 41 static const int kVerticesPerGlyph = 4; | 41 static const int kVerticesPerGlyph = 4; |
| 42 static const int kIndicesPerGlyph = 6; | 42 static const int kIndicesPerGlyph = 6; |
| 43 | 43 |
| 44 GrDistanceFieldTextContext::GrDistanceFieldTextContext(GrContext* context, | 44 GrDistanceFieldTextContext::GrDistanceFieldTextContext(GrContext* context, |
| 45 SkGpuDevice* gpuDevice, |
| 45 const SkDeviceProperties&
properties, | 46 const SkDeviceProperties&
properties, |
| 46 bool enable) | 47 bool enable) |
| 47 : GrTextContext(context, pro
perties) { | 48 : GrTextContext(context, gpuDevice, properties) { |
| 48 #if SK_FORCE_DISTANCE_FIELD_TEXT | 49 #if SK_FORCE_DISTANCE_FIELD_TEXT |
| 49 fEnableDFRendering = true; | 50 fEnableDFRendering = true; |
| 50 #else | 51 #else |
| 51 fEnableDFRendering = enable; | 52 fEnableDFRendering = enable; |
| 52 #endif | 53 #endif |
| 53 fStrike = NULL; | 54 fStrike = NULL; |
| 54 fGammaTexture = NULL; | 55 fGammaTexture = NULL; |
| 55 | 56 |
| 56 fEffectTextureUniqueID = SK_InvalidUniqueID; | 57 fEffectTextureUniqueID = SK_InvalidUniqueID; |
| 57 fEffectColor = GrColor_ILLEGAL; | 58 fEffectColor = GrColor_ILLEGAL; |
| 58 fEffectFlags = kInvalid_DistanceFieldEffectFlag; | 59 fEffectFlags = kInvalid_DistanceFieldEffectFlag; |
| 59 | 60 |
| 60 fVertices = NULL; | 61 fVertices = NULL; |
| 61 fCurrVertex = 0; | 62 fCurrVertex = 0; |
| 62 fAllocVertexCount = 0; | 63 fAllocVertexCount = 0; |
| 63 fTotalVertexCount = 0; | 64 fTotalVertexCount = 0; |
| 64 fCurrTexture = NULL; | 65 fCurrTexture = NULL; |
| 65 | 66 |
| 66 fVertexBounds.setLargestInverted(); | 67 fVertexBounds.setLargestInverted(); |
| 67 } | 68 } |
| 68 | 69 |
| 69 GrDistanceFieldTextContext* GrDistanceFieldTextContext::Create(GrContext* contex
t, | 70 GrDistanceFieldTextContext* GrDistanceFieldTextContext::Create(GrContext* contex
t, |
| 71 SkGpuDevice* gpuD
evice, |
| 70 const SkDevicePro
perties& props, | 72 const SkDevicePro
perties& props, |
| 71 bool enable) { | 73 bool enable) { |
| 72 GrDistanceFieldTextContext* textContext = SkNEW_ARGS(GrDistanceFieldTextCont
ext, | 74 GrDistanceFieldTextContext* textContext = SkNEW_ARGS(GrDistanceFieldTextCont
ext, |
| 73 (context, props, enable
)); | 75 (context, gpuDevice, pr
ops, enable)); |
| 74 textContext->fFallbackTextContext = GrBitmapTextContext::Create(context, pro
ps); | 76 textContext->fFallbackTextContext = GrBitmapTextContext::Create(context, gpu
Device, props); |
| 75 | 77 |
| 76 return textContext; | 78 return textContext; |
| 77 } | 79 } |
| 78 | 80 |
| 79 GrDistanceFieldTextContext::~GrDistanceFieldTextContext() { | 81 GrDistanceFieldTextContext::~GrDistanceFieldTextContext() { |
| 80 SkSafeSetNull(fGammaTexture); | 82 SkSafeSetNull(fGammaTexture); |
| 81 } | 83 } |
| 82 | 84 |
| 83 bool GrDistanceFieldTextContext::canDraw(const SkPaint& paint, const SkMatrix& v
iewMatrix) { | 85 bool GrDistanceFieldTextContext::canDraw(const SkPaint& paint, const SkMatrix& v
iewMatrix) { |
| 84 // TODO: support perspective (need getMaxScale replacement) | 86 // TODO: support perspective (need getMaxScale replacement) |
| (...skipping 22 matching lines...) Expand all Loading... |
| 107 | 109 |
| 108 // TODO: add some stroking support | 110 // TODO: add some stroking support |
| 109 if (paint.getStyle() != SkPaint::kFill_Style) { | 111 if (paint.getStyle() != SkPaint::kFill_Style) { |
| 110 return false; | 112 return false; |
| 111 } | 113 } |
| 112 | 114 |
| 113 return true; | 115 return true; |
| 114 } | 116 } |
| 115 | 117 |
| 116 inline void GrDistanceFieldTextContext::init(GrRenderTarget* rt, const GrClip& c
lip, | 118 inline void GrDistanceFieldTextContext::init(GrRenderTarget* rt, const GrClip& c
lip, |
| 117 const GrPaint& paint, const SkPaint
& skPaint) { | 119 const GrPaint& paint, const SkPaint
& skPaint, |
| 118 GrTextContext::init(rt, clip, paint, skPaint); | 120 const SkIRect& regionClipBounds) { |
| 121 GrTextContext::init(rt, clip, paint, skPaint, regionClipBounds); |
| 119 | 122 |
| 120 fStrike = NULL; | 123 fStrike = NULL; |
| 121 | 124 |
| 122 const SkMatrix& ctm = fViewMatrix; | 125 const SkMatrix& ctm = fViewMatrix; |
| 123 | 126 |
| 124 // getMaxScale doesn't support perspective, so neither do we at the moment | 127 // getMaxScale doesn't support perspective, so neither do we at the moment |
| 125 SkASSERT(!ctm.hasPerspective()); | 128 SkASSERT(!ctm.hasPerspective()); |
| 126 SkScalar maxScale = ctm.getMaxScale(); | 129 SkScalar maxScale = ctm.getMaxScale(); |
| 127 SkScalar textSize = fSkPaint.getTextSize(); | 130 SkScalar textSize = fSkPaint.getTextSize(); |
| 128 SkScalar scaledTextSize = textSize; | 131 SkScalar scaledTextSize = textSize; |
| (...skipping 76 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 205 (*gammaTexture)->writePixels(0, 0, width, height, | 208 (*gammaTexture)->writePixels(0, 0, width, height, |
| 206 (*gammaTexture)->config(), data.get(), 0, | 209 (*gammaTexture)->config(), data.get(), 0, |
| 207 GrContext::kDontFlush_PixelOpsFlag); | 210 GrContext::kDontFlush_PixelOpsFlag); |
| 208 } | 211 } |
| 209 } | 212 } |
| 210 | 213 |
| 211 void GrDistanceFieldTextContext::onDrawText(GrRenderTarget* rt, const GrClip& cl
ip, | 214 void GrDistanceFieldTextContext::onDrawText(GrRenderTarget* rt, const GrClip& cl
ip, |
| 212 const GrPaint& paint, | 215 const GrPaint& paint, |
| 213 const SkPaint& skPaint, const SkMatr
ix& viewMatrix, | 216 const SkPaint& skPaint, const SkMatr
ix& viewMatrix, |
| 214 const char text[], size_t byteLength
, | 217 const char text[], size_t byteLength
, |
| 215 SkScalar x, SkScalar y) { | 218 SkScalar x, SkScalar y, |
| 219 const SkIRect& regionClipBounds) { |
| 216 SkASSERT(byteLength == 0 || text != NULL); | 220 SkASSERT(byteLength == 0 || text != NULL); |
| 217 | 221 |
| 218 // nothing to draw | 222 // nothing to draw |
| 219 if (text == NULL || byteLength == 0) { | 223 if (text == NULL || byteLength == 0) { |
| 220 return; | 224 return; |
| 221 } | 225 } |
| 222 | 226 |
| 223 fViewMatrix = viewMatrix; | 227 fViewMatrix = viewMatrix; |
| 224 SkDrawCacheProc glyphCacheProc = skPaint.getDrawCacheProc(); | 228 SkDrawCacheProc glyphCacheProc = skPaint.getDrawCacheProc(); |
| 225 SkAutoGlyphCache autoCache(skPaint, &fDeviceProperties, NULL); | 229 SkAutoGlyphCache autoCache(skPaint, &fDeviceProperties, NULL); |
| (...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 263 alignX = SkScalarHalf(alignX); | 267 alignX = SkScalarHalf(alignX); |
| 264 alignY = SkScalarHalf(alignY); | 268 alignY = SkScalarHalf(alignY); |
| 265 } else if (skPaint.getTextAlign() == SkPaint::kLeft_Align) { | 269 } else if (skPaint.getTextAlign() == SkPaint::kLeft_Align) { |
| 266 alignX = 0; | 270 alignX = 0; |
| 267 alignY = 0; | 271 alignY = 0; |
| 268 } | 272 } |
| 269 x -= alignX; | 273 x -= alignX; |
| 270 y -= alignY; | 274 y -= alignY; |
| 271 SkPoint offset = SkPoint::Make(x, y); | 275 SkPoint offset = SkPoint::Make(x, y); |
| 272 | 276 |
| 273 this->drawPosText(rt, clip, paint, skPaint, viewMatrix, text, byteLength, po
sitions.begin(), 2, | 277 this->onDrawPosText(rt, clip, paint, skPaint, viewMatrix, text, byteLength,
positions.begin(), |
| 274 offset); | 278 2, offset, regionClipBounds); |
| 275 } | 279 } |
| 276 | 280 |
| 277 void GrDistanceFieldTextContext::onDrawPosText(GrRenderTarget* rt, const GrClip&
clip, | 281 void GrDistanceFieldTextContext::onDrawPosText(GrRenderTarget* rt, const GrClip&
clip, |
| 278 const GrPaint& paint, | 282 const GrPaint& paint, |
| 279 const SkPaint& skPaint, const SkM
atrix& viewMatrix, | 283 const SkPaint& skPaint, const SkM
atrix& viewMatrix, |
| 280 const char text[], size_t byteLen
gth, | 284 const char text[], size_t byteLen
gth, |
| 281 const SkScalar pos[], int scalars
PerPosition, | 285 const SkScalar pos[], int scalars
PerPosition, |
| 282 const SkPoint& offset) { | 286 const SkPoint& offset, |
| 287 const SkIRect& regionClipBounds)
{ |
| 283 | 288 |
| 284 SkASSERT(byteLength == 0 || text != NULL); | 289 SkASSERT(byteLength == 0 || text != NULL); |
| 285 SkASSERT(1 == scalarsPerPosition || 2 == scalarsPerPosition); | 290 SkASSERT(1 == scalarsPerPosition || 2 == scalarsPerPosition); |
| 286 | 291 |
| 287 // nothing to draw | 292 // nothing to draw |
| 288 if (text == NULL || byteLength == 0 /* no raster clip? || fRC->isEmpty()*/)
{ | 293 if (text == NULL || byteLength == 0 /* no raster clip? || fRC->isEmpty()*/)
{ |
| 289 return; | 294 return; |
| 290 } | 295 } |
| 291 | 296 |
| 292 fViewMatrix = viewMatrix; | 297 fViewMatrix = viewMatrix; |
| 293 this->init(rt, clip, paint, skPaint); | 298 this->init(rt, clip, paint, skPaint, regionClipBounds); |
| 294 | 299 |
| 295 SkDrawCacheProc glyphCacheProc = fSkPaint.getDrawCacheProc(); | 300 SkDrawCacheProc glyphCacheProc = fSkPaint.getDrawCacheProc(); |
| 296 | 301 |
| 297 SkAutoGlyphCacheNoGamma autoCache(fSkPaint, &fDeviceProperties, NULL); | 302 SkAutoGlyphCacheNoGamma autoCache(fSkPaint, &fDeviceProperties, NULL); |
| 298 SkGlyphCache* cache = autoCache.getCache(); | 303 SkGlyphCache* cache = autoCache.getCache(); |
| 299 GrFontScaler* fontScaler = GetGrFontScaler(cache); | 304 GrFontScaler* fontScaler = GetGrFontScaler(cache); |
| 300 | 305 |
| 301 setup_gamma_texture(fContext, cache, fDeviceProperties, &fGammaTexture); | 306 setup_gamma_texture(fContext, cache, fDeviceProperties, &fGammaTexture); |
| 302 | 307 |
| 303 int numGlyphs = fSkPaint.textToGlyphs(text, byteLength, NULL); | 308 int numGlyphs = fSkPaint.textToGlyphs(text, byteLength, NULL); |
| (...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 360 } | 365 } |
| 361 } | 366 } |
| 362 } | 367 } |
| 363 pos += scalarsPerPosition; | 368 pos += scalarsPerPosition; |
| 364 } | 369 } |
| 365 } | 370 } |
| 366 | 371 |
| 367 this->finish(); | 372 this->finish(); |
| 368 | 373 |
| 369 if (fallbackTxt.count() > 0) { | 374 if (fallbackTxt.count() > 0) { |
| 370 fFallbackTextContext->drawPosText(rt, clip, paint, skPaint, viewMatrix,
fallbackTxt.begin(), | 375 fFallbackTextContext->drawPosText(rt, clip, paint, skPaint, viewMatrix, |
| 371 fallbackTxt.count(), fallbackPos.begin
(), | 376 fallbackTxt.begin(), fallbackTxt.count
(), |
| 372 scalarsPerPosition, offset); | 377 fallbackPos.begin(), scalarsPerPositio
n, offset, |
| 378 regionClipBounds); |
| 373 } | 379 } |
| 374 } | 380 } |
| 375 | 381 |
| 376 static inline GrColor skcolor_to_grcolor_nopremultiply(SkColor c) { | 382 static inline GrColor skcolor_to_grcolor_nopremultiply(SkColor c) { |
| 377 unsigned r = SkColorGetR(c); | 383 unsigned r = SkColorGetR(c); |
| 378 unsigned g = SkColorGetG(c); | 384 unsigned g = SkColorGetG(c); |
| 379 unsigned b = SkColorGetB(c); | 385 unsigned b = SkColorGetB(c); |
| 380 return GrColorPackRGBA(r, g, b, 0xff); | 386 return GrColorPackRGBA(r, g, b, 0xff); |
| 381 } | 387 } |
| 382 | 388 |
| (...skipping 337 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 720 } | 726 } |
| 721 } | 727 } |
| 722 | 728 |
| 723 inline void GrDistanceFieldTextContext::finish() { | 729 inline void GrDistanceFieldTextContext::finish() { |
| 724 this->flush(); | 730 this->flush(); |
| 725 fTotalVertexCount = 0; | 731 fTotalVertexCount = 0; |
| 726 | 732 |
| 727 GrTextContext::finish(); | 733 GrTextContext::finish(); |
| 728 } | 734 } |
| 729 | 735 |
| OLD | NEW |