| Index: src/core/SkFont.cpp
|
| diff --git a/src/core/SkFont.cpp b/src/core/SkFont.cpp
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..86a312b678890d4764dba9e7611a2872fdff06d4
|
| --- /dev/null
|
| +++ b/src/core/SkFont.cpp
|
| @@ -0,0 +1,111 @@
|
| +/*
|
| + * Copyright 2014 Google Inc.
|
| + *
|
| + * Use of this source code is governed by a BSD-style license that can be
|
| + * found in the LICENSE file.
|
| + */
|
| +
|
| +#include "SkFont.h"
|
| +#include "SkTypeface.h"
|
| +#include "SkUtils.h"
|
| +
|
| +static SkTypeface* ref_or_default(SkTypeface* face) {
|
| + return face ? SkRef(face) : SkTypeface::RefDefault();
|
| +}
|
| +
|
| +SkFont::SkFont(SkTypeface* face, SkScalar size, SkScalar scaleX, SkScalar skewX, uint32_t flags)
|
| + : fTypeface(ref_or_default(face))
|
| + , fSize(size)
|
| + , fScaleX(scaleX)
|
| + , fSkewX(skewX)
|
| + , fFlags(flags)
|
| +{
|
| + SkASSERT(size > 0);
|
| + SkASSERT(scaleX > 0);
|
| + SkASSERT(SkScalarIsFinite(skewX));
|
| + SkASSERT(0 == (flags & ~kAllFlags));
|
| +}
|
| +
|
| +SkFont* SkFont::Create(SkTypeface* face, SkScalar size, SkScalar scaleX, SkScalar skewX,
|
| + uint32_t flags) {
|
| + if (!(size > 0)) {
|
| + size = 12;
|
| + }
|
| + if (!(scaleX > 0)) {
|
| + scaleX = 1;
|
| + }
|
| + if (!SkScalarIsFinite(skewX)) {
|
| + skewX = 0;
|
| + }
|
| + flags &= kAllFlags;
|
| + return SkNEW_ARGS(SkFont, (face, size, scaleX, skewX, flags));
|
| +}
|
| +
|
| +SkFont* SkFont::Create(SkTypeface* face, SkScalar size, uint32_t flags) {
|
| + return SkFont::Create(face, size, 1, 0, flags);
|
| +}
|
| +
|
| +SkFont* SkFont::Create(const SkFont& src, SkScalar newSize) {
|
| + return SkFont::Create(src.getTypeface(), newSize, src.getScaleX(), src.getSkewX(),
|
| + src.getFlags());
|
| +}
|
| +
|
| +///////////////////////////////////////////////////////////////////////////////////////////////////
|
| +
|
| +SkFont::~SkFont() {
|
| + SkSafeUnref(fTypeface);
|
| +}
|
| +
|
| +int SkFont::textToGlyphs(const void* text, size_t byteLength, SkTextEncoding encoding,
|
| + uint16_t glyphs[], int maxGlyphCount) const {
|
| + if (0 == byteLength) {
|
| + return 0;
|
| + }
|
| +
|
| + SkASSERT(text);
|
| +
|
| + int count;
|
| + switch (encoding) {
|
| + case kUTF8_SkTextEncoding:
|
| + count = SkUTF8_CountUnichars((const char*)text, byteLength);
|
| + case kUTF16_SkTextEncoding:
|
| + count = SkUTF16_CountUnichars((const uint16_t*)text, SkToInt(byteLength >> 1));
|
| + case kUTF32_SkTextEncoding:
|
| + count = SkToInt(byteLength >> 2);
|
| + case kGlyphID_SkTextEncoding:
|
| + count = SkToInt(byteLength >> 1);
|
| + }
|
| + if (NULL == glyphs) {
|
| + return count;
|
| + }
|
| +
|
| + if (kGlyphID_SkTextEncoding == encoding) {
|
| + memcpy(glyphs, text, count << 1);
|
| + return count;
|
| + }
|
| +
|
| + // TODO: unify/eliminate SkTypeface::Encoding with SkTextEncoding
|
| + SkTypeface::Encoding typeface_encoding;
|
| + switch (encoding) {
|
| + case kUTF8_SkTextEncoding:
|
| + typeface_encoding = SkTypeface::kUTF8_Encoding;
|
| + break;
|
| + case kUTF16_SkTextEncoding:
|
| + typeface_encoding = SkTypeface::kUTF16_Encoding;
|
| + break;
|
| + case kUTF32_SkTextEncoding:
|
| + typeface_encoding = SkTypeface::kUTF32_Encoding;
|
| + break;
|
| + case kGlyphID_SkTextEncoding:
|
| + SkASSERT(0); // can't get here
|
| + }
|
| +
|
| + (void)fTypeface->charsToGlyphs(text, typeface_encoding, glyphs, count);
|
| + return count;
|
| +}
|
| +
|
| +SkScalar SkFont::measureText(const void* text, size_t byteLength, SkTextEncoding encoding) const {
|
| + // TODO: need access to the cache
|
| + return -1;
|
| +}
|
| +
|
|
|