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