1ed3ee6418ac1dc527db68c75c1d3d9a8d80ebeb0reed@google.com/*
2ed3ee6418ac1dc527db68c75c1d3d9a8d80ebeb0reed@google.com * Copyright 2011 Google Inc.
3ed3ee6418ac1dc527db68c75c1d3d9a8d80ebeb0reed@google.com *
4ed3ee6418ac1dc527db68c75c1d3d9a8d80ebeb0reed@google.com * Use of this source code is governed by a BSD-style license that can be
5ed3ee6418ac1dc527db68c75c1d3d9a8d80ebeb0reed@google.com * found in the LICENSE file.
6ed3ee6418ac1dc527db68c75c1d3d9a8d80ebeb0reed@google.com */
7ed3ee6418ac1dc527db68c75c1d3d9a8d80ebeb0reed@google.com
8ed3ee6418ac1dc527db68c75c1d3d9a8d80ebeb0reed@google.com#include "gm.h"
9ed3ee6418ac1dc527db68c75c1d3d9a8d80ebeb0reed@google.com#include "SkCanvas.h"
10ed3ee6418ac1dc527db68c75c1d3d9a8d80ebeb0reed@google.com#include "SkPath.h"
11ed3ee6418ac1dc527db68c75c1d3d9a8d80ebeb0reed@google.com#include "SkGradientShader.h"
12ed3ee6418ac1dc527db68c75c1d3d9a8d80ebeb0reed@google.com#include "SkTypeface.h"
13ed3ee6418ac1dc527db68c75c1d3d9a8d80ebeb0reed@google.com
14ed3ee6418ac1dc527db68c75c1d3d9a8d80ebeb0reed@google.comstatic SkShader* make_heatGradient(const SkPoint pts[2]) {
15ed3ee6418ac1dc527db68c75c1d3d9a8d80ebeb0reed@google.com    const SkColor bw[] = { SK_ColorBLACK, SK_ColorWHITE };
16ed3ee6418ac1dc527db68c75c1d3d9a8d80ebeb0reed@google.com
172880df2609eba09b555ca37be04b6ad89290c765Tom Hudson    return SkGradientShader::CreateLinear(pts, bw, nullptr,
18ed3ee6418ac1dc527db68c75c1d3d9a8d80ebeb0reed@google.com                                          SK_ARRAY_COUNT(bw),
19ed3ee6418ac1dc527db68c75c1d3d9a8d80ebeb0reed@google.com                                          SkShader::kClamp_TileMode);
20ed3ee6418ac1dc527db68c75c1d3d9a8d80ebeb0reed@google.com}
21ed3ee6418ac1dc527db68c75c1d3d9a8d80ebeb0reed@google.com
22ed3ee6418ac1dc527db68c75c1d3d9a8d80ebeb0reed@google.comstatic bool setFont(SkPaint* paint, const char name[]) {
232880df2609eba09b555ca37be04b6ad89290c765Tom Hudson    SkTypeface* tf = SkTypeface::CreateFromName(name, SkTypeface::kNormal);
24ed3ee6418ac1dc527db68c75c1d3d9a8d80ebeb0reed@google.com    if (tf) {
25ed3ee6418ac1dc527db68c75c1d3d9a8d80ebeb0reed@google.com        paint->setTypeface(tf)->unref();
26ed3ee6418ac1dc527db68c75c1d3d9a8d80ebeb0reed@google.com        return true;
27ed3ee6418ac1dc527db68c75c1d3d9a8d80ebeb0reed@google.com    }
28ce151d0eba3d8f0635dd8b7888312a21999d2a48reed@google.com    return false;
29ed3ee6418ac1dc527db68c75c1d3d9a8d80ebeb0reed@google.com}
30ed3ee6418ac1dc527db68c75c1d3d9a8d80ebeb0reed@google.com
31ed3ee6418ac1dc527db68c75c1d3d9a8d80ebeb0reed@google.com/**
32ed3ee6418ac1dc527db68c75c1d3d9a8d80ebeb0reed@google.com   Test a set of clipping problems discovered while writing blitAntiRect,
33ed3ee6418ac1dc527db68c75c1d3d9a8d80ebeb0reed@google.com   and test all the code paths through the clipping blitters.
34ed3ee6418ac1dc527db68c75c1d3d9a8d80ebeb0reed@google.com   Each region should show as a blue center surrounded by a 2px green
35ed3ee6418ac1dc527db68c75c1d3d9a8d80ebeb0reed@google.com   border, with no red.
36ed3ee6418ac1dc527db68c75c1d3d9a8d80ebeb0reed@google.com*/
37d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com
38ed3ee6418ac1dc527db68c75c1d3d9a8d80ebeb0reed@google.com#define HEIGHT 480
39ed3ee6418ac1dc527db68c75c1d3d9a8d80ebeb0reed@google.com
408367b8cb7a6b2f163ee41365323cb219b7049b15reedclass GammaTextGM : public skiagm::GM {
41ed3ee6418ac1dc527db68c75c1d3d9a8d80ebeb0reed@google.comprotected:
4236352bf5e38f45a70ee4f4fc132a38048d38206dmtklein    SkString onShortName() override {
432880df2609eba09b555ca37be04b6ad89290c765Tom Hudson        SkString name("gammatext");
442880df2609eba09b555ca37be04b6ad89290c765Tom Hudson        name.append(sk_tool_utils::major_platform_os_name());
452880df2609eba09b555ca37be04b6ad89290c765Tom Hudson        return name;
46ed3ee6418ac1dc527db68c75c1d3d9a8d80ebeb0reed@google.com    }
47ed3ee6418ac1dc527db68c75c1d3d9a8d80ebeb0reed@google.com
4836352bf5e38f45a70ee4f4fc132a38048d38206dmtklein    SkISize onISize() override {
49f539318f0d3dba743ec1886d5d9df0fb1be628a1tfarina        return SkISize::Make(1024, HEIGHT);
50ed3ee6418ac1dc527db68c75c1d3d9a8d80ebeb0reed@google.com    }
51ed3ee6418ac1dc527db68c75c1d3d9a8d80ebeb0reed@google.com
52ed3ee6418ac1dc527db68c75c1d3d9a8d80ebeb0reed@google.com    static void drawGrad(SkCanvas* canvas) {
53c39c8674c94dba8b1ffe938cd99c825320cc1475vandebo@chromium.org        SkPoint pts[] = { { 0, 0 }, { 0, SkIntToScalar(HEIGHT) } };
54ed3ee6418ac1dc527db68c75c1d3d9a8d80ebeb0reed@google.com        SkShader* s = make_heatGradient(pts);
55d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com
56ed3ee6418ac1dc527db68c75c1d3d9a8d80ebeb0reed@google.com        canvas->clear(SK_ColorRED);
57ed3ee6418ac1dc527db68c75c1d3d9a8d80ebeb0reed@google.com        SkPaint paint;
58ed3ee6418ac1dc527db68c75c1d3d9a8d80ebeb0reed@google.com        paint.setShader(s)->unref();
59c39c8674c94dba8b1ffe938cd99c825320cc1475vandebo@chromium.org        SkRect r = { 0, 0, SkIntToScalar(1024), SkIntToScalar(HEIGHT) };
60ed3ee6418ac1dc527db68c75c1d3d9a8d80ebeb0reed@google.com        canvas->drawRect(r, paint);
61ed3ee6418ac1dc527db68c75c1d3d9a8d80ebeb0reed@google.com    }
62ed3ee6418ac1dc527db68c75c1d3d9a8d80ebeb0reed@google.com
6336352bf5e38f45a70ee4f4fc132a38048d38206dmtklein    void onDraw(SkCanvas* canvas) override {
64ed3ee6418ac1dc527db68c75c1d3d9a8d80ebeb0reed@google.com        drawGrad(canvas);
65ed3ee6418ac1dc527db68c75c1d3d9a8d80ebeb0reed@google.com
66ed3ee6418ac1dc527db68c75c1d3d9a8d80ebeb0reed@google.com        const SkColor fg[] = {
67ed3ee6418ac1dc527db68c75c1d3d9a8d80ebeb0reed@google.com            0xFFFFFFFF,
68ed3ee6418ac1dc527db68c75c1d3d9a8d80ebeb0reed@google.com            0xFFFFFF00, 0xFFFF00FF, 0xFF00FFFF,
69ed3ee6418ac1dc527db68c75c1d3d9a8d80ebeb0reed@google.com            0xFFFF0000, 0xFF00FF00, 0xFF0000FF,
70ed3ee6418ac1dc527db68c75c1d3d9a8d80ebeb0reed@google.com            0xFF000000,
71ed3ee6418ac1dc527db68c75c1d3d9a8d80ebeb0reed@google.com        };
72d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com
73ed3ee6418ac1dc527db68c75c1d3d9a8d80ebeb0reed@google.com        const char* text = "Hamburgefons";
74ed3ee6418ac1dc527db68c75c1d3d9a8d80ebeb0reed@google.com        size_t len = strlen(text);
75ed3ee6418ac1dc527db68c75c1d3d9a8d80ebeb0reed@google.com
76ed3ee6418ac1dc527db68c75c1d3d9a8d80ebeb0reed@google.com        SkPaint paint;
772880df2609eba09b555ca37be04b6ad89290c765Tom Hudson        setFont(&paint, sk_tool_utils::platform_font_name("serif"));
78ed3ee6418ac1dc527db68c75c1d3d9a8d80ebeb0reed@google.com        paint.setTextSize(SkIntToScalar(16));
79ed3ee6418ac1dc527db68c75c1d3d9a8d80ebeb0reed@google.com        paint.setAntiAlias(true);
80ed3ee6418ac1dc527db68c75c1d3d9a8d80ebeb0reed@google.com        paint.setLCDRenderText(true);
81ed3ee6418ac1dc527db68c75c1d3d9a8d80ebeb0reed@google.com
82c39c8674c94dba8b1ffe938cd99c825320cc1475vandebo@chromium.org        SkScalar x = SkIntToScalar(10);
83ed3ee6418ac1dc527db68c75c1d3d9a8d80ebeb0reed@google.com        for (size_t i = 0; i < SK_ARRAY_COUNT(fg); ++i) {
84ed3ee6418ac1dc527db68c75c1d3d9a8d80ebeb0reed@google.com            paint.setColor(fg[i]);
85d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com
86c39c8674c94dba8b1ffe938cd99c825320cc1475vandebo@chromium.org            SkScalar y = SkIntToScalar(40);
87c39c8674c94dba8b1ffe938cd99c825320cc1475vandebo@chromium.org            SkScalar stopy = SkIntToScalar(HEIGHT);
88ed3ee6418ac1dc527db68c75c1d3d9a8d80ebeb0reed@google.com            while (y < stopy) {
8904f7e14b385118b8caa3ad7fcb30d64f4c32e677reed                canvas->drawText(text, len, x, y, paint);
90ed3ee6418ac1dc527db68c75c1d3d9a8d80ebeb0reed@google.com                y += paint.getTextSize() * 2;
91ed3ee6418ac1dc527db68c75c1d3d9a8d80ebeb0reed@google.com            }
92ed3ee6418ac1dc527db68c75c1d3d9a8d80ebeb0reed@google.com            x += SkIntToScalar(1024) / SK_ARRAY_COUNT(fg);
93ed3ee6418ac1dc527db68c75c1d3d9a8d80ebeb0reed@google.com        }
94ed3ee6418ac1dc527db68c75c1d3d9a8d80ebeb0reed@google.com    }
95ed3ee6418ac1dc527db68c75c1d3d9a8d80ebeb0reed@google.com
96ed3ee6418ac1dc527db68c75c1d3d9a8d80ebeb0reed@google.comprivate:
978367b8cb7a6b2f163ee41365323cb219b7049b15reed    typedef skiagm::GM INHERITED;
98ed3ee6418ac1dc527db68c75c1d3d9a8d80ebeb0reed@google.com};
99ed3ee6418ac1dc527db68c75c1d3d9a8d80ebeb0reed@google.com
10067b21a7eef393bbee86482c75b7ea8dfc474d08abungemanDEF_GM( return new GammaTextGM; )
1018367b8cb7a6b2f163ee41365323cb219b7049b15reed
102ed3ee6418ac1dc527db68c75c1d3d9a8d80ebeb0reed@google.com//////////////////////////////////////////////////////////////////////////////
103ed3ee6418ac1dc527db68c75c1d3d9a8d80ebeb0reed@google.com
1048367b8cb7a6b2f163ee41365323cb219b7049b15reedstatic SkShader* make_gradient(SkColor c) {
1058367b8cb7a6b2f163ee41365323cb219b7049b15reed    const SkPoint pts[] = { { 0, 0 }, { 240, 0 } };
1068367b8cb7a6b2f163ee41365323cb219b7049b15reed    SkColor colors[2];
1078367b8cb7a6b2f163ee41365323cb219b7049b15reed    colors[0] = c;
1088367b8cb7a6b2f163ee41365323cb219b7049b15reed    colors[1] = SkColorSetA(c, 0);
1092880df2609eba09b555ca37be04b6ad89290c765Tom Hudson    return SkGradientShader::CreateLinear(pts, colors, nullptr, 2, SkShader::kClamp_TileMode);
1108367b8cb7a6b2f163ee41365323cb219b7049b15reed}
1118367b8cb7a6b2f163ee41365323cb219b7049b15reed
1128367b8cb7a6b2f163ee41365323cb219b7049b15reedstatic void set_face(SkPaint* paint) {
1138367b8cb7a6b2f163ee41365323cb219b7049b15reed    SkTypeface* face = SkTypeface::CreateFromName("serif", SkTypeface::kItalic);
1148367b8cb7a6b2f163ee41365323cb219b7049b15reed    SkSafeUnref(paint->setTypeface(face));
1158367b8cb7a6b2f163ee41365323cb219b7049b15reed}
116ed3ee6418ac1dc527db68c75c1d3d9a8d80ebeb0reed@google.com
1178367b8cb7a6b2f163ee41365323cb219b7049b15reedstatic void draw_pair(SkCanvas* canvas, SkPaint* paint, SkShader* shader) {
1188367b8cb7a6b2f163ee41365323cb219b7049b15reed    const char text[] = "Now is the time for all good";
1198367b8cb7a6b2f163ee41365323cb219b7049b15reed    const size_t len = strlen(text);
1208367b8cb7a6b2f163ee41365323cb219b7049b15reed
1212880df2609eba09b555ca37be04b6ad89290c765Tom Hudson    paint->setShader(nullptr);
1228367b8cb7a6b2f163ee41365323cb219b7049b15reed    canvas->drawText(text, len, 10, 20, *paint);
1238367b8cb7a6b2f163ee41365323cb219b7049b15reed    paint->setShader(SkShader::CreateColorShader(paint->getColor()))->unref();
1248367b8cb7a6b2f163ee41365323cb219b7049b15reed    canvas->drawText(text, len, 10, 40, *paint);
1258367b8cb7a6b2f163ee41365323cb219b7049b15reed    paint->setShader(shader);
1268367b8cb7a6b2f163ee41365323cb219b7049b15reed    canvas->drawText(text, len, 10, 60, *paint);
127ed3ee6418ac1dc527db68c75c1d3d9a8d80ebeb0reed@google.com}
1288367b8cb7a6b2f163ee41365323cb219b7049b15reed
1298367b8cb7a6b2f163ee41365323cb219b7049b15reedclass GammaShaderTextGM : public skiagm::GM {
1308367b8cb7a6b2f163ee41365323cb219b7049b15reed    SkShader* fShaders[3];
1318367b8cb7a6b2f163ee41365323cb219b7049b15reed    SkColor fColors[3];
1328367b8cb7a6b2f163ee41365323cb219b7049b15reed
1338367b8cb7a6b2f163ee41365323cb219b7049b15reedpublic:
1348367b8cb7a6b2f163ee41365323cb219b7049b15reed    GammaShaderTextGM() {
1358367b8cb7a6b2f163ee41365323cb219b7049b15reed        const SkColor colors[] = { SK_ColorBLACK, SK_ColorRED, SK_ColorBLUE };
1368367b8cb7a6b2f163ee41365323cb219b7049b15reed        for (size_t i = 0; i < SK_ARRAY_COUNT(fShaders); ++i) {
1372880df2609eba09b555ca37be04b6ad89290c765Tom Hudson            fShaders[i] = nullptr;
1388367b8cb7a6b2f163ee41365323cb219b7049b15reed            fColors[i] = colors[i];
1398367b8cb7a6b2f163ee41365323cb219b7049b15reed        }
1408367b8cb7a6b2f163ee41365323cb219b7049b15reed    }
1418367b8cb7a6b2f163ee41365323cb219b7049b15reed
14236352bf5e38f45a70ee4f4fc132a38048d38206dmtklein    ~GammaShaderTextGM() override {
1438367b8cb7a6b2f163ee41365323cb219b7049b15reed        for (size_t i = 0; i < SK_ARRAY_COUNT(fShaders); ++i) {
1448367b8cb7a6b2f163ee41365323cb219b7049b15reed            SkSafeUnref(fShaders[i]);
1458367b8cb7a6b2f163ee41365323cb219b7049b15reed        }
1468367b8cb7a6b2f163ee41365323cb219b7049b15reed    }
1478367b8cb7a6b2f163ee41365323cb219b7049b15reed
1488367b8cb7a6b2f163ee41365323cb219b7049b15reedprotected:
14936352bf5e38f45a70ee4f4fc132a38048d38206dmtklein    SkString onShortName() override {
1508367b8cb7a6b2f163ee41365323cb219b7049b15reed        return SkString("gammagradienttext");
1518367b8cb7a6b2f163ee41365323cb219b7049b15reed    }
1528367b8cb7a6b2f163ee41365323cb219b7049b15reed
15336352bf5e38f45a70ee4f4fc132a38048d38206dmtklein    SkISize onISize() override {
1548367b8cb7a6b2f163ee41365323cb219b7049b15reed        return SkISize::Make(300, 300);
1558367b8cb7a6b2f163ee41365323cb219b7049b15reed    }
1568367b8cb7a6b2f163ee41365323cb219b7049b15reed
15736352bf5e38f45a70ee4f4fc132a38048d38206dmtklein    void onOnceBeforeDraw() override {
1588367b8cb7a6b2f163ee41365323cb219b7049b15reed        for (size_t i = 0; i < SK_ARRAY_COUNT(fShaders); ++i) {
1598367b8cb7a6b2f163ee41365323cb219b7049b15reed            fShaders[i] = make_gradient(fColors[i]);
1608367b8cb7a6b2f163ee41365323cb219b7049b15reed        }
1618367b8cb7a6b2f163ee41365323cb219b7049b15reed    }
1628367b8cb7a6b2f163ee41365323cb219b7049b15reed
16336352bf5e38f45a70ee4f4fc132a38048d38206dmtklein    void onDraw(SkCanvas* canvas) override {
1648367b8cb7a6b2f163ee41365323cb219b7049b15reed        SkPaint paint;
1658367b8cb7a6b2f163ee41365323cb219b7049b15reed        paint.setAntiAlias(true);
1668367b8cb7a6b2f163ee41365323cb219b7049b15reed        paint.setLCDRenderText(true);
1678367b8cb7a6b2f163ee41365323cb219b7049b15reed        paint.setTextSize(18);
1688367b8cb7a6b2f163ee41365323cb219b7049b15reed        set_face(&paint);
1698367b8cb7a6b2f163ee41365323cb219b7049b15reed
1708367b8cb7a6b2f163ee41365323cb219b7049b15reed        for (size_t i = 0; i < SK_ARRAY_COUNT(fShaders); ++i) {
1718367b8cb7a6b2f163ee41365323cb219b7049b15reed            paint.setColor(fColors[i]);
1728367b8cb7a6b2f163ee41365323cb219b7049b15reed            draw_pair(canvas, &paint, fShaders[i]);
1738367b8cb7a6b2f163ee41365323cb219b7049b15reed            canvas->translate(0, 80);
1748367b8cb7a6b2f163ee41365323cb219b7049b15reed        }
1758367b8cb7a6b2f163ee41365323cb219b7049b15reed    }
1768367b8cb7a6b2f163ee41365323cb219b7049b15reed
1778367b8cb7a6b2f163ee41365323cb219b7049b15reedprivate:
1788367b8cb7a6b2f163ee41365323cb219b7049b15reed    typedef skiagm::GM INHERITED;
1798367b8cb7a6b2f163ee41365323cb219b7049b15reed};
1808367b8cb7a6b2f163ee41365323cb219b7049b15reed
1818367b8cb7a6b2f163ee41365323cb219b7049b15reedDEF_GM( return new GammaShaderTextGM; )
1828367b8cb7a6b2f163ee41365323cb219b7049b15reed
183