SkIRect fBBox; // The bounding box of all glyphs (in font units).
+ // The type of advance data wanted.
+ enum PerGlyphInfo {
+ kNo_PerGlyphInfo = 0x0, // Don't populate any per glyph info.
+ kHAdvance_PerGlyphInfo = 0x1, // Populate horizontal advance data.
+ kVAdvance_PerGlyphInfo = 0x2, // Populate vertical advance data.
+ kGlyphNames_PerGlyphInfo = 0x4, // Populate glyph names (Type 1 only).
+ };
+
template <typename Data>
struct AdvanceMetric {
enum MetricType {
///////////////////////////////////////////////////////////////////////////
/** Retrieve detailed typeface metrics. Used by the PDF backend.
- @param perGlyphInfo Indicate if the glyph specific information.
- @param perGlyphInfo Indicate if the glyph specific information (advances
- and names) should be populated.
+ @param perGlyphInfo Indicate what glyph specific information (advances,
+ names, etc.) should be populated.
@return The returned object has already been referenced. NULL is
returned if the font is not found.
*/
static SkAdvancedTypefaceMetrics* GetAdvancedTypefaceMetrics(
- SkFontID fontID, bool perGlyphInfo);
+ SkFontID fontID,
+ SkAdvancedTypefaceMetrics::PerGlyphInfo perGlyphInfo);
/** Return the number of tables in the font
*/
#ifndef SkTypeface_DEFINED
#define SkTypeface_DEFINED
+#include "SkAdvancedTypefaceMetrics.h"
#include "SkRefCnt.h"
class SkStream;
static SkTypeface* Deserialize(SkStream*);
/** Retrieve detailed typeface metrics. Used by the PDF backend.
- @param perGlyphInfo Indicate if the glyph specific information (advances
- and names) should be populated.
+ @param perGlyphInfo Indicate what glyph specific information (advances,
+ names, etc.) should be populated.
@return The returned object has already been referenced.
*/
+ SkAdvancedTypefaceMetrics* getAdvancedTypefaceMetrics(
+ SkAdvancedTypefaceMetrics::PerGlyphInfo perGlyphInfo) const;
+
+ // Temporary: for transition purposes.
SkAdvancedTypefaceMetrics* getAdvancedTypefaceMetrics(
bool perGlyphInfo) const;
///////////////////////////////////////////////////////////////////////////////
+/** Use to combine multiple bits in a bitmask in a type safe way.
+ */
+template <typename T>
+T SkTBitOr(T a, T b) {
+ return (T)(a | b);
+}
+
/**
* Use to cast a pointer to a different type, and maintaining strict-aliasing
*/
* limitations under the License.
*/
+#include "SkAdvancedTypefaceMetrics.h"
#include "SkTypeface.h"
#include "SkFontHost.h"
}
SkAdvancedTypefaceMetrics* SkTypeface::getAdvancedTypefaceMetrics(
- bool perGlyphInfo) const {
+ SkAdvancedTypefaceMetrics::PerGlyphInfo perGlyphInfo) const {
return SkFontHost::GetAdvancedTypefaceMetrics(fUniqueID, perGlyphInfo);
}
+
+// Temporary: for transitions purposes only.
+SkAdvancedTypefaceMetrics* SkTypeface::getAdvancedTypefaceMetrics(
+ bool perGlyphInfo) const {
+ SkASSERT(!perGlyphInfo);
+ return SkFontHost::GetAdvancedTypefaceMetrics(
+ fUniqueID,
+ SkAdvancedTypefaceMetrics::kNo_PerGlyphInfo);
+}
#include "SkScalar.h"
#include "SkStream.h"
#include "SkTypeface.h"
+#include "SkTypes.h"
#include "SkUtils.h"
namespace {
fontInfo = relatedFont->fFontInfo;
fontDescriptor = relatedFont->fDescriptor.get();
} else {
- fontInfo = SkFontHost::GetAdvancedTypefaceMetrics(fontID, true);
+ fontInfo = SkFontHost::GetAdvancedTypefaceMetrics(fontID, SkTBitOr(
+ SkAdvancedTypefaceMetrics::kHAdvance_PerGlyphInfo,
+ SkAdvancedTypefaceMetrics::kGlyphNames_PerGlyphInfo));
SkSafeUnref(fontInfo.get()); // SkRefPtr and Get both took a reference.
}
// static
SkAdvancedTypefaceMetrics* SkFontHost::GetAdvancedTypefaceMetrics(
- uint32_t fontID, bool perGlyphInfo) {
+ uint32_t fontID,
+ SkAdvancedTypefaceMetrics::PerGlyphInfo perGlyphInfo) {
sk_throw(); // not implemented
return NULL;
}
// static
SkAdvancedTypefaceMetrics* SkFontHost::GetAdvancedTypefaceMetrics(
- uint32_t fontID, bool perGlyphInfo) {
+ uint32_t fontID,
+ SkAdvancedTypefaceMetrics::PerGlyphInfo perGlyphInfo) {
#if defined(SK_BUILD_FOR_MAC) || defined(ANDROID)
return NULL;
#else
}
}
- SkASSERT(!FT_HAS_VERTICAL(face));
-#ifdef FT_IS_CID_KEYED
- SkASSERT(FT_IS_CID_KEYED(face) ==
- (info->fType == SkAdvancedTypefaceMetrics::kType1CID_Font));
-#endif
-
info->fStyle = 0;
if (FT_IS_FIXED_WIDTH(face))
info->fStyle |= SkAdvancedTypefaceMetrics::kFixedPitch_Style;
info->fBBox = SkIRect::MakeLTRB(face->bbox.xMin, face->bbox.yMax,
face->bbox.xMax, face->bbox.yMin);
- if (perGlyphInfo && canEmbed(face) && FT_IS_SCALABLE(face) &&
- info->fType != SkAdvancedTypefaceMetrics::kOther_Font) {
+ if (!canEmbed(face) || !FT_IS_SCALABLE(face) ||
+ info->fType == SkAdvancedTypefaceMetrics::kOther_Font) {
+ perGlyphInfo = SkAdvancedTypefaceMetrics::kNo_PerGlyphInfo;
+ }
+
+ if (perGlyphInfo & SkAdvancedTypefaceMetrics::kHAdvance_PerGlyphInfo) {
if (FT_IS_FIXED_WIDTH(face)) {
appendRange(&info->fGlyphWidths, 0);
int16_t advance = face->max_advance_width;
info->fGlyphWidths.reset(
getAdvanceData(face, face->num_glyphs, &getWidthAdvance));
}
+ }
- if (info->fType == SkAdvancedTypefaceMetrics::kType1_Font) {
- // Postscript fonts may contain more than 255 glyphs, so we end up
- // using multiple font descriptions with a glyph ordering. Record
- // the name of each glyph.
- info->fGlyphNames.reset(
- new SkAutoTArray<SkString>(face->num_glyphs));
- for (int gID = 0; gID < face->num_glyphs; gID++) {
- char glyphName[128]; // PS limit for names is 127 bytes.
- FT_Get_Glyph_Name(face, gID, glyphName, 128);
- info->fGlyphNames->get()[gID].set(glyphName);
- }
+ if (perGlyphInfo & SkAdvancedTypefaceMetrics::kVAdvance_PerGlyphInfo &&
+ FT_HAS_VERTICAL(face)) {
+ SkASSERT(false); // Not implemented yet.
+ }
+
+ if (perGlyphInfo & SkAdvancedTypefaceMetrics::kGlyphNames_PerGlyphInfo &&
+ info->fType == SkAdvancedTypefaceMetrics::kType1_Font) {
+ // Postscript fonts may contain more than 255 glyphs, so we end up
+ // using multiple font descriptions with a glyph ordering. Record
+ // the name of each glyph.
+ info->fGlyphNames.reset(
+ new SkAutoTArray<SkString>(face->num_glyphs));
+ for (int gID = 0; gID < face->num_glyphs; gID++) {
+ char glyphName[128]; // PS limit for names is 127 bytes.
+ FT_Get_Glyph_Name(face, gID, glyphName, 128);
+ info->fGlyphNames->get()[gID].set(glyphName);
}
}
// static
SkAdvancedTypefaceMetrics* SkFontHost::GetAdvancedTypefaceMetrics(
- uint32_t fontID, bool perGlyphInfo) {
+ uint32_t fontID,
+ SkAdvancedTypefaceMetrics::PerGlyphInfo perGlyphInfo) {
SkASSERT(!"SkFontHost::GetAdvancedTypefaceMetrics unimplemented");
return NULL;
}
// static
SkAdvancedTypefaceMetrics* SkFontHost::GetAdvancedTypefaceMetrics(
- uint32_t fontID, bool perGlyphInfo) {
+ uint32_t fontID,
+ SkAdvancedTypefaceMetrics::PerGlyphInfo perGlyphInfo) {
SkASSERT(!"SkFontHost::GetAdvancedTypefaceMetrics unimplemented");
return NULL;
}
// static
SkAdvancedTypefaceMetrics* SkFontHost::GetAdvancedTypefaceMetrics(
- uint32_t fontID, bool perGlyphInfo) {
+ uint32_t fontID,
+ SkAdvancedTypefaceMetrics::PerGlyphInfo perGlyphInfo) {
SkASSERT(!"SkFontHost::GetAdvancedTypefaceMetrics unimplemented");
return NULL;
}
#if 0
SkAdvancedTypefaceMetrics* SkFontHost::GetAdvancedTypefaceMetrics(
- uint32_t fontID, bool perGlyphInfo) {
+ uint32_t fontID,
+ SkAdvancedTypefaceMetrics::PerGlyphInfo perGlyphInfo) {
SkASSERT(!"SkFontHost::GetAdvancedTypefaceMetrics unimplemented");
return NULL;
}
// static
SkAdvancedTypefaceMetrics* SkFontHost::GetAdvancedTypefaceMetrics(
- uint32_t fontID, bool perGlyphInfo) {
+ uint32_t fontID,
+ SkAdvancedTypefaceMetrics::PerGlyphInfo perGlyphInfo) {
SkAutoMutexAcquire ac(gFTMutex);
LogFontTypeface* rec = LogFontTypeface::FindById(fontID);
LOGFONT lf = rec->logFont();
// If bit 2 is set, the embedding is read-only.
if (otm.otmfsType & 0x1) {
info->fType = SkAdvancedTypefaceMetrics::kNotEmbeddable_Font;
- } else if (perGlyphInfo) {
+ } else if (perGlyphInfo & kHAdvance_PerGlyphInfo) {
info->fGlyphWidths.reset(
getAdvanceData(hdc, glyphCount, &getWidthAdvance));
}