
/*
 * Copyright 2006 The Android Open Source Project
 *
 * Use of this source code is governed by a BSD-style license that can be
 * found in the LICENSE file.
 */


#include "SkDrawShader.h"
#include "SkDrawBitmap.h"
#include "SkDrawMatrix.h"
#include "SkDrawPaint.h"
#include "SkTemplates.h"

#if SK_USE_CONDENSED_INFO == 0

const SkMemberInfo SkDrawShader::fInfo[] = {
    SK_MEMBER(matrix, Matrix),
    SK_MEMBER(tileMode, TileMode)
};

#endif

DEFINE_GET_MEMBER(SkDrawShader);

SkDrawShader::SkDrawShader() : matrix(NULL), 
    tileMode(SkShader::kClamp_TileMode) {
}

bool SkDrawShader::add() {
    if (fPaint->shader != (SkDrawShader*) -1)
        return true;
    fPaint->shader = this;
    fPaint->fOwnsShader = true;
    return false;
}

void SkDrawShader::addPostlude(SkShader* shader) {
    if (matrix)
        shader->setLocalMatrix(matrix->getMatrix());
}

#if SK_USE_CONDENSED_INFO == 0

const SkMemberInfo SkDrawBitmapShader::fInfo[] = {
    SK_MEMBER_INHERITED,
    SK_MEMBER(filterBitmap, Boolean),
    SK_MEMBER(image, BaseBitmap)
};

#endif

DEFINE_GET_MEMBER(SkDrawBitmapShader);

SkDrawBitmapShader::SkDrawBitmapShader() : filterBitmap(-1), image(NULL) {}

bool SkDrawBitmapShader::add() {
    if (fPaint->shader != (SkDrawShader*) -1)
        return true;
    fPaint->shader = this;
    fPaint->fOwnsShader = true;
    return false;
}

SkShader* SkDrawBitmapShader::getShader() {
    if (image == NULL)
        return NULL;
    
    // note: bitmap shader now supports independent tile modes for X and Y
    // we pass the same to both, but later we should extend this flexibility
    // to the xml (e.g. tileModeX="repeat" tileModeY="clmap")
    // 
    // oops, bitmapshader no longer takes filterBitmap, but deduces it at
    // draw-time from the paint 
    SkShader* shader  = SkShader::CreateBitmapShader(image->fBitmap, 
                                                    (SkShader::TileMode) tileMode,
                                                    (SkShader::TileMode) tileMode);
    SkAutoTDelete<SkShader> autoDel(shader);
    addPostlude(shader);
    (void)autoDel.detach();
    return shader;
}
