aboutsummaryrefslogtreecommitdiffhomepage
path: root/gm/dcshader.cpp
diff options
context:
space:
mode:
authorGravatar Brian Salomon <bsalomon@google.com>2016-10-03 17:15:28 -0400
committerGravatar Skia Commit-Bot <skia-commit-bot@chromium.org>2016-10-03 21:39:33 +0000
commit2ebd0c80a2a9d90a2c2c653f40a2a7205bd2d31b (patch)
tree1baafac8edfb1d5d51e9ea53b176b95506e809cd /gm/dcshader.cpp
parent2cbcd12281ee807214df094964c584c78932e10b (diff)
Remove option to make GrCoordTransforms apply to device positions.
Adds a device space texture decal effect to use for clipping. GOLD_TRYBOT_URL= https://gold.skia.org/search?issue=2870 Change-Id: Ifcc7617ea87f5a86e301995cba9dfc30a4b0e2c5 Reviewed-on: https://skia-review.googlesource.com/2870 Commit-Queue: Brian Salomon <bsalomon@google.com> Reviewed-by: Robert Phillips <robertphillips@google.com>
Diffstat (limited to 'gm/dcshader.cpp')
-rw-r--r--gm/dcshader.cpp294
1 files changed, 0 insertions, 294 deletions
diff --git a/gm/dcshader.cpp b/gm/dcshader.cpp
deleted file mode 100644
index 6f273c098c..0000000000
--- a/gm/dcshader.cpp
+++ /dev/null
@@ -1,294 +0,0 @@
-/*
- * Copyright 2014 Google Inc.
- *
- * Use of this source code is governed by a BSD-style license that can be
- * found in the LICENSE file.
- */
-
-#include "gm.h"
-#if SK_SUPPORT_GPU
-#include "GrFragmentProcessor.h"
-#include "GrCoordTransform.h"
-#include "GrInvariantOutput.h"
-#include "effects/GrXfermodeFragmentProcessor.h"
-#include "glsl/GrGLSLFragmentProcessor.h"
-#include "glsl/GrGLSLFragmentShaderBuilder.h"
-#include "glsl/GrGLSLProgramBuilder.h"
-#include "glsl/GrGLSLProgramDataManager.h"
-#include "Resources.h"
-#include "SkReadBuffer.h"
-#include "SkShader.h"
-#include "SkStream.h"
-#include "SkTypeface.h"
-#include "SkWriteBuffer.h"
-
-namespace skiagm {
-
-///////////////////////////////////////////////////////////////////////////////
-
-class DCShader : public SkShader {
-public:
- DCShader(const SkMatrix& matrix) : fDeviceMatrix(matrix) {}
-
- SK_DECLARE_PUBLIC_FLATTENABLE_DESERIALIZATION_PROCS(DCShader)
-
- void flatten(SkWriteBuffer& buf) const override {
- buf.writeMatrix(fDeviceMatrix);
- }
-
- sk_sp<GrFragmentProcessor> asFragmentProcessor(const AsFPArgs&) const override;
-
-#ifndef SK_IGNORE_TO_STRING
- void toString(SkString* str) const override {
- str->appendf("DCShader: ()");
- }
-#endif
-
-private:
- const SkMatrix fDeviceMatrix;
-};
-
-sk_sp<SkFlattenable> DCShader::CreateProc(SkReadBuffer& buf) {
- SkMatrix matrix;
- buf.readMatrix(&matrix);
- return sk_make_sp<DCShader>(matrix);
-}
-
-class DCFP : public GrFragmentProcessor {
-public:
- DCFP(const SkMatrix& m) : fDeviceTransform(kDevice_GrCoordSet, m) {
- this->addCoordTransform(&fDeviceTransform);
- this->initClassID<DCFP>();
- }
-
- GrGLSLFragmentProcessor* onCreateGLSLInstance() const override {
- class DCGLFP : public GrGLSLFragmentProcessor {
- void emitCode(EmitArgs& args) override {
- GrGLSLFragmentBuilder* fragBuilder = args.fFragBuilder;
- SkString coords2d = fragBuilder->ensureCoords2D(args.fTransformedCoords[0]);
- fragBuilder->codeAppendf("vec2 c = %s;", coords2d.c_str());
- fragBuilder->codeAppend("vec2 r = mod(c, vec2(20.0));");
- fragBuilder->codeAppend("vec4 color = vec4(0.5*sin(c.x / 15.0) + 0.5,"
- "0.5*cos((c.x + c.y) / 15.0) + 0.5,"
- "(r.x + r.y) / 20.0,"
- "distance(r, vec2(15.0)) / 20.0 + 0.2);");
- fragBuilder->codeAppendf("color.rgb *= color.a;"
- "%s = color * %s;",
- args.fOutputColor, GrGLSLExpr4(args.fInputColor).c_str());
- }
- void onSetData(const GrGLSLProgramDataManager&, const GrProcessor&) override {}
- };
- return new DCGLFP;
- }
-
- const char* name() const override { return "DCFP"; }
-
- void onComputeInvariantOutput(GrInvariantOutput* inout) const override {
- inout->mulByUnknownFourComponents();
- }
-
-private:
- void onGetGLSLProcessorKey(const GrGLSLCaps& caps,
- GrProcessorKeyBuilder* b) const override {}
-
- bool onIsEqual(const GrFragmentProcessor&) const override { return true; }
-
- GrCoordTransform fDeviceTransform;
-};
-
-sk_sp<GrFragmentProcessor> DCShader::asFragmentProcessor(const AsFPArgs&) const {
- sk_sp<GrFragmentProcessor> inner(new DCFP(fDeviceMatrix));
- return GrFragmentProcessor::MulOutputByInputAlpha(std::move(inner));
-}
-
-class DCShaderGM : public GM {
-public:
- DCShaderGM() {
- this->setBGColor(sk_tool_utils::color_to_565(0xFFAABBCC));
- }
-
- ~DCShaderGM() override {
- for (int i = 0; i < fPrims.count(); ++i) {
- delete fPrims[i];
- }
- }
-
-protected:
-
- SkString onShortName() override {
- return SkString("dcshader");
- }
-
- SkISize onISize() override { return SkISize::Make(1000, 900); }
-
- void onOnceBeforeDraw() override {
- struct Rect : public Prim {
- SkRect draw(SkCanvas* canvas, const SkPaint& paint) override {
- SkRect rect = SkRect::MakeXYWH(0, 0, 50, 50);
- canvas->drawRect(rect, paint);
- return rect;
- }
- };
-
- struct Circle : public Prim {
- SkRect draw(SkCanvas* canvas, const SkPaint& paint) override {
- constexpr SkScalar radius = 25;
- canvas->drawCircle(radius, radius, radius, paint);
- return SkRect::MakeXYWH(0, 0, 2 * radius, 2 * radius);
- }
- };
-
- struct RRect : public Prim {
- SkRect draw(SkCanvas* canvas, const SkPaint& paint) override {
- SkRRect rrect;
- rrect.setRectXY(SkRect::MakeXYWH(0, 0, 50, 50), 10, 10);
- canvas->drawRRect(rrect, paint);
- return rrect.getBounds();
- }
- };
-
- struct DRRect : public Prim {
- SkRect draw(SkCanvas* canvas, const SkPaint& paint) override {
- SkRRect outerRRect;
- outerRRect.setRectXY(SkRect::MakeXYWH(0, 0, 50, 50), 5, 5);
- SkRRect innerRRect;
- innerRRect.setRectXY(SkRect::MakeXYWH(5, 8, 35, 30), 8, 3);
- canvas->drawDRRect(outerRRect, innerRRect, paint);
- return outerRRect.getBounds();
- }
- };
- struct Path : public Prim {
- SkRect draw(SkCanvas* canvas, const SkPaint& paint) override {
- SkPath path;
- path.addCircle(15, 15, 10);
- path.addOval(SkRect::MakeXYWH(2, 2, 22, 37));
- path.setFillType(SkPath::kEvenOdd_FillType);
- canvas->drawPath(path, paint);
- return path.getBounds();
- }
- };
-
- struct Points : public Prim {
- Points(SkCanvas::PointMode mode) : fMode(mode) {}
-
- SkRect draw(SkCanvas* canvas, const SkPaint& paint) override {
- SkRandom random;
- SkPoint points[500];
- SkRect bounds = SkRect::MakeWH(50, 50);
- int count = SkToInt(SK_ARRAY_COUNT(points));
- if (SkCanvas::kPoints_PointMode != fMode) {
- count = SkTMin(count, 10);
- }
- for (int p = 0; p < count; ++p) {
- points[p].fX = random.nextUScalar1() * bounds.width();
- points[p].fY = random.nextUScalar1() * bounds.width();
- }
- canvas->drawPoints(fMode, count, points, paint);
- return bounds;
- }
- SkCanvas::PointMode fMode;
- };
-
- struct Text : public Prim {
- SkRect draw(SkCanvas* canvas, const SkPaint& origPaint) override {
- SkPaint paint = origPaint;
- paint.setTextSize(30.f);
- this->setFont(&paint);
- const char* text = this->text();
- const SkVector offset = SkVector::Make(10, 10);
- canvas->drawText(text, strlen(text), offset.fX, offset.fY, paint);
- SkRect bounds;
- paint.measureText(text, strlen(text), &bounds);
- bounds.offset(offset);
- return bounds;
- }
-
- virtual void setFont(SkPaint* paint) {
- sk_tool_utils::set_portable_typeface(paint);
- }
-
- virtual const char* text() const { return "Hello, Skia!"; }
- };
-
- fPrims.push_back(new Rect);
- fPrims.push_back(new Circle);
- fPrims.push_back(new RRect);
- fPrims.push_back(new DRRect);
- fPrims.push_back(new Path);
- fPrims.push_back(new Points(SkCanvas::kPoints_PointMode));
- fPrims.push_back(new Points(SkCanvas::kLines_PointMode));
- fPrims.push_back(new Points(SkCanvas::kPolygon_PointMode));
- fPrims.push_back(new Text);
- }
-
- void onDraw(SkCanvas* canvas) override {
- // This GM exists to test a specific feature of the GPU backend. It does not work with the
- // sw rasterizer, tile modes, etc.
- if (nullptr == canvas->getGrContext()) {
- skiagm::GM::DrawGpuOnlyMessage(canvas);
- return;
- }
- SkPaint paint;
- SkTArray<SkMatrix> devMats;
- devMats.push_back().reset();
- devMats.push_back().setRotate(45, 500, 500);
- devMats.push_back().setRotate(-30, 200, 200);
- devMats.back().setPerspX(-SK_Scalar1 / 2000);
- devMats.back().setPerspY(SK_Scalar1 / 1000);
-
-
- SkTArray<SkMatrix> viewMats;
- viewMats.push_back().setScale(0.75f, 0.75f);
- viewMats.push_back().setRotate(45, 50, 50);
- viewMats.back().postScale(0.5f, 1.1f);
-
- canvas->translate(10, 20);
- canvas->save();
- SkScalar tx = 0, maxTy = 0;
- constexpr SkScalar kW = 900;
-
- for (int aa = 0; aa < 2; ++aa) {
- for (int i = 0; i < fPrims.count(); ++i) {
- for (int j = 0; j < devMats.count(); ++j) {
- for (int k = 0; k < viewMats.count(); ++k) {
- paint.setShader(sk_make_sp<DCShader>(devMats[j]));
- paint.setAntiAlias(SkToBool(aa));
- canvas->save();
- canvas->concat(viewMats[k]);
- SkRect bounds = fPrims[i]->draw(canvas, paint);
- canvas->restore();
- viewMats[k].mapRect(&bounds);
- // add margins
- bounds.fRight += 20;
- bounds.fBottom += 20;
- canvas->translate(bounds.fRight, 0);
- tx += bounds.fRight;
- maxTy = SkTMax(bounds.fBottom, maxTy);
- if (tx > kW) {
- tx = 0;
- canvas->restore();
- canvas->translate(0, maxTy);
- canvas->save();
- maxTy = 0;
- }
- }
- }
- }
- }
- canvas->restore();
- }
-
-private:
- struct Prim {
- virtual ~Prim() {}
- virtual SkRect draw(SkCanvas*, const SkPaint&) = 0;
- };
-
- SkTArray<Prim*> fPrims;
-
- typedef GM INHERITED;
-};
-
-DEF_GM(return new DCShaderGM;)
-}
-#endif