Home | History | Annotate | Download | only in gm
      1 /*
      2  * Copyright 2012 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 "SkString.h"
     11 #include "SkTypeface.h"
     12 #include "SkTypes.h"
     13 
     14 static const char* gFaces[] = {
     15     "Times Roman",
     16     "Hiragino Maru Gothic Pro",
     17     "Papyrus",
     18     "Helvetica",
     19     "Courier New"
     20 };
     21 
     22 class TypefaceGM : public skiagm::GM {
     23 public:
     24     TypefaceGM() {
     25         fFaces = new SkTypeface*[SK_ARRAY_COUNT(gFaces)];
     26         for (size_t i = 0; i < SK_ARRAY_COUNT(gFaces); i++) {
     27             fFaces[i] = SkTypeface::CreateFromName(gFaces[i], SkTypeface::kNormal);
     28         }
     29     }
     30 
     31     virtual ~TypefaceGM() {
     32         for (size_t i = 0; i < SK_ARRAY_COUNT(gFaces); i++) {
     33             SkSafeUnref(fFaces[i]);
     34         }
     35         delete [] fFaces;
     36     }
     37 
     38 protected:
     39     virtual SkString onShortName() SK_OVERRIDE {
     40         return SkString("typeface");
     41     }
     42 
     43     virtual SkISize onISize() SK_OVERRIDE {
     44         return SkISize::Make(640, 480);
     45     }
     46 
     47     virtual void onDraw(SkCanvas* canvas) SK_OVERRIDE {
     48         SkString text("Typefaces are fun!");
     49         SkScalar y = 0;
     50 
     51         SkPaint paint;
     52         paint.setAntiAlias(true);
     53         for (size_t i = 0; i < SK_ARRAY_COUNT(gFaces); i++) {
     54             this->drawWithFace(text, i, y, paint, canvas);
     55         }
     56         // Now go backwards
     57         for (int i = SK_ARRAY_COUNT(gFaces) - 1; i >= 0; i--) {
     58             this->drawWithFace(text, i, y, paint, canvas);
     59         }
     60     }
     61 
     62 private:
     63     void drawWithFace(const SkString& text, int i, SkScalar& y, SkPaint& paint,
     64                       SkCanvas* canvas) {
     65         paint.setTypeface(fFaces[i]);
     66         y += paint.getFontMetrics(NULL);
     67         canvas->drawText(text.c_str(), text.size(), 0, y, paint);
     68     }
     69 
     70     SkTypeface** fFaces;
     71 
     72     typedef skiagm::GM INHERITED;
     73 };
     74 
     75 ///////////////////////////////////////////////////////////////////////////////
     76 
     77 static const struct {
     78     const char* fName;
     79     SkTypeface::Style   fStyle;
     80 } gFaceStyles[] = {
     81     { "sans-serif", SkTypeface::kNormal },
     82     { "sans-serif", SkTypeface::kBold },
     83     { "sans-serif", SkTypeface::kItalic },
     84     { "sans-serif", SkTypeface::kBoldItalic },
     85     { "serif", SkTypeface::kNormal },
     86     { "serif", SkTypeface::kBold },
     87     { "serif", SkTypeface::kItalic },
     88     { "serif", SkTypeface::kBoldItalic },
     89     { "monospace", SkTypeface::kNormal },
     90     { "monospace", SkTypeface::kBold },
     91     { "monospace", SkTypeface::kItalic },
     92     { "monospace", SkTypeface::kBoldItalic },
     93 };
     94 
     95 static const int gFaceStylesCount = SK_ARRAY_COUNT(gFaceStyles);
     96 
     97 class TypefaceStylesGM : public skiagm::GM {
     98     SkTypeface* fFaces[gFaceStylesCount];
     99 
    100 public:
    101     TypefaceStylesGM() {
    102         for (int i = 0; i < gFaceStylesCount; i++) {
    103             fFaces[i] = SkTypeface::CreateFromName(gFaceStyles[i].fName,
    104                                                    gFaceStyles[i].fStyle);
    105         }
    106     }
    107 
    108     virtual ~TypefaceStylesGM() {
    109         for (int i = 0; i < gFaceStylesCount; i++) {
    110             SkSafeUnref(fFaces[i]);
    111         }
    112     }
    113 
    114 protected:
    115     virtual SkString onShortName() SK_OVERRIDE {
    116         return SkString("typefacestyles");
    117     }
    118 
    119     virtual SkISize onISize() SK_OVERRIDE {
    120         return SkISize::Make(640, 480);
    121     }
    122 
    123     virtual void onDraw(SkCanvas* canvas) SK_OVERRIDE {
    124         SkPaint paint;
    125         paint.setAntiAlias(true);
    126         paint.setTextSize(SkIntToScalar(30));
    127 
    128         const char* text = "Hamburgefons";
    129         const size_t textLen = strlen(text);
    130 
    131         SkScalar x = SkIntToScalar(10);
    132         SkScalar dy = paint.getFontMetrics(NULL);
    133         SkScalar y = dy;
    134 
    135         paint.setLinearText(true);
    136         for (int i = 0; i < gFaceStylesCount; i++) {
    137             paint.setTypeface(fFaces[i]);
    138             canvas->drawText(text, textLen, x, y, paint);
    139             y += dy;
    140         }
    141     }
    142 
    143 private:
    144     typedef skiagm::GM INHERITED;
    145 };
    146 
    147 ///////////////////////////////////////////////////////////////////////////////
    148 
    149 DEF_GM( return new TypefaceGM; )
    150 DEF_GM( return new TypefaceStylesGM; )
    151