xref: /aosp_15_r20/external/harfbuzz_ng/src/hb-ot-vorg-table.hh (revision 2d1272b857b1f7575e6e246373e1cb218663db8a)
1*2d1272b8SAndroid Build Coastguard Worker /*
2*2d1272b8SAndroid Build Coastguard Worker  * Copyright © 2018 Adobe Inc.
3*2d1272b8SAndroid Build Coastguard Worker  *
4*2d1272b8SAndroid Build Coastguard Worker  *  This is part of HarfBuzz, a text shaping library.
5*2d1272b8SAndroid Build Coastguard Worker  *
6*2d1272b8SAndroid Build Coastguard Worker  * Permission is hereby granted, without written agreement and without
7*2d1272b8SAndroid Build Coastguard Worker  * license or royalty fees, to use, copy, modify, and distribute this
8*2d1272b8SAndroid Build Coastguard Worker  * software and its documentation for any purpose, provided that the
9*2d1272b8SAndroid Build Coastguard Worker  * above copyright notice and the following two paragraphs appear in
10*2d1272b8SAndroid Build Coastguard Worker  * all copies of this software.
11*2d1272b8SAndroid Build Coastguard Worker  *
12*2d1272b8SAndroid Build Coastguard Worker  * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR
13*2d1272b8SAndroid Build Coastguard Worker  * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES
14*2d1272b8SAndroid Build Coastguard Worker  * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN
15*2d1272b8SAndroid Build Coastguard Worker  * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
16*2d1272b8SAndroid Build Coastguard Worker  * DAMAGE.
17*2d1272b8SAndroid Build Coastguard Worker  *
18*2d1272b8SAndroid Build Coastguard Worker  * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING,
19*2d1272b8SAndroid Build Coastguard Worker  * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
20*2d1272b8SAndroid Build Coastguard Worker  * FITNESS FOR A PARTICULAR PURPOSE.  THE SOFTWARE PROVIDED HEREUNDER IS
21*2d1272b8SAndroid Build Coastguard Worker  * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO
22*2d1272b8SAndroid Build Coastguard Worker  * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
23*2d1272b8SAndroid Build Coastguard Worker  *
24*2d1272b8SAndroid Build Coastguard Worker  * Adobe Author(s): Michiharu Ariza
25*2d1272b8SAndroid Build Coastguard Worker  */
26*2d1272b8SAndroid Build Coastguard Worker 
27*2d1272b8SAndroid Build Coastguard Worker #ifndef HB_OT_VORG_TABLE_HH
28*2d1272b8SAndroid Build Coastguard Worker #define HB_OT_VORG_TABLE_HH
29*2d1272b8SAndroid Build Coastguard Worker 
30*2d1272b8SAndroid Build Coastguard Worker #include "hb-open-type.hh"
31*2d1272b8SAndroid Build Coastguard Worker 
32*2d1272b8SAndroid Build Coastguard Worker /*
33*2d1272b8SAndroid Build Coastguard Worker  * VORG -- Vertical Origin Table
34*2d1272b8SAndroid Build Coastguard Worker  * https://docs.microsoft.com/en-us/typography/opentype/spec/vorg
35*2d1272b8SAndroid Build Coastguard Worker  */
36*2d1272b8SAndroid Build Coastguard Worker #define HB_OT_TAG_VORG HB_TAG('V','O','R','G')
37*2d1272b8SAndroid Build Coastguard Worker 
38*2d1272b8SAndroid Build Coastguard Worker namespace OT {
39*2d1272b8SAndroid Build Coastguard Worker 
40*2d1272b8SAndroid Build Coastguard Worker struct VertOriginMetric
41*2d1272b8SAndroid Build Coastguard Worker {
cmpOT::VertOriginMetric42*2d1272b8SAndroid Build Coastguard Worker   int cmp (hb_codepoint_t g) const { return glyph.cmp (g); }
43*2d1272b8SAndroid Build Coastguard Worker 
sanitizeOT::VertOriginMetric44*2d1272b8SAndroid Build Coastguard Worker   bool sanitize (hb_sanitize_context_t *c) const
45*2d1272b8SAndroid Build Coastguard Worker   {
46*2d1272b8SAndroid Build Coastguard Worker     TRACE_SANITIZE (this);
47*2d1272b8SAndroid Build Coastguard Worker     return_trace (c->check_struct (this));
48*2d1272b8SAndroid Build Coastguard Worker   }
49*2d1272b8SAndroid Build Coastguard Worker 
50*2d1272b8SAndroid Build Coastguard Worker   public:
51*2d1272b8SAndroid Build Coastguard Worker   HBGlyphID16	glyph;
52*2d1272b8SAndroid Build Coastguard Worker   FWORD		vertOriginY;
53*2d1272b8SAndroid Build Coastguard Worker 
54*2d1272b8SAndroid Build Coastguard Worker   public:
55*2d1272b8SAndroid Build Coastguard Worker   DEFINE_SIZE_STATIC (4);
56*2d1272b8SAndroid Build Coastguard Worker };
57*2d1272b8SAndroid Build Coastguard Worker 
58*2d1272b8SAndroid Build Coastguard Worker struct VORG
59*2d1272b8SAndroid Build Coastguard Worker {
60*2d1272b8SAndroid Build Coastguard Worker   static constexpr hb_tag_t tableTag = HB_OT_TAG_VORG;
61*2d1272b8SAndroid Build Coastguard Worker 
has_dataOT::VORG62*2d1272b8SAndroid Build Coastguard Worker   bool has_data () const { return version.to_int (); }
63*2d1272b8SAndroid Build Coastguard Worker 
get_y_originOT::VORG64*2d1272b8SAndroid Build Coastguard Worker   int get_y_origin (hb_codepoint_t glyph) const
65*2d1272b8SAndroid Build Coastguard Worker   {
66*2d1272b8SAndroid Build Coastguard Worker     unsigned int i;
67*2d1272b8SAndroid Build Coastguard Worker     if (!vertYOrigins.bfind (glyph, &i))
68*2d1272b8SAndroid Build Coastguard Worker       return defaultVertOriginY;
69*2d1272b8SAndroid Build Coastguard Worker     return vertYOrigins[i].vertOriginY;
70*2d1272b8SAndroid Build Coastguard Worker   }
71*2d1272b8SAndroid Build Coastguard Worker 
72*2d1272b8SAndroid Build Coastguard Worker   template <typename Iterator,
73*2d1272b8SAndroid Build Coastguard Worker 	    hb_requires (hb_is_iterator (Iterator))>
serializeOT::VORG74*2d1272b8SAndroid Build Coastguard Worker   void serialize (hb_serialize_context_t *c,
75*2d1272b8SAndroid Build Coastguard Worker 		  Iterator it,
76*2d1272b8SAndroid Build Coastguard Worker 		  FWORD defaultVertOriginY)
77*2d1272b8SAndroid Build Coastguard Worker   {
78*2d1272b8SAndroid Build Coastguard Worker 
79*2d1272b8SAndroid Build Coastguard Worker     if (unlikely (!c->extend_min ((*this))))  return;
80*2d1272b8SAndroid Build Coastguard Worker 
81*2d1272b8SAndroid Build Coastguard Worker     this->version.major = 1;
82*2d1272b8SAndroid Build Coastguard Worker     this->version.minor = 0;
83*2d1272b8SAndroid Build Coastguard Worker 
84*2d1272b8SAndroid Build Coastguard Worker     this->defaultVertOriginY = defaultVertOriginY;
85*2d1272b8SAndroid Build Coastguard Worker     this->vertYOrigins.len = it.len ();
86*2d1272b8SAndroid Build Coastguard Worker 
87*2d1272b8SAndroid Build Coastguard Worker     c->copy_all (it);
88*2d1272b8SAndroid Build Coastguard Worker   }
89*2d1272b8SAndroid Build Coastguard Worker 
subsetOT::VORG90*2d1272b8SAndroid Build Coastguard Worker   bool subset (hb_subset_context_t *c) const
91*2d1272b8SAndroid Build Coastguard Worker   {
92*2d1272b8SAndroid Build Coastguard Worker     TRACE_SUBSET (this);
93*2d1272b8SAndroid Build Coastguard Worker     auto *vorg_prime = c->serializer->start_embed<VORG> ();
94*2d1272b8SAndroid Build Coastguard Worker     if (unlikely (!c->serializer->check_success (vorg_prime))) return_trace (false);
95*2d1272b8SAndroid Build Coastguard Worker 
96*2d1272b8SAndroid Build Coastguard Worker     auto it =
97*2d1272b8SAndroid Build Coastguard Worker     + vertYOrigins.as_array ()
98*2d1272b8SAndroid Build Coastguard Worker     | hb_filter (c->plan->glyphset (), &VertOriginMetric::glyph)
99*2d1272b8SAndroid Build Coastguard Worker     | hb_map ([&] (const VertOriginMetric& _)
100*2d1272b8SAndroid Build Coastguard Worker 	      {
101*2d1272b8SAndroid Build Coastguard Worker 		hb_codepoint_t new_glyph = HB_SET_VALUE_INVALID;
102*2d1272b8SAndroid Build Coastguard Worker 		c->plan->new_gid_for_old_gid (_.glyph, &new_glyph);
103*2d1272b8SAndroid Build Coastguard Worker 
104*2d1272b8SAndroid Build Coastguard Worker 		VertOriginMetric metric;
105*2d1272b8SAndroid Build Coastguard Worker 		metric.glyph = new_glyph;
106*2d1272b8SAndroid Build Coastguard Worker 		metric.vertOriginY = _.vertOriginY;
107*2d1272b8SAndroid Build Coastguard Worker 		return metric;
108*2d1272b8SAndroid Build Coastguard Worker 	      })
109*2d1272b8SAndroid Build Coastguard Worker     ;
110*2d1272b8SAndroid Build Coastguard Worker 
111*2d1272b8SAndroid Build Coastguard Worker     /* serialize the new table */
112*2d1272b8SAndroid Build Coastguard Worker     vorg_prime->serialize (c->serializer, it, defaultVertOriginY);
113*2d1272b8SAndroid Build Coastguard Worker     return_trace (true);
114*2d1272b8SAndroid Build Coastguard Worker   }
115*2d1272b8SAndroid Build Coastguard Worker 
sanitizeOT::VORG116*2d1272b8SAndroid Build Coastguard Worker   bool sanitize (hb_sanitize_context_t *c) const
117*2d1272b8SAndroid Build Coastguard Worker   {
118*2d1272b8SAndroid Build Coastguard Worker     TRACE_SANITIZE (this);
119*2d1272b8SAndroid Build Coastguard Worker     return_trace (c->check_struct (this) &&
120*2d1272b8SAndroid Build Coastguard Worker 		  hb_barrier () &&
121*2d1272b8SAndroid Build Coastguard Worker 		  version.major == 1 &&
122*2d1272b8SAndroid Build Coastguard Worker 		  vertYOrigins.sanitize (c));
123*2d1272b8SAndroid Build Coastguard Worker   }
124*2d1272b8SAndroid Build Coastguard Worker 
125*2d1272b8SAndroid Build Coastguard Worker   protected:
126*2d1272b8SAndroid Build Coastguard Worker   FixedVersion<>version;	/* Version of VORG table. Set to 0x00010000u. */
127*2d1272b8SAndroid Build Coastguard Worker   FWORD		defaultVertOriginY;
128*2d1272b8SAndroid Build Coastguard Worker 				/* The default vertical origin. */
129*2d1272b8SAndroid Build Coastguard Worker   SortedArray16Of<VertOriginMetric>
130*2d1272b8SAndroid Build Coastguard Worker 		vertYOrigins;	/* The array of vertical origins. */
131*2d1272b8SAndroid Build Coastguard Worker 
132*2d1272b8SAndroid Build Coastguard Worker   public:
133*2d1272b8SAndroid Build Coastguard Worker   DEFINE_SIZE_ARRAY(8, vertYOrigins);
134*2d1272b8SAndroid Build Coastguard Worker };
135*2d1272b8SAndroid Build Coastguard Worker } /* namespace OT */
136*2d1272b8SAndroid Build Coastguard Worker 
137*2d1272b8SAndroid Build Coastguard Worker #endif /* HB_OT_VORG_TABLE_HH */
138