[aat] Remove lcar support

Very low use, only two distinct font files, Apple Chancery.ttf and Hoefler Text.ttc
have it so it really doesn't worth the size addition and so, but one may argue that
whole ligature caret is low use but guess we better to encourage GDEF one anyway.
This commit is contained in:
Ebrahim Byagowi 2020-07-05 22:45:11 +04:30
parent a3b9b94b63
commit 122a2897e4
7 changed files with 1 additions and 269 deletions

View File

@ -7,7 +7,6 @@ HB_BASE_sources = \
hb-aat-layout-feat-table.hh \
hb-aat-layout-just-table.hh \
hb-aat-layout-kerx-table.hh \
hb-aat-layout-lcar-table.hh \
hb-aat-layout-morx-table.hh \
hb-aat-layout-opbd-table.hh \
hb-aat-layout-trak-table.hh \

View File

@ -1,174 +0,0 @@
/*
* Copyright © 2018 Ebrahim Byagowi
*
* This is part of HarfBuzz, a text shaping library.
*
* Permission is hereby granted, without written agreement and without
* license or royalty fees, to use, copy, modify, and distribute this
* software and its documentation for any purpose, provided that the
* above copyright notice and the following two paragraphs appear in
* all copies of this software.
*
* IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR
* DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES
* ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN
* IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
* DAMAGE.
*
* THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING,
* BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
* FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS
* ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO
* PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
*/
#ifndef HB_AAT_LAYOUT_LCAR_TABLE_HH
#define HB_AAT_LAYOUT_LCAR_TABLE_HH
#include "hb-open-type.hh"
#include "hb-aat-layout-common.hh"
/*
* lcar -- Ligature caret
* https://developer.apple.com/fonts/TrueType-Reference-Manual/RM06/Chap6lcar.html
*/
#define HB_AAT_TAG_lcar HB_TAG('l','c','a','r')
namespace AAT {
typedef ArrayOf<HBINT16> LigCaretClassEntry;
struct lcarFormat0
{
unsigned int get_lig_carets (hb_font_t *font,
hb_direction_t direction,
hb_codepoint_t glyph,
unsigned int start_offset,
unsigned int *caret_count /* IN/OUT */,
hb_position_t *caret_array /* OUT */,
const void *base) const
{
const OffsetTo<LigCaretClassEntry>* entry_offset = lookupTable.get_value (glyph,
font->face->get_num_glyphs ());
const LigCaretClassEntry& array = entry_offset ? base+*entry_offset : Null (LigCaretClassEntry);
if (caret_count)
{
+ array.sub_array (start_offset, caret_count)
| hb_map ([&] (int v) { return font->em_scale_dir (v, direction); })
| hb_sink (hb_array (caret_array, *caret_count))
;
}
return array.len;
}
bool sanitize (hb_sanitize_context_t *c, const void *base) const
{
TRACE_SANITIZE (this);
return_trace (likely (c->check_struct (this) && lookupTable.sanitize (c, base)));
}
protected:
Lookup<OffsetTo<LigCaretClassEntry>>
lookupTable; /* data Lookup table associating glyphs */
public:
DEFINE_SIZE_MIN (2);
};
struct lcarFormat1
{
unsigned int get_lig_carets (hb_font_t *font,
hb_direction_t direction,
hb_codepoint_t glyph,
unsigned int start_offset,
unsigned int *caret_count /* IN/OUT */,
hb_position_t *caret_array /* OUT */,
const void *base) const
{
const OffsetTo<LigCaretClassEntry>* entry_offset = lookupTable.get_value (glyph,
font->face->get_num_glyphs ());
const LigCaretClassEntry& array = entry_offset ? base+*entry_offset : Null (LigCaretClassEntry);
if (caret_count)
{
+ array.sub_array (start_offset, caret_count)
| hb_map ([&] (unsigned int point_index)
{
hb_position_t x = 0, y = 0;
font->get_glyph_contour_point_for_origin (glyph, point_index, direction, &x, &y);
return HB_DIRECTION_IS_HORIZONTAL (direction) ? x : y;
})
| hb_sink (hb_array (caret_array, *caret_count))
;
}
return array.len;
}
bool sanitize (hb_sanitize_context_t *c, const void *base) const
{
TRACE_SANITIZE (this);
return_trace (likely (c->check_struct (this) && lookupTable.sanitize (c, base)));
}
protected:
Lookup<OffsetTo<LigCaretClassEntry>>
lookupTable; /* data Lookup table associating glyphs */
public:
DEFINE_SIZE_MIN (2);
};
struct lcar
{
static constexpr hb_tag_t tableTag = HB_AAT_TAG_lcar;
bool has_data () const { return version.major; }
unsigned int get_lig_carets (hb_font_t *font,
hb_direction_t direction,
hb_codepoint_t glyph,
unsigned int start_offset,
unsigned int *caret_count /* IN/OUT */,
hb_position_t *caret_array /* OUT */) const
{
if (!has_data ())
{
if (caret_count)
*caret_count = 0;
return 0;
}
switch (format)
{
case 0: return u.format0.get_lig_carets (font, direction, glyph, start_offset,
caret_count, caret_array, this);
case 1: return u.format1.get_lig_carets (font, direction, glyph, start_offset,
caret_count, caret_array, this);
default:if (caret_count) *caret_count = 0; return 0;
}
}
bool sanitize (hb_sanitize_context_t *c) const
{
TRACE_SANITIZE (this);
if (unlikely (!c->check_struct (this) || version.major != 1))
return_trace (false);
switch (format) {
case 0: return_trace (u.format0.sanitize (c, this));
case 1: return_trace (u.format1.sanitize (c, this));
default:return_trace (true);
}
}
protected:
FixedVersion<>version; /* Version number of the ligature caret table */
HBUINT16 format; /* Format of the ligature caret table. */
union {
lcarFormat0 format0;
lcarFormat0 format1;
} u;
public:
DEFINE_SIZE_MIN (8);
};
} /* namespace AAT */
#endif /* HB_AAT_LAYOUT_LCAR_TABLE_HH */

