void Segment::associateChars(int offset, int numChars) { int i = 0, j = 0; CharInfo *c, *cend; for (c = m_charinfo + offset, cend = m_charinfo + offset + numChars; c != cend; ++c) { c->before(-1); c->after(-1); } for (Slot * s = m_first; s; s->index(i++), s = s->next()) { j = s->before(); if (j < 0) continue; for (const int after = s->after(); j <= after; ++j) { c = charinfo(j); if (c->before() == -1 || i < c->before()) c->before(i); if (c->after() < i) c->after(i); } } for (Slot *s = m_first; s; s = s->next()) { int a; for (a = s->after() + 1; a < offset + numChars && charinfo(a)->after() < 0; ++a) { charinfo(a)->after(s->index()); } --a; s->after(a); for (a = s->before() - 1; a >= offset && charinfo(a)->before() < 0; --a) { charinfo(a)->before(s->index()); } ++a; s->before(a); } }
void Segment::appendSlot(int id, int cid, int gid, int iFeats, size_t coffset) { Slot *aSlot = newSlot(); if (!aSlot) return; m_charinfo[id].init(cid); m_charinfo[id].feats(iFeats); m_charinfo[id].base(coffset); const GlyphFace * theGlyph = m_face->glyphs().glyphSafe(gid); m_charinfo[id].breakWeight(theGlyph ? theGlyph->attrs()[m_silf->aBreak()] : 0); aSlot->child(NULL); aSlot->setGlyph(this, gid, theGlyph); aSlot->originate(id); aSlot->before(id); aSlot->after(id); if (m_last) m_last->next(aSlot); aSlot->prev(m_last); m_last = aSlot; if (!m_first) m_first = aSlot; if (theGlyph && m_silf->aPassBits()) m_passBits &= theGlyph->attrs()[m_silf->aPassBits()] | (m_silf->numPasses() > 16 ? (theGlyph->attrs()[m_silf->aPassBits() + 1] << 16) : 0); }