Index: src/core/SkFont.cpp |
diff --git a/src/core/SkFont.cpp b/src/core/SkFont.cpp |
new file mode 100644 |
index 0000000000000000000000000000000000000000..2c16186c113feb742b26823f0a829e440b4fa5ae |
--- /dev/null |
+++ b/src/core/SkFont.cpp |
@@ -0,0 +1,158 @@ |
+/* |
+ * 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, MaskType mt, |
+ uint32_t flags) |
+ : fTypeface(ref_or_default(face)) |
+ , fSize(size) |
+ , fScaleX(scaleX) |
+ , fSkewX(skewX) |
+ , fFlags(flags) |
+ , fMaskType(SkToU8(mt)) |
+ , fPad(0) |
+{ |
+ SkASSERT(size > 0); |
+ SkASSERT(scaleX > 0); |
+ SkASSERT(SkScalarIsFinite(skewX)); |
+ SkASSERT(0 == (flags & ~kAllFlags)); |
+} |
+ |
+SkFont* SkFont::Create(SkTypeface* face, SkScalar size, SkScalar scaleX, SkScalar skewX, |
+ MaskType mt, uint32_t flags) { |
+ if (size <= 0 || !SkScalarIsFinite(size)) { |
+ return NULL; |
+ } |
+ if (scaleX <= 0 || !SkScalarIsFinite(scaleX)) { |
+ return NULL; |
+ } |
+ if (!SkScalarIsFinite(skewX)) { |
+ return NULL; |
+ } |
+ flags &= kAllFlags; |
+ return SkNEW_ARGS(SkFont, (face, size, scaleX, skewX, mt, flags)); |
+} |
+ |
+SkFont* SkFont::Create(SkTypeface* face, SkScalar size, MaskType mt, uint32_t flags) { |
+ return SkFont::Create(face, size, 1, 0, mt, flags); |
+} |
+ |
+SkFont* SkFont::cloneWithSize(SkScalar newSize) const { |
+ return SkFont::Create(this->getTypeface(), newSize, this->getScaleX(), this->getSkewX(), |
+ this->getMaskType(), this->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); |
+ break; |
+ case kUTF16_SkTextEncoding: |
+ count = SkUTF16_CountUnichars((const uint16_t*)text, SkToInt(byteLength >> 1)); |
+ break; |
+ case kUTF32_SkTextEncoding: |
+ count = SkToInt(byteLength >> 2); |
+ break; |
+ case kGlyphID_SkTextEncoding: |
+ count = SkToInt(byteLength >> 1); |
+ break; |
+ } |
+ 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; |
+} |
+ |
+/////////////////////////////////////////////////////////////////////////////////////////////////// |
+ |
+#include "SkPaint.h" |
+ |
+SkFont* SkFont::Testing_CreateFromPaint(const SkPaint& paint) { |
+ uint32_t flags = 0; |
+ if (paint.isVerticalText()) { |
+ flags |= kVertical_Flag; |
+ } |
+ if (paint.isEmbeddedBitmapText()) { |
+ flags |= kEmbeddedBitmaps_Flag; |
+ } |
+ if (paint.getFlags() & SkPaint::kGenA8FromLCD_Flag) { |
+ flags |= kGenA8FromLCD_Flag; |
+ } |
+ if (paint.isFakeBoldText()) { |
+ flags |= kEmbolden_Flag; |
+ } |
+ |
+ if (SkPaint::kFull_Hinting == paint.getHinting()) { |
+ flags |= kEnableByteCodeHints_Flag; |
+ } |
+ if (paint.isAutohinted()) { |
+ flags |= kEnableAutoHints_Flag; |
+ } |
+ if (paint.isSubpixelText() || paint.isLinearText()) { |
+ // this is our default |
+ } else { |
+ flags |= kUseNonlinearMetrics_Flag; |
+ } |
+ |
+ MaskType maskType = SkFont::kBW_MaskType; |
+ if (paint.isAntiAlias()) { |
+ maskType = paint.isLCDRenderText() ? kLCD_MaskType : kA8_MaskType; |
+ } |
+ |
+ return Create(paint.getTypeface(), |
+ paint.getTextSize(), paint.getTextScaleX(), paint.getTextSkewX(), |
+ maskType, flags); |
+} |