1ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com 2ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com/* 3ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com * Copyright 2006 The Android Open Source Project 4ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com * 5ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com * Use of this source code is governed by a BSD-style license that can be 6ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com * found in the LICENSE file. 7ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com */ 8ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com 98a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 108a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#include "SkDrawShader.h" 118a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#include "SkDrawBitmap.h" 128a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#include "SkDrawMatrix.h" 138a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#include "SkDrawPaint.h" 148a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#include "SkTemplates.h" 158a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 168a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#if SK_USE_CONDENSED_INFO == 0 178a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 188a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comconst SkMemberInfo SkDrawShader::fInfo[] = { 198a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com SK_MEMBER(matrix, Matrix), 208a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com SK_MEMBER(tileMode, TileMode) 218a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com}; 228a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 238a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#endif 248a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 258a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comDEFINE_GET_MEMBER(SkDrawShader); 268a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 27d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.comSkDrawShader::SkDrawShader() : matrix(NULL), 288a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com tileMode(SkShader::kClamp_TileMode) { 298a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com} 308a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 318a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.combool SkDrawShader::add() { 328a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com if (fPaint->shader != (SkDrawShader*) -1) 338a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com return true; 348a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com fPaint->shader = this; 358a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com fPaint->fOwnsShader = true; 368a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com return false; 378a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com} 388a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 399c9005a347e9996f357bd79591bd34f74f8bbc66commit-bot@chromium.orgSkMatrix* SkDrawShader::getMatrix() { 409c9005a347e9996f357bd79591bd34f74f8bbc66commit-bot@chromium.org return matrix ? &matrix->getMatrix() : NULL; 418a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com} 428a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 438a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#if SK_USE_CONDENSED_INFO == 0 448a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 458a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comconst SkMemberInfo SkDrawBitmapShader::fInfo[] = { 468a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com SK_MEMBER_INHERITED, 478a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com SK_MEMBER(filterBitmap, Boolean), 488a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com SK_MEMBER(image, BaseBitmap) 498a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com}; 508a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 518a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#endif 528a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 538a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comDEFINE_GET_MEMBER(SkDrawBitmapShader); 548a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 558a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comSkDrawBitmapShader::SkDrawBitmapShader() : filterBitmap(-1), image(NULL) {} 568a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 578a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.combool SkDrawBitmapShader::add() { 588a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com if (fPaint->shader != (SkDrawShader*) -1) 598a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com return true; 608a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com fPaint->shader = this; 618a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com fPaint->fOwnsShader = true; 628a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com return false; 638a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com} 648a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 658a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comSkShader* SkDrawBitmapShader::getShader() { 668a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com if (image == NULL) 678a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com return NULL; 68d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com 698a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com // note: bitmap shader now supports independent tile modes for X and Y 708a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com // we pass the same to both, but later we should extend this flexibility 718a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com // to the xml (e.g. tileModeX="repeat" tileModeY="clmap") 72d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com // 738a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com // oops, bitmapshader no longer takes filterBitmap, but deduces it at 74d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com // draw-time from the paint 75d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com SkShader* shader = SkShader::CreateBitmapShader(image->fBitmap, 768a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com (SkShader::TileMode) tileMode, 779c9005a347e9996f357bd79591bd34f74f8bbc66commit-bot@chromium.org (SkShader::TileMode) tileMode, 789c9005a347e9996f357bd79591bd34f74f8bbc66commit-bot@chromium.org getMatrix()); 798a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com SkAutoTDelete<SkShader> autoDel(shader); 808a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com (void)autoDel.detach(); 818a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com return shader; 828a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com} 83