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