aboutsummaryrefslogtreecommitdiffhomepage
path: root/samplecode/SampleTypeface.cpp
blob: 63f1d5adba4babbf1a23ffc8796640dcae109129 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
#include "SampleCode.h"
#include "SkView.h"
#include "SkCanvas.h"
#include "SkTypeface.h"
#include "SkPath.h"
#include "SkRegion.h"
#include "SkShader.h"
#include "SkUtils.h"
#include "Sk1DPathEffect.h"
#include "SkCornerPathEffect.h"
#include "SkPathMeasure.h"
#include "SkRandom.h"
#include "SkColorPriv.h"
#include "SkColorFilter.h"
#include "SkDither.h"
#include "SkTypefaceCache.h"

static int dither_4444(int x) {
    return ((x << 1) - ((x >> 4 << 4) | (x >> 4))) >> 4;
}

/** Ensure that the max of the original and dithered value (for alpha) is always
    >= any other dithered value. We apply this "max" in colorpriv.h when we
    predither down to 4444, to be sure that we stay in legal premultiplied form
 */
static void test_4444_dither() {
    int buckets[16];
    sk_bzero(buckets, sizeof(buckets));

    for (int a = 0; a <= 0xFF; a++) {
        int da = dither_4444(a);
        int maxa = SkMax32(a >> 4, da);
    //    SkDebugf("--- %02X %X\n", a, da);
        buckets[da] += 1;
        for (int c = 0; c <= a; c++) {
            int dc = dither_4444(c);
            if (maxa < dc) {
                SkDebugf("------------ error a=%d da=%d c=%d dc=%d\n", a, da,
                         c, dc);
            }
        }
    }
    for (int i = 0; i < 16; i++) {
    //    SkDebugf("[%d] = %d\n", i, buckets[i]);
    }
}

static const struct {
    const char* fName;
    SkTypeface::Style   fStyle;
} gFaces[] = {
    { "sans-serif", SkTypeface::kNormal },
    { "sans-serif", SkTypeface::kBold },
    { "sans-serif", SkTypeface::kItalic },
    { "sans-serif", SkTypeface::kBoldItalic },
    { "serif", SkTypeface::kNormal },
    { "serif", SkTypeface::kBold },
    { "serif", SkTypeface::kItalic },
    { "serif", SkTypeface::kBoldItalic },
    { "monospace", SkTypeface::kNormal },
    { "monospace", SkTypeface::kBold },
    { "monospace", SkTypeface::kItalic },
    { "monospace", SkTypeface::kBoldItalic },
};

static const int gFaceCount = SK_ARRAY_COUNT(gFaces);

class TypefaceView : public SampleView {
    SkTypeface* fFaces[gFaceCount];

public:
	TypefaceView() {
        test_4444_dither();
        for (int i = 0; i < gFaceCount; i++) {
            fFaces[i] = SkTypeface::CreateFromName(gFaces[i].fName,
                                                   gFaces[i].fStyle);
        }

        this->setBGColor(0xFFDDDDDD);
    }

    virtual ~TypefaceView() {
        for (int i = 0; i < gFaceCount; i++) {
            SkSafeUnref(fFaces[i]);
        }

        SkTypefaceCache::Dump();
    }

protected:
    // overrides from SkEventSink
    virtual bool onQuery(SkEvent* evt) {
        if (SampleCode::TitleQ(*evt)) {
            SampleCode::TitleR(evt, "Typefaces");
            return true;
        }
        return this->INHERITED::onQuery(evt);
    }

    virtual void onDrawContent(SkCanvas* canvas) {
        SkPaint paint;
        paint.setAntiAlias(true);
        paint.setTextSize(SkIntToScalar(30));

        const char* text = "Hamburgefons";
        const size_t textLen = strlen(text);

        SkScalar x = SkIntToScalar(10);
        SkScalar dy = paint.getFontMetrics(NULL);
        SkScalar y = dy;

        paint.setLinearText(true);
        for (int i = 0; i < gFaceCount; i++) {
            paint.setTypeface(fFaces[i]);
            canvas->drawText(text, textLen, x, y, paint);
            y += dy;
        }
    }

private:
    typedef SampleView INHERITED;
};

//////////////////////////////////////////////////////////////////////////////

static SkView* MyFactory() { return new TypefaceView; }
static SkViewRegister reg(MyFactory);