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