/* * Copyright 2012 Google Inc. * * Use of this source code is governed by a BSD-style license that can be * found in the LICENSE file. */ #include "gm.h" #include "SkCanvas.h" #include "SkString.h" #include "SkTypeface.h" #include "SkTypes.h" static const char* gFaces[] = { "Times Roman", "Hiragino Maru Gothic Pro", "Papyrus", "Helvetica", "Courier New" }; class TypefaceGM : public skiagm::GM { public: TypefaceGM() { fFaces = new SkTypeface*[SK_ARRAY_COUNT(gFaces)]; for (size_t i = 0; i < SK_ARRAY_COUNT(gFaces); i++) { fFaces[i] = SkTypeface::CreateFromName(gFaces[i], SkTypeface::kNormal); } } virtual ~TypefaceGM() { for (size_t i = 0; i < SK_ARRAY_COUNT(gFaces); i++) { SkSafeUnref(fFaces[i]); } delete [] fFaces; } protected: virtual SkString onShortName() SK_OVERRIDE { return SkString("typeface"); } virtual SkISize onISize() SK_OVERRIDE { return SkISize::Make(640, 480); } virtual void onDraw(SkCanvas* canvas) SK_OVERRIDE { SkString text("Typefaces are fun!"); SkScalar y = 0; SkPaint paint; paint.setAntiAlias(true); for (size_t i = 0; i < SK_ARRAY_COUNT(gFaces); i++) { this->drawWithFace(text, i, y, paint, canvas); } // Now go backwards for (int i = SK_ARRAY_COUNT(gFaces) - 1; i >= 0; i--) { this->drawWithFace(text, i, y, paint, canvas); } } private: void drawWithFace(const SkString& text, int i, SkScalar& y, SkPaint& paint, SkCanvas* canvas) { paint.setTypeface(fFaces[i]); y += paint.getFontMetrics(NULL); canvas->drawText(text.c_str(), text.size(), 0, y, paint); } SkTypeface** fFaces; typedef skiagm::GM INHERITED; }; /////////////////////////////////////////////////////////////////////////////// static const struct { const char* fName; SkTypeface::Style fStyle; } gFaceStyles[] = { { "sans-serif", SkTypeface::kNormal }, { "sans-serif", SkTypeface::kBold }, { "sans-serif", SkTypeface::kItalic }, { "sans-serif", SkTypeface::kBoldItalic }, { "serif", SkTypeface::kNormal }, { "serif", SkTypeface::kBold }, { "serif", SkTypeface::kItalic }, { "serif", SkTypeface::kBoldItalic }, { "monospace", SkTypeface::kNormal }, { "monospace", SkTypeface::kBold }, { "monospace", SkTypeface::kItalic }, { "monospace", SkTypeface::kBoldItalic }, }; static const int gFaceStylesCount = SK_ARRAY_COUNT(gFaceStyles); class TypefaceStylesGM : public skiagm::GM { SkTypeface* fFaces[gFaceStylesCount]; public: TypefaceStylesGM() { for (int i = 0; i < gFaceStylesCount; i++) { fFaces[i] = SkTypeface::CreateFromName(gFaceStyles[i].fName, gFaceStyles[i].fStyle); } } virtual ~TypefaceStylesGM() { for (int i = 0; i < gFaceStylesCount; i++) { SkSafeUnref(fFaces[i]); } } protected: virtual SkString onShortName() SK_OVERRIDE { return SkString("typefacestyles"); } virtual SkISize onISize() SK_OVERRIDE { return SkISize::Make(640, 480); } virtual void onDraw(SkCanvas* canvas) SK_OVERRIDE { SkPaint paint; paint.setAntiAlias(true); paint.setTextSize(SkIntToScalar(30)); const char* text = "Hamburgefons"; const size_t textLen = strlen(text); SkScalar x = SkIntToScalar(10); SkScalar dy = paint.getFontMetrics(NULL); SkScalar y = dy; paint.setLinearText(true); for (int i = 0; i < gFaceStylesCount; i++) { paint.setTypeface(fFaces[i]); canvas->drawText(text, textLen, x, y, paint); y += dy; } } private: typedef skiagm::GM INHERITED; }; /////////////////////////////////////////////////////////////////////////////// DEF_GM( return new TypefaceGM; ) DEF_GM( return new TypefaceStylesGM; )