From: <sil...@li...> - 2005-05-23 18:32:26
|
Update of /cvsroot/silgraphite/silgraphite/src/GrEngine In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv17499/src/GrEngine Modified Files: Tag: v2api GrSegment.cpp Log Message: Fixed a bug in the GetUniscribeClusters routine. Index: GrSegment.cpp =================================================================== RCS file: /cvsroot/silgraphite/silgraphite/src/GrEngine/GrSegment.cpp,v retrieving revision 1.27.2.1 retrieving revision 1.27.2.2 diff -u -d -r1.27.2.1 -r1.27.2.2 --- GrSegment.cpp 27 Oct 2004 14:32:01 -0000 1.27.2.1 +++ GrSegment.cpp 23 May 2005 18:32:12 -0000 1.27.2.2 @@ -1952,6 +1952,11 @@ LgLineBreak lbFirst, lbLast; int isloutFirst = UnderlyingToLogicalSurface(ichBase, ich, true); + if (isloutFirst == kPosInfinity || isloutFirst == kNegInfinity) + { + *plb = klbClipBreak; + return kresFail; + } GrSlotOutput * psloutFirst = m_prgslout + isloutFirst; bool fNotFirst = false; if (psloutFirst->HasComponents() @@ -1967,6 +1972,11 @@ } int isloutLast = UnderlyingToLogicalSurface(ichBase, ich, false); + if (isloutLast == kPosInfinity || isloutLast == kNegInfinity) + { + *plb = klbClipBreak; + return kresFail; + } GrSlotOutput * psloutLast = m_prgslout + isloutLast; bool fNotLast = false; if (psloutLast->HasComponents() @@ -5342,12 +5352,16 @@ prgigbbFirstOfCluster returns the first glyph of the cluster for each CHARACTER (glyph indices returned are zero-based and refer to physical order--left-to-right, etc.). pfClusterStart returns a flag for each GLYPH indicating whether it is the first - of a cluster. + of a cluster. In this case the glyphs are ordered logically. Both arrays are optional. + + The fRtlLog flag is true for RTL text where the glyph arrays are returned in logical order + (the normal case for RTL). Then this method returns the END of the cluster rather than the + beginning; that is the first physical glyph in the cluster. ----------------------------------------------------------------------------------------------*/ GrResult GrSegment::GetUniscribeClusters(int ichwBase, IGrGraphics * pgg, int * prgigbbFirstOfCluster, int cchMax, int * pcch, - bool * pfClusterStart, int cfMax, int * pcf) + bool * pfClusterStart, int cfMax, int * pcf, bool fRtlLog) { ChkGrArgPtr(pgg); ChkGrOutPtr(pcch); @@ -5501,8 +5515,12 @@ // Convert (logical) slots to actual glyphs. for (ich = 0; ich < m_dichwLim; ich++) { + int isloutLeft = fRtlLog ? visloutAfter[ich] : visloutBefore[ich]; if (prgigbbFirstOfCluster) - prgigbbFirstOfCluster[ich] = LogicalToPhysicalSurface(visloutBefore[ich]); + prgigbbFirstOfCluster[ich] = LogicalToPhysicalSurface(isloutLeft); + + // pfClusterStart is dealing with logical ordering of glyphs, so here we use visloutBefore, + // not isloutLeft (maybe counter-intuitive). if (pfClusterStart) pfClusterStart[visloutBefore[ich] - isloutFirstReal] = true; @@ -5530,7 +5548,8 @@ int isloutMin = visloutBefore[ichStopOrig]; int ichStart = ichStopOrig; while (ichStart > 0 && - (ichStart > ichStartOrig || visloutBefore[ichStart - 1] >= visloutBefore[ichStopOrig])) + (ichStart > ichStartOrig || visloutBefore[ichStart - 1] >= visloutBefore[ichStopOrig] + || visloutBefore[ichStart - 1] == visloutBefore[ichStart])) { ichStart--; isloutMin = std::min(isloutMin, visloutBefore[ichStart]); @@ -5539,7 +5558,8 @@ int isloutMax = visloutAfter[ichStartOrig]; int ichStop = ichStartOrig; while (ichStop < m_dichwLim - 1 && - (ichStop < ichStopOrig || visloutAfter[ichStop + 1] <= visloutAfter[ichStartOrig])) + (ichStop < ichStopOrig || visloutAfter[ichStop + 1] <= visloutAfter[ichStartOrig] + || visloutAfter[ichStop + 1] == visloutAfter[ichStop])) { ichStop++; isloutMax = std::max(isloutMax, visloutAfter[ichStop]); @@ -5560,6 +5580,10 @@ natural location of the glyph and what is produced by Graphite. The y-offset is the same as GetGlyphsAndPositions. + Probably the right implementation is that base characters use only the advance width + and diacritics use the x-offset. But in Graphite it is not trivial to determine which + is which. + This is an experimental method. Its behavior may change signficantly in the future. ----------------------------------------------------------------------------------------------*/ GrResult GrSegment::GetUniscribePositions(int ichBase, IGrGraphics * pgg, |