blob: 443cd500262545781476d36d2eb4231c01e961e1 [file] [log] [blame]
/*
* Copyright 2019 Google LLC
*
* Use of this source code is governed by a BSD-style license that can be
* found in the LICENSE file.
*/
#include "gm/gm.h"
#include "include/core/SkCanvas.h"
#include "include/core/SkColorFilter.h"
#include "include/core/SkData.h"
#include "include/core/SkImage.h"
#include "include/core/SkPaint.h"
#include "include/core/SkRefCnt.h"
#include "include/core/SkSize.h"
#include "include/core/SkString.h"
#include "src/core/SkColorFilterPriv.h"
#include "src/core/SkReadBuffer.h"
#include "src/core/SkWriteBuffer.h"
#include "tools/Resources.h"
#include <stddef.h>
#include <utility>
class GrContext;
class GrRenderTargetContext;
const char* SKSL_TEST_SRC = R"(
layout(ctype=float) uniform half b;
void main(inout half4 color) {
color.a = color.r*0.3 + color.g*0.6 + color.b*0.1;
color.r = 0;
color.g = 0;
color.b = 0;
}
)";
static void runtimeCpuFunc(float color[4], const void* context) {
color[3] = color[0]*0.3 + color[1]*0.6 + color[2]*0.1;
color[0] = 0;
color[1] = 0;
color[2] = 0;
}
DEF_SIMPLE_GPU_GM(runtimecolorfilter, context, rtc, canvas, 768, 256) {
auto img = GetResourceAsImage("images/mandrill_256.png");
canvas->drawImage(img, 0, 0, nullptr);
float b = 0.75;
sk_sp<SkData> data = SkData::MakeWithCopy(&b, sizeof(b));
static SkRuntimeColorFilterFactory fact = SkRuntimeColorFilterFactory(SkString(SKSL_TEST_SRC),
runtimeCpuFunc);
auto cf1 = fact.make(data);
SkPaint p;
p.setColorFilter(cf1);
canvas->drawImage(img, 256, 0, &p);
static constexpr size_t kBufferSize = 512;
char buffer[kBufferSize];
SkBinaryWriteBuffer wb(buffer, kBufferSize);
wb.writeFlattenable(cf1.get());
SkReadBuffer rb(buffer, kBufferSize);
auto cf2 = rb.readColorFilter();
if (cf2) {
p.setColorFilter(cf2);
canvas->drawImage(img, 512, 0, &p);
}
}
DEF_SIMPLE_GM(runtimecolorfilter_interpreted, canvas, 768, 256) {
auto img = GetResourceAsImage("images/mandrill_256.png");
canvas->drawImage(img, 0, 0, nullptr);
float b = 0.75;
sk_sp<SkData> data = SkData::MakeWithCopy(&b, sizeof(b));
static SkRuntimeColorFilterFactory fact = SkRuntimeColorFilterFactory(SkString(SKSL_TEST_SRC),
nullptr);
auto cf1 = fact.make(data);
SkPaint p;
p.setColorFilter(cf1);
canvas->drawImage(img, 256, 0, &p);
static constexpr size_t kBufferSize = 512;
char buffer[kBufferSize];
SkBinaryWriteBuffer wb(buffer, kBufferSize);
wb.writeFlattenable(cf1.get());
SkReadBuffer rb(buffer, kBufferSize);
auto cf2 = rb.readColorFilter();
if (cf2) {
p.setColorFilter(cf2);
canvas->drawImage(img, 512, 0, &p);
}
}
// These need to be static for some dm caching tests in DM...
static SkRuntimeColorFilterFactory gInterp =
SkRuntimeColorFilterFactory(SkString(SKSL_TEST_SRC), nullptr);
static SkRuntimeColorFilterFactory gCpuProc =
SkRuntimeColorFilterFactory(SkString(SKSL_TEST_SRC), runtimeCpuFunc);
class RuntimeCF : public skiagm::GM {
public:
RuntimeCF(bool useCpuProc) : fFact(useCpuProc ? gCpuProc : gInterp) {
fName.printf("runtime_cf_interp_%d", !useCpuProc);
}
protected:
bool runAsBench() const override { return true; }
SkString onShortName() override {
return fName;
}
SkISize onISize() override {
return SkISize::Make(512, 256);
}
void onOnceBeforeDraw() override {
fImg = GetResourceAsImage("images/mandrill_256.png")->makeRasterImage();
}
void onDraw(SkCanvas* canvas) override {
canvas->drawImage(fImg, 0, 0, nullptr);
if (!fCF) {
float b = 0.75;
sk_sp<SkData> data = SkData::MakeWithCopy(&b, sizeof(b));
fCF = fFact.make(data);
}
SkPaint p;
p.setColorFilter(fCF);
canvas->drawImage(fImg, 256, 0, &p);
}
private:
sk_sp<SkImage> fImg;
SkRuntimeColorFilterFactory fFact;
SkString fName;
sk_sp<SkColorFilter> fCF;
typedef skiagm::GM INHERITED;
};
DEF_GM(return new RuntimeCF(false);)
//DEF_GM(return new RuntimeCF(true);)