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