blob: 89252b6cc6acc3c9e6e27f8389fd252fe276b0c6 [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));
Mike Reeda6dd1eb2019-03-30 15:14:08 +000037 auto cf1 = SkRuntimeColorFilterFactory(SkString(SKSL_TEST_SRC), runtimeCpuFunc).make(data);
Ethan Nicholasa70693b2019-03-04 13:07:36 -050038 SkPaint p;
39 p.setColorFilter(cf1);
40 canvas->drawImage(img, 256, 0, &p);
41
42 static constexpr size_t kBufferSize = 512;
43 char buffer[kBufferSize];
44 SkBinaryWriteBuffer wb(buffer, kBufferSize);
45 wb.writeFlattenable(cf1.get());
46 SkReadBuffer rb(buffer, kBufferSize);
47 auto cf2 = rb.readColorFilter();
Ethan Nicholasa1855622019-03-21 13:51:02 -040048 if (cf2) {
49 p.setColorFilter(cf2);
50 canvas->drawImage(img, 512, 0, &p);
51 }
Ethan Nicholasa70693b2019-03-04 13:07:36 -050052}
Ethan Nicholas0e9401d2019-03-21 11:05:37 -040053
54DEF_SIMPLE_GM(runtimecolorfilter_interpreted, canvas, 768, 256) {
55 auto img = GetResourceAsImage("images/mandrill_256.png");
56 canvas->drawImage(img, 0, 0, nullptr);
57
58 float b = 0.75;
59 sk_sp<SkData> data = SkData::MakeWithCopy(&b, sizeof(b));
Mike Reeda6dd1eb2019-03-30 15:14:08 +000060 auto cf1 = SkRuntimeColorFilterFactory(SkString(SKSL_TEST_SRC), nullptr).make(data);
Ethan Nicholas0e9401d2019-03-21 11:05:37 -040061 SkPaint p;
62 p.setColorFilter(cf1);
63 canvas->drawImage(img, 256, 0, &p);
64
65 static constexpr size_t kBufferSize = 512;
66 char buffer[kBufferSize];
67 SkBinaryWriteBuffer wb(buffer, kBufferSize);
68 wb.writeFlattenable(cf1.get());
69 SkReadBuffer rb(buffer, kBufferSize);
70 auto cf2 = rb.readColorFilter();
Ethan Nicholasa1855622019-03-21 13:51:02 -040071 if (cf2) {
72 p.setColorFilter(cf2);
73 canvas->drawImage(img, 512, 0, &p);
74 }
Ethan Nicholas0e9401d2019-03-21 11:05:37 -040075}