Home | History | Annotate | Download | only in gm
      1 /*
      2  * Copyright 2014 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 "SkDashPathEffect.h"
     11 
     12 static void test_nulldev(SkCanvas* canvas) {
     13     SkBitmap bm;
     14     bm.setInfo(SkImageInfo::MakeN32Premul(30, 30));
     15     // notice: no pixels mom! be sure we don't crash
     16     // https://code.google.com/p/chromium/issues/detail?id=352616
     17     SkCanvas c(bm);
     18 
     19     SkBitmap src;
     20     src.allocN32Pixels(10, 10);
     21     src.eraseColor(SK_ColorRED);
     22 
     23     // ensure we don't crash
     24     c.writePixels(src, 0, 0);
     25 }
     26 
     27 static void draw_text_stroked(SkCanvas* canvas, const SkPaint& paint, SkScalar strokeWidth) {
     28     SkPaint p(paint);
     29     SkPoint loc = { 20, 435 };
     30 
     31     if (strokeWidth > 0) {
     32         p.setStyle(SkPaint::kFill_Style);
     33         canvas->drawText("P", 1, loc.fX, loc.fY - 225, p);
     34         canvas->drawPosText("P", 1, &loc, p);
     35     }
     36 
     37     p.setColor(SK_ColorRED);
     38     p.setStyle(SkPaint::kStroke_Style);
     39     p.setStrokeWidth(strokeWidth);
     40 
     41     canvas->drawText("P", 1, loc.fX, loc.fY - 225, p);
     42     canvas->drawPosText("P", 1, &loc, p);
     43 }
     44 
     45 static void draw_text_set(SkCanvas* canvas, const SkPaint& paint) {
     46     SkAutoCanvasRestore acr(canvas, true);
     47 
     48     draw_text_stroked(canvas, paint, 10);
     49 
     50     canvas->translate(200, 0);
     51     draw_text_stroked(canvas, paint, 0);
     52 
     53     const SkScalar intervals[] = { 20, 10, 5, 10 };
     54     const SkScalar phase = 0;
     55 
     56     canvas->translate(200, 0);
     57     SkPaint p(paint);
     58     p.setPathEffect(SkDashPathEffect::Create(intervals, SK_ARRAY_COUNT(intervals), phase))->unref();
     59     draw_text_stroked(canvas, p, 10);
     60 }
     61 
     62 class StrokeTextGM : public skiagm::GM {
     63     // Skia has a threshold above which it draws text via paths instead of using scalercontext
     64     // and caching the glyph. This GM wants to ensure that we draw stroking correctly on both
     65     // sides of this threshold.
     66     enum {
     67         kBelowThreshold_TextSize = 255,
     68         kAboveThreshold_TextSize = 257
     69     };
     70 public:
     71     StrokeTextGM() {}
     72 
     73 protected:
     74     virtual uint32_t onGetFlags() const SK_OVERRIDE {
     75         return kSkipTiled_Flag;
     76     }
     77 
     78     virtual SkString onShortName() SK_OVERRIDE {
     79         return SkString("stroketext");
     80     }
     81 
     82     virtual SkISize onISize() SK_OVERRIDE {
     83         return SkISize::Make(1200, 480);
     84     }
     85 
     86     virtual void onDraw(SkCanvas* canvas) SK_OVERRIDE {
     87         if (true) { test_nulldev(canvas); }
     88         SkPaint paint;
     89         paint.setAntiAlias(true);
     90 
     91         paint.setTextSize(kBelowThreshold_TextSize);
     92         draw_text_set(canvas, paint);
     93 
     94         canvas->translate(600, 0);
     95         paint.setTextSize(kAboveThreshold_TextSize);
     96         draw_text_set(canvas, paint);
     97     }
     98 
     99 private:
    100     typedef skiagm::GM INHERITED;
    101 };
    102 
    103 DEF_GM( return SkNEW(StrokeTextGM); )
    104