11cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger/* 21cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger * Copyright 2011 Google Inc. 31cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger * 41cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger * Use of this source code is governed by a BSD-style license that can be 51cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger * found in the LICENSE file. 61cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger */ 71cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger 81cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger 91cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger#include "gm.h" 101cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger#include "SkCanvas.h" 111cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger 121cab2921ab279367f8206cdadc9259d12e603548Derek Sollenbergernamespace skiagm { 131cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger 141cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger#define TEXT_SIZE 48 151cab2921ab279367f8206cdadc9259d12e603548Derek Sollenbergerstatic const char gText[] = "Hello"; 161cab2921ab279367f8206cdadc9259d12e603548Derek Sollenbergerstatic const size_t gLen = sizeof(gText) - 1; 171cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger 181cab2921ab279367f8206cdadc9259d12e603548Derek Sollenbergerclass VertTextGM : public GM { 191cab2921ab279367f8206cdadc9259d12e603548Derek Sollenbergerpublic: 201cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger VertTextGM() {} 211cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger 221cab2921ab279367f8206cdadc9259d12e603548Derek Sollenbergerprotected: 231cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger 241cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger SkString onShortName() { 251cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger return SkString("verttext"); 261cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger } 271cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger 281cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger SkISize onISize() { return make_isize(640, 480); } 291cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger 301cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger static void drawBaseline(SkCanvas* canvas, const SkPaint& paint, 311cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger SkScalar x, SkScalar y) { 321cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger SkScalar total = paint.measureText(gText, gLen); 331cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger 341cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger SkPaint p; 351cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger p.setAntiAlias(true); 361cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger p.setColor(0x80FF0000); 371cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger canvas->drawLine(x, y, 381cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger paint.isVerticalText() ? x : x + total, 391cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger paint.isVerticalText() ? y + total : y, 401cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger p); 411cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger 421cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger p.setColor(0xFF0000FF); 431cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger SkScalar adv[gLen]; 441cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger paint.getTextWidths(gText, gLen, adv, NULL); 451cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger for (size_t i = 0; i < gLen; ++i) { 461cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger canvas->drawCircle(x, y, SK_Scalar1 * 3 / 2, p); 471cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger if (paint.isVerticalText()) { 481cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger y += adv[i]; 491cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger } else { 501cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger x += adv[i]; 511cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger } 521cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger } 531cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger canvas->drawCircle(x, y, SK_Scalar1 * 3 / 2, p); 541cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger } 551cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger 561cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger virtual void onDraw(SkCanvas* canvas) { 571cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger SkScalar x = SkIntToScalar(100); 581cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger SkScalar y = SkIntToScalar(50); 591cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger 601cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger for (int i = 0; i < 4; ++i) { 611cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger SkPaint paint; 621cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger paint.setAntiAlias(true); 631cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger paint.setTextSize(SkIntToScalar(TEXT_SIZE)); 641cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger 651cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger 661cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger paint.setVerticalText(false); 671cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger drawBaseline(canvas, paint, x, y); 681cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger canvas->drawText(gText, gLen, x, y, paint); 691cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger 701cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger paint.setVerticalText(true); 711cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger drawBaseline(canvas, paint, x, y); 721cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger canvas->drawText(gText, gLen, x, y, paint); 731cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger 741cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger x += SkIntToScalar(40); 751cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger y += SkIntToScalar(120); 761cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger 771cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger canvas->rotate(SkIntToScalar(-15)); 781cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger } 791cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger } 801cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger 811cab2921ab279367f8206cdadc9259d12e603548Derek Sollenbergerprivate: 821cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger typedef GM INHERITED; 831cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger}; 841cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger 851cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger/////////////////////////////////////////////////////////////////////////////// 861cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger 871cab2921ab279367f8206cdadc9259d12e603548Derek Sollenbergerstatic GM* MyFactory(void*) { return new VertTextGM; } 881cab2921ab279367f8206cdadc9259d12e603548Derek Sollenbergerstatic GMRegistry reg(MyFactory); 891cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger 901cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger} 91