Blob Blame History Raw
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,