[subset] Keep head when no glyf table
This commit is contained in:
parent
7f9b2228a6
commit
0d61926ca7
|
@ -27,7 +27,6 @@
|
||||||
#ifndef HB_OT_CFF1_TABLE_HH
|
#ifndef HB_OT_CFF1_TABLE_HH
|
||||||
#define HB_OT_CFF1_TABLE_HH
|
#define HB_OT_CFF1_TABLE_HH
|
||||||
|
|
||||||
#include "hb-ot-head-table.hh"
|
|
||||||
#include "hb-ot-cff-common.hh"
|
#include "hb-ot-cff-common.hh"
|
||||||
#include "hb-subset-cff1.hh"
|
#include "hb-subset-cff1.hh"
|
||||||
|
|
||||||
|
@ -1378,16 +1377,7 @@ struct cff1
|
||||||
|
|
||||||
bool subset (hb_subset_context_t *c) const
|
bool subset (hb_subset_context_t *c) const
|
||||||
{
|
{
|
||||||
bool success = true;
|
return hb_subset_cff1 (c);
|
||||||
if (hb_subset_cff1 (c)) {
|
|
||||||
hb_blob_t *head_blob = hb_sanitize_context_t().reference_table<head> (c->plan->source);
|
|
||||||
success = success && head_blob && c->plan->add_table (HB_OT_TAG_head, head_blob);
|
|
||||||
hb_blob_destroy (head_blob);
|
|
||||||
} else {
|
|
||||||
success = false;
|
|
||||||
}
|
|
||||||
|
|
||||||
return success;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
|
|
|
@ -27,7 +27,6 @@
|
||||||
#ifndef HB_OT_CFF2_TABLE_HH
|
#ifndef HB_OT_CFF2_TABLE_HH
|
||||||
#define HB_OT_CFF2_TABLE_HH
|
#define HB_OT_CFF2_TABLE_HH
|
||||||
|
|
||||||
#include "hb-ot-head-table.hh"
|
|
||||||
#include "hb-ot-cff-common.hh"
|
#include "hb-ot-cff-common.hh"
|
||||||
#include "hb-subset-cff2.hh"
|
#include "hb-subset-cff2.hh"
|
||||||
|
|
||||||
|
@ -541,16 +540,7 @@ struct cff2
|
||||||
|
|
||||||
bool subset (hb_subset_context_t *c) const
|
bool subset (hb_subset_context_t *c) const
|
||||||
{
|
{
|
||||||
bool success = true;
|
return hb_subset_cff2 (c);
|
||||||
if (hb_subset_cff2 (c)) {
|
|
||||||
hb_blob_t *head_blob = hb_sanitize_context_t().reference_table<head> (c->plan->source);
|
|
||||||
success = success && head_blob && c->plan->add_table (HB_OT_TAG_head, head_blob);
|
|
||||||
hb_blob_destroy (head_blob);
|
|
||||||
} else {
|
|
||||||
success = false;
|
|
||||||
}
|
|
||||||
|
|
||||||
return success;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public:
|
public:
|
||||||
|
|
|
@ -54,6 +54,18 @@ struct head
|
||||||
return 16 <= upem && upem <= 16384 ? upem : 1000;
|
return 16 <= upem && upem <= 16384 ? upem : 1000;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool serialize (hb_serialize_context_t *c) const
|
||||||
|
{
|
||||||
|
TRACE_SERIALIZE (this);
|
||||||
|
return_trace ((bool) c->embed (this));
|
||||||
|
}
|
||||||
|
|
||||||
|
bool subset (hb_subset_context_t *c) const
|
||||||
|
{
|
||||||
|
TRACE_SUBSET (this);
|
||||||
|
return_trace (serialize (c->serializer));
|
||||||
|
}
|
||||||
|
|
||||||
enum mac_style_flag_t {
|
enum mac_style_flag_t {
|
||||||
BOLD = 1u<<0,
|
BOLD = 1u<<0,
|
||||||
ITALIC = 1u<<1,
|
ITALIC = 1u<<1,
|
||||||
|
|
|
@ -133,6 +133,53 @@ _subset (hb_subset_plan_t *plan)
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static bool
|
||||||
|
_is_table_present (hb_face_t *source,
|
||||||
|
hb_tag_t tag)
|
||||||
|
{
|
||||||
|
unsigned tables = hb_face_get_table_tags (source, 0, nullptr, nullptr);
|
||||||
|
hb_vector_t<uint32_t> tags;
|
||||||
|
tags.resize (tables);
|
||||||
|
hb_face_get_table_tags (source, 0, &tables, tags.arrayZ);
|
||||||
|
for (unsigned int i = 0; i < tables; i++) {
|
||||||
|
if (tags[i] == tag)
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
static bool
|
||||||
|
_should_drop_table (hb_subset_plan_t *plan, hb_tag_t tag)
|
||||||
|
{
|
||||||
|
if (plan->drop_tables->has (tag))
|
||||||
|
return true;
|
||||||
|
|
||||||
|
switch (tag) {
|
||||||
|
case HB_TAG ('c', 'v', 'a', 'r'): /* hint table, fallthrough */
|
||||||
|
case HB_TAG ('c', 'v', 't', ' '): /* hint table, fallthrough */
|
||||||
|
case HB_TAG ('f', 'p', 'g', 'm'): /* hint table, fallthrough */
|
||||||
|
case HB_TAG ('p', 'r', 'e', 'p'): /* hint table, fallthrough */
|
||||||
|
case HB_TAG ('h', 'd', 'm', 'x'): /* hint table, fallthrough */
|
||||||
|
case HB_TAG ('V', 'D', 'M', 'X'): /* hint table, fallthrough */
|
||||||
|
return plan->drop_hints;
|
||||||
|
|
||||||
|
#ifdef HB_NO_SUBSET_LAYOUT
|
||||||
|
// Drop Layout Tables if requested.
|
||||||
|
case HB_OT_TAG_GDEF:
|
||||||
|
case HB_OT_TAG_GPOS:
|
||||||
|
case HB_OT_TAG_GSUB:
|
||||||
|
case HB_TAG ('m', 'o', 'r', 'x'):
|
||||||
|
case HB_TAG ('m', 'o', 'r', 't'):
|
||||||
|
case HB_TAG ('k', 'e', 'r', 'x'):
|
||||||
|
case HB_TAG ('k', 'e', 'r', 'n'):
|
||||||
|
return true;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
default:
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
static bool
|
static bool
|
||||||
_subset_table (hb_subset_plan_t *plan,
|
_subset_table (hb_subset_plan_t *plan,
|
||||||
hb_tag_t tag)
|
hb_tag_t tag)
|
||||||
|
@ -149,11 +196,15 @@ _subset_table (hb_subset_plan_t *plan,
|
||||||
case HB_OT_TAG_name:
|
case HB_OT_TAG_name:
|
||||||
result = _subset<const OT::name> (plan);
|
result = _subset<const OT::name> (plan);
|
||||||
break;
|
break;
|
||||||
case HB_OT_TAG_head:
|
case HB_OT_TAG_head: {
|
||||||
// TODO that won't work well if there is no glyf
|
if (_is_table_present (plan->source, HB_OT_TAG_glyf) && !_should_drop_table (plan, HB_OT_TAG_glyf))
|
||||||
|
{
|
||||||
DEBUG_MSG(SUBSET, nullptr, "skip head, handled by glyf");
|
DEBUG_MSG(SUBSET, nullptr, "skip head, handled by glyf");
|
||||||
result = true;
|
return true;
|
||||||
|
}
|
||||||
|
result = _subset<const OT::head> (plan);
|
||||||
break;
|
break;
|
||||||
|
}
|
||||||
case HB_OT_TAG_hhea:
|
case HB_OT_TAG_hhea:
|
||||||
DEBUG_MSG(SUBSET, nullptr, "skip hhea handled by hmtx");
|
DEBUG_MSG(SUBSET, nullptr, "skip hhea handled by hmtx");
|
||||||
return true;
|
return true;
|
||||||
|
@ -234,38 +285,6 @@ _subset_table (hb_subset_plan_t *plan,
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
static bool
|
|
||||||
_should_drop_table (hb_subset_plan_t *plan, hb_tag_t tag)
|
|
||||||
{
|
|
||||||
if (plan->drop_tables->has (tag))
|
|
||||||
return true;
|
|
||||||
|
|
||||||
switch (tag) {
|
|
||||||
case HB_TAG ('c', 'v', 'a', 'r'): /* hint table, fallthrough */
|
|
||||||
case HB_TAG ('c', 'v', 't', ' '): /* hint table, fallthrough */
|
|
||||||
case HB_TAG ('f', 'p', 'g', 'm'): /* hint table, fallthrough */
|
|
||||||
case HB_TAG ('p', 'r', 'e', 'p'): /* hint table, fallthrough */
|
|
||||||
case HB_TAG ('h', 'd', 'm', 'x'): /* hint table, fallthrough */
|
|
||||||
case HB_TAG ('V', 'D', 'M', 'X'): /* hint table, fallthrough */
|
|
||||||
return plan->drop_hints;
|
|
||||||
|
|
||||||
#ifdef HB_NO_SUBSET_LAYOUT
|
|
||||||
// Drop Layout Tables if requested.
|
|
||||||
case HB_OT_TAG_GDEF:
|
|
||||||
case HB_OT_TAG_GPOS:
|
|
||||||
case HB_OT_TAG_GSUB:
|
|
||||||
case HB_TAG ('m', 'o', 'r', 'x'):
|
|
||||||
case HB_TAG ('m', 'o', 'r', 't'):
|
|
||||||
case HB_TAG ('k', 'e', 'r', 'x'):
|
|
||||||
case HB_TAG ('k', 'e', 'r', 'n'):
|
|
||||||
return true;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
default:
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* hb_subset:
|
* hb_subset:
|
||||||
* @source: font face data to be subset.
|
* @source: font face data to be subset.
|
||||||
|
|
Loading…
Reference in New Issue