1ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com/* 2ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com * Copyright 2011 Google Inc. 3ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com * 4ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com * Use of this source code is governed by a BSD-style license that can be 5ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com * found in the LICENSE file. 6ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com */ 70bb6d06622eca40694b8bdea21d697a458d41b4creed@android.com#include "SampleCode.h" 80bb6d06622eca40694b8bdea21d697a458d41b4creed@android.com#include "SkView.h" 90bb6d06622eca40694b8bdea21d697a458d41b4creed@android.com#include "SkBlurMaskFilter.h" 100bb6d06622eca40694b8bdea21d697a458d41b4creed@android.com#include "SkCanvas.h" 11021b4054960a8b670e7a2670f7a5b4707b5736e3reed@google.com#include "SkColorShader.h" 120bb6d06622eca40694b8bdea21d697a458d41b4creed@android.com#include "SkGradientShader.h" 130bb6d06622eca40694b8bdea21d697a458d41b4creed@android.com#include "SkGraphics.h" 140bb6d06622eca40694b8bdea21d697a458d41b4creed@android.com#include "SkPath.h" 150bb6d06622eca40694b8bdea21d697a458d41b4creed@android.com#include "SkRandom.h" 160bb6d06622eca40694b8bdea21d697a458d41b4creed@android.com#include "SkRegion.h" 170bb6d06622eca40694b8bdea21d697a458d41b4creed@android.com#include "SkShader.h" 180bb6d06622eca40694b8bdea21d697a458d41b4creed@android.com#include "SkUtils.h" 190bb6d06622eca40694b8bdea21d697a458d41b4creed@android.com#include "SkColorPriv.h" 200bb6d06622eca40694b8bdea21d697a458d41b4creed@android.com#include "SkColorFilter.h" 210bb6d06622eca40694b8bdea21d697a458d41b4creed@android.com#include "SkTime.h" 220bb6d06622eca40694b8bdea21d697a458d41b4creed@android.com#include "SkTypeface.h" 230bb6d06622eca40694b8bdea21d697a458d41b4creed@android.com#include "SkTextBox.h" 240bb6d06622eca40694b8bdea21d697a458d41b4creed@android.com#include "SkOSFile.h" 250bb6d06622eca40694b8bdea21d697a458d41b4creed@android.com#include "SkStream.h" 260bb6d06622eca40694b8bdea21d697a458d41b4creed@android.com#include "SkKey.h" 270bb6d06622eca40694b8bdea21d697a458d41b4creed@android.com 28021b4054960a8b670e7a2670f7a5b4707b5736e3reed@google.comextern void skia_set_text_gamma(float blackGamma, float whiteGamma); 29021b4054960a8b670e7a2670f7a5b4707b5736e3reed@google.com 30b49d98999799ff9406302fa75b5011e95fb153bcbungeman@google.com#if defined(SK_BUILD_FOR_WIN) && defined(SK_FONTHOST_WIN_GDI) 31b652427197ddaac5d35010e1b199bcb431e656b7reed@google.comextern SkTypeface* SkCreateTypefaceFromLOGFONT(const LOGFONT&); 32d6f5a81955d0edb5bec9198bcadeab9563340927reed@google.com#endif 33b652427197ddaac5d35010e1b199bcb431e656b7reed@google.com 34d6f5a81955d0edb5bec9198bcadeab9563340927reed@google.comstatic const char gText[] = 35ae933ce0ea5fd9d21cb6ef2cee7e729d32690aacrmistry@google.com "When in the Course of human events it becomes necessary for one people " 36ae933ce0ea5fd9d21cb6ef2cee7e729d32690aacrmistry@google.com "to dissolve the political bands which have connected them with another " 37ae933ce0ea5fd9d21cb6ef2cee7e729d32690aacrmistry@google.com "and to assume among the powers of the earth, the separate and equal " 38ae933ce0ea5fd9d21cb6ef2cee7e729d32690aacrmistry@google.com "station to which the Laws of Nature and of Nature's God entitle them, " 39ae933ce0ea5fd9d21cb6ef2cee7e729d32690aacrmistry@google.com "a decent respect to the opinions of mankind requires that they should " 40ae933ce0ea5fd9d21cb6ef2cee7e729d32690aacrmistry@google.com "declare the causes which impel them to the separation."; 410bb6d06622eca40694b8bdea21d697a458d41b4creed@android.com 4217fb387a56f8fcfcb9ccf585e2c53ee8e709028dreed@google.comclass TextBoxView : public SampleView { 43d6f5a81955d0edb5bec9198bcadeab9563340927reed@google.compublic: 44ae933ce0ea5fd9d21cb6ef2cee7e729d32690aacrmistry@google.com TextBoxView() { 45b49d98999799ff9406302fa75b5011e95fb153bcbungeman@google.com#if defined(SK_BUILD_FOR_WIN) && defined(SK_FONTHOST_WIN_GDI) 46ae933ce0ea5fd9d21cb6ef2cee7e729d32690aacrmistry@google.com LOGFONT lf; 47ae933ce0ea5fd9d21cb6ef2cee7e729d32690aacrmistry@google.com sk_bzero(&lf, sizeof(lf)); 48ae933ce0ea5fd9d21cb6ef2cee7e729d32690aacrmistry@google.com lf.lfHeight = 9; 49ae933ce0ea5fd9d21cb6ef2cee7e729d32690aacrmistry@google.com SkTypeface* tf0 = SkCreateTypefaceFromLOGFONT(lf); 50ae933ce0ea5fd9d21cb6ef2cee7e729d32690aacrmistry@google.com lf.lfHeight = 12; 51ae933ce0ea5fd9d21cb6ef2cee7e729d32690aacrmistry@google.com SkTypeface* tf1 = SkCreateTypefaceFromLOGFONT(lf); 52ae933ce0ea5fd9d21cb6ef2cee7e729d32690aacrmistry@google.com // we assert that different sizes should not affect which face we get 53ae933ce0ea5fd9d21cb6ef2cee7e729d32690aacrmistry@google.com SkASSERT(tf0 == tf1); 54ae933ce0ea5fd9d21cb6ef2cee7e729d32690aacrmistry@google.com tf0->unref(); 55ae933ce0ea5fd9d21cb6ef2cee7e729d32690aacrmistry@google.com tf1->unref(); 56d6f5a81955d0edb5bec9198bcadeab9563340927reed@google.com#endif 57021b4054960a8b670e7a2670f7a5b4707b5736e3reed@google.com } 58d6f5a81955d0edb5bec9198bcadeab9563340927reed@google.com 590bb6d06622eca40694b8bdea21d697a458d41b4creed@android.comprotected: 600bb6d06622eca40694b8bdea21d697a458d41b4creed@android.com // overrides from SkEventSink 610bb6d06622eca40694b8bdea21d697a458d41b4creed@android.com virtual bool onQuery(SkEvent* evt) { 620bb6d06622eca40694b8bdea21d697a458d41b4creed@android.com if (SampleCode::TitleQ(*evt)) { 6345369a33bb78b6b76fafd63b1334151368dc9e2atfarina@chromium.org SampleCode::TitleR(evt, "TextBox"); 640bb6d06622eca40694b8bdea21d697a458d41b4creed@android.com return true; 650bb6d06622eca40694b8bdea21d697a458d41b4creed@android.com } 660bb6d06622eca40694b8bdea21d697a458d41b4creed@android.com return this->INHERITED::onQuery(evt); 670bb6d06622eca40694b8bdea21d697a458d41b4creed@android.com } 68d6f5a81955d0edb5bec9198bcadeab9563340927reed@google.com 69021b4054960a8b670e7a2670f7a5b4707b5736e3reed@google.com void drawTest(SkCanvas* canvas, SkScalar w, SkScalar h, SkColor fg, SkColor bg) { 70021b4054960a8b670e7a2670f7a5b4707b5736e3reed@google.com SkAutoCanvasRestore acr(canvas, true); 71021b4054960a8b670e7a2670f7a5b4707b5736e3reed@google.com 72021b4054960a8b670e7a2670f7a5b4707b5736e3reed@google.com canvas->clipRect(SkRect::MakeWH(w, h)); 73021b4054960a8b670e7a2670f7a5b4707b5736e3reed@google.com canvas->drawColor(bg); 74ae933ce0ea5fd9d21cb6ef2cee7e729d32690aacrmistry@google.com SkScalar margin = 20; 750bb6d06622eca40694b8bdea21d697a458d41b4creed@android.com SkTextBox tbox; 76ae933ce0ea5fd9d21cb6ef2cee7e729d32690aacrmistry@google.com tbox.setMode(SkTextBox::kLineBreak_Mode); 77ae933ce0ea5fd9d21cb6ef2cee7e729d32690aacrmistry@google.com tbox.setBox(margin, margin, 78ae933ce0ea5fd9d21cb6ef2cee7e729d32690aacrmistry@google.com w - margin, h - margin); 79ae933ce0ea5fd9d21cb6ef2cee7e729d32690aacrmistry@google.com tbox.setSpacing(SkIntToScalar(3)/3, 0); 800bb6d06622eca40694b8bdea21d697a458d41b4creed@android.com 81ae933ce0ea5fd9d21cb6ef2cee7e729d32690aacrmistry@google.com SkPaint paint; 82ae933ce0ea5fd9d21cb6ef2cee7e729d32690aacrmistry@google.com paint.setAntiAlias(true); 83261b8e2ca1cf22303ad95267f0bdc6e87e1bbe70reed@google.com paint.setLCDRenderText(true); 84021b4054960a8b670e7a2670f7a5b4707b5736e3reed@google.com paint.setColor(fg); 85ae933ce0ea5fd9d21cb6ef2cee7e729d32690aacrmistry@google.com tbox.setText(gText, strlen(gText), paint); 860bb6d06622eca40694b8bdea21d697a458d41b4creed@android.com 87ae933ce0ea5fd9d21cb6ef2cee7e729d32690aacrmistry@google.com for (int i = 9; i < 24; i += 2) { 88ae933ce0ea5fd9d21cb6ef2cee7e729d32690aacrmistry@google.com paint.setTextSize(SkIntToScalar(i)); 89ae933ce0ea5fd9d21cb6ef2cee7e729d32690aacrmistry@google.com tbox.draw(canvas); 90ae933ce0ea5fd9d21cb6ef2cee7e729d32690aacrmistry@google.com canvas->translate(0, tbox.getTextHeight() + paint.getFontSpacing()); 91ae933ce0ea5fd9d21cb6ef2cee7e729d32690aacrmistry@google.com } 920bb6d06622eca40694b8bdea21d697a458d41b4creed@android.com } 93d6f5a81955d0edb5bec9198bcadeab9563340927reed@google.com 94021b4054960a8b670e7a2670f7a5b4707b5736e3reed@google.com virtual void onDrawContent(SkCanvas* canvas) { 95021b4054960a8b670e7a2670f7a5b4707b5736e3reed@google.com SkScalar width = this->width() / 3; 96021b4054960a8b670e7a2670f7a5b4707b5736e3reed@google.com drawTest(canvas, width, this->height(), SK_ColorBLACK, SK_ColorWHITE); 97021b4054960a8b670e7a2670f7a5b4707b5736e3reed@google.com canvas->translate(width, 0); 98021b4054960a8b670e7a2670f7a5b4707b5736e3reed@google.com drawTest(canvas, width, this->height(), SK_ColorWHITE, SK_ColorBLACK); 99021b4054960a8b670e7a2670f7a5b4707b5736e3reed@google.com canvas->translate(width, 0); 100021b4054960a8b670e7a2670f7a5b4707b5736e3reed@google.com drawTest(canvas, width, this->height()/2, SK_ColorGRAY, SK_ColorWHITE); 101021b4054960a8b670e7a2670f7a5b4707b5736e3reed@google.com canvas->translate(0, this->height()/2); 102021b4054960a8b670e7a2670f7a5b4707b5736e3reed@google.com drawTest(canvas, width, this->height()/2, SK_ColorGRAY, SK_ColorBLACK); 103021b4054960a8b670e7a2670f7a5b4707b5736e3reed@google.com } 104021b4054960a8b670e7a2670f7a5b4707b5736e3reed@google.com 1050bb6d06622eca40694b8bdea21d697a458d41b4creed@android.comprivate: 1064ee1433844401df5b136e420a2548172de56c8abreed@google.com typedef SampleView INHERITED; 1070bb6d06622eca40694b8bdea21d697a458d41b4creed@android.com}; 1080bb6d06622eca40694b8bdea21d697a458d41b4creed@android.com 1090bb6d06622eca40694b8bdea21d697a458d41b4creed@android.com////////////////////////////////////////////////////////////////////////////// 1100bb6d06622eca40694b8bdea21d697a458d41b4creed@android.com 1110bb6d06622eca40694b8bdea21d697a458d41b4creed@android.comstatic SkView* MyFactory() { return new TextBoxView; } 1120bb6d06622eca40694b8bdea21d697a458d41b4creed@android.comstatic SkViewRegister reg(MyFactory); 113