SkShader.cpp revision 0f10f7bf1fb43ca6346dc220a076773b1f19a367
1ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com/* 2ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com * Copyright 2006 The Android Open Source Project 3ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com * 4ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com * Use of this source code is governed by a BSD-style license that can be 5ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com * found in the LICENSE file. 6ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com */ 7ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com 8a5572e5bb2a2bbeeb59de0741c2527869d365a0ccommit-bot@chromium.org#include "SkBitmapProcShader.h" 9a5572e5bb2a2bbeeb59de0741c2527869d365a0ccommit-bot@chromium.org#include "SkReadBuffer.h" 10a5572e5bb2a2bbeeb59de0741c2527869d365a0ccommit-bot@chromium.org#include "SkMallocPixelRef.h" 11a5572e5bb2a2bbeeb59de0741c2527869d365a0ccommit-bot@chromium.org#include "SkPaint.h" 12d3ae77965e94e0efda496f5461cbec4533cb5b16vandebo@chromium.org#include "SkScalar.h" 138a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#include "SkShader.h" 148b0e8ac5f582de80356019406e2975079bf0829dcommit-bot@chromium.org#include "SkWriteBuffer.h" 158a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 16f94b3a4cebd4adab09c40ebe23c02a615e10c394bsalomon@google.comSkShader::SkShader() { 17f94b3a4cebd4adab09c40ebe23c02a615e10c394bsalomon@google.com fLocalMatrix.reset(); 18a641f3f18e5319773989812a888f3fad49e4f2adreed@google.com SkDEBUGCODE(fInSetContext = false;) 198a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com} 208a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 218b0e8ac5f582de80356019406e2975079bf0829dcommit-bot@chromium.orgSkShader::SkShader(SkReadBuffer& buffer) 22f94b3a4cebd4adab09c40ebe23c02a615e10c394bsalomon@google.com : INHERITED(buffer) { 238a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com if (buffer.readBool()) { 24f94b3a4cebd4adab09c40ebe23c02a615e10c394bsalomon@google.com buffer.readMatrix(&fLocalMatrix); 25f94b3a4cebd4adab09c40ebe23c02a615e10c394bsalomon@google.com } else { 26f94b3a4cebd4adab09c40ebe23c02a615e10c394bsalomon@google.com fLocalMatrix.reset(); 278a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com } 28f94b3a4cebd4adab09c40ebe23c02a615e10c394bsalomon@google.com 29a641f3f18e5319773989812a888f3fad49e4f2adreed@google.com SkDEBUGCODE(fInSetContext = false;) 308a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com} 318a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 328a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comSkShader::~SkShader() { 33a641f3f18e5319773989812a888f3fad49e4f2adreed@google.com SkASSERT(!fInSetContext); 348a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com} 358a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 368b0e8ac5f582de80356019406e2975079bf0829dcommit-bot@chromium.orgvoid SkShader::flatten(SkWriteBuffer& buffer) const { 378a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com this->INHERITED::flatten(buffer); 38f94b3a4cebd4adab09c40ebe23c02a615e10c394bsalomon@google.com bool hasLocalM = this->hasLocalMatrix(); 39f94b3a4cebd4adab09c40ebe23c02a615e10c394bsalomon@google.com buffer.writeBool(hasLocalM); 40f94b3a4cebd4adab09c40ebe23c02a615e10c394bsalomon@google.com if (hasLocalM) { 41f94b3a4cebd4adab09c40ebe23c02a615e10c394bsalomon@google.com buffer.writeMatrix(fLocalMatrix); 428a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com } 438a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com} 448a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 458a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.combool SkShader::setContext(const SkBitmap& device, 468a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com const SkPaint& paint, 478a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com const SkMatrix& matrix) { 48a641f3f18e5319773989812a888f3fad49e4f2adreed@google.com SkASSERT(!this->setContextHasBeenCalled()); 49a641f3f18e5319773989812a888f3fad49e4f2adreed@google.com 508a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com const SkMatrix* m = &matrix; 518a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com SkMatrix total; 528a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 538a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com fPaintAlpha = paint.getAlpha(); 54f94b3a4cebd4adab09c40ebe23c02a615e10c394bsalomon@google.com if (this->hasLocalMatrix()) { 55f94b3a4cebd4adab09c40ebe23c02a615e10c394bsalomon@google.com total.setConcat(matrix, this->getLocalMatrix()); 568a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com m = &total; 578a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com } 588a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com if (m->invert(&fTotalInverse)) { 598a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com fTotalInverseClass = (uint8_t)ComputeMatrixClass(fTotalInverse); 60a641f3f18e5319773989812a888f3fad49e4f2adreed@google.com SkDEBUGCODE(fInSetContext = true;) 618a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com return true; 628a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com } 638a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com return false; 648a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com} 658a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 66a641f3f18e5319773989812a888f3fad49e4f2adreed@google.comvoid SkShader::endContext() { 67a641f3f18e5319773989812a888f3fad49e4f2adreed@google.com SkASSERT(fInSetContext); 68a641f3f18e5319773989812a888f3fad49e4f2adreed@google.com SkDEBUGCODE(fInSetContext = false;) 69a641f3f18e5319773989812a888f3fad49e4f2adreed@google.com} 70a641f3f18e5319773989812a888f3fad49e4f2adreed@google.com 713bafe74a29c37761082980ed4ee9b831256bd27ereed@google.comSkShader::ShadeProc SkShader::asAShadeProc(void** ctx) { 723bafe74a29c37761082980ed4ee9b831256bd27ereed@google.com return NULL; 733bafe74a29c37761082980ed4ee9b831256bd27ereed@google.com} 743bafe74a29c37761082980ed4ee9b831256bd27ereed@google.com 758a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#include "SkColorPriv.h" 768a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 778a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comvoid SkShader::shadeSpan16(int x, int y, uint16_t span16[], int count) { 788a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com SkASSERT(span16); 798a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com SkASSERT(count > 0); 808a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com SkASSERT(this->canCallShadeSpan16()); 818a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 828a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com // basically, if we get here, the subclass screwed up 830c00f21fee3f5cfa3aa7e5d46ff94cb8cf340451tomhudson@google.com SkDEBUGFAIL("kHasSpan16 flag is set, but shadeSpan16() not implemented"); 848a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com} 858a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 868a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#define kTempColorQuadCount 6 // balance between speed (larger) and saving stack-space 877c2f27d788fff9dbf66a6d52753e47f786a313c0reed@google.com#define kTempColorCount (kTempColorQuadCount << 2) 888a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 898a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#ifdef SK_CPU_BENDIAN 908a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com #define SkU32BitShiftToByteOffset(shift) (3 - ((shift) >> 3)) 918a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#else 928a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com #define SkU32BitShiftToByteOffset(shift) ((shift) >> 3) 938a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#endif 948a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 958a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comvoid SkShader::shadeSpanAlpha(int x, int y, uint8_t alpha[], int count) { 968a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com SkASSERT(count > 0); 978a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 988a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com SkPMColor colors[kTempColorCount]; 998a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 1008a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com while ((count -= kTempColorCount) >= 0) { 1018a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com this->shadeSpan(x, y, colors, kTempColorCount); 1028a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com x += kTempColorCount; 1038a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 1048a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com const uint8_t* srcA = (const uint8_t*)colors + SkU32BitShiftToByteOffset(SK_A32_SHIFT); 1058a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com int quads = kTempColorQuadCount; 1068a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com do { 1078a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com U8CPU a0 = srcA[0]; 1088a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com U8CPU a1 = srcA[4]; 1098a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com U8CPU a2 = srcA[8]; 1108a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com U8CPU a3 = srcA[12]; 1118a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com srcA += 4*4; 1128a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com *alpha++ = SkToU8(a0); 1138a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com *alpha++ = SkToU8(a1); 1148a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com *alpha++ = SkToU8(a2); 1158a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com *alpha++ = SkToU8(a3); 1168a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com } while (--quads != 0); 1178a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com } 1188a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com SkASSERT(count < 0); 1198a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com SkASSERT(count + kTempColorCount >= 0); 1208a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com if (count += kTempColorCount) { 1218a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com this->shadeSpan(x, y, colors, count); 1228a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 1238a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com const uint8_t* srcA = (const uint8_t*)colors + SkU32BitShiftToByteOffset(SK_A32_SHIFT); 1248a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com do { 1258a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com *alpha++ = *srcA; 1268a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com srcA += 4; 1278a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com } while (--count != 0); 1288a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com } 1298a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#if 0 1308a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com do { 1318a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com int n = count; 1328a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com if (n > kTempColorCount) 1338a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com n = kTempColorCount; 1348a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com SkASSERT(n > 0); 1358a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 1368a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com this->shadeSpan(x, y, colors, n); 1378a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com x += n; 1388a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com count -= n; 1398a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 1408a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com const uint8_t* srcA = (const uint8_t*)colors + SkU32BitShiftToByteOffset(SK_A32_SHIFT); 1418a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com do { 1428a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com *alpha++ = *srcA; 1438a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com srcA += 4; 1448a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com } while (--n != 0); 1458a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com } while (count > 0); 1468a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#endif 1478a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com} 1488a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 1498a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comSkShader::MatrixClass SkShader::ComputeMatrixClass(const SkMatrix& mat) { 1508a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com MatrixClass mc = kLinear_MatrixClass; 1518a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 1528d430185e08d2067584837a76b7193b803fee7a0tomhudson@google.com if (mat.hasPerspective()) { 1538a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com if (mat.fixedStepInX(0, NULL, NULL)) { 1548a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com mc = kFixedStepInX_MatrixClass; 1558a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com } else { 1568a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com mc = kPerspective_MatrixClass; 1578a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com } 1588a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com } 1598a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com return mc; 1608a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com} 1618a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 1628a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com////////////////////////////////////////////////////////////////////////////// 1638a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 164d3ae77965e94e0efda496f5461cbec4533cb5b16vandebo@chromium.orgSkShader::BitmapType SkShader::asABitmap(SkBitmap*, SkMatrix*, 16591f319c5dc4493384f0a52aaeef3dcc311ef6ed0rileya@google.com TileMode*) const { 166f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com return kNone_BitmapType; 1678a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com} 1688a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 169d3ae77965e94e0efda496f5461cbec4533cb5b16vandebo@chromium.orgSkShader::GradientType SkShader::asAGradient(GradientInfo* info) const { 170d3ae77965e94e0efda496f5461cbec4533cb5b16vandebo@chromium.org return kNone_GradientType; 171d3ae77965e94e0efda496f5461cbec4533cb5b16vandebo@chromium.org} 172d3ae77965e94e0efda496f5461cbec4533cb5b16vandebo@chromium.org 1730ac6af49975c54c2debf41e9200af416ecd2d973bsalomon@google.comGrEffectRef* SkShader::asNewEffect(GrContext*, const SkPaint&) const { 174a3bdc1a6cd1ce9630df43a28fffef17a12c41f32humper@google.com return NULL; 17503c1c359b336ad20d23ab07004cdafafd14c90a5rileya@google.com} 17603c1c359b336ad20d23ab07004cdafafd14c90a5rileya@google.com 1778a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comSkShader* SkShader::CreateBitmapShader(const SkBitmap& src, 1788a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com TileMode tmx, TileMode tmy) { 179a5572e5bb2a2bbeeb59de0741c2527869d365a0ccommit-bot@chromium.org return ::CreateBitmapShader(src, tmx, tmy, NULL); 1808a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com} 1818a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 1820f10f7bf1fb43ca6346dc220a076773b1f19a367commit-bot@chromium.org#ifndef SK_IGNORE_TO_STRING 18376f9e938df0b5826fd4c80b854ceafaf385cfbe1robertphillips@google.comvoid SkShader::toString(SkString* str) const { 18476f9e938df0b5826fd4c80b854ceafaf385cfbe1robertphillips@google.com if (this->hasLocalMatrix()) { 18576f9e938df0b5826fd4c80b854ceafaf385cfbe1robertphillips@google.com str->append(" "); 18676f9e938df0b5826fd4c80b854ceafaf385cfbe1robertphillips@google.com this->getLocalMatrix().toString(str); 18776f9e938df0b5826fd4c80b854ceafaf385cfbe1robertphillips@google.com } 18876f9e938df0b5826fd4c80b854ceafaf385cfbe1robertphillips@google.com} 18976f9e938df0b5826fd4c80b854ceafaf385cfbe1robertphillips@google.com#endif 19076f9e938df0b5826fd4c80b854ceafaf385cfbe1robertphillips@google.com 1918a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com////////////////////////////////////////////////////////////////////////////// 1928a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 1938a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#include "SkColorShader.h" 1948a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#include "SkUtils.h" 1958a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 196f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.comSkColorShader::SkColorShader() { 197f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com fFlags = 0; 198f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com fInheritColor = true; 199f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com} 200f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com 201f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.comSkColorShader::SkColorShader(SkColor c) { 202f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com fFlags = 0; 203f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com fColor = c; 204f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com fInheritColor = false; 205f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com} 206f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com 2072be9e8b407624fa696854b78b407b97a01dbb703reed@google.comSkColorShader::~SkColorShader() {} 208f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com 209b6e161937bc890f0aa12ac5e27415d4d260ea6e0junov@chromium.orgbool SkColorShader::isOpaque() const { 210b6e161937bc890f0aa12ac5e27415d4d260ea6e0junov@chromium.org if (fInheritColor) { 211b6e161937bc890f0aa12ac5e27415d4d260ea6e0junov@chromium.org return true; // using paint's alpha 212b6e161937bc890f0aa12ac5e27415d4d260ea6e0junov@chromium.org } 213b6e161937bc890f0aa12ac5e27415d4d260ea6e0junov@chromium.org return SkColorGetA(fColor) == 255; 214b6e161937bc890f0aa12ac5e27415d4d260ea6e0junov@chromium.org} 215b6e161937bc890f0aa12ac5e27415d4d260ea6e0junov@chromium.org 2168b0e8ac5f582de80356019406e2975079bf0829dcommit-bot@chromium.orgSkColorShader::SkColorShader(SkReadBuffer& b) : INHERITED(b) { 2175119bdb952025a30f115b9c6a187173956e55097reed@android.com fFlags = 0; // computed in setContext 218f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com 219c73dd5c6880739f26216f198c757028fd28df1a4djsollen@google.com fInheritColor = b.readBool(); 2208a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com if (fInheritColor) { 2218a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com return; 2228a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com } 223c73dd5c6880739f26216f198c757028fd28df1a4djsollen@google.com fColor = b.readColor(); 2248a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com} 2258a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 2268b0e8ac5f582de80356019406e2975079bf0829dcommit-bot@chromium.orgvoid SkColorShader::flatten(SkWriteBuffer& buffer) const { 2278a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com this->INHERITED::flatten(buffer); 228c73dd5c6880739f26216f198c757028fd28df1a4djsollen@google.com buffer.writeBool(fInheritColor); 2298a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com if (fInheritColor) { 2308a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com return; 2318a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com } 232c73dd5c6880739f26216f198c757028fd28df1a4djsollen@google.com buffer.writeColor(fColor); 2338a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com} 2348a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 23559ccef695cef28a74ab2ea13d5a6c9017af45402reed@google.comuint32_t SkColorShader::getFlags() { 23659ccef695cef28a74ab2ea13d5a6c9017af45402reed@google.com return fFlags; 23759ccef695cef28a74ab2ea13d5a6c9017af45402reed@google.com} 23859ccef695cef28a74ab2ea13d5a6c9017af45402reed@google.com 2398a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comuint8_t SkColorShader::getSpan16Alpha() const { 2408a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com return SkGetPackedA32(fPMColor); 2418a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com} 2428a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 2438a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.combool SkColorShader::setContext(const SkBitmap& device, const SkPaint& paint, 2448a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com const SkMatrix& matrix) { 2458a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com if (!this->INHERITED::setContext(device, paint, matrix)) { 2468a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com return false; 2478a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com } 2488a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 2498a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com unsigned a; 250d3ae77965e94e0efda496f5461cbec4533cb5b16vandebo@chromium.org 2518a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com if (fInheritColor) { 252d3ae77965e94e0efda496f5461cbec4533cb5b16vandebo@chromium.org fColor = paint.getColor(); 253d3ae77965e94e0efda496f5461cbec4533cb5b16vandebo@chromium.org a = SkColorGetA(fColor); 2548a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com } else { 255d3ae77965e94e0efda496f5461cbec4533cb5b16vandebo@chromium.org a = SkAlphaMul(SkColorGetA(fColor), SkAlpha255To256(paint.getAlpha())); 2568a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com } 2578a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 258d3ae77965e94e0efda496f5461cbec4533cb5b16vandebo@chromium.org unsigned r = SkColorGetR(fColor); 259d3ae77965e94e0efda496f5461cbec4533cb5b16vandebo@chromium.org unsigned g = SkColorGetG(fColor); 260d3ae77965e94e0efda496f5461cbec4533cb5b16vandebo@chromium.org unsigned b = SkColorGetB(fColor); 2618a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 2628a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com // we want this before we apply any alpha 2638a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com fColor16 = SkPack888ToRGB16(r, g, b); 2648a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 2658a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com if (a != 255) { 2668f073382bb6a9b3998a74e6b58654476b77b4c86reed@android.com r = SkMulDiv255Round(r, a); 2678f073382bb6a9b3998a74e6b58654476b77b4c86reed@android.com g = SkMulDiv255Round(g, a); 2688f073382bb6a9b3998a74e6b58654476b77b4c86reed@android.com b = SkMulDiv255Round(b, a); 2698a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com } 2708a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com fPMColor = SkPackARGB32(a, r, g, b); 2718a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 2728f073382bb6a9b3998a74e6b58654476b77b4c86reed@android.com fFlags = kConstInY32_Flag; 2735b81535014f545f6498f5c8721723b81576989b1reed@android.com if (255 == a) { 2745119bdb952025a30f115b9c6a187173956e55097reed@android.com fFlags |= kOpaqueAlpha_Flag; 2755b81535014f545f6498f5c8721723b81576989b1reed@android.com if (paint.isDither() == false) { 2765b81535014f545f6498f5c8721723b81576989b1reed@android.com fFlags |= kHasSpan16_Flag; 2775b81535014f545f6498f5c8721723b81576989b1reed@android.com } 2785119bdb952025a30f115b9c6a187173956e55097reed@android.com } 2795119bdb952025a30f115b9c6a187173956e55097reed@android.com 2808a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com return true; 2818a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com} 2828a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 2838a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comvoid SkColorShader::shadeSpan(int x, int y, SkPMColor span[], int count) { 2848a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com sk_memset32(span, fPMColor, count); 2858a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com} 2868a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 2878a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comvoid SkColorShader::shadeSpan16(int x, int y, uint16_t span[], int count) { 2888a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com sk_memset16(span, fColor16, count); 2898a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com} 2908a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 2918a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comvoid SkColorShader::shadeSpanAlpha(int x, int y, uint8_t alpha[], int count) { 2928a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com memset(alpha, SkGetPackedA32(fPMColor), count); 2938a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com} 2948a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 295f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com// if we had a asAColor method, that would be more efficient... 296f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.comSkShader::BitmapType SkColorShader::asABitmap(SkBitmap* bitmap, SkMatrix* matrix, 29791f319c5dc4493384f0a52aaeef3dcc311ef6ed0rileya@google.com TileMode modes[]) const { 2982be9e8b407624fa696854b78b407b97a01dbb703reed@google.com return kNone_BitmapType; 299f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com} 300f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com 301d3ae77965e94e0efda496f5461cbec4533cb5b16vandebo@chromium.orgSkShader::GradientType SkColorShader::asAGradient(GradientInfo* info) const { 302d3ae77965e94e0efda496f5461cbec4533cb5b16vandebo@chromium.org if (info) { 303d3ae77965e94e0efda496f5461cbec4533cb5b16vandebo@chromium.org if (info->fColors && info->fColorCount >= 1) { 304d3ae77965e94e0efda496f5461cbec4533cb5b16vandebo@chromium.org info->fColors[0] = fColor; 305d3ae77965e94e0efda496f5461cbec4533cb5b16vandebo@chromium.org } 306d3ae77965e94e0efda496f5461cbec4533cb5b16vandebo@chromium.org info->fColorCount = 1; 307d3ae77965e94e0efda496f5461cbec4533cb5b16vandebo@chromium.org info->fTileMode = SkShader::kRepeat_TileMode; 308d3ae77965e94e0efda496f5461cbec4533cb5b16vandebo@chromium.org } 309d3ae77965e94e0efda496f5461cbec4533cb5b16vandebo@chromium.org return kColor_GradientType; 310d3ae77965e94e0efda496f5461cbec4533cb5b16vandebo@chromium.org} 31137a201231b8f6381938282675eb9abb50ab3b389reed@google.com 3120f10f7bf1fb43ca6346dc220a076773b1f19a367commit-bot@chromium.org#ifndef SK_IGNORE_TO_STRING 31376f9e938df0b5826fd4c80b854ceafaf385cfbe1robertphillips@google.comvoid SkColorShader::toString(SkString* str) const { 31476f9e938df0b5826fd4c80b854ceafaf385cfbe1robertphillips@google.com str->append("SkColorShader: ("); 31576f9e938df0b5826fd4c80b854ceafaf385cfbe1robertphillips@google.com 31676f9e938df0b5826fd4c80b854ceafaf385cfbe1robertphillips@google.com if (fInheritColor) { 31776f9e938df0b5826fd4c80b854ceafaf385cfbe1robertphillips@google.com str->append("Color: inherited from paint"); 31876f9e938df0b5826fd4c80b854ceafaf385cfbe1robertphillips@google.com } else { 31976f9e938df0b5826fd4c80b854ceafaf385cfbe1robertphillips@google.com str->append("Color: "); 32076f9e938df0b5826fd4c80b854ceafaf385cfbe1robertphillips@google.com str->appendHex(fColor); 32176f9e938df0b5826fd4c80b854ceafaf385cfbe1robertphillips@google.com } 32276f9e938df0b5826fd4c80b854ceafaf385cfbe1robertphillips@google.com 32376f9e938df0b5826fd4c80b854ceafaf385cfbe1robertphillips@google.com this->INHERITED::toString(str); 32476f9e938df0b5826fd4c80b854ceafaf385cfbe1robertphillips@google.com 32576f9e938df0b5826fd4c80b854ceafaf385cfbe1robertphillips@google.com str->append(")"); 32676f9e938df0b5826fd4c80b854ceafaf385cfbe1robertphillips@google.com} 32776f9e938df0b5826fd4c80b854ceafaf385cfbe1robertphillips@google.com#endif 32876f9e938df0b5826fd4c80b854ceafaf385cfbe1robertphillips@google.com 32937a201231b8f6381938282675eb9abb50ab3b389reed@google.com/////////////////////////////////////////////////////////////////////////////// 33037a201231b8f6381938282675eb9abb50ab3b389reed@google.com 33137a201231b8f6381938282675eb9abb50ab3b389reed@google.com#include "SkEmptyShader.h" 33237a201231b8f6381938282675eb9abb50ab3b389reed@google.com 33337a201231b8f6381938282675eb9abb50ab3b389reed@google.comuint32_t SkEmptyShader::getFlags() { return 0; } 33437a201231b8f6381938282675eb9abb50ab3b389reed@google.comuint8_t SkEmptyShader::getSpan16Alpha() const { return 0; } 33559ccef695cef28a74ab2ea13d5a6c9017af45402reed@google.com 33659ccef695cef28a74ab2ea13d5a6c9017af45402reed@google.combool SkEmptyShader::setContext(const SkBitmap&, const SkPaint&, 33759ccef695cef28a74ab2ea13d5a6c9017af45402reed@google.com const SkMatrix&) { return false; } 33859ccef695cef28a74ab2ea13d5a6c9017af45402reed@google.com 33959ccef695cef28a74ab2ea13d5a6c9017af45402reed@google.comvoid SkEmptyShader::shadeSpan(int x, int y, SkPMColor span[], int count) { 3400c00f21fee3f5cfa3aa7e5d46ff94cb8cf340451tomhudson@google.com SkDEBUGFAIL("should never get called, since setContext() returned false"); 34159ccef695cef28a74ab2ea13d5a6c9017af45402reed@google.com} 34259ccef695cef28a74ab2ea13d5a6c9017af45402reed@google.com 34359ccef695cef28a74ab2ea13d5a6c9017af45402reed@google.comvoid SkEmptyShader::shadeSpan16(int x, int y, uint16_t span[], int count) { 3440c00f21fee3f5cfa3aa7e5d46ff94cb8cf340451tomhudson@google.com SkDEBUGFAIL("should never get called, since setContext() returned false"); 34559ccef695cef28a74ab2ea13d5a6c9017af45402reed@google.com} 34659ccef695cef28a74ab2ea13d5a6c9017af45402reed@google.com 34759ccef695cef28a74ab2ea13d5a6c9017af45402reed@google.comvoid SkEmptyShader::shadeSpanAlpha(int x, int y, uint8_t alpha[], int count) { 3480c00f21fee3f5cfa3aa7e5d46ff94cb8cf340451tomhudson@google.com SkDEBUGFAIL("should never get called, since setContext() returned false"); 34937a201231b8f6381938282675eb9abb50ab3b389reed@google.com} 35076f9e938df0b5826fd4c80b854ceafaf385cfbe1robertphillips@google.com 3510f10f7bf1fb43ca6346dc220a076773b1f19a367commit-bot@chromium.org#ifndef SK_IGNORE_TO_STRING 35276f9e938df0b5826fd4c80b854ceafaf385cfbe1robertphillips@google.comvoid SkEmptyShader::toString(SkString* str) const { 35376f9e938df0b5826fd4c80b854ceafaf385cfbe1robertphillips@google.com str->append("SkEmptyShader: ("); 35476f9e938df0b5826fd4c80b854ceafaf385cfbe1robertphillips@google.com 35576f9e938df0b5826fd4c80b854ceafaf385cfbe1robertphillips@google.com this->INHERITED::toString(str); 35676f9e938df0b5826fd4c80b854ceafaf385cfbe1robertphillips@google.com 35776f9e938df0b5826fd4c80b854ceafaf385cfbe1robertphillips@google.com str->append(")"); 35876f9e938df0b5826fd4c80b854ceafaf385cfbe1robertphillips@google.com} 35976f9e938df0b5826fd4c80b854ceafaf385cfbe1robertphillips@google.com#endif 360