/* * Copyright 2021 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/SkImage.h" #include "include/core/SkPaint.h" #include "include/effects/SkGradientShader.h" #include "tools/Resources.h" namespace { sk_sp create_gradient_shader(SkRect r) { // TODO: it seems like only the x-component of sk_FragCoord is making it to the shader! SkPoint pts[2] = { {r.fLeft, r.fTop}, {r.fRight, r.fTop} }; SkColor colors[] = { SK_ColorRED, SK_ColorGREEN, SK_ColorBLUE }; float offsets[] = { 0.0f, 0.75f, 1.0f }; return SkGradientShader::MakeLinear(pts, colors, offsets, SK_ARRAY_COUNT(colors), SkTileMode::kClamp); } sk_sp create_image_shader() { SkImageInfo ii = SkImageInfo::Make(100, 100, kRGBA_8888_SkColorType, kPremul_SkAlphaType); SkBitmap bitmap; bitmap.allocPixels(ii); bitmap.eraseColor(SK_ColorWHITE); SkCanvas canvas(bitmap); SkPaint redPaint; redPaint.setColor(SK_ColorRED); canvas.drawCircle(50, 50, 50, redPaint); bitmap.setAlphaType(kOpaque_SkAlphaType); bitmap.setImmutable(); sk_sp img = SkImage::MakeFromBitmap(bitmap); // TODO: we'll need a 'makeTextureImage' call here return img->makeShader(SkTileMode::kRepeat, SkTileMode::kRepeat, SkSamplingOptions()); } sk_sp create_blend_shader(SkBlendMode bm) { constexpr SkColor4f kTransYellow = {1.0f, 1.0f, 0.0f, 0.5f}; sk_sp solid = SkShaders::Color(kTransYellow, nullptr); return SkShaders::Blend(bm, std::move(solid), create_image_shader()); } } // anonymous namespace namespace skiagm { // This is just for bootstrapping Graphite. class GraphiteStartGM : public GM { public: GraphiteStartGM() { this->setBGColor(0xFFCCCCCC); GetResourceAsBitmap("images/color_wheel.gif", &fBitmap); } protected: SkString onShortName() override { return SkString("graphitestart"); } SkISize onISize() override { return SkISize::Make(256, 384); } void onDraw(SkCanvas* canvas) override { // UL corner { SkPaint p; p.setColor(SK_ColorRED); canvas->drawRect({2, 2, 127, 127}, p); } // UR corner { SkRect r{129, 2, 255, 127}; SkPaint p; p.setShader(create_gradient_shader(r)); canvas->drawRect(r, p); } // LL corner { SkPaint p; p.setShader(create_image_shader()); canvas->drawRect({2, 129, 127, 255}, p); } // LR corner { SkPaint p; p.setShader(create_blend_shader(SkBlendMode::kDstOver)); canvas->drawRect({129, 129, 255, 255}, p); } #ifdef SK_GRAPHITE_ENABLED // TODO: failing serialize test on Linux, not sure what's going on canvas->writePixels(fBitmap, 0, 256); #endif } SkBitmap fBitmap; }; ////////////////////////////////////////////////////////////////////////////// DEF_GM(return new GraphiteStartGM;) } // namespace skiagm