1e805535b19e0e3d5459b69ed53d6986a1fe6663dreed@google.com/* 2e805535b19e0e3d5459b69ed53d6986a1fe6663dreed@google.com * Copyright 2011 Google Inc. 3e805535b19e0e3d5459b69ed53d6986a1fe6663dreed@google.com * 4e805535b19e0e3d5459b69ed53d6986a1fe6663dreed@google.com * Use of this source code is governed by a BSD-style license that can be 5e805535b19e0e3d5459b69ed53d6986a1fe6663dreed@google.com * found in the LICENSE file. 6e805535b19e0e3d5459b69ed53d6986a1fe6663dreed@google.com */ 7e805535b19e0e3d5459b69ed53d6986a1fe6663dreed@google.com 8e805535b19e0e3d5459b69ed53d6986a1fe6663dreed@google.com#include "gm.h" 9e805535b19e0e3d5459b69ed53d6986a1fe6663dreed@google.com#include "SkCanvas.h" 10e805535b19e0e3d5459b69ed53d6986a1fe6663dreed@google.com#include "SkGradientShader.h" 11cb325ceda16fab97fd3281785e6ae10fcb8dcf83tomhudson@google.com#include "SkTypeface.h" 12e805535b19e0e3d5459b69ed53d6986a1fe6663dreed@google.com 13fb82300d1b41f21d1d154847b6bf3fb73d5b6f81reed@google.com// test shader w/ transparency 14e805535b19e0e3d5459b69ed53d6986a1fe6663dreed@google.comstatic SkShader* make_grad(SkScalar width) { 15fb82300d1b41f21d1d154847b6bf3fb73d5b6f81reed@google.com SkColor colors[] = { SK_ColorRED, 0x0000FF00, SK_ColorBLUE }; 16e805535b19e0e3d5459b69ed53d6986a1fe6663dreed@google.com SkPoint pts[] = { { 0, 0 }, { width, 0 } }; 17fb82300d1b41f21d1d154847b6bf3fb73d5b6f81reed@google.com return SkGradientShader::CreateLinear(pts, colors, NULL, 18e805535b19e0e3d5459b69ed53d6986a1fe6663dreed@google.com SK_ARRAY_COUNT(colors), 19e805535b19e0e3d5459b69ed53d6986a1fe6663dreed@google.com SkShader::kMirror_TileMode); 20e805535b19e0e3d5459b69ed53d6986a1fe6663dreed@google.com} 21e805535b19e0e3d5459b69ed53d6986a1fe6663dreed@google.com 22fb82300d1b41f21d1d154847b6bf3fb73d5b6f81reed@google.com// test opaque shader 23e805535b19e0e3d5459b69ed53d6986a1fe6663dreed@google.comstatic SkShader* make_grad2(SkScalar width) { 24e805535b19e0e3d5459b69ed53d6986a1fe6663dreed@google.com SkColor colors[] = { SK_ColorRED, SK_ColorGREEN, SK_ColorBLUE }; 25e805535b19e0e3d5459b69ed53d6986a1fe6663dreed@google.com SkPoint pts[] = { { 0, 0 }, { width, 0 } }; 26e805535b19e0e3d5459b69ed53d6986a1fe6663dreed@google.com return SkGradientShader::CreateLinear(pts, colors, NULL, 27e805535b19e0e3d5459b69ed53d6986a1fe6663dreed@google.com SK_ARRAY_COUNT(colors), 28e805535b19e0e3d5459b69ed53d6986a1fe6663dreed@google.com SkShader::kMirror_TileMode); 29e805535b19e0e3d5459b69ed53d6986a1fe6663dreed@google.com} 30e805535b19e0e3d5459b69ed53d6986a1fe6663dreed@google.com 31cb325ceda16fab97fd3281785e6ae10fcb8dcf83tomhudson@google.comstatic SkShader* make_chrome_solid() { 32cb325ceda16fab97fd3281785e6ae10fcb8dcf83tomhudson@google.com SkColor colors[] = { SK_ColorGREEN, SK_ColorGREEN }; 33cb325ceda16fab97fd3281785e6ae10fcb8dcf83tomhudson@google.com SkPoint pts[] = { { 0, 0 }, { 1, 0 } }; 34cb325ceda16fab97fd3281785e6ae10fcb8dcf83tomhudson@google.com return SkGradientShader::CreateLinear(pts, colors, NULL, 2, 35cb325ceda16fab97fd3281785e6ae10fcb8dcf83tomhudson@google.com SkShader::kClamp_TileMode); 36cb325ceda16fab97fd3281785e6ae10fcb8dcf83tomhudson@google.com} 37cb325ceda16fab97fd3281785e6ae10fcb8dcf83tomhudson@google.com 38e805535b19e0e3d5459b69ed53d6986a1fe6663dreed@google.comnamespace skiagm { 39ae933ce0ea5fd9d21cb6ef2cee7e729d32690aacrmistry@google.com 40cb325ceda16fab97fd3281785e6ae10fcb8dcf83tomhudson@google.com// Replicate chrome layout test - clipped pathed gradient-shaded text 41cb325ceda16fab97fd3281785e6ae10fcb8dcf83tomhudson@google.comclass ChromeGradTextGM1 : public GM { 42cb325ceda16fab97fd3281785e6ae10fcb8dcf83tomhudson@google.compublic: 43cb325ceda16fab97fd3281785e6ae10fcb8dcf83tomhudson@google.com ChromeGradTextGM1() { } 44cb325ceda16fab97fd3281785e6ae10fcb8dcf83tomhudson@google.comprotected: 45cb325ceda16fab97fd3281785e6ae10fcb8dcf83tomhudson@google.com 46cb325ceda16fab97fd3281785e6ae10fcb8dcf83tomhudson@google.com virtual SkString onShortName() { return SkString("chrome_gradtext1"); } 47f539318f0d3dba743ec1886d5d9df0fb1be628a1tfarina virtual SkISize onISize() { return SkISize::Make(500, 480); } 48cb325ceda16fab97fd3281785e6ae10fcb8dcf83tomhudson@google.com virtual void onDraw(SkCanvas* canvas) { 49cb325ceda16fab97fd3281785e6ae10fcb8dcf83tomhudson@google.com SkPaint paint; 50992c7b03ef7914a18bfd78e965b0b4c99a5f5672Cary Clark sk_tool_utils::set_portable_typeface(&paint); 51cb325ceda16fab97fd3281785e6ae10fcb8dcf83tomhudson@google.com SkRect r = SkRect::MakeWH(SkIntToScalar(100), SkIntToScalar(100)); 52cb325ceda16fab97fd3281785e6ae10fcb8dcf83tomhudson@google.com 53cb325ceda16fab97fd3281785e6ae10fcb8dcf83tomhudson@google.com canvas->clipRect(r); 54cb325ceda16fab97fd3281785e6ae10fcb8dcf83tomhudson@google.com 55cb325ceda16fab97fd3281785e6ae10fcb8dcf83tomhudson@google.com paint.setColor(SK_ColorRED); 56cb325ceda16fab97fd3281785e6ae10fcb8dcf83tomhudson@google.com canvas->drawRect(r, paint); 57cb325ceda16fab97fd3281785e6ae10fcb8dcf83tomhudson@google.com 58cb325ceda16fab97fd3281785e6ae10fcb8dcf83tomhudson@google.com // Minimal repro doesn't require AA, LCD, or a nondefault typeface 59cb325ceda16fab97fd3281785e6ae10fcb8dcf83tomhudson@google.com paint.setShader(make_chrome_solid())->unref(); 60cb325ceda16fab97fd3281785e6ae10fcb8dcf83tomhudson@google.com paint.setTextSize(SkIntToScalar(500)); 61cb325ceda16fab97fd3281785e6ae10fcb8dcf83tomhudson@google.com 62cb325ceda16fab97fd3281785e6ae10fcb8dcf83tomhudson@google.com canvas->drawText("I", 1, 0, 100, paint); 63cb325ceda16fab97fd3281785e6ae10fcb8dcf83tomhudson@google.com } 64cb325ceda16fab97fd3281785e6ae10fcb8dcf83tomhudson@google.comprivate: 65cb325ceda16fab97fd3281785e6ae10fcb8dcf83tomhudson@google.com typedef GM INHERITED; 66cb325ceda16fab97fd3281785e6ae10fcb8dcf83tomhudson@google.com}; 67cb325ceda16fab97fd3281785e6ae10fcb8dcf83tomhudson@google.com 68cb325ceda16fab97fd3281785e6ae10fcb8dcf83tomhudson@google.com 69cb325ceda16fab97fd3281785e6ae10fcb8dcf83tomhudson@google.com// Replicate chrome layout test - switching between solid & gadient text 70cb325ceda16fab97fd3281785e6ae10fcb8dcf83tomhudson@google.comclass ChromeGradTextGM2 : public GM { 71cb325ceda16fab97fd3281785e6ae10fcb8dcf83tomhudson@google.compublic: 72cb325ceda16fab97fd3281785e6ae10fcb8dcf83tomhudson@google.com ChromeGradTextGM2() { } 73cb325ceda16fab97fd3281785e6ae10fcb8dcf83tomhudson@google.comprotected: 74cb325ceda16fab97fd3281785e6ae10fcb8dcf83tomhudson@google.com 75cb325ceda16fab97fd3281785e6ae10fcb8dcf83tomhudson@google.com virtual SkString onShortName() { return SkString("chrome_gradtext2"); } 76f539318f0d3dba743ec1886d5d9df0fb1be628a1tfarina virtual SkISize onISize() { return SkISize::Make(500, 480); } 77cb325ceda16fab97fd3281785e6ae10fcb8dcf83tomhudson@google.com virtual void onDraw(SkCanvas* canvas) { 78cb325ceda16fab97fd3281785e6ae10fcb8dcf83tomhudson@google.com SkPaint paint; 79992c7b03ef7914a18bfd78e965b0b4c99a5f5672Cary Clark sk_tool_utils::set_portable_typeface(&paint); 80cb325ceda16fab97fd3281785e6ae10fcb8dcf83tomhudson@google.com 81cb325ceda16fab97fd3281785e6ae10fcb8dcf83tomhudson@google.com paint.setStyle(SkPaint::kFill_Style); 82cb325ceda16fab97fd3281785e6ae10fcb8dcf83tomhudson@google.com canvas->drawText("Normal Fill Text", 16, 0, 50, paint); 83cb325ceda16fab97fd3281785e6ae10fcb8dcf83tomhudson@google.com paint.setStyle(SkPaint::kStroke_Style); 84cb325ceda16fab97fd3281785e6ae10fcb8dcf83tomhudson@google.com canvas->drawText("Normal Stroke Text", 18, 0, 100, paint); 85cb325ceda16fab97fd3281785e6ae10fcb8dcf83tomhudson@google.com 86cb325ceda16fab97fd3281785e6ae10fcb8dcf83tomhudson@google.com // Minimal repro doesn't require AA, LCD, or a nondefault typeface 87cb325ceda16fab97fd3281785e6ae10fcb8dcf83tomhudson@google.com paint.setShader(make_chrome_solid())->unref(); 88cb325ceda16fab97fd3281785e6ae10fcb8dcf83tomhudson@google.com 89cb325ceda16fab97fd3281785e6ae10fcb8dcf83tomhudson@google.com paint.setStyle(SkPaint::kFill_Style); 90cb325ceda16fab97fd3281785e6ae10fcb8dcf83tomhudson@google.com canvas->drawText("Gradient Fill Text", 18, 0, 150, paint); 91cb325ceda16fab97fd3281785e6ae10fcb8dcf83tomhudson@google.com paint.setStyle(SkPaint::kStroke_Style); 92cb325ceda16fab97fd3281785e6ae10fcb8dcf83tomhudson@google.com canvas->drawText("Gradient Stroke Text", 20, 0, 200, paint); 93cb325ceda16fab97fd3281785e6ae10fcb8dcf83tomhudson@google.com } 94cb325ceda16fab97fd3281785e6ae10fcb8dcf83tomhudson@google.comprivate: 95cb325ceda16fab97fd3281785e6ae10fcb8dcf83tomhudson@google.com typedef GM INHERITED; 96cb325ceda16fab97fd3281785e6ae10fcb8dcf83tomhudson@google.com}; 97cb325ceda16fab97fd3281785e6ae10fcb8dcf83tomhudson@google.com 98cb325ceda16fab97fd3281785e6ae10fcb8dcf83tomhudson@google.com 99cb325ceda16fab97fd3281785e6ae10fcb8dcf83tomhudson@google.com 100e805535b19e0e3d5459b69ed53d6986a1fe6663dreed@google.comclass GradTextGM : public GM { 101e805535b19e0e3d5459b69ed53d6986a1fe6663dreed@google.compublic: 102e805535b19e0e3d5459b69ed53d6986a1fe6663dreed@google.com GradTextGM () {} 103e805535b19e0e3d5459b69ed53d6986a1fe6663dreed@google.com 104e805535b19e0e3d5459b69ed53d6986a1fe6663dreed@google.comprotected: 105e805535b19e0e3d5459b69ed53d6986a1fe6663dreed@google.com virtual SkString onShortName() { 106e805535b19e0e3d5459b69ed53d6986a1fe6663dreed@google.com return SkString("gradtext"); 107e805535b19e0e3d5459b69ed53d6986a1fe6663dreed@google.com } 108e805535b19e0e3d5459b69ed53d6986a1fe6663dreed@google.com 109f539318f0d3dba743ec1886d5d9df0fb1be628a1tfarina virtual SkISize onISize() { return SkISize::Make(500, 480); } 110e805535b19e0e3d5459b69ed53d6986a1fe6663dreed@google.com 111e805535b19e0e3d5459b69ed53d6986a1fe6663dreed@google.com static void draw_text(SkCanvas* canvas, const SkPaint& paint) { 112e805535b19e0e3d5459b69ed53d6986a1fe6663dreed@google.com const char* text = "When in the course of human events"; 113e805535b19e0e3d5459b69ed53d6986a1fe6663dreed@google.com size_t len = strlen(text); 114e805535b19e0e3d5459b69ed53d6986a1fe6663dreed@google.com canvas->drawText(text, len, 0, 0, paint); 115e805535b19e0e3d5459b69ed53d6986a1fe6663dreed@google.com } 116e805535b19e0e3d5459b69ed53d6986a1fe6663dreed@google.com 117e805535b19e0e3d5459b69ed53d6986a1fe6663dreed@google.com static void draw_text3(SkCanvas* canvas, const SkPaint& paint) { 118e805535b19e0e3d5459b69ed53d6986a1fe6663dreed@google.com SkPaint p(paint); 119e805535b19e0e3d5459b69ed53d6986a1fe6663dreed@google.com 120e805535b19e0e3d5459b69ed53d6986a1fe6663dreed@google.com p.setAntiAlias(false); 121e805535b19e0e3d5459b69ed53d6986a1fe6663dreed@google.com draw_text(canvas, p); 122e805535b19e0e3d5459b69ed53d6986a1fe6663dreed@google.com p.setAntiAlias(true); 123fb82300d1b41f21d1d154847b6bf3fb73d5b6f81reed@google.com canvas->translate(0, paint.getTextSize() * 4/3); 124e805535b19e0e3d5459b69ed53d6986a1fe6663dreed@google.com draw_text(canvas, p); 125e805535b19e0e3d5459b69ed53d6986a1fe6663dreed@google.com p.setLCDRenderText(true); 126fb82300d1b41f21d1d154847b6bf3fb73d5b6f81reed@google.com canvas->translate(0, paint.getTextSize() * 4/3); 127e805535b19e0e3d5459b69ed53d6986a1fe6663dreed@google.com draw_text(canvas, p); 128e805535b19e0e3d5459b69ed53d6986a1fe6663dreed@google.com } 129e805535b19e0e3d5459b69ed53d6986a1fe6663dreed@google.com 130e805535b19e0e3d5459b69ed53d6986a1fe6663dreed@google.com virtual void onDraw(SkCanvas* canvas) { 131fb82300d1b41f21d1d154847b6bf3fb73d5b6f81reed@google.com SkPaint paint; 132992c7b03ef7914a18bfd78e965b0b4c99a5f5672Cary Clark sk_tool_utils::set_portable_typeface(&paint); 133fb82300d1b41f21d1d154847b6bf3fb73d5b6f81reed@google.com paint.setTextSize(SkIntToScalar(26)); 134e805535b19e0e3d5459b69ed53d6986a1fe6663dreed@google.com 135fb82300d1b41f21d1d154847b6bf3fb73d5b6f81reed@google.com const SkISize& size = this->getISize(); 136fb82300d1b41f21d1d154847b6bf3fb73d5b6f81reed@google.com SkRect r = SkRect::MakeWH(SkIntToScalar(size.width()), 137fb82300d1b41f21d1d154847b6bf3fb73d5b6f81reed@google.com SkIntToScalar(size.height()) / 2); 138fb82300d1b41f21d1d154847b6bf3fb73d5b6f81reed@google.com canvas->drawRect(r, paint); 139e805535b19e0e3d5459b69ed53d6986a1fe6663dreed@google.com 140fb82300d1b41f21d1d154847b6bf3fb73d5b6f81reed@google.com canvas->translate(SkIntToScalar(20), paint.getTextSize()); 141fb82300d1b41f21d1d154847b6bf3fb73d5b6f81reed@google.com 142fb82300d1b41f21d1d154847b6bf3fb73d5b6f81reed@google.com for (int i = 0; i < 2; ++i) { 143fb82300d1b41f21d1d154847b6bf3fb73d5b6f81reed@google.com paint.setShader(make_grad(SkIntToScalar(80)))->unref(); 144fb82300d1b41f21d1d154847b6bf3fb73d5b6f81reed@google.com draw_text3(canvas, paint); 145fb82300d1b41f21d1d154847b6bf3fb73d5b6f81reed@google.com 146fb82300d1b41f21d1d154847b6bf3fb73d5b6f81reed@google.com canvas->translate(0, paint.getTextSize() * 2); 147e805535b19e0e3d5459b69ed53d6986a1fe6663dreed@google.com 148fb82300d1b41f21d1d154847b6bf3fb73d5b6f81reed@google.com paint.setShader(make_grad2(SkIntToScalar(80)))->unref(); 149fb82300d1b41f21d1d154847b6bf3fb73d5b6f81reed@google.com draw_text3(canvas, paint); 150ae933ce0ea5fd9d21cb6ef2cee7e729d32690aacrmistry@google.com 151fb82300d1b41f21d1d154847b6bf3fb73d5b6f81reed@google.com canvas->translate(0, paint.getTextSize() * 2); 152fb82300d1b41f21d1d154847b6bf3fb73d5b6f81reed@google.com } 153e805535b19e0e3d5459b69ed53d6986a1fe6663dreed@google.com } 154e805535b19e0e3d5459b69ed53d6986a1fe6663dreed@google.com 155e805535b19e0e3d5459b69ed53d6986a1fe6663dreed@google.comprivate: 156e805535b19e0e3d5459b69ed53d6986a1fe6663dreed@google.com typedef GM INHERITED; 157e805535b19e0e3d5459b69ed53d6986a1fe6663dreed@google.com}; 158e805535b19e0e3d5459b69ed53d6986a1fe6663dreed@google.com 159e805535b19e0e3d5459b69ed53d6986a1fe6663dreed@google.com////////////////////////////////////////////////////////////////////////////// 160e805535b19e0e3d5459b69ed53d6986a1fe6663dreed@google.com 161e805535b19e0e3d5459b69ed53d6986a1fe6663dreed@google.comstatic GM* MyFactory(void*) { return new GradTextGM; } 162cb325ceda16fab97fd3281785e6ae10fcb8dcf83tomhudson@google.comstatic GM* CMyFactory(void*) { return new ChromeGradTextGM1; } 163cb325ceda16fab97fd3281785e6ae10fcb8dcf83tomhudson@google.comstatic GM* CMyFactory2(void*) { return new ChromeGradTextGM2; } 164e805535b19e0e3d5459b69ed53d6986a1fe6663dreed@google.com 165cb325ceda16fab97fd3281785e6ae10fcb8dcf83tomhudson@google.comstatic GMRegistry reg(MyFactory); 166cb325ceda16fab97fd3281785e6ae10fcb8dcf83tomhudson@google.comstatic GMRegistry Creg(CMyFactory); 167cb325ceda16fab97fd3281785e6ae10fcb8dcf83tomhudson@google.comstatic GMRegistry Creg2(CMyFactory2); 168e805535b19e0e3d5459b69ed53d6986a1fe6663dreed@google.com} 169