View File

@ -113,7 +113,6 @@ HB_OT_TABLE (AAT, mort)
HB_OT_TABLE (AAT, kerx)
HB_OT_TABLE (AAT, ankr)
HB_OT_TABLE (AAT, trak)
HB_OT_TABLE (AAT, lcar)
HB_OT_TABLE (AAT, ltag)
HB_OT_TABLE (AAT, feat)
// HB_OT_TABLE (AAT, opbd)

View File

@ -51,9 +51,7 @@
#include "hb-ot-name-table.hh"
#include "hb-ot-os2-table.hh"
#include "hb-aat-layout-lcar-table.hh"
#include "hb-aat-layout-morx-table.hh"
#include "hb-aat-layout-opbd-table.hh" // Just so we compile it; unused otherwise.
/**
@ -368,21 +366,7 @@ hb_ot_layout_get_ligature_carets (hb_font_t *font,
unsigned int *caret_count /* IN/OUT */,
hb_position_t *caret_array /* OUT */)
{
unsigned int result_caret_count = caret_count ? *caret_count : 0;
unsigned int result = font->face->table.GDEF->table->get_lig_carets (font, direction, glyph, start_offset, &result_caret_count, caret_array);
if (result)
{
if (caret_count) *caret_count = result_caret_count;
}
else
{
#ifndef HB_NO_AAT
result = font->face->table.lcar->get_lig_carets (font, direction, glyph, start_offset, caret_count, caret_array);
#else
if (caret_count) *caret_count = 0;
#endif
}
return result;
return font->face->table.GDEF->table->get_lig_carets (font, direction, glyph, start_offset, caret_count, caret_array);
}
#endif

View File

@ -6,7 +6,6 @@ hb_base_sources = files(
'hb-aat-layout-feat-table.hh',
'hb-aat-layout-just-table.hh',
'hb-aat-layout-kerx-table.hh',
'hb-aat-layout-lcar-table.hh',
'hb-aat-layout-morx-table.hh',
'hb-aat-layout-opbd-table.hh',
'hb-aat-layout-trak-table.hh',

Binary file not shown.

View File

@ -27,80 +27,6 @@
#include <hb-ot.h>
static void
test_ot_layout_get_ligature_carets_aat_lcar (void)
{
hb_face_t *face = hb_test_open_font_file ("fonts/lcar.ttf");
hb_font_t *font = hb_font_create (face);
hb_font_set_scale (font, hb_face_get_upem (face) * 2, hb_face_get_upem (face) * 4);
hb_position_t caret_array[16];
/* a normal call */
{
unsigned caret_count = 16;
g_assert_cmpuint (2, ==, hb_ot_layout_get_ligature_carets (font, HB_DIRECTION_LTR,
98, 0, &caret_count,
caret_array));
g_assert_cmpuint (2, ==, caret_count);
g_assert_cmpuint (1130, ==, caret_array[0]);
g_assert_cmpuint (2344, ==, caret_array[1]);
}
/* RTL, maybe needs to be tweaked however */
{
unsigned caret_count = 16;
g_assert_cmpuint (2, ==, hb_ot_layout_get_ligature_carets (font, HB_DIRECTION_RTL,
98, 0, &caret_count,
caret_array));
g_assert_cmpuint (2, ==, caret_count);
g_assert_cmpuint (1130, ==, caret_array[0]);
g_assert_cmpuint (2344, ==, caret_array[1]);
}
/* bottom to top call, bigger caret positions as the specified scaling */
{
unsigned caret_count = 16;
g_assert_cmpuint (2, ==, hb_ot_layout_get_ligature_carets (font, HB_DIRECTION_BTT,
98, 0, &caret_count,
caret_array));
g_assert_cmpuint (2, ==, caret_count);
g_assert_cmpuint (2260, ==, caret_array[0]);
g_assert_cmpuint (4688, ==, caret_array[1]);
}
/* the same glyph as above but with offset */
{
caret_array[1] = 123;
unsigned caret_count = 16;
g_assert_cmpuint (2, ==, hb_ot_layout_get_ligature_carets (font, HB_DIRECTION_BTT,
98, 1, &caret_count,
caret_array));
g_assert_cmpuint (1, ==, caret_count);
g_assert_cmpuint (4688, ==, caret_array[0]);
g_assert_cmpuint (123, ==, caret_array[1]);
}
/* empty carets */
{
unsigned caret_count = 16;
g_assert_cmpuint (0, ==, hb_ot_layout_get_ligature_carets (font, HB_DIRECTION_LTR,
97, 0, &caret_count,
caret_array));
g_assert_cmpuint (0, ==, caret_count);
}
hb_font_destroy (font);
hb_face_destroy (face);
}
static void
test_ot_layout_get_ligature_carets_ot_gsub (void)
{
@ -241,7 +167,6 @@ main (int argc, char **argv)
{
g_test_init (&argc, &argv, NULL);
hb_test_add (test_ot_layout_get_ligature_carets_aat_lcar);
hb_test_add (test_ot_layout_get_ligature_carets_ot_gsub);
hb_test_add (test_ot_layout_get_ligature_carets_empty);