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); } }
SegCacheEntry::SegCacheEntry(const uint16* cmapGlyphs, size_t length, Segment * seg, size_t charOffset, long long cacheTime) : m_glyphLength(0), m_unicode(gralloc<uint16>(length)), m_glyph(NULL), m_attr(NULL), m_justs(NULL), m_accessCount(0), m_lastAccess(cacheTime) { if (m_unicode) for (uint16 i = 0; i < length; i++) m_unicode[i] = cmapGlyphs[i]; const size_t glyphCount = seg->slotCount(), sizeof_sjust = SlotJustify::size_of(seg->silf()->numJustLevels()); if (!glyphCount) return; size_t num_justs = 0, justs_pos = 0; if (seg->hasJustification()) { for (const Slot * s = seg->first(); s; s = s->next()) { if (s->m_justs == 0) continue; ++num_justs; } m_justs = gralloc<byte>(sizeof_sjust * num_justs); } const Slot * slot = seg->first(); m_glyph = new Slot[glyphCount]; m_attr = gralloc<int16>(glyphCount * seg->numAttrs()); if (!m_glyph || (!m_attr && seg->numAttrs())) return; m_glyphLength = glyphCount; Slot * slotCopy = m_glyph; m_glyph->prev(NULL); uint16 pos = 0; while (slot) { slotCopy->userAttrs(m_attr + pos * seg->numAttrs()); slotCopy->m_justs = m_justs ? reinterpret_cast<SlotJustify *>(m_justs + justs_pos++ * sizeof_sjust) : 0; slotCopy->set(*slot, -static_cast<int32>(charOffset), seg->numAttrs(), seg->silf()->numJustLevels(), length); slotCopy->index(pos); if (slot->firstChild()) slotCopy->m_child = m_glyph + slot->firstChild()->index(); if (slot->attachedTo()) slotCopy->attachTo(m_glyph + slot->attachedTo()->index()); if (slot->nextSibling()) slotCopy->m_sibling = m_glyph + slot->nextSibling()->index(); slot = slot->next(); ++slotCopy; ++pos; if (slot) { slotCopy->prev(slotCopy-1); (slotCopy-1)->next(slotCopy); } } }
bool Segment::initCollisions() { m_collisions = grzeroalloc<SlotCollision>(slotCount()); if (!m_collisions) return false; for (Slot *p = m_first; p; p = p->next()) if (p->index() < slotCount()) ::new (collisionInfo(p)) SlotCollision(this, p); else return false; return true; }