blob: 9bc8762aa648907ec06d212b8461a42c2129712e [file] [log] [blame]
epoger@google.comec3ed6a2011-07-28 14:26:00 +00001
2/*
3 * Copyright 2011 Google Inc.
4 *
5 * Use of this source code is governed by a BSD-style license that can be
6 * found in the LICENSE file.
7 */
reed@android.com8a1c16f2008-12-17 15:59:43 +00008#include "SampleCode.h"
9#include "SkView.h"
10#include "SkCanvas.h"
11#include "SkTypeface.h"
12#include "SkPath.h"
13#include "SkRegion.h"
14#include "SkShader.h"
15#include "SkUtils.h"
reed@android.com8a1c16f2008-12-17 15:59:43 +000016#include "Sk1DPathEffect.h"
17#include "SkCornerPathEffect.h"
18#include "SkPathMeasure.h"
19#include "SkRandom.h"
20#include "SkColorPriv.h"
21#include "SkColorFilter.h"
22#include "SkDither.h"
reed@google.com2f3dc9d2011-05-02 17:33:45 +000023#include "SkTypefaceCache.h"
reed@android.com8a1c16f2008-12-17 15:59:43 +000024
reed@android.com7d970c72010-04-22 16:07:49 +000025static int dither_4444(int x) {
26 return ((x << 1) - ((x >> 4 << 4) | (x >> 4))) >> 4;
27}
28
29/** Ensure that the max of the original and dithered value (for alpha) is always
30 >= any other dithered value. We apply this "max" in colorpriv.h when we
31 predither down to 4444, to be sure that we stay in legal premultiplied form
32 */
33static void test_4444_dither() {
34 int buckets[16];
35 sk_bzero(buckets, sizeof(buckets));
36
37 for (int a = 0; a <= 0xFF; a++) {
38 int da = dither_4444(a);
39 int maxa = SkMax32(a >> 4, da);
40 // SkDebugf("--- %02X %X\n", a, da);
41 buckets[da] += 1;
42 for (int c = 0; c <= a; c++) {
43 int dc = dither_4444(c);
44 if (maxa < dc) {
45 SkDebugf("------------ error a=%d da=%d c=%d dc=%d\n", a, da,
46 c, dc);
47 }
48 }
49 }
50 for (int i = 0; i < 16; i++) {
51 // SkDebugf("[%d] = %d\n", i, buckets[i]);
52 }
53}
54
reed@android.com8a1c16f2008-12-17 15:59:43 +000055static const struct {
56 const char* fName;
57 SkTypeface::Style fStyle;
58} gFaces[] = {
reed@google.comdf499912011-03-22 14:07:59 +000059 { "sans-serif", SkTypeface::kNormal },
60 { "sans-serif", SkTypeface::kBold },
61 { "sans-serif", SkTypeface::kItalic },
62 { "sans-serif", SkTypeface::kBoldItalic },
reed@android.com8a1c16f2008-12-17 15:59:43 +000063 { "serif", SkTypeface::kNormal },
64 { "serif", SkTypeface::kBold },
65 { "serif", SkTypeface::kItalic },
66 { "serif", SkTypeface::kBoldItalic },
mike@reedtribe.org9db49282011-03-22 01:35:30 +000067 { "monospace", SkTypeface::kNormal },
68 { "monospace", SkTypeface::kBold },
69 { "monospace", SkTypeface::kItalic },
70 { "monospace", SkTypeface::kBoldItalic },
reed@android.com8a1c16f2008-12-17 15:59:43 +000071};
72
73static const int gFaceCount = SK_ARRAY_COUNT(gFaces);
74
reed@google.comf2183392011-04-22 14:10:48 +000075class TypefaceView : public SampleView {
reed@android.com8a1c16f2008-12-17 15:59:43 +000076 SkTypeface* fFaces[gFaceCount];
77
78public:
rmistry@google.comae933ce2012-08-23 18:19:56 +000079 TypefaceView() {
reed@android.com7d970c72010-04-22 16:07:49 +000080 test_4444_dither();
reed@android.com8a1c16f2008-12-17 15:59:43 +000081 for (int i = 0; i < gFaceCount; i++) {
reed@android.com069b8272009-03-04 15:31:48 +000082 fFaces[i] = SkTypeface::CreateFromName(gFaces[i].fName,
83 gFaces[i].fStyle);
reed@android.com8a1c16f2008-12-17 15:59:43 +000084 }
reed@google.comf2183392011-04-22 14:10:48 +000085
86 this->setBGColor(0xFFDDDDDD);
reed@android.com8a1c16f2008-12-17 15:59:43 +000087 }
reed@google.com82065d62011-02-07 15:30:46 +000088
reed@android.com8a1c16f2008-12-17 15:59:43 +000089 virtual ~TypefaceView() {
90 for (int i = 0; i < gFaceCount; i++) {
reed@google.com82065d62011-02-07 15:30:46 +000091 SkSafeUnref(fFaces[i]);
reed@android.com8a1c16f2008-12-17 15:59:43 +000092 }
reed@google.com2f3dc9d2011-05-02 17:33:45 +000093
94 SkTypefaceCache::Dump();
reed@android.com8a1c16f2008-12-17 15:59:43 +000095 }
96
97protected:
98 // overrides from SkEventSink
99 virtual bool onQuery(SkEvent* evt) {
100 if (SampleCode::TitleQ(*evt)) {
101 SampleCode::TitleR(evt, "Typefaces");
102 return true;
103 }
104 return this->INHERITED::onQuery(evt);
105 }
reed@google.com82065d62011-02-07 15:30:46 +0000106
reed@google.comf2183392011-04-22 14:10:48 +0000107 virtual void onDrawContent(SkCanvas* canvas) {
reed@android.com8a1c16f2008-12-17 15:59:43 +0000108 SkPaint paint;
109 paint.setAntiAlias(true);
110 paint.setTextSize(SkIntToScalar(30));
reed@android.com04d86c62010-01-25 22:02:44 +0000111
reed@android.com8a1c16f2008-12-17 15:59:43 +0000112 const char* text = "Hamburgefons";
113 const size_t textLen = strlen(text);
reed@google.com82065d62011-02-07 15:30:46 +0000114
reed@android.com8a1c16f2008-12-17 15:59:43 +0000115 SkScalar x = SkIntToScalar(10);
116 SkScalar dy = paint.getFontMetrics(NULL);
117 SkScalar y = dy;
reed@google.com82065d62011-02-07 15:30:46 +0000118
reed@google.com2f3dc9d2011-05-02 17:33:45 +0000119 paint.setLinearText(true);
reed@android.com8a1c16f2008-12-17 15:59:43 +0000120 for (int i = 0; i < gFaceCount; i++) {
121 paint.setTypeface(fFaces[i]);
122 canvas->drawText(text, textLen, x, y, paint);
123 y += dy;
124 }
reed@android.com8a1c16f2008-12-17 15:59:43 +0000125 }
reed@google.com82065d62011-02-07 15:30:46 +0000126
reed@android.com8a1c16f2008-12-17 15:59:43 +0000127private:
reed@google.comf2183392011-04-22 14:10:48 +0000128 typedef SampleView INHERITED;
reed@android.com8a1c16f2008-12-17 15:59:43 +0000129};
130
131//////////////////////////////////////////////////////////////////////////////
132
133static SkView* MyFactory() { return new TypefaceView; }
134static SkViewRegister reg(MyFactory);
135