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