1ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com 2ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com/* 3ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com * Copyright 2011 Google Inc. 4ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com * 5ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com * Use of this source code is governed by a BSD-style license that can be 6ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com * found in the LICENSE file. 7ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com */ 80bb6d06622eca40694b8bdea21d697a458d41b4creed@android.com#include "SampleCode.h" 90bb6d06622eca40694b8bdea21d697a458d41b4creed@android.com#include "SkView.h" 100bb6d06622eca40694b8bdea21d697a458d41b4creed@android.com#include "SkBlurMaskFilter.h" 110bb6d06622eca40694b8bdea21d697a458d41b4creed@android.com#include "SkCanvas.h" 12021b4054960a8b670e7a2670f7a5b4707b5736e3reed@google.com#include "SkColorShader.h" 130bb6d06622eca40694b8bdea21d697a458d41b4creed@android.com#include "SkGradientShader.h" 140bb6d06622eca40694b8bdea21d697a458d41b4creed@android.com#include "SkGraphics.h" 150bb6d06622eca40694b8bdea21d697a458d41b4creed@android.com#include "SkImageDecoder.h" 160bb6d06622eca40694b8bdea21d697a458d41b4creed@android.com#include "SkPath.h" 170bb6d06622eca40694b8bdea21d697a458d41b4creed@android.com#include "SkRandom.h" 180bb6d06622eca40694b8bdea21d697a458d41b4creed@android.com#include "SkRegion.h" 190bb6d06622eca40694b8bdea21d697a458d41b4creed@android.com#include "SkShader.h" 200bb6d06622eca40694b8bdea21d697a458d41b4creed@android.com#include "SkUtils.h" 210bb6d06622eca40694b8bdea21d697a458d41b4creed@android.com#include "SkXfermode.h" 220bb6d06622eca40694b8bdea21d697a458d41b4creed@android.com#include "SkColorPriv.h" 230bb6d06622eca40694b8bdea21d697a458d41b4creed@android.com#include "SkColorFilter.h" 240bb6d06622eca40694b8bdea21d697a458d41b4creed@android.com#include "SkTime.h" 250bb6d06622eca40694b8bdea21d697a458d41b4creed@android.com#include "SkTypeface.h" 260bb6d06622eca40694b8bdea21d697a458d41b4creed@android.com#include "SkTextBox.h" 270bb6d06622eca40694b8bdea21d697a458d41b4creed@android.com#include "SkOSFile.h" 280bb6d06622eca40694b8bdea21d697a458d41b4creed@android.com#include "SkStream.h" 290bb6d06622eca40694b8bdea21d697a458d41b4creed@android.com#include "SkKey.h" 300bb6d06622eca40694b8bdea21d697a458d41b4creed@android.com 31021b4054960a8b670e7a2670f7a5b4707b5736e3reed@google.comextern void skia_set_text_gamma(float blackGamma, float whiteGamma); 32021b4054960a8b670e7a2670f7a5b4707b5736e3reed@google.com 33b49d98999799ff9406302fa75b5011e95fb153bcbungeman@google.com#if defined(SK_BUILD_FOR_WIN) && defined(SK_FONTHOST_WIN_GDI) 34b652427197ddaac5d35010e1b199bcb431e656b7reed@google.comextern SkTypeface* SkCreateTypefaceFromLOGFONT(const LOGFONT&); 35d6f5a81955d0edb5bec9198bcadeab9563340927reed@google.com#endif 36b652427197ddaac5d35010e1b199bcb431e656b7reed@google.com 37d6f5a81955d0edb5bec9198bcadeab9563340927reed@google.comstatic const char gText[] = 38ae933ce0ea5fd9d21cb6ef2cee7e729d32690aacrmistry@google.com "When in the Course of human events it becomes necessary for one people " 39ae933ce0ea5fd9d21cb6ef2cee7e729d32690aacrmistry@google.com "to dissolve the political bands which have connected them with another " 40ae933ce0ea5fd9d21cb6ef2cee7e729d32690aacrmistry@google.com "and to assume among the powers of the earth, the separate and equal " 41ae933ce0ea5fd9d21cb6ef2cee7e729d32690aacrmistry@google.com "station to which the Laws of Nature and of Nature's God entitle them, " 42ae933ce0ea5fd9d21cb6ef2cee7e729d32690aacrmistry@google.com "a decent respect to the opinions of mankind requires that they should " 43ae933ce0ea5fd9d21cb6ef2cee7e729d32690aacrmistry@google.com "declare the causes which impel them to the separation."; 440bb6d06622eca40694b8bdea21d697a458d41b4creed@android.com 4517fb387a56f8fcfcb9ccf585e2c53ee8e709028dreed@google.comclass TextBoxView : public SampleView { 46d6f5a81955d0edb5bec9198bcadeab9563340927reed@google.compublic: 47ae933ce0ea5fd9d21cb6ef2cee7e729d32690aacrmistry@google.com TextBoxView() { 48b49d98999799ff9406302fa75b5011e95fb153bcbungeman@google.com#if defined(SK_BUILD_FOR_WIN) && defined(SK_FONTHOST_WIN_GDI) 49ae933ce0ea5fd9d21cb6ef2cee7e729d32690aacrmistry@google.com LOGFONT lf; 50ae933ce0ea5fd9d21cb6ef2cee7e729d32690aacrmistry@google.com sk_bzero(&lf, sizeof(lf)); 51ae933ce0ea5fd9d21cb6ef2cee7e729d32690aacrmistry@google.com lf.lfHeight = 9; 52ae933ce0ea5fd9d21cb6ef2cee7e729d32690aacrmistry@google.com SkTypeface* tf0 = SkCreateTypefaceFromLOGFONT(lf); 53ae933ce0ea5fd9d21cb6ef2cee7e729d32690aacrmistry@google.com lf.lfHeight = 12; 54ae933ce0ea5fd9d21cb6ef2cee7e729d32690aacrmistry@google.com SkTypeface* tf1 = SkCreateTypefaceFromLOGFONT(lf); 55ae933ce0ea5fd9d21cb6ef2cee7e729d32690aacrmistry@google.com // we assert that different sizes should not affect which face we get 56ae933ce0ea5fd9d21cb6ef2cee7e729d32690aacrmistry@google.com SkASSERT(tf0 == tf1); 57ae933ce0ea5fd9d21cb6ef2cee7e729d32690aacrmistry@google.com tf0->unref(); 58ae933ce0ea5fd9d21cb6ef2cee7e729d32690aacrmistry@google.com tf1->unref(); 59d6f5a81955d0edb5bec9198bcadeab9563340927reed@google.com#endif 60021b4054960a8b670e7a2670f7a5b4707b5736e3reed@google.com } 61d6f5a81955d0edb5bec9198bcadeab9563340927reed@google.com 620bb6d06622eca40694b8bdea21d697a458d41b4creed@android.comprotected: 630bb6d06622eca40694b8bdea21d697a458d41b4creed@android.com // overrides from SkEventSink 640bb6d06622eca40694b8bdea21d697a458d41b4creed@android.com virtual bool onQuery(SkEvent* evt) { 650bb6d06622eca40694b8bdea21d697a458d41b4creed@android.com if (SampleCode::TitleQ(*evt)) { 6645369a33bb78b6b76fafd63b1334151368dc9e2atfarina@chromium.org SampleCode::TitleR(evt, "TextBox"); 670bb6d06622eca40694b8bdea21d697a458d41b4creed@android.com return true; 680bb6d06622eca40694b8bdea21d697a458d41b4creed@android.com } 690bb6d06622eca40694b8bdea21d697a458d41b4creed@android.com return this->INHERITED::onQuery(evt); 700bb6d06622eca40694b8bdea21d697a458d41b4creed@android.com } 71d6f5a81955d0edb5bec9198bcadeab9563340927reed@google.com 72021b4054960a8b670e7a2670f7a5b4707b5736e3reed@google.com void drawTest(SkCanvas* canvas, SkScalar w, SkScalar h, SkColor fg, SkColor bg) { 73021b4054960a8b670e7a2670f7a5b4707b5736e3reed@google.com SkAutoCanvasRestore acr(canvas, true); 74021b4054960a8b670e7a2670f7a5b4707b5736e3reed@google.com 75021b4054960a8b670e7a2670f7a5b4707b5736e3reed@google.com canvas->clipRect(SkRect::MakeWH(w, h)); 76021b4054960a8b670e7a2670f7a5b4707b5736e3reed@google.com canvas->drawColor(bg); 77ae933ce0ea5fd9d21cb6ef2cee7e729d32690aacrmistry@google.com SkScalar margin = 20; 780bb6d06622eca40694b8bdea21d697a458d41b4creed@android.com SkTextBox tbox; 79ae933ce0ea5fd9d21cb6ef2cee7e729d32690aacrmistry@google.com tbox.setMode(SkTextBox::kLineBreak_Mode); 80ae933ce0ea5fd9d21cb6ef2cee7e729d32690aacrmistry@google.com tbox.setBox(margin, margin, 81ae933ce0ea5fd9d21cb6ef2cee7e729d32690aacrmistry@google.com w - margin, h - margin); 82ae933ce0ea5fd9d21cb6ef2cee7e729d32690aacrmistry@google.com tbox.setSpacing(SkIntToScalar(3)/3, 0); 830bb6d06622eca40694b8bdea21d697a458d41b4creed@android.com 84ae933ce0ea5fd9d21cb6ef2cee7e729d32690aacrmistry@google.com SkPaint paint; 85ae933ce0ea5fd9d21cb6ef2cee7e729d32690aacrmistry@google.com paint.setAntiAlias(true); 86261b8e2ca1cf22303ad95267f0bdc6e87e1bbe70reed@google.com paint.setLCDRenderText(true); 87021b4054960a8b670e7a2670f7a5b4707b5736e3reed@google.com paint.setColor(fg); 88ae933ce0ea5fd9d21cb6ef2cee7e729d32690aacrmistry@google.com tbox.setText(gText, strlen(gText), paint); 890bb6d06622eca40694b8bdea21d697a458d41b4creed@android.com 90ae933ce0ea5fd9d21cb6ef2cee7e729d32690aacrmistry@google.com for (int i = 9; i < 24; i += 2) { 91ae933ce0ea5fd9d21cb6ef2cee7e729d32690aacrmistry@google.com paint.setTextSize(SkIntToScalar(i)); 92ae933ce0ea5fd9d21cb6ef2cee7e729d32690aacrmistry@google.com tbox.draw(canvas); 93ae933ce0ea5fd9d21cb6ef2cee7e729d32690aacrmistry@google.com canvas->translate(0, tbox.getTextHeight() + paint.getFontSpacing()); 94ae933ce0ea5fd9d21cb6ef2cee7e729d32690aacrmistry@google.com } 950bb6d06622eca40694b8bdea21d697a458d41b4creed@android.com } 96d6f5a81955d0edb5bec9198bcadeab9563340927reed@google.com 97021b4054960a8b670e7a2670f7a5b4707b5736e3reed@google.com virtual void onDrawContent(SkCanvas* canvas) { 98021b4054960a8b670e7a2670f7a5b4707b5736e3reed@google.com SkScalar width = this->width() / 3; 99021b4054960a8b670e7a2670f7a5b4707b5736e3reed@google.com drawTest(canvas, width, this->height(), SK_ColorBLACK, SK_ColorWHITE); 100021b4054960a8b670e7a2670f7a5b4707b5736e3reed@google.com canvas->translate(width, 0); 101021b4054960a8b670e7a2670f7a5b4707b5736e3reed@google.com drawTest(canvas, width, this->height(), SK_ColorWHITE, SK_ColorBLACK); 102021b4054960a8b670e7a2670f7a5b4707b5736e3reed@google.com canvas->translate(width, 0); 103021b4054960a8b670e7a2670f7a5b4707b5736e3reed@google.com drawTest(canvas, width, this->height()/2, SK_ColorGRAY, SK_ColorWHITE); 104021b4054960a8b670e7a2670f7a5b4707b5736e3reed@google.com canvas->translate(0, this->height()/2); 105021b4054960a8b670e7a2670f7a5b4707b5736e3reed@google.com drawTest(canvas, width, this->height()/2, SK_ColorGRAY, SK_ColorBLACK); 106021b4054960a8b670e7a2670f7a5b4707b5736e3reed@google.com } 107021b4054960a8b670e7a2670f7a5b4707b5736e3reed@google.com 1080bb6d06622eca40694b8bdea21d697a458d41b4creed@android.comprivate: 1094ee1433844401df5b136e420a2548172de56c8abreed@google.com typedef SampleView INHERITED; 1100bb6d06622eca40694b8bdea21d697a458d41b4creed@android.com}; 1110bb6d06622eca40694b8bdea21d697a458d41b4creed@android.com 1120bb6d06622eca40694b8bdea21d697a458d41b4creed@android.com////////////////////////////////////////////////////////////////////////////// 1130bb6d06622eca40694b8bdea21d697a458d41b4creed@android.com 1140bb6d06622eca40694b8bdea21d697a458d41b4creed@android.comstatic SkView* MyFactory() { return new TextBoxView; } 1150bb6d06622eca40694b8bdea21d697a458d41b4creed@android.comstatic SkViewRegister reg(MyFactory); 116