2011-07-28 14:26:00 +00:00
|
|
|
|
|
|
|
/*
|
|
|
|
* Copyright 2011 Google Inc.
|
|
|
|
*
|
|
|
|
* Use of this source code is governed by a BSD-style license that can be
|
|
|
|
* found in the LICENSE file.
|
|
|
|
*/
|
2008-12-17 15:59:43 +00:00
|
|
|
#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"
|
2011-05-02 17:33:45 +00:00
|
|
|
#include "SkTypefaceCache.h"
|
2008-12-17 15:59:43 +00:00
|
|
|
|
2010-04-22 16:07:49 +00:00
|
|
|
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]);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2008-12-17 15:59:43 +00:00
|
|
|
static const struct {
|
|
|
|
const char* fName;
|
|
|
|
SkTypeface::Style fStyle;
|
|
|
|
} gFaces[] = {
|
2011-03-22 14:07:59 +00:00
|
|
|
{ "sans-serif", SkTypeface::kNormal },
|
|
|
|
{ "sans-serif", SkTypeface::kBold },
|
|
|
|
{ "sans-serif", SkTypeface::kItalic },
|
|
|
|
{ "sans-serif", SkTypeface::kBoldItalic },
|
2008-12-17 15:59:43 +00:00
|
|
|
{ "serif", SkTypeface::kNormal },
|
|
|
|
{ "serif", SkTypeface::kBold },
|
|
|
|
{ "serif", SkTypeface::kItalic },
|
|
|
|
{ "serif", SkTypeface::kBoldItalic },
|
2011-03-22 01:35:30 +00:00
|
|
|
{ "monospace", SkTypeface::kNormal },
|
|
|
|
{ "monospace", SkTypeface::kBold },
|
|
|
|
{ "monospace", SkTypeface::kItalic },
|
|
|
|
{ "monospace", SkTypeface::kBoldItalic },
|
2008-12-17 15:59:43 +00:00
|
|
|
};
|
|
|
|
|
|
|
|
static const int gFaceCount = SK_ARRAY_COUNT(gFaces);
|
|
|
|
|
2011-04-22 14:10:48 +00:00
|
|
|
class TypefaceView : public SampleView {
|
2008-12-17 15:59:43 +00:00
|
|
|
SkTypeface* fFaces[gFaceCount];
|
|
|
|
|
|
|
|
public:
|
2012-08-23 18:19:56 +00:00
|
|
|
TypefaceView() {
|
2010-04-22 16:07:49 +00:00
|
|
|
test_4444_dither();
|
2008-12-17 15:59:43 +00:00
|
|
|
for (int i = 0; i < gFaceCount; i++) {
|
2009-03-04 15:31:48 +00:00
|
|
|
fFaces[i] = SkTypeface::CreateFromName(gFaces[i].fName,
|
|
|
|
gFaces[i].fStyle);
|
2008-12-17 15:59:43 +00:00
|
|
|
}
|
2011-04-22 14:10:48 +00:00
|
|
|
|
|
|
|
this->setBGColor(0xFFDDDDDD);
|
2008-12-17 15:59:43 +00:00
|
|
|
}
|
2011-02-07 15:30:46 +00:00
|
|
|
|
2008-12-17 15:59:43 +00:00
|
|
|
virtual ~TypefaceView() {
|
|
|
|
for (int i = 0; i < gFaceCount; i++) {
|
2011-02-07 15:30:46 +00:00
|
|
|
SkSafeUnref(fFaces[i]);
|
2008-12-17 15:59:43 +00:00
|
|
|
}
|
2011-05-02 17:33:45 +00:00
|
|
|
|
|
|
|
SkTypefaceCache::Dump();
|
2008-12-17 15:59:43 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
protected:
|
|
|
|
// overrides from SkEventSink
|
|
|
|
virtual bool onQuery(SkEvent* evt) {
|
|
|
|
if (SampleCode::TitleQ(*evt)) {
|
|
|
|
SampleCode::TitleR(evt, "Typefaces");
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
return this->INHERITED::onQuery(evt);
|
|
|
|
}
|
2011-02-07 15:30:46 +00:00
|
|
|
|
2011-04-22 14:10:48 +00:00
|
|
|
virtual void onDrawContent(SkCanvas* canvas) {
|
2008-12-17 15:59:43 +00:00
|
|
|
SkPaint paint;
|
|
|
|
paint.setAntiAlias(true);
|
|
|
|
paint.setTextSize(SkIntToScalar(30));
|
2010-01-25 22:02:44 +00:00
|
|
|
|
2008-12-17 15:59:43 +00:00
|
|
|
const char* text = "Hamburgefons";
|
|
|
|
const size_t textLen = strlen(text);
|
2011-02-07 15:30:46 +00:00
|
|
|
|
2008-12-17 15:59:43 +00:00
|
|
|
SkScalar x = SkIntToScalar(10);
|
|
|
|
SkScalar dy = paint.getFontMetrics(NULL);
|
|
|
|
SkScalar y = dy;
|
2011-02-07 15:30:46 +00:00
|
|
|
|
2011-05-02 17:33:45 +00:00
|
|
|
paint.setLinearText(true);
|
2008-12-17 15:59:43 +00:00
|
|
|
for (int i = 0; i < gFaceCount; i++) {
|
|
|
|
paint.setTypeface(fFaces[i]);
|
|
|
|
canvas->drawText(text, textLen, x, y, paint);
|
|
|
|
y += dy;
|
|
|
|
}
|
|
|
|
}
|
2011-02-07 15:30:46 +00:00
|
|
|
|
2008-12-17 15:59:43 +00:00
|
|
|
private:
|
2011-04-22 14:10:48 +00:00
|
|
|
typedef SampleView INHERITED;
|
2008-12-17 15:59:43 +00:00
|
|
|
};
|
|
|
|
|
|
|
|
//////////////////////////////////////////////////////////////////////////////
|
|
|
|
|
|
|
|
static SkView* MyFactory() { return new TypefaceView; }
|
|
|
|
static SkViewRegister reg(MyFactory);
|
|
|
|
|