/*
 * Copyright 2016 Google Inc.
 *
 * Use of this source code is governed by a BSD-style license that can be
 * found in the LICENSE file.
 */

#include "Test.h"
#include "SkBitmap.h"
#include "SkImage.h"
#include "SkShader.h"
#include "SkSurface.h"
#include "SkData.h"

static void check_isabitmap(skiatest::Reporter* reporter, SkShader* shader,
                            int expectedW, int expectedH,
                            SkShader::TileMode expectedX, SkShader::TileMode expectedY,
                            const SkMatrix& expectedM) {
    SkBitmap bm;
    SkShader::TileMode tileModes[2];
    SkMatrix localM;
    REPORTER_ASSERT(reporter, shader->isABitmap(&bm, &localM, tileModes));
    REPORTER_ASSERT(reporter, bm.width() == expectedW);
    REPORTER_ASSERT(reporter, bm.height() == expectedH);
    REPORTER_ASSERT(reporter, localM == expectedM);
    REPORTER_ASSERT(reporter, tileModes[0] == expectedX);
    REPORTER_ASSERT(reporter, tileModes[1] == expectedY);

    // wack these so we don't get a false positive
    localM.setScale(9999, -9999);
    tileModes[0] = tileModes[1] = (SkShader::TileMode)99;

    SkImage* image = shader->isAImage(&localM, tileModes);
    REPORTER_ASSERT(reporter, image);
    REPORTER_ASSERT(reporter, image->width() == expectedW);
    REPORTER_ASSERT(reporter, image->height() == expectedH);
    REPORTER_ASSERT(reporter, localM == expectedM);
    REPORTER_ASSERT(reporter, tileModes[0] == expectedX);
    REPORTER_ASSERT(reporter, tileModes[1] == expectedY);
}

DEF_TEST(Shader_isABitmap, reporter) {
    const int W = 100;
    const int H = 100;
    SkBitmap bm;
    bm.allocN32Pixels(W, H);
    auto img = SkImage::MakeFromBitmap(bm);
    const SkMatrix localM = SkMatrix::MakeScale(2, 3);
    const SkShader::TileMode tmx = SkShader::kRepeat_TileMode;
    const SkShader::TileMode tmy = SkShader::kMirror_TileMode;

    auto shader0 = SkShader::MakeBitmapShader(bm, tmx, tmy, &localM);
    auto shader1 = SkImage::MakeFromBitmap(bm)->makeShader(tmx, tmy, &localM);

    check_isabitmap(reporter, shader0.get(), W, H, tmx, tmy, localM);
    check_isabitmap(reporter, shader1.get(), W, H, tmx, tmy, localM);
}
