| #ifndef OT_GLYF_COMPOSITE_ITER_HH | |
| #define OT_GLYF_COMPOSITE_ITER_HH | |
| #include "../../hb.hh" | |
| namespace OT { | |
| namespace glyf_impl { | |
| template <typename CompositeGlyphRecord> | |
| struct composite_iter_tmpl : hb_iter_with_fallback_t<composite_iter_tmpl<CompositeGlyphRecord>, | |
| const CompositeGlyphRecord &> | |
| { | |
| typedef const CompositeGlyphRecord *__item_t__; | |
| composite_iter_tmpl (hb_bytes_t glyph_, __item_t__ current_) : | |
| glyph (glyph_), current (nullptr), current_size (0) | |
| { | |
| set_current (current_); | |
| } | |
| composite_iter_tmpl () : glyph (hb_bytes_t ()), current (nullptr), current_size (0) {} | |
| const CompositeGlyphRecord & __item__ () const { return *current; } | |
| bool __more__ () const { return current; } | |
| void __next__ () | |
| { | |
| if (!current->has_more ()) { current = nullptr; return; } | |
| set_current (&StructAtOffset<CompositeGlyphRecord> (current, current_size)); | |
| } | |
| composite_iter_tmpl __end__ () const { return composite_iter_tmpl (); } | |
| bool operator != (const composite_iter_tmpl& o) const | |
| { return current != o.current; } | |
| void set_current (__item_t__ current_) | |
| { | |
| if (!glyph.check_range (current_, CompositeGlyphRecord::min_size)) | |
| { | |
| current = nullptr; | |
| current_size = 0; | |
| return; | |
| } | |
| unsigned size = current_->get_size (); | |
| if (!glyph.check_range (current_, size)) | |
| { | |
| current = nullptr; | |
| current_size = 0; | |
| return; | |
| } | |
| current = current_; | |
| current_size = size; | |
| } | |
| private: | |
| hb_bytes_t glyph; | |
| __item_t__ current; | |
| unsigned current_size; | |
| }; | |
| } /* namespace glyf_impl */ | |
| } /* namespace OT */ | |
| #endif /* OT_GLYF_COMPOSITE_ITER_HH */ |