40 using namespace ystdex;
41 using namespace platform;
56 ::FT_Pointer, ::FT_Face* aface)
58 Typeface* fontFace(static_cast<Typeface*>(face_id));
59 ::FT_Face& face(*aface);
60 ::FT_Error error(FT_New_Face(library, fontFace->Path.c_str(),
61 fontFace->face_index, aface));
65 error = ::FT_Select_Charmap(face, FT_ENCODING_UNICODE);
68 fontFace->cmap_index = face->charmap
69 ? ::FT_Get_Charmap_Index(face->charmap) : 0;
71 fontFace->nGlyphs = face->num_glyphs;
72 fontFace->uUnitPerEM = face->units_per_EM;
73 fontFace->nCharmaps = face->num_charmaps;
74 if(FT_IS_SCALABLE(face))
75 fontFace->lUnderlinePos = FT_MulFix(face->underline_position,
76 face->size->metrics.y_scale) >> 6;
77 fontFace->fixSizes.clear();
78 if(face->available_sizes)
80 ::FT_Int t = face->num_fixed_sizes;
82 fontFace->fixSizes.reserve(t);
83 for(::FT_Int i = 0; i < t; ++i)
84 fontFace->fixSizes.push_back(
85 face->available_sizes[i].size >> 6);
93 ::FT_GlyphSlot_Embolden(face->glyph);
94 ::FT_GlyphSlot_Oblique(face->glyph);
95 ::FT_Outline_Embolden(&face->glyph->outline, 64);
96 ::FT_Set_Transform(face, &fontFace->matrix,
nullptr);
105 : Cache(cache), family_name(name), mFaces()
125 return p ? p : (fs == FontStyle::Regular ?
nullptr
131 const auto i(
mFaces.find(style_name));
133 return (i ==
mFaces.cend()) ?
nullptr : i->second;
142 : Path(path), face_index(i), cmap_index(-1)
149 ::FTC_FaceID new_face_id(
this);
150 ::FT_Face face(
nullptr);
157 const FamilyName family_name(face->family_name);
158 const auto it(cache.
mFamilies.find(family_name));
159 const bool not_found(it == cache.
mFamilies.end());
162 : it->second, style_name = face->style_name);
184 const Typeface*
const pDefaultTypeface(
188 throw LoggedEvent(
"Null default font face pointer found.");
189 return *pDefaultTypeface;
199 && (error = ::FTC_Manager_New(
library, 0, 0, cache_size,
210 ystdex::sfmt(
"Font init failed: %08x\n;", error).c_str(), 1);
223 const auto i(
mFamilies.find(family_name));
225 return (i ==
mFamilies.cend()) ?
nullptr : i->second;
248 ::FT_Face face(
nullptr);
251 ::FTC_Manager_LookupFace(
manager, pFace, &face);
269 return mFamilies.erase(family.GetFamilyName()) != 0;
309 ::FT_Face face(
nullptr);
311 if(::FT_New_Face(
library, path.c_str(), -1, &face) != 0)
314 const auto face_num(face->num_faces);
316 ::FT_Done_Face(face);
320 const size_t face_n(face_num);
322 for(
size_t i(0); i < face_n; ++i)
341 throw LoggedEvent(
"Bad font found.");
350 sbit =
GetGlyph(c, FT_LOAD_DEFAULT);
352 return sbit->xadvance;
372 ::FTC_SBitCache_LookupScaler(cache.sbitCache, &
scaler, flags,
373 ::FTC_CMapCache_Lookup(cache.cmapCache,
scaler.face_id,
374 pFace->GetCMapIndex(), c), &sbit,
nullptr);
385 ::FT_Size size(
nullptr);