1cb93a386Sopenharmony_ci/* 2cb93a386Sopenharmony_ci * Copyright 2019 Google LLC 3cb93a386Sopenharmony_ci * 4cb93a386Sopenharmony_ci * Use of this source code is governed by a BSD-style license that can be 5cb93a386Sopenharmony_ci * found in the LICENSE file. 6cb93a386Sopenharmony_ci */ 7cb93a386Sopenharmony_ci 8cb93a386Sopenharmony_ci#include "gm/gm.h" 9cb93a386Sopenharmony_ci#include "include/core/SkCanvas.h" 10cb93a386Sopenharmony_ci#include "include/core/SkData.h" 11cb93a386Sopenharmony_ci#include "include/core/SkPaint.h" 12cb93a386Sopenharmony_ci#include "include/core/SkShader.h" 13cb93a386Sopenharmony_ci#include "include/core/SkSize.h" 14cb93a386Sopenharmony_ci#include "include/core/SkString.h" 15cb93a386Sopenharmony_ci#include "include/effects/SkRuntimeEffect.h" 16cb93a386Sopenharmony_ci 17cb93a386Sopenharmony_cistatic const char* RUNTIME_FUNCTIONS_SRC = R"( 18cb93a386Sopenharmony_ci uniform half4 gColor; 19cb93a386Sopenharmony_ci 20cb93a386Sopenharmony_ci half scale(float x) { 21cb93a386Sopenharmony_ci return x / 255; 22cb93a386Sopenharmony_ci } 23cb93a386Sopenharmony_ci 24cb93a386Sopenharmony_ci half4 blackAndWhite(half4 raw) { 25cb93a386Sopenharmony_ci half value = raw.r * 0.22 + raw.g * 0.67 + raw.b * 0.11; 26cb93a386Sopenharmony_ci return half4(value.xxx, raw.a); 27cb93a386Sopenharmony_ci } 28cb93a386Sopenharmony_ci 29cb93a386Sopenharmony_ci half4 main(float2 p) { 30cb93a386Sopenharmony_ci return blackAndWhite(half4(scale(p.x), scale(p.y), gColor.b, 1)); 31cb93a386Sopenharmony_ci } 32cb93a386Sopenharmony_ci)"; 33cb93a386Sopenharmony_ci 34cb93a386Sopenharmony_ciclass RuntimeFunctions : public skiagm::GM { 35cb93a386Sopenharmony_ci bool runAsBench() const override { return true; } 36cb93a386Sopenharmony_ci 37cb93a386Sopenharmony_ci SkString onShortName() override { return SkString("runtimefunctions"); } 38cb93a386Sopenharmony_ci 39cb93a386Sopenharmony_ci SkISize onISize() override { return {256, 256}; } 40cb93a386Sopenharmony_ci 41cb93a386Sopenharmony_ci void onDraw(SkCanvas* canvas) override { 42cb93a386Sopenharmony_ci sk_sp<SkRuntimeEffect> gEffect = 43cb93a386Sopenharmony_ci SkRuntimeEffect::MakeForShader(SkString(RUNTIME_FUNCTIONS_SRC)).effect; 44cb93a386Sopenharmony_ci SkASSERT(gEffect); 45cb93a386Sopenharmony_ci 46cb93a386Sopenharmony_ci SkMatrix localM; 47cb93a386Sopenharmony_ci localM.setRotate(90, 128, 128); 48cb93a386Sopenharmony_ci 49cb93a386Sopenharmony_ci SkColor4f inputColor = { 1, 0, 0, 1 }; 50cb93a386Sopenharmony_ci auto shader = gEffect->makeShader(SkData::MakeWithCopy(&inputColor, sizeof(inputColor)), 51cb93a386Sopenharmony_ci nullptr, 0, &localM, true); 52cb93a386Sopenharmony_ci SkPaint p; 53cb93a386Sopenharmony_ci p.setShader(std::move(shader)); 54cb93a386Sopenharmony_ci canvas->drawRect({0, 0, 256, 256}, p); 55cb93a386Sopenharmony_ci } 56cb93a386Sopenharmony_ci}; 57cb93a386Sopenharmony_ci 58cb93a386Sopenharmony_ciDEF_GM(return new RuntimeFunctions;) 59