diff --git a/mozilla/gfx/src/xlib/nsFontMetricsXlib.cpp b/mozilla/gfx/src/xlib/nsFontMetricsXlib.cpp index 09556ebc554..89925125dff 100644 --- a/mozilla/gfx/src/xlib/nsFontMetricsXlib.cpp +++ b/mozilla/gfx/src/xlib/nsFontMetricsXlib.cpp @@ -62,6 +62,7 @@ nsFontMetricsXlib::nsFontMetricsXlib() mStrikeoutOffset = 0; mUnderlineSize = 0; mUnderlineOffset = 0; + mSpaceWidth = 0; } nsFontMetricsXlib::~nsFontMetricsXlib() @@ -419,6 +420,8 @@ void nsFontMetricsXlib::RealizeFont() // 56% of ascent, best guess for non-true type mXHeight = NSToCoordRound((float) mFontHandle->ascent* f * 0.56f); + int rawWidth = XTextWidth(mFontHandle, " ", 1); + mSpaceWidth = NSToCoordRound(rawWidth * f); unsigned long pr = 0; if (::XGetFontProperty(mFontHandle, XA_X_HEIGHT, &pr)) @@ -2184,4 +2187,11 @@ nsFontMetricsXlib::DrawString(nsDrawingSurfaceXlib* aSurface, nsFontXlib* aFont, aX, aY, buf, (len / 2)); } +nsresult +nsFontMetricsXlib::GetSpaceWidth(nscoord &aSpaceWidth) +{ + aSpaceWidth = mSpaceWidth; + return NS_OK; +} + #endif /* FONT_SWITCHING */ diff --git a/mozilla/gfx/src/xlib/nsFontMetricsXlib.h b/mozilla/gfx/src/xlib/nsFontMetricsXlib.h index 658fb4dfd3f..8a227eaa823 100644 --- a/mozilla/gfx/src/xlib/nsFontMetricsXlib.h +++ b/mozilla/gfx/src/xlib/nsFontMetricsXlib.h @@ -102,6 +102,8 @@ public: NS_IMETHOD GetFont(const nsFont *&aFont); NS_IMETHOD GetFontHandle(nsFontHandle &aHandle); + virtual nsresult GetSpaceWidth(nscoord &aSpaceWidth); + #ifdef FONT_SWITCHING nsFontXlib* FindFont(PRUnichar aChar); @@ -152,6 +154,7 @@ protected: nscoord mStrikeoutOffset; nscoord mUnderlineSize; nscoord mUnderlineOffset; + nscoord mSpaceWidth; #ifdef FONT_SWITCHING diff --git a/mozilla/gfx/src/xlib/nsRenderingContextXlib.cpp b/mozilla/gfx/src/xlib/nsRenderingContextXlib.cpp index 0a87387c157..19f156fffc5 100644 --- a/mozilla/gfx/src/xlib/nsRenderingContextXlib.cpp +++ b/mozilla/gfx/src/xlib/nsRenderingContextXlib.cpp @@ -958,6 +958,12 @@ NS_IMETHODIMP nsRenderingContextXlib::GetWidth(char aC, nscoord& aWidth) { printf("nsRenderingContextXlib::GetWidth()\n"); + // Check for the very common case of trying to get the width of a single + // space. + if ((aC == ' ') && (nsnull != mFontMetrics)) { + nsFontMetricsXlib* fontMetricsXlib = (nsFontMetricsXlib*)mFontMetrics; + return fontMetricsXlib->GetSpaceWidth(aWidth); + } return GetWidth(&aC, 1, aWidth); }