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