xref: /aosp_15_r20/external/harfbuzz_ng/src/OT/glyf/composite-iter.hh (revision 2d1272b857b1f7575e6e246373e1cb218663db8a)
1*2d1272b8SAndroid Build Coastguard Worker #ifndef OT_GLYF_COMPOSITE_ITER_HH
2*2d1272b8SAndroid Build Coastguard Worker #define OT_GLYF_COMPOSITE_ITER_HH
3*2d1272b8SAndroid Build Coastguard Worker 
4*2d1272b8SAndroid Build Coastguard Worker 
5*2d1272b8SAndroid Build Coastguard Worker #include "../../hb.hh"
6*2d1272b8SAndroid Build Coastguard Worker 
7*2d1272b8SAndroid Build Coastguard Worker 
8*2d1272b8SAndroid Build Coastguard Worker namespace OT {
9*2d1272b8SAndroid Build Coastguard Worker namespace glyf_impl {
10*2d1272b8SAndroid Build Coastguard Worker 
11*2d1272b8SAndroid Build Coastguard Worker 
12*2d1272b8SAndroid Build Coastguard Worker template <typename CompositeGlyphRecord>
13*2d1272b8SAndroid Build Coastguard Worker struct composite_iter_tmpl : hb_iter_with_fallback_t<composite_iter_tmpl<CompositeGlyphRecord>,
14*2d1272b8SAndroid Build Coastguard Worker 						     const CompositeGlyphRecord &>
15*2d1272b8SAndroid Build Coastguard Worker {
16*2d1272b8SAndroid Build Coastguard Worker   typedef const CompositeGlyphRecord *__item_t__;
composite_iter_tmplOT::glyf_impl::composite_iter_tmpl17*2d1272b8SAndroid Build Coastguard Worker   composite_iter_tmpl (hb_bytes_t glyph_, __item_t__ current_) :
18*2d1272b8SAndroid Build Coastguard Worker       glyph (glyph_), current (nullptr), current_size (0)
19*2d1272b8SAndroid Build Coastguard Worker   {
20*2d1272b8SAndroid Build Coastguard Worker     set_current (current_);
21*2d1272b8SAndroid Build Coastguard Worker   }
22*2d1272b8SAndroid Build Coastguard Worker 
composite_iter_tmplOT::glyf_impl::composite_iter_tmpl23*2d1272b8SAndroid Build Coastguard Worker   composite_iter_tmpl () : glyph (hb_bytes_t ()), current (nullptr), current_size (0) {}
24*2d1272b8SAndroid Build Coastguard Worker 
__item__OT::glyf_impl::composite_iter_tmpl25*2d1272b8SAndroid Build Coastguard Worker   const CompositeGlyphRecord & __item__ () const { return *current; }
__more__OT::glyf_impl::composite_iter_tmpl26*2d1272b8SAndroid Build Coastguard Worker   bool __more__ () const { return current; }
__next__OT::glyf_impl::composite_iter_tmpl27*2d1272b8SAndroid Build Coastguard Worker   void __next__ ()
28*2d1272b8SAndroid Build Coastguard Worker   {
29*2d1272b8SAndroid Build Coastguard Worker     if (!current->has_more ()) { current = nullptr; return; }
30*2d1272b8SAndroid Build Coastguard Worker 
31*2d1272b8SAndroid Build Coastguard Worker     set_current (&StructAtOffset<CompositeGlyphRecord> (current, current_size));
32*2d1272b8SAndroid Build Coastguard Worker   }
__end__OT::glyf_impl::composite_iter_tmpl33*2d1272b8SAndroid Build Coastguard Worker   composite_iter_tmpl __end__ () const { return composite_iter_tmpl (); }
operator !=OT::glyf_impl::composite_iter_tmpl34*2d1272b8SAndroid Build Coastguard Worker   bool operator != (const composite_iter_tmpl& o) const
35*2d1272b8SAndroid Build Coastguard Worker   { return current != o.current; }
36*2d1272b8SAndroid Build Coastguard Worker 
37*2d1272b8SAndroid Build Coastguard Worker 
set_currentOT::glyf_impl::composite_iter_tmpl38*2d1272b8SAndroid Build Coastguard Worker   void set_current (__item_t__ current_)
39*2d1272b8SAndroid Build Coastguard Worker   {
40*2d1272b8SAndroid Build Coastguard Worker     if (!glyph.check_range (current_, CompositeGlyphRecord::min_size))
41*2d1272b8SAndroid Build Coastguard Worker     {
42*2d1272b8SAndroid Build Coastguard Worker       current = nullptr;
43*2d1272b8SAndroid Build Coastguard Worker       current_size = 0;
44*2d1272b8SAndroid Build Coastguard Worker       return;
45*2d1272b8SAndroid Build Coastguard Worker     }
46*2d1272b8SAndroid Build Coastguard Worker     unsigned size = current_->get_size ();
47*2d1272b8SAndroid Build Coastguard Worker     if (!glyph.check_range (current_, size))
48*2d1272b8SAndroid Build Coastguard Worker     {
49*2d1272b8SAndroid Build Coastguard Worker       current = nullptr;
50*2d1272b8SAndroid Build Coastguard Worker       current_size = 0;
51*2d1272b8SAndroid Build Coastguard Worker       return;
52*2d1272b8SAndroid Build Coastguard Worker     }
53*2d1272b8SAndroid Build Coastguard Worker 
54*2d1272b8SAndroid Build Coastguard Worker     current = current_;
55*2d1272b8SAndroid Build Coastguard Worker     current_size = size;
56*2d1272b8SAndroid Build Coastguard Worker   }
57*2d1272b8SAndroid Build Coastguard Worker 
58*2d1272b8SAndroid Build Coastguard Worker   private:
59*2d1272b8SAndroid Build Coastguard Worker   hb_bytes_t glyph;
60*2d1272b8SAndroid Build Coastguard Worker   __item_t__ current;
61*2d1272b8SAndroid Build Coastguard Worker   unsigned current_size;
62*2d1272b8SAndroid Build Coastguard Worker };
63*2d1272b8SAndroid Build Coastguard Worker 
64*2d1272b8SAndroid Build Coastguard Worker 
65*2d1272b8SAndroid Build Coastguard Worker } /* namespace glyf_impl */
66*2d1272b8SAndroid Build Coastguard Worker } /* namespace OT */
67*2d1272b8SAndroid Build Coastguard Worker 
68*2d1272b8SAndroid Build Coastguard Worker #endif /* OT_GLYF_COMPOSITE_ITER_HH */
69