1685cfc0ee13d7c355ae2f4f3d225ad45e945763fepoger@google.com 2685cfc0ee13d7c355ae2f4f3d225ad45e945763fepoger@google.com/* 3685cfc0ee13d7c355ae2f4f3d225ad45e945763fepoger@google.com * Copyright 2006 The Android Open Source Project 4685cfc0ee13d7c355ae2f4f3d225ad45e945763fepoger@google.com * 5685cfc0ee13d7c355ae2f4f3d225ad45e945763fepoger@google.com * Use of this source code is governed by a BSD-style license that can be 6685cfc0ee13d7c355ae2f4f3d225ad45e945763fepoger@google.com * found in the LICENSE file. 7685cfc0ee13d7c355ae2f4f3d225ad45e945763fepoger@google.com */ 8685cfc0ee13d7c355ae2f4f3d225ad45e945763fepoger@google.com 9bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com 10bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com#include "SkDrawShader.h" 11bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com#include "SkDrawBitmap.h" 12bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com#include "SkDrawMatrix.h" 13bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com#include "SkDrawPaint.h" 14bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com#include "SkTemplates.h" 15bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com 16bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com#if SK_USE_CONDENSED_INFO == 0 17bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com 18bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.comconst SkMemberInfo SkDrawShader::fInfo[] = { 19bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com SK_MEMBER(matrix, Matrix), 20bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com SK_MEMBER(tileMode, TileMode) 21bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com}; 22bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com 23bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com#endif 24bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com 25bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.comDEFINE_GET_MEMBER(SkDrawShader); 26bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com 27dfb3e3c0faadabc131ac1532e29ca71667328513rmistry@google.comSkDrawShader::SkDrawShader() : matrix(NULL), 28bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com tileMode(SkShader::kClamp_TileMode) { 29bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com} 30bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com 31bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.combool SkDrawShader::add() { 32bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com if (fPaint->shader != (SkDrawShader*) -1) 33bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com return true; 34bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com fPaint->shader = this; 35bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com fPaint->fOwnsShader = true; 36bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com return false; 37bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com} 38bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com 39bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.comvoid SkDrawShader::addPostlude(SkShader* shader) { 40bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com if (matrix) 41bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com shader->setLocalMatrix(matrix->getMatrix()); 42bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com} 43bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com 44bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com#if SK_USE_CONDENSED_INFO == 0 45bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com 46bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.comconst SkMemberInfo SkDrawBitmapShader::fInfo[] = { 47bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com SK_MEMBER_INHERITED, 48bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com SK_MEMBER(filterBitmap, Boolean), 49bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com SK_MEMBER(image, BaseBitmap) 50bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com}; 51bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com 52bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com#endif 53bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com 54bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.comDEFINE_GET_MEMBER(SkDrawBitmapShader); 55bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com 56bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.comSkDrawBitmapShader::SkDrawBitmapShader() : filterBitmap(-1), image(NULL) {} 57bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com 58bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.combool SkDrawBitmapShader::add() { 59bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com if (fPaint->shader != (SkDrawShader*) -1) 60bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com return true; 61bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com fPaint->shader = this; 62bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com fPaint->fOwnsShader = true; 63bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com return false; 64bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com} 65bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com 66bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.comSkShader* SkDrawBitmapShader::getShader() { 67bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com if (image == NULL) 68bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com return NULL; 69dfb3e3c0faadabc131ac1532e29ca71667328513rmistry@google.com 70bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com // note: bitmap shader now supports independent tile modes for X and Y 71bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com // we pass the same to both, but later we should extend this flexibility 72bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com // to the xml (e.g. tileModeX="repeat" tileModeY="clmap") 73dfb3e3c0faadabc131ac1532e29ca71667328513rmistry@google.com // 74bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com // oops, bitmapshader no longer takes filterBitmap, but deduces it at 75dfb3e3c0faadabc131ac1532e29ca71667328513rmistry@google.com // draw-time from the paint 76dfb3e3c0faadabc131ac1532e29ca71667328513rmistry@google.com SkShader* shader = SkShader::CreateBitmapShader(image->fBitmap, 77bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com (SkShader::TileMode) tileMode, 78bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com (SkShader::TileMode) tileMode); 79bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com SkAutoTDelete<SkShader> autoDel(shader); 80bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com addPostlude(shader); 81bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com (void)autoDel.detach(); 82bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com return shader; 83bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com} 84