blob: 70b7ee950b60db3638347173bb4ef845a20427de [file] [log] [blame]
Ethan Nicholasa70693b2019-03-04 13:07:36 -05001/*
2 * Copyright 2019 Google LLC
3 *
4 * Use of this source code is governed by a BSD-style license that can be
5 * found in the LICENSE file.
6 */
7
Ethan Nicholasa70693b2019-03-04 13:07:36 -05008#include "Resources.h"
Mike Kleinea3f0142019-03-20 11:12:10 -05009#include "SkCanvas.h"
Ethan Nicholasa70693b2019-03-04 13:07:36 -050010#include "SkColorFilterPriv.h"
Mike Kleinea3f0142019-03-20 11:12:10 -050011#include "SkImage.h"
Ethan Nicholasa70693b2019-03-04 13:07:36 -050012#include "SkReadBuffer.h"
Mike Kleinea3f0142019-03-20 11:12:10 -050013#include "ToolUtils.h"
Ethan Nicholasa70693b2019-03-04 13:07:36 -050014#include "effects/GrSkSLFP.h"
Mike Kleinea3f0142019-03-20 11:12:10 -050015#include "gm.h"
Ethan Nicholasa70693b2019-03-04 13:07:36 -050016
17const char* SKSL_TEST_SRC = R"(
Ethan Nicholasc1c686b2019-04-02 17:30:23 -040018 layout(ctype=float) in uniform half b;
Ethan Nicholasa70693b2019-03-04 13:07:36 -050019
20 void main(inout half4 color) {
21 color.rg = color.gr;
Ethan Nicholasc1c686b2019-04-02 17:30:23 -040022 color.b = b;
Ethan Nicholasa70693b2019-03-04 13:07:36 -050023 }
24)";
25
26static void runtimeCpuFunc(float color[4], const void* context) {
27 std::swap(color[0], color[1]);
28 color[2] = *(float*) context;
29}
30
31DEF_SIMPLE_GPU_GM(runtimecolorfilter, context, rtc, canvas, 768, 256) {
32 auto img = GetResourceAsImage("images/mandrill_256.png");
33 canvas->drawImage(img, 0, 0, nullptr);
34
35 float b = 0.75;
Ethan Nicholas0e9401d2019-03-21 11:05:37 -040036 sk_sp<SkData> data = SkData::MakeWithCopy(&b, sizeof(b));
Ethan Nicholas0d997662019-04-08 09:46:01 -040037 static SkRuntimeColorFilterFactory fact = SkRuntimeColorFilterFactory(SkString(SKSL_TEST_SRC),
38 runtimeCpuFunc);
39 auto cf1 = fact.make(data);
Ethan Nicholasa70693b2019-03-04 13:07:36 -050040 SkPaint p;
41 p.setColorFilter(cf1);
42 canvas->drawImage(img, 256, 0, &p);
43
44 static constexpr size_t kBufferSize = 512;
45 char buffer[kBufferSize];
46 SkBinaryWriteBuffer wb(buffer, kBufferSize);
47 wb.writeFlattenable(cf1.get());
48 SkReadBuffer rb(buffer, kBufferSize);
49 auto cf2 = rb.readColorFilter();
Ethan Nicholasa1855622019-03-21 13:51:02 -040050 if (cf2) {
51 p.setColorFilter(cf2);
52 canvas->drawImage(img, 512, 0, &p);
53 }
Ethan Nicholasa70693b2019-03-04 13:07:36 -050054}
Ethan Nicholas0e9401d2019-03-21 11:05:37 -040055
56DEF_SIMPLE_GM(runtimecolorfilter_interpreted, canvas, 768, 256) {
57 auto img = GetResourceAsImage("images/mandrill_256.png");
58 canvas->drawImage(img, 0, 0, nullptr);
59
60 float b = 0.75;
61 sk_sp<SkData> data = SkData::MakeWithCopy(&b, sizeof(b));
Ethan Nicholas0d997662019-04-08 09:46:01 -040062 static SkRuntimeColorFilterFactory fact = SkRuntimeColorFilterFactory(SkString(SKSL_TEST_SRC),
63 nullptr);
64 auto cf1 = fact.make(data);
Ethan Nicholas0e9401d2019-03-21 11:05:37 -040065 SkPaint p;
66 p.setColorFilter(cf1);
67 canvas->drawImage(img, 256, 0, &p);
68
69 static constexpr size_t kBufferSize = 512;
70 char buffer[kBufferSize];
71 SkBinaryWriteBuffer wb(buffer, kBufferSize);
72 wb.writeFlattenable(cf1.get());
73 SkReadBuffer rb(buffer, kBufferSize);
74 auto cf2 = rb.readColorFilter();
Ethan Nicholasa1855622019-03-21 13:51:02 -040075 if (cf2) {
76 p.setColorFilter(cf2);
77 canvas->drawImage(img, 512, 0, &p);
78 }
Ethan Nicholas0e9401d2019-03-21 11:05:37 -040079}