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 389 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
400 flags |= ctm.isSimilarity() ? kSimilarity_DistanceFieldEffectFlag : 0; | 400 flags |= ctm.isSimilarity() ? kSimilarity_DistanceFieldEffectFlag : 0; |
401 flags |= fUseLCDText ? kUseLCD_DistanceFieldEffectFlag : 0; | 401 flags |= fUseLCDText ? kUseLCD_DistanceFieldEffectFlag : 0; |
402 flags |= fUseLCDText && ctm.rectStaysRect() ? | 402 flags |= fUseLCDText && ctm.rectStaysRect() ? |
403 kRectToRect_DistanceFieldEffectFlag : 0; | 403 kRectToRect_DistanceFieldEffectFlag : 0; |
404 bool useBGR = SkPixelGeometryIsBGR(fDeviceProperties.pixelGeometry()); | 404 bool useBGR = SkPixelGeometryIsBGR(fDeviceProperties.pixelGeometry()); |
405 flags |= fUseLCDText && useBGR ? kBGR_DistanceFieldEffectFlag : 0; | 405 flags |= fUseLCDText && useBGR ? kBGR_DistanceFieldEffectFlag : 0; |
406 | 406 |
407 // see if we need to create a new effect | 407 // see if we need to create a new effect |
408 if (textureUniqueID != fEffectTextureUniqueID || | 408 if (textureUniqueID != fEffectTextureUniqueID || |
409 filteredColor != fEffectColor || | 409 filteredColor != fEffectColor || |
410 flags != fEffectFlags) { | 410 flags != fEffectFlags || |
| 411 !fCachedGeometryProcessor->viewMatrix().cheapEqualTo(fViewMatrix)) { |
411 GrColor color = fPaint.getColor(); | 412 GrColor color = fPaint.getColor(); |
412 if (fUseLCDText) { | 413 if (fUseLCDText) { |
413 GrColor colorNoPreMul = skcolor_to_grcolor_nopremultiply(filteredCol
or); | 414 GrColor colorNoPreMul = skcolor_to_grcolor_nopremultiply(filteredCol
or); |
414 fCachedGeometryProcessor.reset(GrDistanceFieldLCDTextureEffect::Crea
te(color, | 415 fCachedGeometryProcessor.reset(GrDistanceFieldLCDTextureEffect::Crea
te(color, |
| 416
fViewMatrix, |
415
fCurrTexture, | 417
fCurrTexture, |
416
params, | 418
params, |
417
fGammaTexture, | 419
fGammaTexture, |
418
gammaParams, | 420
gammaParams, |
419
colorNoPreMul, | 421
colorNoPreMul, |
420
flags)); | 422
flags)); |
421 } else { | 423 } else { |
422 flags |= kColorAttr_DistanceFieldEffectFlag; | 424 flags |= kColorAttr_DistanceFieldEffectFlag; |
423 bool opaque = GrColorIsOpaque(color); | 425 bool opaque = GrColorIsOpaque(color); |
424 #ifdef SK_GAMMA_APPLY_TO_A8 | 426 #ifdef SK_GAMMA_APPLY_TO_A8 |
425 U8CPU lum = SkColorSpaceLuminance::computeLuminance(fDevicePropertie
s.gamma(), | 427 U8CPU lum = SkColorSpaceLuminance::computeLuminance(fDevicePropertie
s.gamma(), |
426 filteredColor); | 428 filteredColor); |
427 fCachedGeometryProcessor.reset(GrDistanceFieldTextureEffect::Create(
color, | 429 fCachedGeometryProcessor.reset(GrDistanceFieldTextureEffect::Create(
color, |
| 430
fViewMatrix, |
428
fCurrTexture, | 431
fCurrTexture, |
429
params, | 432
params, |
430
fGammaTexture, | 433
fGammaTexture, |
431
gammaParams, | 434
gammaParams, |
432
lum/255.f, | 435
lum/255.f, |
433
flags, | 436
flags, |
434
opaque)); | 437
opaque)); |
435 #else | 438 #else |
436 fCachedGeometryProcessor.reset(GrDistanceFieldNoGammaTextureEffect::
Create(color, | 439 fCachedGeometryProcessor.reset(GrDistanceFieldNoGammaTextureEffect::
Create(color, |
| 440
fViewMatrix, |
437
fCurrTexture, | 441
fCurrTexture, |
438
params, | 442
params, |
439
flags, | 443
flags, |
440
opaque)); | 444
opaque)); |
441 #endif | 445 #endif |
442 } | 446 } |
443 fEffectTextureUniqueID = textureUniqueID; | 447 fEffectTextureUniqueID = textureUniqueID; |
444 fEffectColor = filteredColor; | 448 fEffectColor = filteredColor; |
445 fEffectFlags = flags; | 449 fEffectFlags = flags; |
446 } | 450 } |
(...skipping 179 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
626 return true; | 630 return true; |
627 } | 631 } |
628 | 632 |
629 void GrDistanceFieldTextContext::flush() { | 633 void GrDistanceFieldTextContext::flush() { |
630 if (NULL == fDrawTarget) { | 634 if (NULL == fDrawTarget) { |
631 return; | 635 return; |
632 } | 636 } |
633 | 637 |
634 if (fCurrVertex > 0) { | 638 if (fCurrVertex > 0) { |
635 GrDrawState drawState; | 639 GrDrawState drawState; |
636 drawState.setFromPaint(fPaint, fViewMatrix, fContext->getRenderTarget())
; | 640 drawState.setFromPaint(fPaint, fContext->getRenderTarget()); |
637 | 641 |
638 // setup our sampler state for our text texture/atlas | 642 // setup our sampler state for our text texture/atlas |
639 SkASSERT(SkIsAlign4(fCurrVertex)); | 643 SkASSERT(SkIsAlign4(fCurrVertex)); |
640 | 644 |
641 // get our current color | 645 // get our current color |
642 SkColor filteredColor; | 646 SkColor filteredColor; |
643 SkColorFilter* colorFilter = fSkPaint.getColorFilter(); | 647 SkColorFilter* colorFilter = fSkPaint.getColorFilter(); |
644 if (colorFilter) { | 648 if (colorFilter) { |
645 filteredColor = colorFilter->filterColor(fSkPaint.getColor()); | 649 filteredColor = colorFilter->filterColor(fSkPaint.getColor()); |
646 } else { | 650 } else { |
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
679 } | 683 } |
680 } | 684 } |
681 | 685 |
682 inline void GrDistanceFieldTextContext::finish() { | 686 inline void GrDistanceFieldTextContext::finish() { |
683 this->flush(); | 687 this->flush(); |
684 fTotalVertexCount = 0; | 688 fTotalVertexCount = 0; |
685 | 689 |
686 GrTextContext::finish(); | 690 GrTextContext::finish(); |
687 } | 691 } |
688 | 692 |
OLD | NEW |