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 */
7bf0001d0472d727266762c5967ec0d919a6df083reed@google.com
88a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#include "SampleCode.h"
98a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#include "SkView.h"
108a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#include "SkCanvas.h"
118b0e8ac5f582de80356019406e2975079bf0829dcommit-bot@chromium.org#include "SkReadBuffer.h"
128b0e8ac5f582de80356019406e2975079bf0829dcommit-bot@chromium.org#include "SkWriteBuffer.h"
138a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#include "SkGradientShader.h"
148a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#include "SkGraphics.h"
158a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#include "SkImageDecoder.h"
168a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#include "SkPath.h"
178a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#include "SkRandom.h"
188a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#include "SkRegion.h"
198a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#include "SkShader.h"
208a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#include "SkUtils.h"
218a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#include "SkColorPriv.h"
228a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#include "SkColorFilter.h"
238a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#include "SkTime.h"
248a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#include "SkTypeface.h"
258a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#include "SkXfermode.h"
268a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
278a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#include "SkStream.h"
288a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#include "SkXMLParser.h"
298a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
309e39bb3603ee33e7753ee66eb76ebcfc412396f1reed@google.comstatic void test_breakText() {
318a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    SkPaint paint;
328a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    const char* text = "sdfkljAKLDFJKEWkldfjlk#$%&sdfs.dsj";
338a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    size_t length = strlen(text);
348a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    SkScalar width = paint.measureText(text, length);
3582065d667f64e232bcde2ad849756a6096fcbe6freed@google.com
368a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    SkScalar mm = 0;
378a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    SkScalar nn = 0;
389e39bb3603ee33e7753ee66eb76ebcfc412396f1reed@google.com    for (SkScalar w = 0; w <= width; w += SK_Scalar1) {
398a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        SkScalar m;
408a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        size_t n = paint.breakText(text, length, w, &m,
418a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com                                    SkPaint::kBackward_TextBufferDirection);
4282065d667f64e232bcde2ad849756a6096fcbe6freed@google.com
438a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        SkASSERT(n <= length);
448a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        SkASSERT(m <= width);
4582065d667f64e232bcde2ad849756a6096fcbe6freed@google.com
469e39bb3603ee33e7753ee66eb76ebcfc412396f1reed@google.com        if (n == 0) {
478a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com            SkASSERT(m == 0);
489e39bb3603ee33e7753ee66eb76ebcfc412396f1reed@google.com        } else {
498a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com            // now assert that we're monotonic
509e39bb3603ee33e7753ee66eb76ebcfc412396f1reed@google.com            if (n == nn) {
518a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com                SkASSERT(m == mm);
529e39bb3603ee33e7753ee66eb76ebcfc412396f1reed@google.com            } else {
538a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com                SkASSERT(n > nn);
548a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com                SkASSERT(m > mm);
558a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com            }
568a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        }
57ffe39bd3b66eb5090684959e7f2409346ab72d93tomhudson@google.com        nn = SkIntToScalar((unsigned int)n);
588a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        mm = m;
598a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    }
608a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
6164cc579efa7e416c7298ed159d76b074b283c0f9senorblanco@chromium.org    SkDEBUGCODE(size_t length2 =) paint.breakText(text, length, width, &mm);
62261b8e2ca1cf22303ad95267f0bdc6e87e1bbe70reed@google.com    SkASSERT(length2 == length);
638a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    SkASSERT(mm == width);
648a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com}
658a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
66e0e7cfe44bb9d66d76120a79e5275c294bacaa22commit-bot@chromium.orgstatic SkRandom gRand;
678a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
688a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comclass SkPowerMode : public SkXfermode {
698a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.compublic:
708a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    SkPowerMode(SkScalar exponent) { this->init(exponent); }
718a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
729e39bb3603ee33e7753ee66eb76ebcfc412396f1reed@google.com    virtual void xfer16(uint16_t dst[], const SkPMColor src[], int count,
733af2b8def636eb36b69b1b334013320646dc7465mike@reedtribe.org                        const SkAlpha aa[]) const SK_OVERRIDE;
748a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
758b0e8ac5f582de80356019406e2975079bf0829dcommit-bot@chromium.org    typedef SkFlattenable* (*Factory)(SkReadBuffer&);
7682065d667f64e232bcde2ad849756a6096fcbe6freed@google.com
770f10f7bf1fb43ca6346dc220a076773b1f19a367commit-bot@chromium.org    SK_TO_STRING_OVERRIDE()
78ba28d03e94dc221d6a803bf2a84a420b9159255cdjsollen@google.com    SK_DECLARE_PUBLIC_FLATTENABLE_DESERIALIZATION_PROCS(SkPowerMode)
7982065d667f64e232bcde2ad849756a6096fcbe6freed@google.com
808a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comprivate:
818a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    SkScalar fExp;          // user's value
828a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    uint8_t fTable[256];    // cache
838a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
848a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    void init(SkScalar exponent);
858b0e8ac5f582de80356019406e2975079bf0829dcommit-bot@chromium.org    SkPowerMode(SkReadBuffer& b) : INHERITED(b) {
868a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        // read the exponent
87c73dd5c6880739f26216f198c757028fd28df1a4djsollen@google.com        this->init(SkFixedToScalar(b.readFixed()));
888a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    }
898b0e8ac5f582de80356019406e2975079bf0829dcommit-bot@chromium.org    virtual void flatten(SkWriteBuffer& b) const SK_OVERRIDE {
9054924243c1b65b3ee6d8fa064b50a9b1bb2a19a5djsollen@google.com        this->INHERITED::flatten(b);
91c73dd5c6880739f26216f198c757028fd28df1a4djsollen@google.com        b.writeFixed(SkScalarToFixed(fExp));
9254924243c1b65b3ee6d8fa064b50a9b1bb2a19a5djsollen@google.com    }
9382065d667f64e232bcde2ad849756a6096fcbe6freed@google.com
948a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    typedef SkXfermode INHERITED;
958a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com};
968a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
979e39bb3603ee33e7753ee66eb76ebcfc412396f1reed@google.comvoid SkPowerMode::init(SkScalar e) {
988a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    fExp = e;
998a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    float ee = SkScalarToFloat(e);
10082065d667f64e232bcde2ad849756a6096fcbe6freed@google.com
1018a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    printf("------ %g\n", ee);
1029e39bb3603ee33e7753ee66eb76ebcfc412396f1reed@google.com    for (int i = 0; i < 256; i++) {
1038a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        float x = i / 255.f;
1048a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com     //   printf(" %d %g", i, x);
1058a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        x = powf(x, ee);
1068a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com     //   printf(" %g", x);
107e1ca705cac4b946993f6cbf798e2a0ba27e739f3reed@google.com        int xx = SkScalarRoundToInt(x * 255);
1088a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com     //   printf(" %d\n", xx);
1098a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        fTable[i] = SkToU8(xx);
1108a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    }
1118a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com}
1128a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
1139e39bb3603ee33e7753ee66eb76ebcfc412396f1reed@google.comvoid SkPowerMode::xfer16(uint16_t dst[], const SkPMColor src[], int count,
1143af2b8def636eb36b69b1b334013320646dc7465mike@reedtribe.org                         const SkAlpha aa[]) const {
1159e39bb3603ee33e7753ee66eb76ebcfc412396f1reed@google.com    for (int i = 0; i < count; i++) {
1168a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        SkPMColor c = src[i];
1178a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        int r = SkGetPackedR32(c);
1188a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        int g = SkGetPackedG32(c);
1198a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        int b = SkGetPackedB32(c);
1208a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        r = fTable[r];
1218a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        g = fTable[g];
1228a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        b = fTable[b];
1238a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        dst[i] = SkPack888ToRGB16(r, g, b);
1248a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    }
1258a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com}
1268a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
1270f10f7bf1fb43ca6346dc220a076773b1f19a367commit-bot@chromium.org#ifndef SK_IGNORE_TO_STRING
128b83b6b4f7690fe929d8d6b1a3d2b7ed562b95ba6robertphillips@google.comvoid SkPowerMode::toString(SkString* str) const {
129b83b6b4f7690fe929d8d6b1a3d2b7ed562b95ba6robertphillips@google.com    str->append("SkPowerMode: exponent ");
130b83b6b4f7690fe929d8d6b1a3d2b7ed562b95ba6robertphillips@google.com    str->appendScalar(fExp);
131b83b6b4f7690fe929d8d6b1a3d2b7ed562b95ba6robertphillips@google.com}
132b83b6b4f7690fe929d8d6b1a3d2b7ed562b95ba6robertphillips@google.com#endif
133b83b6b4f7690fe929d8d6b1a3d2b7ed562b95ba6robertphillips@google.com
1348a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comstatic const struct {
1358a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    const char* fName;
1368a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    uint32_t    fFlags;
1378a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    bool        fFlushCache;
1388a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com} gHints[] = {
1398a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    { "Linear", SkPaint::kLinearText_Flag,     false },
1408a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    { "Normal",   0,                           true },
1418a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    { "Subpixel", SkPaint::kSubpixelText_Flag, true }
1428a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com};
1438a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
144e003aecb30fe40b0cbf4b0d38147bf794752422acommit-bot@chromium.orgstatic void DrawTheText(SkCanvas* canvas, const char text[], size_t length, SkScalar x, SkScalar y,
145e003aecb30fe40b0cbf4b0d38147bf794752422acommit-bot@chromium.org                        const SkPaint& paint, SkScalar clickX) {
1468a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    SkPaint p(paint);
1478a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
1488a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#if 0
1498a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    canvas->drawText(text, length, x, y, paint);
1508a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#else
1518a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    {
1528a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        SkPoint pts[1000];
1538a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        SkScalar xpos = x;
1548a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        SkASSERT(length <= SK_ARRAY_COUNT(pts));
1559e39bb3603ee33e7753ee66eb76ebcfc412396f1reed@google.com        for (size_t i = 0; i < length; i++) {
1568a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com            pts[i].set(xpos, y), xpos += paint.getTextSize();
1579e39bb3603ee33e7753ee66eb76ebcfc412396f1reed@google.com        }
1588a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        canvas->drawPosText(text, length, pts, paint);
1598a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    }
1608a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#endif
1618a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
1628a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    p.setSubpixelText(true);
1638a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    x += SkIntToScalar(180);
1648a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    canvas->drawText(text, length, x, y, p);
1658a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
1668a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#ifdef SK_DEBUG
1679e39bb3603ee33e7753ee66eb76ebcfc412396f1reed@google.com    if (true) {
1688a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        p.setSubpixelText(false);
1698a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        p.setLinearText(true);
1708a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        x += SkIntToScalar(180);
1718a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        canvas->drawText(text, length, x, y, p);
1728a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    }
1738a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#endif
1748a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com}
1758a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
1769e39bb3603ee33e7753ee66eb76ebcfc412396f1reed@google.comclass TextSpeedView : public SampleView {
1778a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.compublic:
178ae933ce0ea5fd9d21cb6ef2cee7e729d32690aacrmistry@google.com    TextSpeedView() {
1798a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        fHints = 0;
1808a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        fClickX = 0;
1818a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
18282065d667f64e232bcde2ad849756a6096fcbe6freed@google.com        test_breakText();
1838a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    }
18482065d667f64e232bcde2ad849756a6096fcbe6freed@google.com
1858a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comprotected:
1868a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    // overrides from SkEventSink
1879e39bb3603ee33e7753ee66eb76ebcfc412396f1reed@google.com    virtual bool onQuery(SkEvent* evt) {
1889e39bb3603ee33e7753ee66eb76ebcfc412396f1reed@google.com        if (SampleCode::TitleQ(*evt)) {
1898a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com            SampleCode::TitleR(evt, "Text");
1908a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com            return true;
1918a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        }
1928a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        return this->INHERITED::onQuery(evt);
1938a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    }
19482065d667f64e232bcde2ad849756a6096fcbe6freed@google.com
1959e39bb3603ee33e7753ee66eb76ebcfc412396f1reed@google.com    static void make_textstrip(SkBitmap* bm) {
196a8c183125f2861067daf432cada06d431a795cd0commit-bot@chromium.org        bm->allocPixels(SkImageInfo::Make(200, 18, kRGB_565_SkColorType,
197a8c183125f2861067daf432cada06d431a795cd0commit-bot@chromium.org                                          kOpaque_SkAlphaType));
1988a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        bm->eraseColor(SK_ColorWHITE);
19982065d667f64e232bcde2ad849756a6096fcbe6freed@google.com
2008a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        SkCanvas    canvas(*bm);
2018a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        SkPaint     paint;
2028a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        const char* s = "Lorem ipsum dolor sit amet, consectetuer adipiscing elit";
20382065d667f64e232bcde2ad849756a6096fcbe6freed@google.com
2048a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        paint.setFlags(paint.getFlags() | SkPaint::kAntiAlias_Flag
2058a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com                                        | SkPaint::kDevKernText_Flag);
2068a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        paint.setTextSize(SkIntToScalar(14));
2078a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        canvas.drawText(s, strlen(s), SkIntToScalar(8), SkIntToScalar(14), paint);
2088a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    }
20982065d667f64e232bcde2ad849756a6096fcbe6freed@google.com
210e0e7cfe44bb9d66d76120a79e5275c294bacaa22commit-bot@chromium.org    static void fill_pts(SkPoint pts[], size_t n, SkRandom* rand) {
2118a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        for (size_t i = 0; i < n; i++)
2128a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com            pts[i].set(rand->nextUScalar1() * 640, rand->nextUScalar1() * 480);
2138a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    }
21482065d667f64e232bcde2ad849756a6096fcbe6freed@google.com
2159e39bb3603ee33e7753ee66eb76ebcfc412396f1reed@google.com    virtual void onDrawContent(SkCanvas* canvas) {
2168a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        SkAutoCanvasRestore restore(canvas, false);
2178a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        {
2188a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com            SkRect r;
2198a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com            r.set(0, 0, SkIntToScalar(1000), SkIntToScalar(20));
2208a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com       //     canvas->saveLayer(&r, NULL, SkCanvas::kHasAlphaLayer_SaveFlag);
2218a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        }
2228a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
2238a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        SkPaint paint;
2248a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com//        const uint16_t glyphs[] = { 0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19 };
2258a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        int         index = fHints % SK_ARRAY_COUNT(gHints);
2268a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        index = 1;
2278a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com//        const char* style = gHints[index].fName;
22882065d667f64e232bcde2ad849756a6096fcbe6freed@google.com
2298a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com//        canvas->translate(0, SkIntToScalar(50));
2308a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
2318a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com  //      canvas->drawText(style, strlen(style), SkIntToScalar(20), SkIntToScalar(20), paint);
2328a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
23304d86c6a6b8eb8631752b3680f1292fa0a2c7119reed@android.com        SkSafeUnref(paint.setTypeface(SkTypeface::CreateFromFile("/skimages/samplefont.ttf")));
2348a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        paint.setAntiAlias(true);
2358a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        paint.setFlags(paint.getFlags() | gHints[index].fFlags);
23682065d667f64e232bcde2ad849756a6096fcbe6freed@google.com
2378a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        SkRect clip;
2388a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        clip.set(SkIntToScalar(25), SkIntToScalar(34), SkIntToScalar(88), SkIntToScalar(155));
23982065d667f64e232bcde2ad849756a6096fcbe6freed@google.com
2408a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        const char* text = "Hamburgefons";
2418a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        size_t length = strlen(text);
2428a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
2432f3dc9dc4c970bd066be329a842a791d91f524e2reed@google.com        SkScalar y = SkIntToScalar(0);
2442f3dc9dc4c970bd066be329a842a791d91f524e2reed@google.com        for (int i = 9; i <= 24; i++) {
2452f3dc9dc4c970bd066be329a842a791d91f524e2reed@google.com            paint.setTextSize(SkIntToScalar(i) /*+ (gRand.nextU() & 0xFFFF)*/);
2469e39bb3603ee33e7753ee66eb76ebcfc412396f1reed@google.com            for (SkScalar dx = 0; dx <= SkIntToScalar(3)/4;
2479e39bb3603ee33e7753ee66eb76ebcfc412396f1reed@google.com                                            dx += SkIntToScalar(1) /* /4 */) {
2482f3dc9dc4c970bd066be329a842a791d91f524e2reed@google.com                y += paint.getFontSpacing();
249e003aecb30fe40b0cbf4b0d38147bf794752422acommit-bot@chromium.org                DrawTheText(canvas, text, length, SkIntToScalar(20) + dx, y, paint, fClickX);
2508a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com            }
2518a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        }
2522f3dc9dc4c970bd066be329a842a791d91f524e2reed@google.com        if (gHints[index].fFlushCache) {
2532f3dc9dc4c970bd066be329a842a791d91f524e2reed@google.com//                SkGraphics::SetFontCacheUsed(0);
2548a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        }
2558a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    }
25682065d667f64e232bcde2ad849756a6096fcbe6freed@google.com
2574d5c26de0a24f86c37c1da8b0e30d11a550ea67breed@google.com    virtual SkView::Click* onFindClickHandler(SkScalar x, SkScalar y,
2584d5c26de0a24f86c37c1da8b0e30d11a550ea67breed@google.com                                              unsigned modi) SK_OVERRIDE {
2598a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        fClickX = x;
2608a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        this->inval(NULL);
2614d5c26de0a24f86c37c1da8b0e30d11a550ea67breed@google.com        return this->INHERITED::onFindClickHandler(x, y, modi);
2628a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    }
26382065d667f64e232bcde2ad849756a6096fcbe6freed@google.com
2649e39bb3603ee33e7753ee66eb76ebcfc412396f1reed@google.com    virtual bool onClick(Click* click) {
2658a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        return this->INHERITED::onClick(click);
2668a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    }
26782065d667f64e232bcde2ad849756a6096fcbe6freed@google.com
2688a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comprivate:
2698a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    int fHints;
2708a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    SkScalar fClickX;
2718a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
2729e39bb3603ee33e7753ee66eb76ebcfc412396f1reed@google.com    typedef SampleView INHERITED;
2738a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com};
2748a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
2758a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com//////////////////////////////////////////////////////////////////////////////
2768a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
2778a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comstatic SkView* MyFactory() { return new TextSpeedView; }
2788a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comstatic SkViewRegister reg(MyFactory);
279