| OLD | NEW |
| 1 /* | 1 /* |
| 2 * Copyright 2015 Google Inc. | 2 * Copyright 2015 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 #include "GrAtlasTextContext.h" | 7 #include "GrAtlasTextContext.h" |
| 8 | 8 |
| 9 #include "GrBatch.h" | 9 #include "GrBatch.h" |
| 10 #include "GrBatchFontCache.h" | 10 #include "GrBatchFontCache.h" |
| (...skipping 79 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 90 return GrColorPackRGBA(r, g, b, 0xff); | 90 return GrColorPackRGBA(r, g, b, 0xff); |
| 91 } | 91 } |
| 92 | 92 |
| 93 }; | 93 }; |
| 94 | 94 |
| 95 // TODO | 95 // TODO |
| 96 // Distance field text in textblobs | 96 // Distance field text in textblobs |
| 97 | 97 |
| 98 GrAtlasTextContext::GrAtlasTextContext(GrContext* context, | 98 GrAtlasTextContext::GrAtlasTextContext(GrContext* context, |
| 99 GrDrawContext* drawContext, | 99 GrDrawContext* drawContext, |
| 100 const SkDeviceProperties& properties) | 100 const SkSurfaceProps& surfaceProps) |
| 101 : INHERITED(context, drawContext, properties) | 101 : INHERITED(context, drawContext, surfaceProps) |
| 102 , fDistanceAdjustTable(SkNEW(DistanceAdjustTable)) { | 102 , fDistanceAdjustTable(SkNEW(DistanceAdjustTable)) { |
| 103 // We overallocate vertices in our textblobs based on the assumption that A8
has the greatest | 103 // We overallocate vertices in our textblobs based on the assumption that A8
has the greatest |
| 104 // vertexStride | 104 // vertexStride |
| 105 SK_COMPILE_ASSERT(kGrayTextVASize >= kColorTextVASize && kGrayTextVASize >=
kLCDTextVASize, | 105 SK_COMPILE_ASSERT(kGrayTextVASize >= kColorTextVASize && kGrayTextVASize >=
kLCDTextVASize, |
| 106 vertex_attribute_changed); | 106 vertex_attribute_changed); |
| 107 fCurrStrike = NULL; | 107 fCurrStrike = NULL; |
| 108 fCache = context->getTextBlobCache(); | 108 fCache = context->getTextBlobCache(); |
| 109 } | 109 } |
| 110 | 110 |
| 111 void GrAtlasTextContext::DistanceAdjustTable::buildDistanceAdjustTable() { | 111 void GrAtlasTextContext::DistanceAdjustTable::buildDistanceAdjustTable() { |
| (...skipping 73 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 185 | 185 |
| 186 fTable[row] = d; | 186 fTable[row] = d; |
| 187 break; | 187 break; |
| 188 } | 188 } |
| 189 } | 189 } |
| 190 } | 190 } |
| 191 } | 191 } |
| 192 | 192 |
| 193 GrAtlasTextContext* GrAtlasTextContext::Create(GrContext* context, | 193 GrAtlasTextContext* GrAtlasTextContext::Create(GrContext* context, |
| 194 GrDrawContext* drawContext, | 194 GrDrawContext* drawContext, |
| 195 const SkDeviceProperties& props)
{ | 195 const SkSurfaceProps& surfaceProp
s) { |
| 196 return SkNEW_ARGS(GrAtlasTextContext, (context, drawContext, props)); | 196 return SkNEW_ARGS(GrAtlasTextContext, (context, drawContext, surfaceProps)); |
| 197 } | 197 } |
| 198 | 198 |
| 199 bool GrAtlasTextContext::canDraw(const GrRenderTarget*, | 199 bool GrAtlasTextContext::canDraw(const GrRenderTarget*, |
| 200 const GrClip&, | 200 const GrClip&, |
| 201 const GrPaint&, | 201 const GrPaint&, |
| 202 const SkPaint& skPaint, | 202 const SkPaint& skPaint, |
| 203 const SkMatrix& viewMatrix) { | 203 const SkMatrix& viewMatrix) { |
| 204 return this->canDrawAsDistanceFields(skPaint, viewMatrix) || | 204 return this->canDrawAsDistanceFields(skPaint, viewMatrix) || |
| 205 !SkDraw::ShouldDrawTextAsPaths(skPaint, viewMatrix); | 205 !SkDraw::ShouldDrawTextAsPaths(skPaint, viewMatrix); |
| 206 } | 206 } |
| (...skipping 120 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 327 // the blob anyways at flush time, so no need to regenerate explicitly | 327 // the blob anyways at flush time, so no need to regenerate explicitly |
| 328 | 328 |
| 329 return false; | 329 return false; |
| 330 } | 330 } |
| 331 | 331 |
| 332 | 332 |
| 333 inline SkGlyphCache* GrAtlasTextContext::setupCache(BitmapTextBlob::Run* run, | 333 inline SkGlyphCache* GrAtlasTextContext::setupCache(BitmapTextBlob::Run* run, |
| 334 const SkPaint& skPaint, | 334 const SkPaint& skPaint, |
| 335 const SkMatrix* viewMatrix, | 335 const SkMatrix* viewMatrix, |
| 336 bool noGamma) { | 336 bool noGamma) { |
| 337 skPaint.getScalerContextDescriptor(&run->fDescriptor, &fDeviceProperties, vi
ewMatrix, noGamma); | 337 skPaint.getScalerContextDescriptor(&run->fDescriptor, fSurfaceProps, viewMat
rix, noGamma); |
| 338 run->fTypeface.reset(SkSafeRef(skPaint.getTypeface())); | 338 run->fTypeface.reset(SkSafeRef(skPaint.getTypeface())); |
| 339 return SkGlyphCache::DetachCache(run->fTypeface, run->fDescriptor.getDesc())
; | 339 return SkGlyphCache::DetachCache(run->fTypeface, run->fDescriptor.getDesc())
; |
| 340 } | 340 } |
| 341 | 341 |
| 342 void GrAtlasTextContext::drawTextBlob(GrRenderTarget* rt, | 342 void GrAtlasTextContext::drawTextBlob(GrRenderTarget* rt, |
| 343 const GrClip& clip, const SkPaint& skPaint
, | 343 const GrClip& clip, const SkPaint& skPaint
, |
| 344 const SkMatrix& viewMatrix, const SkTextBl
ob* blob, | 344 const SkMatrix& viewMatrix, const SkTextBl
ob* blob, |
| 345 SkScalar x, SkScalar y, | 345 SkScalar x, SkScalar y, |
| 346 SkDrawFilter* drawFilter, const SkIRect& c
lipBounds) { | 346 SkDrawFilter* drawFilter, const SkIRect& c
lipBounds) { |
| 347 // If we have been abandoned, then don't draw | 347 // If we have been abandoned, then don't draw |
| 348 if (fContext->abandoned()) { | 348 if (fContext->abandoned()) { |
| 349 return; | 349 return; |
| 350 } | 350 } |
| 351 | 351 |
| 352 SkAutoTUnref<BitmapTextBlob> cacheBlob; | 352 SkAutoTUnref<BitmapTextBlob> cacheBlob; |
| 353 SkMaskFilter::BlurRec blurRec; | 353 SkMaskFilter::BlurRec blurRec; |
| 354 BitmapTextBlob::Key key; | 354 BitmapTextBlob::Key key; |
| 355 // It might be worth caching these things, but its not clear at this time | 355 // It might be worth caching these things, but its not clear at this time |
| 356 // TODO for animated mask filters, this will fill up our cache. We need a s
afeguard here | 356 // TODO for animated mask filters, this will fill up our cache. We need a s
afeguard here |
| 357 const SkMaskFilter* mf = skPaint.getMaskFilter(); | 357 const SkMaskFilter* mf = skPaint.getMaskFilter(); |
| 358 bool canCache = !(skPaint.getPathEffect() || | 358 bool canCache = !(skPaint.getPathEffect() || |
| 359 (mf && !mf->asABlur(&blurRec)) || | 359 (mf && !mf->asABlur(&blurRec)) || |
| 360 drawFilter); | 360 drawFilter); |
| 361 | 361 |
| 362 if (canCache) { | 362 if (canCache) { |
| 363 bool hasLCD = HasLCD(blob); | 363 bool hasLCD = HasLCD(blob); |
| 364 | 364 |
| 365 // We canonicalize all non-lcd draws to use kUnknown_SkPixelGeometry | 365 // We canonicalize all non-lcd draws to use kUnknown_SkPixelGeometry |
| 366 SkPixelGeometry pixelGeometry = hasLCD ? fDeviceProperties.pixelGeometry
() : | 366 SkPixelGeometry pixelGeometry = hasLCD ? fSurfaceProps.pixelGeometry() : |
| 367 kUnknown_SkPixelGeometry; | 367 kUnknown_SkPixelGeometry; |
| 368 | 368 |
| 369 // TODO we want to figure out a way to be able to use the canonical colo
r on LCD text, | 369 // TODO we want to figure out a way to be able to use the canonical colo
r on LCD text, |
| 370 // see the note on ComputeCanonicalColor above. We pick a dummy value f
or LCD text to | 370 // see the note on ComputeCanonicalColor above. We pick a dummy value f
or LCD text to |
| 371 // ensure we always match the same key | 371 // ensure we always match the same key |
| 372 GrColor canonicalColor = hasLCD ? SK_ColorTRANSPARENT : | 372 GrColor canonicalColor = hasLCD ? SK_ColorTRANSPARENT : |
| 373 ComputeCanonicalColor(skPaint, hasLCD)
; | 373 ComputeCanonicalColor(skPaint, hasLCD)
; |
| 374 | 374 |
| 375 key.fPixelGeometry = pixelGeometry; | 375 key.fPixelGeometry = pixelGeometry; |
| 376 key.fUniqueID = blob->uniqueID(); | 376 key.fUniqueID = blob->uniqueID(); |
| (...skipping 58 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 435 } | 435 } |
| 436 | 436 |
| 437 SkScalar maxScale = viewMatrix.getMaxScale(); | 437 SkScalar maxScale = viewMatrix.getMaxScale(); |
| 438 SkScalar scaledTextSize = maxScale*skPaint.getTextSize(); | 438 SkScalar scaledTextSize = maxScale*skPaint.getTextSize(); |
| 439 // Hinted text looks far better at small resolutions | 439 // Hinted text looks far better at small resolutions |
| 440 // Scaling up beyond 2x yields undesireable artifacts | 440 // Scaling up beyond 2x yields undesireable artifacts |
| 441 if (scaledTextSize < kMinDFFontSize || scaledTextSize > kLargeDFFontLimit) { | 441 if (scaledTextSize < kMinDFFontSize || scaledTextSize > kLargeDFFontLimit) { |
| 442 return false; | 442 return false; |
| 443 } | 443 } |
| 444 | 444 |
| 445 bool useDFT = fDeviceProperties.useDFT(); | 445 bool useDFT = fSurfaceProps.isUseDistanceFieldFonts(); |
| 446 #if SK_FORCE_DISTANCE_FIELD_TEXT | 446 #if SK_FORCE_DISTANCE_FIELD_TEXT |
| 447 useDFT = true; | 447 useDFT = true; |
| 448 #endif | 448 #endif |
| 449 | 449 |
| 450 if (!useDFT && !skPaint.isDistanceFieldTextTEMP() && scaledTextSize < kLarge
DFFontSize) { | 450 if (!useDFT && !skPaint.isDistanceFieldTextTEMP() && scaledTextSize < kLarge
DFFontSize) { |
| 451 return false; | 451 return false; |
| 452 } | 452 } |
| 453 | 453 |
| 454 // rasterizers and mask filters modify alpha, which doesn't | 454 // rasterizers and mask filters modify alpha, which doesn't |
| 455 // translate well to distance | 455 // translate well to distance |
| (...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 487 // applyFontToPaint() always overwrites the exact same attributes, | 487 // applyFontToPaint() always overwrites the exact same attributes, |
| 488 // so it is safe to not re-seed the paint for this reason. | 488 // so it is safe to not re-seed the paint for this reason. |
| 489 it.applyFontToPaint(&runPaint); | 489 it.applyFontToPaint(&runPaint); |
| 490 | 490 |
| 491 if (drawFilter && !drawFilter->filter(&runPaint, SkDrawFilter::kText_Typ
e)) { | 491 if (drawFilter && !drawFilter->filter(&runPaint, SkDrawFilter::kText_Typ
e)) { |
| 492 // A false return from filter() means we should abort the current dr
aw. | 492 // A false return from filter() means we should abort the current dr
aw. |
| 493 runPaint = skPaint; | 493 runPaint = skPaint; |
| 494 continue; | 494 continue; |
| 495 } | 495 } |
| 496 | 496 |
| 497 runPaint.setFlags(FilterTextFlags(fDeviceProperties, runPaint)); | 497 runPaint.setFlags(FilterTextFlags(fSurfaceProps, runPaint)); |
| 498 | 498 |
| 499 // setup vertex / glyphIndex for the new run | 499 // setup vertex / glyphIndex for the new run |
| 500 if (run > 0) { | 500 if (run > 0) { |
| 501 PerSubRunInfo& newRun = cacheBlob->fRuns[run].fSubRunInfo.back(); | 501 PerSubRunInfo& newRun = cacheBlob->fRuns[run].fSubRunInfo.back(); |
| 502 PerSubRunInfo& lastRun = cacheBlob->fRuns[run - 1].fSubRunInfo.back(
); | 502 PerSubRunInfo& lastRun = cacheBlob->fRuns[run - 1].fSubRunInfo.back(
); |
| 503 | 503 |
| 504 newRun.fVertexStartIndex = lastRun.fVertexEndIndex; | 504 newRun.fVertexStartIndex = lastRun.fVertexEndIndex; |
| 505 newRun.fVertexEndIndex = lastRun.fVertexEndIndex; | 505 newRun.fVertexEndIndex = lastRun.fVertexEndIndex; |
| 506 | 506 |
| 507 newRun.fGlyphStartIndex = lastRun.fGlyphEndIndex; | 507 newRun.fGlyphStartIndex = lastRun.fGlyphEndIndex; |
| (...skipping 147 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 655 int scalarsPerPosition, | 655 int scalarsPerPosition, |
| 656 const SkPoint& offset, | 656 const SkPoint& offset, |
| 657 const SkIRect& clipRect) { | 657 const SkIRect& clipRect) { |
| 658 SkASSERT(fallbackTxt.count()); | 658 SkASSERT(fallbackTxt.count()); |
| 659 blob->setHasBitmap(); | 659 blob->setHasBitmap(); |
| 660 Run& run = blob->fRuns[runIndex]; | 660 Run& run = blob->fRuns[runIndex]; |
| 661 // Push back a new subrun to fill and set the override descriptor | 661 // Push back a new subrun to fill and set the override descriptor |
| 662 run.push_back(); | 662 run.push_back(); |
| 663 run.fOverrideDescriptor.reset(SkNEW(SkAutoDescriptor)); | 663 run.fOverrideDescriptor.reset(SkNEW(SkAutoDescriptor)); |
| 664 skPaint.getScalerContextDescriptor(run.fOverrideDescriptor, | 664 skPaint.getScalerContextDescriptor(run.fOverrideDescriptor, |
| 665 &fDeviceProperties, &viewMatrix, false); | 665 fSurfaceProps, &viewMatrix, false); |
| 666 SkGlyphCache* cache = SkGlyphCache::DetachCache(run.fTypeface, | 666 SkGlyphCache* cache = SkGlyphCache::DetachCache(run.fTypeface, |
| 667 run.fOverrideDescriptor->get
Desc()); | 667 run.fOverrideDescriptor->get
Desc()); |
| 668 this->internalDrawBMPPosText(blob, runIndex, cache, skPaint, paint.getColor(
), viewMatrix, | 668 this->internalDrawBMPPosText(blob, runIndex, cache, skPaint, paint.getColor(
), viewMatrix, |
| 669 fallbackTxt.begin(), fallbackTxt.count(), | 669 fallbackTxt.begin(), fallbackTxt.count(), |
| 670 fallbackPos.begin(), scalarsPerPosition, offset
, clipRect); | 670 fallbackPos.begin(), scalarsPerPosition, offset
, clipRect); |
| 671 SkGlyphCache::AttachCache(cache); | 671 SkGlyphCache::AttachCache(cache); |
| 672 } | 672 } |
| 673 | 673 |
| 674 inline GrAtlasTextContext::BitmapTextBlob* | 674 inline GrAtlasTextContext::BitmapTextBlob* |
| 675 GrAtlasTextContext::setupDFBlob(int glyphCount, const SkPaint& origPaint, | 675 GrAtlasTextContext::setupDFBlob(int glyphCount, const SkPaint& origPaint, |
| (...skipping 390 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1066 const SkPaint& origPaint) { | 1066 const SkPaint& origPaint) { |
| 1067 SkASSERT(byteLength == 0 || text != NULL); | 1067 SkASSERT(byteLength == 0 || text != NULL); |
| 1068 | 1068 |
| 1069 // nothing to draw | 1069 // nothing to draw |
| 1070 if (text == NULL || byteLength == 0) { | 1070 if (text == NULL || byteLength == 0) { |
| 1071 return; | 1071 return; |
| 1072 } | 1072 } |
| 1073 | 1073 |
| 1074 SkDrawCacheProc glyphCacheProc = origPaint.getDrawCacheProc(); | 1074 SkDrawCacheProc glyphCacheProc = origPaint.getDrawCacheProc(); |
| 1075 SkAutoDescriptor desc; | 1075 SkAutoDescriptor desc; |
| 1076 origPaint.getScalerContextDescriptor(&desc, &fDeviceProperties, NULL, true); | 1076 origPaint.getScalerContextDescriptor(&desc, fSurfaceProps, NULL, true); |
| 1077 SkGlyphCache* origPaintCache = SkGlyphCache::DetachCache(origPaint.getTypefa
ce(), | 1077 SkGlyphCache* origPaintCache = SkGlyphCache::DetachCache(origPaint.getTypefa
ce(), |
| 1078 desc.getDesc()); | 1078 desc.getDesc()); |
| 1079 | 1079 |
| 1080 SkTArray<SkScalar> positions; | 1080 SkTArray<SkScalar> positions; |
| 1081 | 1081 |
| 1082 const char* textPtr = text; | 1082 const char* textPtr = text; |
| 1083 SkFixed stopX = 0; | 1083 SkFixed stopX = 0; |
| 1084 SkFixed stopY = 0; | 1084 SkFixed stopY = 0; |
| 1085 SkFixed origin = 0; | 1085 SkFixed origin = 0; |
| 1086 switch (origPaint.getTextAlign()) { | 1086 switch (origPaint.getTextAlign()) { |
| (...skipping 948 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2035 | 2035 |
| 2036 size_t textLen = it.glyphCount() * sizeof(uint16_t); | 2036 size_t textLen = it.glyphCount() * sizeof(uint16_t); |
| 2037 const SkPoint& offset = it.offset(); | 2037 const SkPoint& offset = it.offset(); |
| 2038 | 2038 |
| 2039 it.applyFontToPaint(&runPaint); | 2039 it.applyFontToPaint(&runPaint); |
| 2040 | 2040 |
| 2041 if (drawFilter && !drawFilter->filter(&runPaint, SkDrawFilter::kText_Type))
{ | 2041 if (drawFilter && !drawFilter->filter(&runPaint, SkDrawFilter::kText_Type))
{ |
| 2042 return; | 2042 return; |
| 2043 } | 2043 } |
| 2044 | 2044 |
| 2045 runPaint.setFlags(FilterTextFlags(fDeviceProperties, runPaint)); | 2045 runPaint.setFlags(FilterTextFlags(fSurfaceProps, runPaint)); |
| 2046 | 2046 |
| 2047 switch (it.positioning()) { | 2047 switch (it.positioning()) { |
| 2048 case SkTextBlob::kDefault_Positioning: | 2048 case SkTextBlob::kDefault_Positioning: |
| 2049 this->drawTextAsPath(rt, clip, runPaint, viewMatrix, | 2049 this->drawTextAsPath(rt, clip, runPaint, viewMatrix, |
| 2050 (const char *)it.glyphs(), | 2050 (const char *)it.glyphs(), |
| 2051 textLen, x + offset.x(), y + offset.y(), clipBo
unds); | 2051 textLen, x + offset.x(), y + offset.y(), clipBo
unds); |
| 2052 break; | 2052 break; |
| 2053 case SkTextBlob::kHorizontal_Positioning: | 2053 case SkTextBlob::kHorizontal_Positioning: |
| 2054 this->drawPosTextAsPath(rt, clip, runPaint, viewMatrix, | 2054 this->drawPosTextAsPath(rt, clip, runPaint, viewMatrix, |
| 2055 (const char*)it.glyphs(), | 2055 (const char*)it.glyphs(), |
| (...skipping 25 matching lines...) Expand all Loading... |
| 2081 | 2081 |
| 2082 BitmapTextBatch* batch; | 2082 BitmapTextBatch* batch; |
| 2083 if (info.fDrawAsDistanceFields) { | 2083 if (info.fDrawAsDistanceFields) { |
| 2084 SkColor filteredColor; | 2084 SkColor filteredColor; |
| 2085 SkColorFilter* colorFilter = skPaint.getColorFilter(); | 2085 SkColorFilter* colorFilter = skPaint.getColorFilter(); |
| 2086 if (colorFilter) { | 2086 if (colorFilter) { |
| 2087 filteredColor = colorFilter->filterColor(skPaint.getColor()); | 2087 filteredColor = colorFilter->filterColor(skPaint.getColor()); |
| 2088 } else { | 2088 } else { |
| 2089 filteredColor = skPaint.getColor(); | 2089 filteredColor = skPaint.getColor(); |
| 2090 } | 2090 } |
| 2091 bool useBGR = SkPixelGeometryIsBGR(fDeviceProperties.pixelGeometry()); | 2091 bool useBGR = SkPixelGeometryIsBGR(fSurfaceProps.pixelGeometry()); |
| 2092 batch = BitmapTextBatch::Create(format, glyphCount, fContext->getBatchFo
ntCache(), | 2092 batch = BitmapTextBatch::Create(format, glyphCount, fContext->getBatchFo
ntCache(), |
| 2093 fDistanceAdjustTable, filteredColor, | 2093 fDistanceAdjustTable, filteredColor, |
| 2094 info.fUseLCDText, useBGR); | 2094 info.fUseLCDText, useBGR); |
| 2095 } else { | 2095 } else { |
| 2096 batch = BitmapTextBatch::Create(format, glyphCount, fContext->getBatchFo
ntCache()); | 2096 batch = BitmapTextBatch::Create(format, glyphCount, fContext->getBatchFo
ntCache()); |
| 2097 } | 2097 } |
| 2098 BitmapTextBatch::Geometry& geometry = batch->geometry(); | 2098 BitmapTextBatch::Geometry& geometry = batch->geometry(); |
| 2099 geometry.fBlob = SkRef(cacheBlob); | 2099 geometry.fBlob = SkRef(cacheBlob); |
| 2100 geometry.fRun = run; | 2100 geometry.fRun = run; |
| 2101 geometry.fSubRun = subRun; | 2101 geometry.fSubRun = subRun; |
| (...skipping 101 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2203 this->flushBigGlyphs(cacheBlob, rt, clip, skPaint, 0, 0, clipBounds); | 2203 this->flushBigGlyphs(cacheBlob, rt, clip, skPaint, 0, 0, clipBounds); |
| 2204 } | 2204 } |
| 2205 | 2205 |
| 2206 ////////////////////////////////////////////////////////////////////////////////
/////////////////// | 2206 ////////////////////////////////////////////////////////////////////////////////
/////////////////// |
| 2207 | 2207 |
| 2208 #ifdef GR_TEST_UTILS | 2208 #ifdef GR_TEST_UTILS |
| 2209 | 2209 |
| 2210 BATCH_TEST_DEFINE(TextBlobBatch) { | 2210 BATCH_TEST_DEFINE(TextBlobBatch) { |
| 2211 static uint32_t gContextID = SK_InvalidGenID; | 2211 static uint32_t gContextID = SK_InvalidGenID; |
| 2212 static GrAtlasTextContext* gTextContext = NULL; | 2212 static GrAtlasTextContext* gTextContext = NULL; |
| 2213 static SkDeviceProperties gDevProperties; | 2213 static SkSurfaceProps gSurfaceProps(SkSurfaceProps::kLegacyFontHost_InitType
); |
| 2214 | 2214 |
| 2215 if (context->uniqueID() != gContextID) { | 2215 if (context->uniqueID() != gContextID) { |
| 2216 gContextID = context->uniqueID(); | 2216 gContextID = context->uniqueID(); |
| 2217 SkDELETE(gTextContext); | 2217 SkDELETE(gTextContext); |
| 2218 | 2218 |
| 2219 // We don't yet test the fall back to paths in the GrTextContext base cl
ass. This is mostly | 2219 // We don't yet test the fall back to paths in the GrTextContext base cl
ass. This is mostly |
| 2220 // because we don't really want to have a gpu device here. | 2220 // because we don't really want to have a gpu device here. |
| 2221 // We enable distance fields by twiddling a knob on the paint | 2221 // We enable distance fields by twiddling a knob on the paint |
| 2222 GrDrawContext* drawContext = context->drawContext(&gDevProperties); | 2222 GrDrawContext* drawContext = context->drawContext(&gSurfaceProps); |
| 2223 | 2223 |
| 2224 gTextContext = GrAtlasTextContext::Create(context, drawContext, gDevProp
erties); | 2224 gTextContext = GrAtlasTextContext::Create(context, drawContext, gSurface
Props); |
| 2225 } | 2225 } |
| 2226 | 2226 |
| 2227 // create dummy render target | 2227 // create dummy render target |
| 2228 GrSurfaceDesc desc; | 2228 GrSurfaceDesc desc; |
| 2229 desc.fFlags = kRenderTarget_GrSurfaceFlag; | 2229 desc.fFlags = kRenderTarget_GrSurfaceFlag; |
| 2230 desc.fWidth = 1024; | 2230 desc.fWidth = 1024; |
| 2231 desc.fHeight = 1024; | 2231 desc.fHeight = 1024; |
| 2232 desc.fConfig = kRGBA_8888_GrPixelConfig; | 2232 desc.fConfig = kRGBA_8888_GrPixelConfig; |
| 2233 desc.fSampleCnt = 0; | 2233 desc.fSampleCnt = 0; |
| 2234 SkAutoTUnref<GrTexture> texture(context->textureProvider()->createTexture(de
sc, true, NULL, 0)); | 2234 SkAutoTUnref<GrTexture> texture(context->textureProvider()->createTexture(de
sc, true, NULL, 0)); |
| (...skipping 29 matching lines...) Expand all Loading... |
| 2264 gTextContext->createDrawTextBlob(rt, clip, grPaint, skPaint, viewMat
rix, text, | 2264 gTextContext->createDrawTextBlob(rt, clip, grPaint, skPaint, viewMat
rix, text, |
| 2265 static_cast<size_t>(textLen), 0, 0,
noClip)); | 2265 static_cast<size_t>(textLen), 0, 0,
noClip)); |
| 2266 | 2266 |
| 2267 SkScalar transX = static_cast<SkScalar>(random->nextU()); | 2267 SkScalar transX = static_cast<SkScalar>(random->nextU()); |
| 2268 SkScalar transY = static_cast<SkScalar>(random->nextU()); | 2268 SkScalar transY = static_cast<SkScalar>(random->nextU()); |
| 2269 const GrAtlasTextContext::BitmapTextBlob::Run::SubRunInfo& info = blob->fRun
s[0].fSubRunInfo[0]; | 2269 const GrAtlasTextContext::BitmapTextBlob::Run::SubRunInfo& info = blob->fRun
s[0].fSubRunInfo[0]; |
| 2270 return gTextContext->createBatch(blob, info, textLen, 0, 0, color, transX, t
ransY, skPaint); | 2270 return gTextContext->createBatch(blob, info, textLen, 0, 0, color, transX, t
ransY, skPaint); |
| 2271 } | 2271 } |
| 2272 | 2272 |
| 2273 #endif | 2273 #endif |
| OLD | NEW |