void GlyphIterator::setCursiveGlyph() { if (direction < 0) { if (position <= nextLimit || position >= prevLimit) { return; } } else { if (position <= prevLimit || position >= nextLimit) { return; } } glyphPositionAdjustments->setCursiveGlyph(position, baselineIsLogicalEnd()); }
void GlyphPositionAdjustments::applyCursiveAdjustments(LEGlyphStorage &glyphStorage, le_bool rightToLeft, const LEFontInstance *fontInstance) { if (! hasCursiveGlyphs()) { return; } le_int32 start = 0, end = fGlyphCount, dir = 1; le_int32 firstExitPoint = -1, lastExitPoint = -1; LEPoint entryAnchor, exitAnchor, pixels; LEGlyphID lastExitGlyphID = 0; float baselineAdjustment = 0; // This removes a possible warning about // using exitAnchor before it's been initialized. exitAnchor.fX = exitAnchor.fY = 0; if (rightToLeft) { start = fGlyphCount - 1; end = -1; dir = -1; } for (le_int32 i = start; i != end; i += dir) { LEGlyphID glyphID = glyphStorage[i]; if (isCursiveGlyph(i)) { if (lastExitPoint >= 0 && getEntryPoint(i, entryAnchor) != NULL) { float anchorDiffX = exitAnchor.fX - entryAnchor.fX; float anchorDiffY = exitAnchor.fY - entryAnchor.fY; baselineAdjustment += anchorDiffY; adjustYPlacement(i, baselineAdjustment); if (rightToLeft) { LEPoint secondAdvance; fontInstance->getGlyphAdvance(glyphID, pixels); fontInstance->pixelsToUnits(pixels, secondAdvance); adjustXAdvance(i, -(anchorDiffX + secondAdvance.fX)); } else { LEPoint firstAdvance; fontInstance->getGlyphAdvance(lastExitGlyphID, pixels); fontInstance->pixelsToUnits(pixels, firstAdvance); adjustXAdvance(lastExitPoint, anchorDiffX - firstAdvance.fX); } } lastExitPoint = i; if (getExitPoint(i, exitAnchor) != NULL) { if (firstExitPoint < 0) { firstExitPoint = i; } lastExitGlyphID = glyphID; } else { if (baselineIsLogicalEnd(i) && firstExitPoint >= 0 && lastExitPoint >= 0) { le_int32 limit = lastExitPoint /*+ dir*/; LEPoint dummyAnchor; if (getEntryPoint(i, dummyAnchor) != NULL) { limit += dir; } for (le_int32 j = firstExitPoint; j != limit; j += dir) { if (isCursiveGlyph(j)) { adjustYPlacement(j, -baselineAdjustment); } } } firstExitPoint = lastExitPoint = -1; baselineAdjustment = 0; } } } }