ae933ce0ea
This CL is part III of IV (I broke down the 1280 files into 4 CLs). Review URL: https://codereview.appspot.com/6475053 git-svn-id: http://skia.googlecode.com/svn/trunk@5264 2bbb7eff-a529-9590-31e7-b0007b416f81
136 lines
3.6 KiB
C++
136 lines
3.6 KiB
C++
|
|
/*
|
|
* Copyright 2011 Google Inc.
|
|
*
|
|
* Use of this source code is governed by a BSD-style license that can be
|
|
* found in the LICENSE file.
|
|
*/
|
|
#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);
|
|
|