Bug 382206. Ensure that the clip rectangle used to draw partial ligatures is pixel-aligned. Also fix an off-by-one error that busted the detection of the end of a ligature. r=pavlov

This commit is contained in:
roc+@cs.cmu.edu 2007-05-29 02:47:54 -07:00
Родитель 1d3bab895f
Коммит a5bd4967b2
1 изменённых файлов: 9 добавлений и 6 удалений

Просмотреть файл

@ -985,7 +985,7 @@ gfxTextRun::DrawPartialLigature(gfxFont *aFont, gfxContext *aCtx, PRUint32 aOffs
// before-spacing. // before-spacing.
widthBeforeCluster = 0; widthBeforeCluster = 0;
} }
if (aOffset < data.mEndOffset) { if (aOffset < data.mEndOffset - 1) {
// Not the end of the ligature; need to clip the ligature after the current cluster // Not the end of the ligature; need to clip the ligature after the current cluster
gfxFloat endEdge = aPt->x + clusterWidth; gfxFloat endEdge = aPt->x + clusterWidth;
if (IsRightToLeft()) { if (IsRightToLeft()) {
@ -999,12 +999,15 @@ gfxTextRun::DrawPartialLigature(gfxFont *aFont, gfxContext *aCtx, PRUint32 aOffs
} }
aCtx->Save(); aCtx->Save();
aCtx->NewPath();
// use division here to ensure that when the rect is aligned on multiples // use division here to ensure that when the rect is aligned on multiples
// of mAppUnitsPerDevUnit, we clip to true device unit boundaries // of mAppUnitsPerDevUnit, we clip to true device unit boundaries.
aCtx->Clip(gfxRect(left/mAppUnitsPerDevUnit, // Also, make sure we snap the rectangle to device pixels.
aDirtyRect->Y()/mAppUnitsPerDevUnit, aCtx->Rectangle(gfxRect(left/mAppUnitsPerDevUnit,
(right - left)/mAppUnitsPerDevUnit, aDirtyRect->Y()/mAppUnitsPerDevUnit,
aDirtyRect->Height()/mAppUnitsPerDevUnit)); (right - left)/mAppUnitsPerDevUnit,
aDirtyRect->Height()/mAppUnitsPerDevUnit), PR_TRUE);
aCtx->Clip();
gfxPoint pt(aPt->x - direction*widthBeforeCluster, aPt->y); gfxPoint pt(aPt->x - direction*widthBeforeCluster, aPt->y);
DrawGlyphs(aFont, aCtx, PR_FALSE, &pt, data.mStartOffset, DrawGlyphs(aFont, aCtx, PR_FALSE, &pt, data.mStartOffset,
data.mEndOffset, aProvider); data.mEndOffset, aProvider);