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

#include "include/core/SkAlphaType.h"
#include "include/core/SkBlendMode.h"
#include "include/core/SkCanvas.h"
#include "include/core/SkColor.h"
#include "include/core/SkColorFilter.h"
#include "include/core/SkImage.h"
#include "include/core/SkImageInfo.h"
#include "include/core/SkPaint.h"
#include "include/core/SkRefCnt.h"
#include "include/core/SkSamplingOptions.h"
#include "include/core/SkShader.h"
#include "include/core/SkSurface.h"
#include "include/core/SkTypes.h"
#include "include/effects/SkColorMatrix.h"
#include "include/gpu/GpuTypes.h"
#include "include/gpu/GrDirectContext.h"
#include "src/core/SkAutoPixmapStorage.h"
#include "tests/CtsEnforcement.h"
#include "tests/Test.h"
#include "tests/TestUtils.h"

#include <functional>

struct GrContextOptions;


DEF_GANESH_TEST_FOR_RENDERING_CONTEXTS(MatrixColorFilter_TransparentBlack,
                                       reporter,
                                       info,
                                       CtsEnforcement::kApiLevel_T) {
    auto context = info.directContext();
    // Make a transparent black image rather than use a paint color to avoid an optimization that
    // applies the color filter on the CPU to paint colors.
    auto imgSurf = SkSurface::MakeRenderTarget(
            context, skgpu::Budgeted::kYes, SkImageInfo::MakeN32(5, 5, kPremul_SkAlphaType));
    imgSurf->getCanvas()->drawColor(0x0000000);
    auto shader = imgSurf->makeImageSnapshot()->makeShader(SkSamplingOptions());
    SkColorMatrix m;
    m.setScale(0, 0, 0, 127.f);
    SkPaint p;
    p.setColorFilter(SkColorFilters::Matrix(m));
    p.setShader(shader);
    p.setBlendMode(SkBlendMode::kSrc);
    auto surf = SkSurface::MakeRenderTarget(
            context, skgpu::Budgeted::kYes, SkImageInfo::MakeN32(5, 5, kPremul_SkAlphaType));
    // Seed the output surface with red so we would notice if we failed to draw at all.
    surf->getCanvas()->clear(SK_ColorRED);
    surf->getCanvas()->drawPaint(p);
    SkAutoPixmapStorage pixels;
    pixels.alloc(surf->imageInfo());
    surf->readPixels(pixels, 0, 0);
    auto error = std::function<ComparePixmapsErrorReporter>(
            [reporter](int x, int y, const float diffs[4]) {
                ERRORF(reporter, "Expected transparent black, instead got (%f, %f, %f, %f)",
                       diffs[0], diffs[1], diffs[2], diffs[3]);
            });
    static constexpr float kTol[] = {0, 0, 0, 0};
    CheckSolidPixels({0, 0, 0, 0}, pixels, kTol, error);
}
