diff -pruN -x '.moz*' -x .libs -x .deps -x dist -x 'config*' -x 'firefox*' -x '*a' -x '*so' -x '*o' -x build -x '*html' mozilla.orig/gfx/src/gtk/nsFontMetricsXft.cpp mozilla/gfx/src/gtk/nsFontMetricsXft.cpp --- mozilla.orig/gfx/src/gtk/nsFontMetricsXft.cpp 2006-04-25 08:58:36.000000000 +0900 +++ mozilla/gfx/src/gtk/nsFontMetricsXft.cpp 2007-02-08 01:50:05.000000000 +0900 @@ -227,10 +227,14 @@ static nsresult EnumFontsXft (nsIAto static void ConvertCharToUCS4 (const char *aString, PRUint32 aLength, + PRUint32 aStart, + PRUint32 aEnd, nsAutoFcChar32Buffer &aOutBuffer, PRUint32 *aOutLen); static void ConvertUnicharToUCS4 (const PRUnichar *aString, PRUint32 aLength, + PRUint32 aStart, + PRUint32 aEnd, nsAutoFcChar32Buffer &aOutBuffer, PRUint32 *aOutLen); static nsresult ConvertUCS4ToCustom (FcChar32 *aSrc, PRUint32 aSrcLen, @@ -507,7 +511,7 @@ nsFontMetricsXft::GetWidth(const PRUnich return NS_OK; } - gint rawWidth = RawGetWidth(aString, aLength); + gint rawWidth = RawGetWidth(aString, aLength, 0, aLength); float f; f = mDeviceContext->DevUnitsToAppUnits(); @@ -533,7 +537,7 @@ nsFontMetricsXft::GetTextDimensions(cons return NS_OK; nsresult rv; - rv = EnumerateGlyphs(aString, aLength, + rv = EnumerateGlyphs(aString, aLength, 0, aLength, &nsFontMetricsXft::TextDimensionsCallback, &aDimensions); @@ -608,7 +612,7 @@ nsFontMetricsXft::DrawString(const char nsAutoDrawSpecBuffer drawBuffer(data.draw, &data.color); data.drawBuffer = &drawBuffer; - return EnumerateGlyphs(aString, aLength, + return EnumerateGlyphs(aString, aLength, 0, aLength, &nsFontMetricsXft::DrawStringCallback, &data); } @@ -638,7 +642,7 @@ nsFontMetricsXft::DrawString(const PRUni nsAutoDrawSpecBuffer drawBuffer(data.draw, &data.color); data.drawBuffer = &drawBuffer; - return EnumerateGlyphs(aString, aLength, + return EnumerateGlyphs(aString, aLength, 0, aLength, &nsFontMetricsXft::DrawStringCallback, &data); } @@ -662,7 +666,7 @@ nsFontMetricsXft::GetBoundingMetrics(con data.firstTime = PR_TRUE; nsresult rv; - rv = EnumerateGlyphs(aString, aLength, + rv = EnumerateGlyphs(aString, aLength, 0, aLength, &nsFontMetricsXft::BoundingMetricsCallback, &data); NS_ENSURE_SUCCESS(rv, rv); @@ -700,7 +704,7 @@ nsFontMetricsXft::GetBoundingMetrics(con data.firstTime = PR_TRUE; nsresult rv; - rv = EnumerateGlyphs(aString, aLength, + rv = EnumerateGlyphs(aString, aLength, 0, aLength, &nsFontMetricsXft::BoundingMetricsCallback, &data); NS_ENSURE_SUCCESS(rv, rv); @@ -758,7 +762,17 @@ nsFontMetricsXft::GetRangeWidth(const PR PRUint32 aEnd, PRUint32 &aWidth) { - return NS_ERROR_NOT_IMPLEMENTED; + if (!aLength) { + aWidth = 0; + return NS_OK; + } + + gint rawWidth = RawGetWidth(aText, aLength, aStart, aEnd); + float f = mDeviceContext->DevUnitsToAppUnits(); + + aWidth = NSToCoordRound(rawWidth * f); + + return NS_OK; } nsresult @@ -768,7 +782,17 @@ nsFontMetricsXft::GetRangeWidth(const ch PRUint32 aEnd, PRUint32 &aWidth) { - return NS_ERROR_NOT_IMPLEMENTED; + if (!aLength) { + aWidth = 0; + return NS_OK; + } + + gint rawWidth = RawGetWidth(aText, aLength, aStart, aEnd); + float f = mDeviceContext->DevUnitsToAppUnits(); + + aWidth = NSToCoordRound(rawWidth * f); + + return NS_OK; } PRUint32 @@ -850,12 +874,12 @@ nsFontMetricsXft::CacheFontMetrics(void) // mSpaceWidth (width of a space) gint rawWidth; PRUnichar unispace(' '); - rawWidth = RawGetWidth(&unispace, 1); + rawWidth = RawGetWidth(&unispace, 1, 0, 1); mSpaceWidth = NSToCoordRound(rawWidth * f); // mAveCharWidth (width of an 'average' char) PRUnichar xUnichar('x'); - rawWidth = RawGetWidth(&xUnichar, 1); + rawWidth = RawGetWidth(&xUnichar, 1, 0, 1); mAveCharWidth = NSToCoordRound(rawWidth * f); // mXHeight (height of an 'x' character) @@ -1226,12 +1250,27 @@ nsFontMetricsXft::DoMatch(PRBool aMatchA } gint -nsFontMetricsXft::RawGetWidth(const PRUnichar* aString, PRUint32 aLength) +nsFontMetricsXft::RawGetWidth(const PRUnichar* aString, PRUint32 aLength, PRUint32 aStart, PRUint32 aEnd) +{ + nscoord width = 0; + nsresult rv; + + rv = EnumerateGlyphs(aString, aLength, aStart, aEnd, + &nsFontMetricsXft::GetWidthCallback, &width); + + if (NS_FAILED(rv)) + width = 0; + + return width; +} + +gint +nsFontMetricsXft::RawGetWidth(const char* aString, PRUint32 aLength, PRUint32 aStart, PRUint32 aEnd) { nscoord width = 0; nsresult rv; - rv = EnumerateGlyphs(aString, aLength, + rv = EnumerateGlyphs(aString, aLength, aStart, aEnd, &nsFontMetricsXft::GetWidthCallback, &width); if (NS_FAILED(rv)) @@ -1457,6 +1496,8 @@ nsFontMetricsXft::EnumerateXftGlyphs(con nsresult nsFontMetricsXft::EnumerateGlyphs(const PRUnichar *aString, PRUint32 aLen, + PRUint32 aStart, + PRUint32 aEnd, GlyphEnumeratorCallback aCallback, void *aCallbackData) { @@ -1465,7 +1506,7 @@ nsFontMetricsXft::EnumerateGlyphs(const NS_ENSURE_TRUE(aLen, NS_OK); - ConvertUnicharToUCS4(aString, aLen, charBuffer, &len); + ConvertUnicharToUCS4(aString, aLen, aStart, aEnd, charBuffer, &len); if (!len) return NS_ERROR_OUT_OF_MEMORY; @@ -1475,6 +1516,8 @@ nsFontMetricsXft::EnumerateGlyphs(const nsresult nsFontMetricsXft::EnumerateGlyphs(const char *aString, PRUint32 aLen, + PRUint32 aStart, + PRUint32 aEnd, GlyphEnumeratorCallback aCallback, void *aCallbackData) { @@ -1484,7 +1527,7 @@ nsFontMetricsXft::EnumerateGlyphs(const NS_ENSURE_TRUE(aLen, NS_OK); // Convert the incoming string into an array of UCS4 chars - ConvertCharToUCS4(aString, aLen, charBuffer, &len); + ConvertCharToUCS4(aString, aLen, aStart, aEnd, charBuffer, &len); if (!len) return NS_ERROR_OUT_OF_MEMORY; @@ -2343,7 +2386,7 @@ EnumFontsXft(nsIAtom* aLangGroup, const /* static */ void -ConvertCharToUCS4(const char *aString, PRUint32 aLength, +ConvertCharToUCS4(const char *aString, PRUint32 aLength, PRUint32 aStart, PRUint32 aEnd, nsAutoFcChar32Buffer &aOutBuffer, PRUint32 *aOutLen) { *aOutLen = 0; @@ -2352,19 +2395,21 @@ ConvertCharToUCS4(const char *aString, P if (!aOutBuffer.EnsureElemCapacity(aLength)) return; outBuffer = aOutBuffer.get(); + if (aEnd > aLength) + aEnd = aLength; - for (PRUint32 i = 0; i < aLength; ++i) { - outBuffer[i] = PRUint8(aString[i]); // to convert char >= 0x80 correctly + for (PRUint32 i = aStart; i < aLength && i < aEnd; ++i) { + outBuffer[i - aStart] = PRUint8(aString[i]); // to convert char >= 0x80 correctly } - *aOutLen = aLength; + *aOutLen = aEnd - aStart; } // Convert the incoming string into an array of UCS4 chars /* static */ void -ConvertUnicharToUCS4(const PRUnichar *aString, PRUint32 aLength, +ConvertUnicharToUCS4(const PRUnichar *aString, PRUint32 aLength, PRUint32 aStart, PRUint32 aEnd, nsAutoFcChar32Buffer &aOutBuffer, PRUint32 *aOutLen) { *aOutLen = 0; @@ -2378,7 +2423,7 @@ ConvertUnicharToUCS4(const PRUnichar *aS // Walk the passed in string looking for surrogates to convert to // their full ucs4 representation. - for (PRUint32 i = 0; i < aLength; ++i) { + for (PRUint32 i = aStart; i < aLength && i < aEnd; ++i) { PRUnichar c = aString[i]; // Optimized for the non-surrogate case @@ -2693,12 +2738,12 @@ ConvertUCS4ToCustom(FcChar32 *aSrc, PRU #endif // Convert 16bit custom font codes to UCS4 ConvertUnicharToUCS4(NS_REINTERPRET_CAST(PRUnichar *, med), - medLen >> 1, aResult, &aDestLen); + medLen >> 1, 0, medLen >> 1, aResult, &aDestLen); rv = aDestLen ? rv : NS_ERROR_OUT_OF_MEMORY; } else { // Convert 8bit custom font codes to UCS4 - ConvertCharToUCS4(med, medLen, aResult, &aDestLen); + ConvertCharToUCS4(med, medLen, 0, medLen, aResult, &aDestLen); rv = aDestLen ? rv : NS_ERROR_OUT_OF_MEMORY; } diff -pruN -x '.moz*' -x .libs -x .deps -x dist -x 'config*' -x 'firefox*' -x '*a' -x '*so' -x '*o' -x build -x '*html' mozilla.orig/gfx/src/gtk/nsFontMetricsXft.h mozilla/gfx/src/gtk/nsFontMetricsXft.h --- mozilla.orig/gfx/src/gtk/nsFontMetricsXft.h 2005-05-03 05:48:30.000000000 +0900 +++ mozilla/gfx/src/gtk/nsFontMetricsXft.h 2007-02-08 01:38:27.000000000 +0900 @@ -259,7 +259,13 @@ private: void DoMatch (PRBool aMatchAll); gint RawGetWidth (const PRUnichar* aString, - PRUint32 aLength); + PRUint32 aLength, + PRUint32 aStart, + PRUint32 aEnd); + gint RawGetWidth (const char* aString, + PRUint32 aLength, + PRUint32 aStart, + PRUint32 aEnd); nsresult SetupMiniFont (void); nsresult DrawUnknownGlyph (FcChar32 aChar, nscoord aX, @@ -272,10 +278,14 @@ private: void *aCallbackData); nsresult EnumerateGlyphs (const char *aString, PRUint32 aLen, + PRUint32 aStart, + PRUint32 aEnd, GlyphEnumeratorCallback aCallback, void *aCallbackData); nsresult EnumerateGlyphs (const PRUnichar *aString, PRUint32 aLen, + PRUint32 aStart, + PRUint32 aEnd, GlyphEnumeratorCallback aCallback, void *aCallbackData); void PrepareToDraw (nsRenderingContextGTK *aContext,