1.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 1.2 +++ b/gfx/skia/trunk/src/effects/SkTransparentShader.cpp Wed Dec 31 06:09:35 2014 +0100 1.3 @@ -0,0 +1,117 @@ 1.4 + 1.5 +/* 1.6 + * Copyright 2006 The Android Open Source Project 1.7 + * 1.8 + * Use of this source code is governed by a BSD-style license that can be 1.9 + * found in the LICENSE file. 1.10 + */ 1.11 + 1.12 + 1.13 +#include "SkTransparentShader.h" 1.14 +#include "SkColorPriv.h" 1.15 +#include "SkString.h" 1.16 + 1.17 +bool SkTransparentShader::setContext(const SkBitmap& device, 1.18 + const SkPaint& paint, 1.19 + const SkMatrix& matrix) { 1.20 + fDevice = &device; 1.21 + fAlpha = paint.getAlpha(); 1.22 + 1.23 + return this->INHERITED::setContext(device, paint, matrix); 1.24 +} 1.25 + 1.26 +uint32_t SkTransparentShader::getFlags() { 1.27 + uint32_t flags = this->INHERITED::getFlags(); 1.28 + 1.29 + switch (fDevice->colorType()) { 1.30 + case kRGB_565_SkColorType: 1.31 + flags |= kHasSpan16_Flag; 1.32 + if (fAlpha == 255) 1.33 + flags |= kOpaqueAlpha_Flag; 1.34 + break; 1.35 + case kPMColor_SkColorType: 1.36 + if (fAlpha == 255 && fDevice->isOpaque()) 1.37 + flags |= kOpaqueAlpha_Flag; 1.38 + break; 1.39 + default: 1.40 + break; 1.41 + } 1.42 + return flags; 1.43 +} 1.44 + 1.45 +void SkTransparentShader::shadeSpan(int x, int y, SkPMColor span[], int count) { 1.46 + unsigned scale = SkAlpha255To256(fAlpha); 1.47 + 1.48 + switch (fDevice->colorType()) { 1.49 + case kPMColor_SkColorType: 1.50 + if (scale == 256) { 1.51 + SkPMColor* src = fDevice->getAddr32(x, y); 1.52 + if (src != span) { 1.53 + memcpy(span, src, count * sizeof(SkPMColor)); 1.54 + } 1.55 + } else { 1.56 + const SkPMColor* src = fDevice->getAddr32(x, y); 1.57 + for (int i = count - 1; i >= 0; --i) { 1.58 + span[i] = SkAlphaMulQ(src[i], scale); 1.59 + } 1.60 + } 1.61 + break; 1.62 + case kRGB_565_SkColorType: { 1.63 + const uint16_t* src = fDevice->getAddr16(x, y); 1.64 + if (scale == 256) { 1.65 + for (int i = count - 1; i >= 0; --i) { 1.66 + span[i] = SkPixel16ToPixel32(src[i]); 1.67 + } 1.68 + } else { 1.69 + unsigned alpha = fAlpha; 1.70 + for (int i = count - 1; i >= 0; --i) { 1.71 + uint16_t c = src[i]; 1.72 + unsigned r = SkPacked16ToR32(c); 1.73 + unsigned g = SkPacked16ToG32(c); 1.74 + unsigned b = SkPacked16ToB32(c); 1.75 + 1.76 + span[i] = SkPackARGB32( alpha, 1.77 + SkAlphaMul(r, scale), 1.78 + SkAlphaMul(g, scale), 1.79 + SkAlphaMul(b, scale)); 1.80 + } 1.81 + } 1.82 + break; 1.83 + } 1.84 + case kAlpha_8_SkColorType: { 1.85 + const uint8_t* src = fDevice->getAddr8(x, y); 1.86 + if (scale == 256) { 1.87 + for (int i = count - 1; i >= 0; --i) { 1.88 + span[i] = SkPackARGB32(src[i], 0, 0, 0); 1.89 + } 1.90 + } else { 1.91 + for (int i = count - 1; i >= 0; --i) { 1.92 + span[i] = SkPackARGB32(SkAlphaMul(src[i], scale), 0, 0, 0); 1.93 + } 1.94 + } 1.95 + break; 1.96 + } 1.97 + default: 1.98 + SkDEBUGFAIL("colorType not supported as a destination device"); 1.99 + break; 1.100 + } 1.101 +} 1.102 + 1.103 +void SkTransparentShader::shadeSpan16(int x, int y, uint16_t span[], int count) { 1.104 + SkASSERT(fDevice->colorType() == kRGB_565_SkColorType); 1.105 + 1.106 + uint16_t* src = fDevice->getAddr16(x, y); 1.107 + if (src != span) { 1.108 + memcpy(span, src, count << 1); 1.109 + } 1.110 +} 1.111 + 1.112 +#ifndef SK_IGNORE_TO_STRING 1.113 +void SkTransparentShader::toString(SkString* str) const { 1.114 + str->append("SkTransparentShader: ("); 1.115 + 1.116 + this->INHERITED::toString(str); 1.117 + 1.118 + str->append(")"); 1.119 +} 1.120 +#endif