[cmap Add hb_subset_collect_variation_unicodes()
To be moved to hb-face.h later.
This commit is contained in:
parent
4806b3800d
commit
1dcf5fb038
|
@ -296,7 +296,7 @@ struct CmapSubtableFormat4
|
||||||
{
|
{
|
||||||
/* XXX This does NOT skip over chars mapping to gid0... */
|
/* XXX This does NOT skip over chars mapping to gid0... */
|
||||||
if (this->startCount[i] != 0xFFFFu || this->endCount[i] != 0xFFFFu) // Skip the last segment (0xFFFF)
|
if (this->startCount[i] != 0xFFFFu || this->endCount[i] != 0xFFFFu) // Skip the last segment (0xFFFF)
|
||||||
hb_set_add_range (out, this->startCount[i], this->endCount[i]);
|
out->add_range (this->startCount[i], this->endCount[i]);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -459,11 +459,9 @@ struct CmapSubtableLongSegmented
|
||||||
inline void collect_unicodes (hb_set_t *out) const
|
inline void collect_unicodes (hb_set_t *out) const
|
||||||
{
|
{
|
||||||
for (unsigned int i = 0; i < this->groups.len; i++) {
|
for (unsigned int i = 0; i < this->groups.len; i++) {
|
||||||
hb_set_add_range (out,
|
out->add_range (this->groups[i].startCharCode,
|
||||||
MIN ((unsigned int) this->groups[i].startCharCode,
|
MIN ((hb_codepoint_t) this->groups[i].endCharCode,
|
||||||
(unsigned int) HB_MAX_UNICODE_CODEPOINT_VALUE),
|
(hb_codepoint_t) HB_MAX_UNICODE_CODEPOINT_VALUE));
|
||||||
MIN ((unsigned int) this->groups[i].endCharCode,
|
|
||||||
(unsigned int) HB_MAX_UNICODE_CODEPOINT_VALUE));
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -600,7 +598,23 @@ struct UnicodeValueRange
|
||||||
DEFINE_SIZE_STATIC (4);
|
DEFINE_SIZE_STATIC (4);
|
||||||
};
|
};
|
||||||
|
|
||||||
typedef SortedArrayOf<UnicodeValueRange, HBUINT32> DefaultUVS;
|
struct DefaultUVS : SortedArrayOf<UnicodeValueRange, HBUINT32>
|
||||||
|
{
|
||||||
|
inline void collect_unicodes (hb_set_t *out) const
|
||||||
|
{
|
||||||
|
unsigned int count = len;
|
||||||
|
for (unsigned int i = 0; i < count; i++)
|
||||||
|
{
|
||||||
|
hb_codepoint_t first = arrayZ[i].startUnicodeValue;
|
||||||
|
hb_codepoint_t last = MIN ((hb_codepoint_t) (first + arrayZ[i].additionalCount),
|
||||||
|
(hb_codepoint_t) HB_MAX_UNICODE_CODEPOINT_VALUE);
|
||||||
|
out->add_range (first, last);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public:
|
||||||
|
DEFINE_SIZE_ARRAY (4, arrayZ);
|
||||||
|
};
|
||||||
|
|
||||||
struct UVSMapping
|
struct UVSMapping
|
||||||
{
|
{
|
||||||
|
@ -621,7 +635,18 @@ struct UVSMapping
|
||||||
DEFINE_SIZE_STATIC (5);
|
DEFINE_SIZE_STATIC (5);
|
||||||
};
|
};
|
||||||
|
|
||||||
typedef SortedArrayOf<UVSMapping, HBUINT32> NonDefaultUVS;
|
struct NonDefaultUVS : SortedArrayOf<UVSMapping, HBUINT32>
|
||||||
|
{
|
||||||
|
inline void collect_unicodes (hb_set_t *out) const
|
||||||
|
{
|
||||||
|
unsigned int count = len;
|
||||||
|
for (unsigned int i = 0; i < count; i++)
|
||||||
|
out->add (arrayZ[i].glyphID);
|
||||||
|
}
|
||||||
|
|
||||||
|
public:
|
||||||
|
DEFINE_SIZE_ARRAY (4, arrayZ);
|
||||||
|
};
|
||||||
|
|
||||||
struct VariationSelectorRecord
|
struct VariationSelectorRecord
|
||||||
{
|
{
|
||||||
|
@ -644,6 +669,12 @@ struct VariationSelectorRecord
|
||||||
return GLYPH_VARIANT_NOT_FOUND;
|
return GLYPH_VARIANT_NOT_FOUND;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
inline void collect_unicodes (hb_set_t *out, const void *base) const
|
||||||
|
{
|
||||||
|
(base+defaultUVS).collect_unicodes (out);
|
||||||
|
(base+nonDefaultUVS).collect_unicodes (out);
|
||||||
|
}
|
||||||
|
|
||||||
inline int cmp (const hb_codepoint_t &variation_selector) const
|
inline int cmp (const hb_codepoint_t &variation_selector) const
|
||||||
{
|
{
|
||||||
return varSelector.cmp (variation_selector);
|
return varSelector.cmp (variation_selector);
|
||||||
|
@ -672,7 +703,7 @@ struct CmapSubtableFormat14
|
||||||
hb_codepoint_t variation_selector,
|
hb_codepoint_t variation_selector,
|
||||||
hb_codepoint_t *glyph) const
|
hb_codepoint_t *glyph) const
|
||||||
{
|
{
|
||||||
return record[record.bsearch(variation_selector)].get_glyph (codepoint, glyph, this);
|
return record[record.bsearch (variation_selector)].get_glyph (codepoint, glyph, this);
|
||||||
}
|
}
|
||||||
|
|
||||||
inline void collect_variation_selectors (hb_set_t *out) const
|
inline void collect_variation_selectors (hb_set_t *out) const
|
||||||
|
@ -681,6 +712,11 @@ struct CmapSubtableFormat14
|
||||||
for (unsigned int i = 0; i < count; i++)
|
for (unsigned int i = 0; i < count; i++)
|
||||||
out->add (record.arrayZ[i].varSelector);
|
out->add (record.arrayZ[i].varSelector);
|
||||||
}
|
}
|
||||||
|
inline void collect_variation_unicodes (hb_codepoint_t variation_selector,
|
||||||
|
hb_set_t *out) const
|
||||||
|
{
|
||||||
|
record[record.bsearch (variation_selector)].collect_unicodes (out, this);
|
||||||
|
}
|
||||||
|
|
||||||
inline bool sanitize (hb_sanitize_context_t *c) const
|
inline bool sanitize (hb_sanitize_context_t *c) const
|
||||||
{
|
{
|
||||||
|
@ -1045,6 +1081,11 @@ struct cmap
|
||||||
{
|
{
|
||||||
subtable_uvs->collect_variation_selectors (out);
|
subtable_uvs->collect_variation_selectors (out);
|
||||||
}
|
}
|
||||||
|
inline void collect_variation_unicodes (hb_codepoint_t variation_selector,
|
||||||
|
hb_set_t *out) const
|
||||||
|
{
|
||||||
|
subtable_uvs->collect_variation_unicodes (variation_selector, out);
|
||||||
|
}
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
typedef bool (*hb_cmap_get_glyph_func_t) (const void *obj,
|
typedef bool (*hb_cmap_get_glyph_func_t) (const void *obj,
|
||||||
|
|
|
@ -263,7 +263,8 @@ hb_subset_collect_unicodes (hb_face_t *face, hb_set_t *out)
|
||||||
* Since: REPLACEME
|
* Since: REPLACEME
|
||||||
*/
|
*/
|
||||||
void
|
void
|
||||||
hb_subset_collect_variation_selectors (hb_face_t *face, hb_set_t *out)
|
hb_subset_collect_variation_selectors (hb_face_t *face,
|
||||||
|
hb_set_t *out)
|
||||||
{
|
{
|
||||||
/* XXX Use saved accel. */
|
/* XXX Use saved accel. */
|
||||||
OT::cmap::accelerator_t cmap;
|
OT::cmap::accelerator_t cmap;
|
||||||
|
@ -271,3 +272,25 @@ hb_subset_collect_variation_selectors (hb_face_t *face, hb_set_t *out)
|
||||||
cmap.collect_variation_selectors (out);
|
cmap.collect_variation_selectors (out);
|
||||||
cmap.fini();
|
cmap.fini();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* hb_subset_collect_variation_unicodes:
|
||||||
|
* @face: font face.
|
||||||
|
* @out: set to add Unicode characters for @variation_selector covered by @face to.
|
||||||
|
*
|
||||||
|
*
|
||||||
|
*
|
||||||
|
* Since: REPLACEME
|
||||||
|
*/
|
||||||
|
void
|
||||||
|
hb_subset_collect_variation_unicodes (hb_face_t *face,
|
||||||
|
hb_codepoint_t variation_selector,
|
||||||
|
hb_set_t *out)
|
||||||
|
{
|
||||||
|
/* XXX Use saved accel. */
|
||||||
|
OT::cmap::accelerator_t cmap;
|
||||||
|
cmap.init (face);
|
||||||
|
cmap.collect_variation_unicodes (variation_selector, out);
|
||||||
|
cmap.fini();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
|
@ -84,10 +84,16 @@ hb_subset (hb_face_t *source,
|
||||||
/* TODO Move to hb-face.h. */
|
/* TODO Move to hb-face.h. */
|
||||||
|
|
||||||
HB_EXTERN void
|
HB_EXTERN void
|
||||||
hb_subset_collect_unicodes (hb_face_t *source, hb_set_t *out);
|
hb_subset_collect_unicodes (hb_face_t *face, hb_set_t *out);
|
||||||
|
|
||||||
HB_EXTERN void
|
HB_EXTERN void
|
||||||
hb_subset_collect_variation_selectors (hb_face_t *source, hb_set_t *out);
|
hb_subset_collect_variation_selectors (hb_face_t *face,
|
||||||
|
hb_set_t *out);
|
||||||
|
|
||||||
|
HB_EXTERN void
|
||||||
|
hb_subset_collect_variation_unicodes (hb_face_t *face,
|
||||||
|
hb_codepoint_t variation_selector,
|
||||||
|
hb_set_t *out);
|
||||||
|
|
||||||
|
|
||||||
HB_END_DECLS
|
HB_END_DECLS
|
||||||
|
|
Loading…
Reference in New Issue