void Slot::setAttr(Segment *seg, attrCode ind, uint8 subindex, int16 value, const SlotMap & map) { if (!this) return; if (ind == gr_slatUserDefnV1) { ind = gr_slatUserDefn; subindex = 0; } switch (ind) { case gr_slatAdvX : m_advance.x = value; break; case gr_slatAdvY : m_advance.y = value; break; case gr_slatAttTo : { const uint16 idx = uint16(value); if (idx < map.size() && map[idx]) { Slot *other = map[idx]; if (other != this && other->child(this)) { attachTo(other); m_attach = Position(seg->glyphAdvance(other->gid()), 0); } } break; } case gr_slatAttX : m_attach.x = value; break; case gr_slatAttY : m_attach.y = value; break; case gr_slatAttXOff : case gr_slatAttYOff : break; case gr_slatAttWithX : m_with.x = value; break; case gr_slatAttWithY : m_with.y = value; break; case gr_slatAttWithXOff : case gr_slatAttWithYOff : break; case gr_slatAttLevel : m_attLevel = byte(value); break; case gr_slatBreak : seg->charinfo(m_original)->breakWeight(value); break; case gr_slatCompRef : break; // not sure what to do here case gr_slatDir : break; // read only case gr_slatInsert : markInsertBefore(value? true : false); break; case gr_slatPosX : break; // can't set these here case gr_slatPosY : break; case gr_slatShiftX : m_shift.x = value; break; case gr_slatShiftY : m_shift.y = value; break; case gr_slatMeasureSol : break; case gr_slatMeasureEol : break; case gr_slatJStretch : break; // handle these later case gr_slatJShrink : break; case gr_slatJStep : break; case gr_slatJWeight : break; case gr_slatJWidth : m_just = value; break; case gr_slatSegSplit : seg->charinfo(m_original)->addflags(value & 3); break; case gr_slatUserDefn : m_userAttr[subindex] = value; break; default : break; } }