| 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 "GrContext.h" | 9 #include "GrContext.h" |
| 10 #include "GrDrawContext.h" | 10 #include "GrDrawContext.h" |
| (...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 46 // gamma corrected masks anyways, nor color | 46 // gamma corrected masks anyways, nor color |
| 47 U8CPU lum = SkComputeLuminance(SkColorGetR(canonicalColor), | 47 U8CPU lum = SkComputeLuminance(SkColorGetR(canonicalColor), |
| 48 SkColorGetG(canonicalColor), | 48 SkColorGetG(canonicalColor), |
| 49 SkColorGetB(canonicalColor)); | 49 SkColorGetB(canonicalColor)); |
| 50 // reduce to our finite number of bits | 50 // reduce to our finite number of bits |
| 51 canonicalColor = SkMaskGamma::CanonicalColor(SkColorSetRGB(lum, lum, lum
)); | 51 canonicalColor = SkMaskGamma::CanonicalColor(SkColorSetRGB(lum, lum, lum
)); |
| 52 } | 52 } |
| 53 return canonicalColor; | 53 return canonicalColor; |
| 54 } | 54 } |
| 55 | 55 |
| 56 uint32_t GrAtlasTextContext::ComputeScalerContextFlags(GrDrawContext* dc, const
GrPaint& grPaint) { | 56 uint32_t GrAtlasTextContext::ComputeScalerContextFlags(GrDrawContext* dc) { |
| 57 // If we're rendering to an sRGB render target, and we aren't forcing sRGB b
lending off, | 57 // If we're doing gamma-correct rendering, then we can disable the gamma hac
ks. |
| 58 // then we can disable the gamma hacks. Otherwise, leave them on. In either
case, we still | 58 // Otherwise, leave them on. In either case, we still want the contrast boos
t: |
| 59 // want the contrast boost: | 59 if (dc->isGammaCorrect()) { |
| 60 if (GrPixelConfigIsSRGB(dc->accessRenderTarget()->config()) && | |
| 61 !grPaint.getDisableOutputConversionToSRGB()) { | |
| 62 return SkPaint::kBoostContrast_ScalerContextFlag; | 60 return SkPaint::kBoostContrast_ScalerContextFlag; |
| 63 } else { | 61 } else { |
| 64 return SkPaint::kFakeGammaAndBoostContrast_ScalerContextFlags; | 62 return SkPaint::kFakeGammaAndBoostContrast_ScalerContextFlags; |
| 65 } | 63 } |
| 66 } | 64 } |
| 67 | 65 |
| 68 // TODO if this function ever shows up in profiling, then we can compute this va
lue when the | 66 // TODO if this function ever shows up in profiling, then we can compute this va
lue when the |
| 69 // textblob is being built and cache it. However, for the time being textblobs
mostly only have 1 | 67 // textblob is being built and cache it. However, for the time being textblobs
mostly only have 1 |
| 70 // run so this is not a big deal to compute here. | 68 // run so this is not a big deal to compute here. |
| 71 bool GrAtlasTextContext::HasLCD(const SkTextBlob* blob) { | 69 bool GrAtlasTextContext::HasLCD(const SkTextBlob* blob) { |
| (...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 121 cacheBlob.reset(SkSafeRef(cache->find(key))); | 119 cacheBlob.reset(SkSafeRef(cache->find(key))); |
| 122 } | 120 } |
| 123 | 121 |
| 124 // Though for the time being runs in the textblob can override the paint, th
ey only touch font | 122 // Though for the time being runs in the textblob can override the paint, th
ey only touch font |
| 125 // info. | 123 // info. |
| 126 GrPaint grPaint; | 124 GrPaint grPaint; |
| 127 if (!SkPaintToGrPaint(context, skPaint, viewMatrix, props.isGammaCorrect(),
&grPaint)) { | 125 if (!SkPaintToGrPaint(context, skPaint, viewMatrix, props.isGammaCorrect(),
&grPaint)) { |
| 128 return; | 126 return; |
| 129 } | 127 } |
| 130 | 128 |
| 131 uint32_t scalerContextFlags = ComputeScalerContextFlags(dc, grPaint); | 129 uint32_t scalerContextFlags = ComputeScalerContextFlags(dc); |
| 132 | 130 |
| 133 if (cacheBlob) { | 131 if (cacheBlob) { |
| 134 if (cacheBlob->mustRegenerate(skPaint, grPaint.getColor(), blurRec, view
Matrix, x, y)) { | 132 if (cacheBlob->mustRegenerate(skPaint, grPaint.getColor(), blurRec, view
Matrix, x, y)) { |
| 135 // We have to remake the blob because changes may invalidate our mas
ks. | 133 // We have to remake the blob because changes may invalidate our mas
ks. |
| 136 // TODO we could probably get away reuse most of the time if the poi
nter is unique, | 134 // TODO we could probably get away reuse most of the time if the poi
nter is unique, |
| 137 // but we'd have to clear the subrun information | 135 // but we'd have to clear the subrun information |
| 138 cache->remove(cacheBlob); | 136 cache->remove(cacheBlob); |
| 139 cacheBlob.reset(SkRef(cache->createCachedBlob(blob, key, blurRec, sk
Paint))); | 137 cacheBlob.reset(SkRef(cache->createCachedBlob(blob, key, blurRec, sk
Paint))); |
| 140 RegenerateTextBlob(cacheBlob, context->getBatchFontCache(), | 138 RegenerateTextBlob(cacheBlob, context->getBatchFontCache(), |
| 141 *context->caps()->shaderCaps(), skPaint, grPaint.
getColor(), | 139 *context->caps()->shaderCaps(), skPaint, grPaint.
getColor(), |
| (...skipping 180 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 322 const SkSurfaceProps& props, | 320 const SkSurfaceProps& props, |
| 323 const char text[], size_t byteLength, | 321 const char text[], size_t byteLength, |
| 324 SkScalar x, SkScalar y, const SkIRect& regionC
lipBounds) { | 322 SkScalar x, SkScalar y, const SkIRect& regionC
lipBounds) { |
| 325 if (context->abandoned()) { | 323 if (context->abandoned()) { |
| 326 return; | 324 return; |
| 327 } else if (this->canDraw(skPaint, viewMatrix, props, *context->caps()->shade
rCaps())) { | 325 } else if (this->canDraw(skPaint, viewMatrix, props, *context->caps()->shade
rCaps())) { |
| 328 SkAutoTUnref<GrAtlasTextBlob> blob( | 326 SkAutoTUnref<GrAtlasTextBlob> blob( |
| 329 CreateDrawTextBlob(context->getTextBlobCache(), context->getBatchFon
tCache(), | 327 CreateDrawTextBlob(context->getTextBlobCache(), context->getBatchFon
tCache(), |
| 330 *context->caps()->shaderCaps(), | 328 *context->caps()->shaderCaps(), |
| 331 paint, skPaint, | 329 paint, skPaint, |
| 332 ComputeScalerContextFlags(dc, paint), | 330 ComputeScalerContextFlags(dc), |
| 333 viewMatrix, props, | 331 viewMatrix, props, |
| 334 text, byteLength, x, y)); | 332 text, byteLength, x, y)); |
| 335 blob->flushThrowaway(context, dc, props, fDistanceAdjustTable, skPaint,
paint, | 333 blob->flushThrowaway(context, dc, props, fDistanceAdjustTable, skPaint,
paint, |
| 336 clip, viewMatrix, regionClipBounds, x, y); | 334 clip, viewMatrix, regionClipBounds, x, y); |
| 337 return; | 335 return; |
| 338 } | 336 } |
| 339 | 337 |
| 340 // fall back to drawing as a path | 338 // fall back to drawing as a path |
| 341 GrTextUtils::DrawTextAsPath(context, dc, clip, skPaint, viewMatrix, text, by
teLength, x, y, | 339 GrTextUtils::DrawTextAsPath(context, dc, clip, skPaint, viewMatrix, text, by
teLength, x, y, |
| 342 regionClipBounds); | 340 regionClipBounds); |
| 343 } | 341 } |
| 344 | 342 |
| 345 void GrAtlasTextContext::drawPosText(GrContext* context, | 343 void GrAtlasTextContext::drawPosText(GrContext* context, |
| 346 GrDrawContext* dc, | 344 GrDrawContext* dc, |
| 347 const GrClip& clip, | 345 const GrClip& clip, |
| 348 const GrPaint& paint, const SkPaint& skPain
t, | 346 const GrPaint& paint, const SkPaint& skPain
t, |
| 349 const SkMatrix& viewMatrix, | 347 const SkMatrix& viewMatrix, |
| 350 const SkSurfaceProps& props, | 348 const SkSurfaceProps& props, |
| 351 const char text[], size_t byteLength, | 349 const char text[], size_t byteLength, |
| 352 const SkScalar pos[], int scalarsPerPositio
n, | 350 const SkScalar pos[], int scalarsPerPositio
n, |
| 353 const SkPoint& offset, const SkIRect& regio
nClipBounds) { | 351 const SkPoint& offset, const SkIRect& regio
nClipBounds) { |
| 354 if (context->abandoned()) { | 352 if (context->abandoned()) { |
| 355 return; | 353 return; |
| 356 } else if (this->canDraw(skPaint, viewMatrix, props, *context->caps()->shade
rCaps())) { | 354 } else if (this->canDraw(skPaint, viewMatrix, props, *context->caps()->shade
rCaps())) { |
| 357 SkAutoTUnref<GrAtlasTextBlob> blob( | 355 SkAutoTUnref<GrAtlasTextBlob> blob( |
| 358 CreateDrawPosTextBlob(context->getTextBlobCache(), | 356 CreateDrawPosTextBlob(context->getTextBlobCache(), |
| 359 context->getBatchFontCache(), | 357 context->getBatchFontCache(), |
| 360 *context->caps()->shaderCaps(), | 358 *context->caps()->shaderCaps(), |
| 361 paint, skPaint, | 359 paint, skPaint, |
| 362 ComputeScalerContextFlags(dc, paint), | 360 ComputeScalerContextFlags(dc), |
| 363 viewMatrix, props, | 361 viewMatrix, props, |
| 364 text, byteLength, | 362 text, byteLength, |
| 365 pos, scalarsPerPosition, | 363 pos, scalarsPerPosition, |
| 366 offset)); | 364 offset)); |
| 367 blob->flushThrowaway(context, dc, props, fDistanceAdjustTable, skPaint,
paint, | 365 blob->flushThrowaway(context, dc, props, fDistanceAdjustTable, skPaint,
paint, |
| 368 clip, viewMatrix, regionClipBounds, offset.fX, offs
et.fY); | 366 clip, viewMatrix, regionClipBounds, offset.fX, offs
et.fY); |
| 369 return; | 367 return; |
| 370 } | 368 } |
| 371 | 369 |
| 372 // fall back to drawing as a path | 370 // fall back to drawing as a path |
| (...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 427 viewMatrix, | 425 viewMatrix, |
| 428 gSurfaceProps, text, | 426 gSurfaceProps, text, |
| 429 static_cast<size_t>(textLen), x,
y)); | 427 static_cast<size_t>(textLen), x,
y)); |
| 430 | 428 |
| 431 return blob->test_createBatch(textLen, 0, 0, viewMatrix, x, y, color, skPain
t, | 429 return blob->test_createBatch(textLen, 0, 0, viewMatrix, x, y, color, skPain
t, |
| 432 gSurfaceProps, gTextContext->dfAdjustTable(), | 430 gSurfaceProps, gTextContext->dfAdjustTable(), |
| 433 context->getBatchFontCache()); | 431 context->getBatchFontCache()); |
| 434 } | 432 } |
| 435 | 433 |
| 436 #endif | 434 #endif |
| OLD | NEW |