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