1 2 /* 3 * Copyright 2011 Google Inc. 4 * 5 * Use of this source code is governed by a BSD-style license that can be 6 * found in the LICENSE file. 7 */ 8 #include "SampleCode.h" 9 #include "SkView.h" 10 #include "SkBlurMaskFilter.h" 11 #include "SkCanvas.h" 12 #include "SkColorShader.h" 13 #include "SkGradientShader.h" 14 #include "SkGraphics.h" 15 #include "SkImageDecoder.h" 16 #include "SkPath.h" 17 #include "SkRandom.h" 18 #include "SkRegion.h" 19 #include "SkShader.h" 20 #include "SkUtils.h" 21 #include "SkXfermode.h" 22 #include "SkColorPriv.h" 23 #include "SkColorFilter.h" 24 #include "SkTime.h" 25 #include "SkTypeface.h" 26 #include "SkTextBox.h" 27 #include "SkOSFile.h" 28 #include "SkStream.h" 29 #include "SkKey.h" 30 31 extern void skia_set_text_gamma(float blackGamma, float whiteGamma); 32 33 #if defined(SK_BUILD_FOR_WIN) && defined(SK_FONTHOST_WIN_GDI) 34 extern SkTypeface* SkCreateTypefaceFromLOGFONT(const LOGFONT&); 35 #endif 36 37 static const char gText[] = 38 "When in the Course of human events it becomes necessary for one people " 39 "to dissolve the political bands which have connected them with another " 40 "and to assume among the powers of the earth, the separate and equal " 41 "station to which the Laws of Nature and of Nature's God entitle them, " 42 "a decent respect to the opinions of mankind requires that they should " 43 "declare the causes which impel them to the separation."; 44 45 class TextBoxView : public SampleView { 46 public: 47 TextBoxView() { 48 #if defined(SK_BUILD_FOR_WIN) && defined(SK_FONTHOST_WIN_GDI) 49 LOGFONT lf; 50 sk_bzero(&lf, sizeof(lf)); 51 lf.lfHeight = 9; 52 SkTypeface* tf0 = SkCreateTypefaceFromLOGFONT(lf); 53 lf.lfHeight = 12; 54 SkTypeface* tf1 = SkCreateTypefaceFromLOGFONT(lf); 55 // we assert that different sizes should not affect which face we get 56 SkASSERT(tf0 == tf1); 57 tf0->unref(); 58 tf1->unref(); 59 #endif 60 } 61 62 protected: 63 // overrides from SkEventSink 64 virtual bool onQuery(SkEvent* evt) { 65 if (SampleCode::TitleQ(*evt)) { 66 SampleCode::TitleR(evt, "TextBox"); 67 return true; 68 } 69 return this->INHERITED::onQuery(evt); 70 } 71 72 void drawTest(SkCanvas* canvas, SkScalar w, SkScalar h, SkColor fg, SkColor bg) { 73 SkAutoCanvasRestore acr(canvas, true); 74 75 canvas->clipRect(SkRect::MakeWH(w, h)); 76 canvas->drawColor(bg); 77 SkScalar margin = 20; 78 SkTextBox tbox; 79 tbox.setMode(SkTextBox::kLineBreak_Mode); 80 tbox.setBox(margin, margin, 81 w - margin, h - margin); 82 tbox.setSpacing(SkIntToScalar(3)/3, 0); 83 84 SkPaint paint; 85 paint.setAntiAlias(true); 86 paint.setLCDRenderText(true); 87 paint.setColor(fg); 88 tbox.setText(gText, strlen(gText), paint); 89 90 for (int i = 9; i < 24; i += 2) { 91 paint.setTextSize(SkIntToScalar(i)); 92 tbox.draw(canvas); 93 canvas->translate(0, tbox.getTextHeight() + paint.getFontSpacing()); 94 } 95 } 96 97 virtual void onDrawContent(SkCanvas* canvas) { 98 SkScalar width = this->width() / 3; 99 drawTest(canvas, width, this->height(), SK_ColorBLACK, SK_ColorWHITE); 100 canvas->translate(width, 0); 101 drawTest(canvas, width, this->height(), SK_ColorWHITE, SK_ColorBLACK); 102 canvas->translate(width, 0); 103 drawTest(canvas, width, this->height()/2, SK_ColorGRAY, SK_ColorWHITE); 104 canvas->translate(0, this->height()/2); 105 drawTest(canvas, width, this->height()/2, SK_ColorGRAY, SK_ColorBLACK); 106 } 107 108 private: 109 typedef SampleView INHERITED; 110 }; 111 112 ////////////////////////////////////////////////////////////////////////////// 113 114 static SkView* MyFactory() { return new TextBoxView; } 115 static SkViewRegister reg(MyFactory); 116