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; 50cb325ceda16fab97fd3281785e6ae10fcb8dcf83tomhudson@google.com SkRect r = SkRect::MakeWH(SkIntToScalar(100), SkIntToScalar(100)); 51cb325ceda16fab97fd3281785e6ae10fcb8dcf83tomhudson@google.com 52cb325ceda16fab97fd3281785e6ae10fcb8dcf83tomhudson@google.com canvas->clipRect(r); 53cb325ceda16fab97fd3281785e6ae10fcb8dcf83tomhudson@google.com 54cb325ceda16fab97fd3281785e6ae10fcb8dcf83tomhudson@google.com paint.setColor(SK_ColorRED); 55cb325ceda16fab97fd3281785e6ae10fcb8dcf83tomhudson@google.com canvas->drawRect(r, paint); 56cb325ceda16fab97fd3281785e6ae10fcb8dcf83tomhudson@google.com 57cb325ceda16fab97fd3281785e6ae10fcb8dcf83tomhudson@google.com // Minimal repro doesn't require AA, LCD, or a nondefault typeface 58cb325ceda16fab97fd3281785e6ae10fcb8dcf83tomhudson@google.com paint.setShader(make_chrome_solid())->unref(); 59cb325ceda16fab97fd3281785e6ae10fcb8dcf83tomhudson@google.com paint.setTextSize(SkIntToScalar(500)); 60cb325ceda16fab97fd3281785e6ae10fcb8dcf83tomhudson@google.com 61cb325ceda16fab97fd3281785e6ae10fcb8dcf83tomhudson@google.com canvas->drawText("I", 1, 0, 100, paint); 62cb325ceda16fab97fd3281785e6ae10fcb8dcf83tomhudson@google.com } 63cb325ceda16fab97fd3281785e6ae10fcb8dcf83tomhudson@google.comprivate: 64cb325ceda16fab97fd3281785e6ae10fcb8dcf83tomhudson@google.com typedef GM INHERITED; 65cb325ceda16fab97fd3281785e6ae10fcb8dcf83tomhudson@google.com}; 66cb325ceda16fab97fd3281785e6ae10fcb8dcf83tomhudson@google.com 67cb325ceda16fab97fd3281785e6ae10fcb8dcf83tomhudson@google.com 68cb325ceda16fab97fd3281785e6ae10fcb8dcf83tomhudson@google.com// Replicate chrome layout test - switching between solid & gadient text 69cb325ceda16fab97fd3281785e6ae10fcb8dcf83tomhudson@google.comclass ChromeGradTextGM2 : public GM { 70cb325ceda16fab97fd3281785e6ae10fcb8dcf83tomhudson@google.compublic: 71cb325ceda16fab97fd3281785e6ae10fcb8dcf83tomhudson@google.com ChromeGradTextGM2() { } 72cb325ceda16fab97fd3281785e6ae10fcb8dcf83tomhudson@google.comprotected: 73cb325ceda16fab97fd3281785e6ae10fcb8dcf83tomhudson@google.com 74cb325ceda16fab97fd3281785e6ae10fcb8dcf83tomhudson@google.com virtual SkString onShortName() { return SkString("chrome_gradtext2"); } 75f539318f0d3dba743ec1886d5d9df0fb1be628a1tfarina virtual SkISize onISize() { return SkISize::Make(500, 480); } 76cb325ceda16fab97fd3281785e6ae10fcb8dcf83tomhudson@google.com virtual void onDraw(SkCanvas* canvas) { 77cb325ceda16fab97fd3281785e6ae10fcb8dcf83tomhudson@google.com SkPaint paint; 78cb325ceda16fab97fd3281785e6ae10fcb8dcf83tomhudson@google.com 79cb325ceda16fab97fd3281785e6ae10fcb8dcf83tomhudson@google.com paint.setStyle(SkPaint::kFill_Style); 80cb325ceda16fab97fd3281785e6ae10fcb8dcf83tomhudson@google.com canvas->drawText("Normal Fill Text", 16, 0, 50, paint); 81cb325ceda16fab97fd3281785e6ae10fcb8dcf83tomhudson@google.com paint.setStyle(SkPaint::kStroke_Style); 82cb325ceda16fab97fd3281785e6ae10fcb8dcf83tomhudson@google.com canvas->drawText("Normal Stroke Text", 18, 0, 100, paint); 83cb325ceda16fab97fd3281785e6ae10fcb8dcf83tomhudson@google.com 84cb325ceda16fab97fd3281785e6ae10fcb8dcf83tomhudson@google.com // Minimal repro doesn't require AA, LCD, or a nondefault typeface 85cb325ceda16fab97fd3281785e6ae10fcb8dcf83tomhudson@google.com paint.setShader(make_chrome_solid())->unref(); 86cb325ceda16fab97fd3281785e6ae10fcb8dcf83tomhudson@google.com 87cb325ceda16fab97fd3281785e6ae10fcb8dcf83tomhudson@google.com paint.setStyle(SkPaint::kFill_Style); 88cb325ceda16fab97fd3281785e6ae10fcb8dcf83tomhudson@google.com canvas->drawText("Gradient Fill Text", 18, 0, 150, paint); 89cb325ceda16fab97fd3281785e6ae10fcb8dcf83tomhudson@google.com paint.setStyle(SkPaint::kStroke_Style); 90cb325ceda16fab97fd3281785e6ae10fcb8dcf83tomhudson@google.com canvas->drawText("Gradient Stroke Text", 20, 0, 200, paint); 91cb325ceda16fab97fd3281785e6ae10fcb8dcf83tomhudson@google.com } 92cb325ceda16fab97fd3281785e6ae10fcb8dcf83tomhudson@google.comprivate: 93cb325ceda16fab97fd3281785e6ae10fcb8dcf83tomhudson@google.com typedef GM INHERITED; 94cb325ceda16fab97fd3281785e6ae10fcb8dcf83tomhudson@google.com}; 95cb325ceda16fab97fd3281785e6ae10fcb8dcf83tomhudson@google.com 96cb325ceda16fab97fd3281785e6ae10fcb8dcf83tomhudson@google.com 97cb325ceda16fab97fd3281785e6ae10fcb8dcf83tomhudson@google.com 98e805535b19e0e3d5459b69ed53d6986a1fe6663dreed@google.comclass GradTextGM : public GM { 99e805535b19e0e3d5459b69ed53d6986a1fe6663dreed@google.compublic: 100e805535b19e0e3d5459b69ed53d6986a1fe6663dreed@google.com GradTextGM () {} 101e805535b19e0e3d5459b69ed53d6986a1fe6663dreed@google.com 102e805535b19e0e3d5459b69ed53d6986a1fe6663dreed@google.comprotected: 103a90c6803865766d28e92091f56f718f5e41fe80fcommit-bot@chromium.org virtual uint32_t onGetFlags() const SK_OVERRIDE { 104a90c6803865766d28e92091f56f718f5e41fe80fcommit-bot@chromium.org return kSkipTiled_Flag; 105a90c6803865766d28e92091f56f718f5e41fe80fcommit-bot@chromium.org } 106a90c6803865766d28e92091f56f718f5e41fe80fcommit-bot@chromium.org 107e805535b19e0e3d5459b69ed53d6986a1fe6663dreed@google.com 108e805535b19e0e3d5459b69ed53d6986a1fe6663dreed@google.com virtual SkString onShortName() { 109e805535b19e0e3d5459b69ed53d6986a1fe6663dreed@google.com return SkString("gradtext"); 110e805535b19e0e3d5459b69ed53d6986a1fe6663dreed@google.com } 111e805535b19e0e3d5459b69ed53d6986a1fe6663dreed@google.com 112f539318f0d3dba743ec1886d5d9df0fb1be628a1tfarina virtual SkISize onISize() { return SkISize::Make(500, 480); } 113e805535b19e0e3d5459b69ed53d6986a1fe6663dreed@google.com 114e805535b19e0e3d5459b69ed53d6986a1fe6663dreed@google.com static void draw_text(SkCanvas* canvas, const SkPaint& paint) { 115e805535b19e0e3d5459b69ed53d6986a1fe6663dreed@google.com const char* text = "When in the course of human events"; 116e805535b19e0e3d5459b69ed53d6986a1fe6663dreed@google.com size_t len = strlen(text); 117e805535b19e0e3d5459b69ed53d6986a1fe6663dreed@google.com canvas->drawText(text, len, 0, 0, paint); 118e805535b19e0e3d5459b69ed53d6986a1fe6663dreed@google.com } 119e805535b19e0e3d5459b69ed53d6986a1fe6663dreed@google.com 120e805535b19e0e3d5459b69ed53d6986a1fe6663dreed@google.com static void draw_text3(SkCanvas* canvas, const SkPaint& paint) { 121e805535b19e0e3d5459b69ed53d6986a1fe6663dreed@google.com SkPaint p(paint); 122e805535b19e0e3d5459b69ed53d6986a1fe6663dreed@google.com 123e805535b19e0e3d5459b69ed53d6986a1fe6663dreed@google.com p.setAntiAlias(false); 124e805535b19e0e3d5459b69ed53d6986a1fe6663dreed@google.com draw_text(canvas, p); 125e805535b19e0e3d5459b69ed53d6986a1fe6663dreed@google.com p.setAntiAlias(true); 126fb82300d1b41f21d1d154847b6bf3fb73d5b6f81reed@google.com canvas->translate(0, paint.getTextSize() * 4/3); 127e805535b19e0e3d5459b69ed53d6986a1fe6663dreed@google.com draw_text(canvas, p); 128e805535b19e0e3d5459b69ed53d6986a1fe6663dreed@google.com p.setLCDRenderText(true); 129fb82300d1b41f21d1d154847b6bf3fb73d5b6f81reed@google.com canvas->translate(0, paint.getTextSize() * 4/3); 130e805535b19e0e3d5459b69ed53d6986a1fe6663dreed@google.com draw_text(canvas, p); 131e805535b19e0e3d5459b69ed53d6986a1fe6663dreed@google.com } 132e805535b19e0e3d5459b69ed53d6986a1fe6663dreed@google.com 133e805535b19e0e3d5459b69ed53d6986a1fe6663dreed@google.com virtual void onDraw(SkCanvas* canvas) { 134fb82300d1b41f21d1d154847b6bf3fb73d5b6f81reed@google.com SkPaint paint; 135fb82300d1b41f21d1d154847b6bf3fb73d5b6f81reed@google.com paint.setTextSize(SkIntToScalar(26)); 136e805535b19e0e3d5459b69ed53d6986a1fe6663dreed@google.com 137fb82300d1b41f21d1d154847b6bf3fb73d5b6f81reed@google.com const SkISize& size = this->getISize(); 138fb82300d1b41f21d1d154847b6bf3fb73d5b6f81reed@google.com SkRect r = SkRect::MakeWH(SkIntToScalar(size.width()), 139fb82300d1b41f21d1d154847b6bf3fb73d5b6f81reed@google.com SkIntToScalar(size.height()) / 2); 140fb82300d1b41f21d1d154847b6bf3fb73d5b6f81reed@google.com canvas->drawRect(r, paint); 141e805535b19e0e3d5459b69ed53d6986a1fe6663dreed@google.com 142fb82300d1b41f21d1d154847b6bf3fb73d5b6f81reed@google.com canvas->translate(SkIntToScalar(20), paint.getTextSize()); 143fb82300d1b41f21d1d154847b6bf3fb73d5b6f81reed@google.com 144fb82300d1b41f21d1d154847b6bf3fb73d5b6f81reed@google.com for (int i = 0; i < 2; ++i) { 145fb82300d1b41f21d1d154847b6bf3fb73d5b6f81reed@google.com paint.setShader(make_grad(SkIntToScalar(80)))->unref(); 146fb82300d1b41f21d1d154847b6bf3fb73d5b6f81reed@google.com draw_text3(canvas, paint); 147fb82300d1b41f21d1d154847b6bf3fb73d5b6f81reed@google.com 148fb82300d1b41f21d1d154847b6bf3fb73d5b6f81reed@google.com canvas->translate(0, paint.getTextSize() * 2); 149e805535b19e0e3d5459b69ed53d6986a1fe6663dreed@google.com 150fb82300d1b41f21d1d154847b6bf3fb73d5b6f81reed@google.com paint.setShader(make_grad2(SkIntToScalar(80)))->unref(); 151fb82300d1b41f21d1d154847b6bf3fb73d5b6f81reed@google.com draw_text3(canvas, paint); 152ae933ce0ea5fd9d21cb6ef2cee7e729d32690aacrmistry@google.com 153fb82300d1b41f21d1d154847b6bf3fb73d5b6f81reed@google.com canvas->translate(0, paint.getTextSize() * 2); 154fb82300d1b41f21d1d154847b6bf3fb73d5b6f81reed@google.com } 155e805535b19e0e3d5459b69ed53d6986a1fe6663dreed@google.com } 156e805535b19e0e3d5459b69ed53d6986a1fe6663dreed@google.com 157e805535b19e0e3d5459b69ed53d6986a1fe6663dreed@google.comprivate: 158e805535b19e0e3d5459b69ed53d6986a1fe6663dreed@google.com typedef GM INHERITED; 159e805535b19e0e3d5459b69ed53d6986a1fe6663dreed@google.com}; 160e805535b19e0e3d5459b69ed53d6986a1fe6663dreed@google.com 161e805535b19e0e3d5459b69ed53d6986a1fe6663dreed@google.com////////////////////////////////////////////////////////////////////////////// 162e805535b19e0e3d5459b69ed53d6986a1fe6663dreed@google.com 163e805535b19e0e3d5459b69ed53d6986a1fe6663dreed@google.comstatic GM* MyFactory(void*) { return new GradTextGM; } 164cb325ceda16fab97fd3281785e6ae10fcb8dcf83tomhudson@google.comstatic GM* CMyFactory(void*) { return new ChromeGradTextGM1; } 165cb325ceda16fab97fd3281785e6ae10fcb8dcf83tomhudson@google.comstatic GM* CMyFactory2(void*) { return new ChromeGradTextGM2; } 166e805535b19e0e3d5459b69ed53d6986a1fe6663dreed@google.com 167cb325ceda16fab97fd3281785e6ae10fcb8dcf83tomhudson@google.comstatic GMRegistry reg(MyFactory); 168cb325ceda16fab97fd3281785e6ae10fcb8dcf83tomhudson@google.comstatic GMRegistry Creg(CMyFactory); 169cb325ceda16fab97fd3281785e6ae10fcb8dcf83tomhudson@google.comstatic GMRegistry Creg2(CMyFactory2); 170e805535b19e0e3d5459b69ed53d6986a1fe6663dreed@google.com} 171