diff --git a/mozilla/gfx/src/photon/nsRenderingContextPh.cpp b/mozilla/gfx/src/photon/nsRenderingContextPh.cpp index 1d461fc6033..0c5665b39e4 100644 --- a/mozilla/gfx/src/photon/nsRenderingContextPh.cpp +++ b/mozilla/gfx/src/photon/nsRenderingContextPh.cpp @@ -1008,7 +1008,28 @@ NS_IMETHODIMP nsRenderingContextPh :: GetWidth( const PRUnichar *aString, PRUint return ret_code; } -NS_IMETHODIMP nsRenderingContextPh :: DrawString( const char *aString, PRUint32 aLength, nscoord aX, nscoord aY, const nscoord* aSpacing ) { +NS_IMETHODIMP +nsRenderingContextPh::GetTextDimensions(const char* aString, PRUint32 aLength, + nsTextDimensions& aDimensions) +{ + mFontMetrics->GetMaxAscent(aDimensions.ascent); + mFontMetrics->GetMaxDescent(aDimensions.descent); + return GetWidth(aString, aLength, aDimensions.width); +} + +NS_IMETHODIMP +nsRenderingContextPh::GetTextDimensions(const PRUnichar *aString, + PRUint32 aLength, + nsTextDimensions &aDimensions, + PRInt32 *aFontID) +{ + //XXX need fix for bug 96609 + mFontMetrics->GetMaxAscent(aDimensions.ascent); + mFontMetrics->GetMaxDescent(aDimensions.descent); + return GetWidth(aString, aLength, aDimensions.width); +} + +NS_IMETHODIMP nsRenderingContextPh :: DrawString2( const char *aString, PRUint32 aLength, nscoord aX, nscoord aY, const nscoord* aSpacing ) { if( mClipRegion->IsEmpty() ) return NS_ERROR_FAILURE; @@ -1019,7 +1040,7 @@ NS_IMETHODIMP nsRenderingContextPh :: DrawString( const char *aString, PRUint32 mTranMatrix->TransformCoord( &aX, &aY ); PhPoint_t pos = { aX, aY }; SELECT( mSurface ); - PgDrawTextChars( aString, aLength, &pos, Pg_TEXT_LEFT | Pg_TEXT_TOP ); + PgDrawTextChars( aString, aLength, &pos, Pg_TEXT_LEFT ); } else { nscoord x = aX; @@ -1032,19 +1053,31 @@ NS_IMETHODIMP nsRenderingContextPh :: DrawString( const char *aString, PRUint32 mTranMatrix->TransformCoord(&xx, &yy); PhPoint_t pos = { xx, yy }; SELECT(mSurface); - PgDrawText( &ch, 1, &pos, (Pg_TEXT_LEFT | Pg_TEXT_TOP)); + PgDrawText( &ch, 1, &pos, Pg_TEXT_LEFT ); x += *aSpacing++; } } return NS_OK; } -NS_IMETHODIMP nsRenderingContextPh :: DrawString( const PRUnichar *aString, PRUint32 aLength, nscoord aX, nscoord aY, PRInt32 aFontID, const nscoord* aSpacing ) { +NS_IMETHODIMP nsRenderingContextPh :: DrawString2( const PRUnichar *aString, PRUint32 aLength, nscoord aX, nscoord aY, PRInt32 aFontID, const nscoord* aSpacing ) { NS_ConvertUCS2toUTF8 theUnicodeString( aString, aLength ); const char *p = theUnicodeString.get( ); - return DrawString( p, strlen( p ), aX, aY, aSpacing ); + return DrawString2( p, strlen( p ), aX, aY, aSpacing ); } +NS_IMETHODIMP nsRenderingContextPh :: DrawString( const char *aString, PRUint32 aLength, nscoord aX, nscoord aY, PRInt32 aFontID, const nscoord* aSpacing ) { + nscoord y; + mFontMetrics->GetMaxAscent(y); + return DrawString2( aString, strlen( p ), aX, aY + y, aSpacing ); + } + +NS_IMETHODIMP nsRenderingContextPh :: DrawString( const PRUnichar *aString, PRUint32 aLength, nscoord aX, nscoord aY, PRInt32 aFontID, const nscoord* aSpacing ) { + nscoord y; + mFontMetrics->GetMaxAscent(y); + return DrawString2( aString, strlen( p ), aX, aY + y, aSpacing ); + } + NS_IMETHODIMP nsRenderingContextPh :: DrawString( const nsString& aString, nscoord aX, nscoord aY, PRInt32 aFontID, const nscoord* aSpacing ) { NS_ConvertUCS2toUTF8 theUnicodeString( aString.get(), aString.Length() ); const char *p = theUnicodeString.get(); diff --git a/mozilla/gfx/src/photon/nsRenderingContextPh.h b/mozilla/gfx/src/photon/nsRenderingContextPh.h index 294b3f56d50..4884101a399 100644 --- a/mozilla/gfx/src/photon/nsRenderingContextPh.h +++ b/mozilla/gfx/src/photon/nsRenderingContextPh.h @@ -152,6 +152,18 @@ public: NS_IMETHOD GetWidth(const PRUnichar* aString, PRUint32 aLength, nscoord& aWidth, PRInt32 *aFontID); + NS_IMETHOD GetTextDimensions(const char* aString, PRUint32 aLength, + nsTextDimensions& aDimensions); + NS_IMETHOD GetTextDimensions(const PRUnichar *aString, PRUint32 aLength, + nsTextDimensions& aDimensions, PRInt32 *aFontID); + NS_IMETHOD DrawString2(const char *aString, PRUint32 aLength, + nscoord aX, nscoord aY, + const nscoord* aSpacing); + NS_IMETHOD DrawString2(const PRUnichar *aString, PRUint32 aLength, + nscoord aX, nscoord aY, + PRInt32 aFontID, + const nscoord* aSpacing); + NS_IMETHOD DrawString(const char *aString, PRUint32 aLength, nscoord aX, nscoord aY, const nscoord* aSpacing); diff --git a/mozilla/gfx/src/qt/nsRenderingContextQT.cpp b/mozilla/gfx/src/qt/nsRenderingContextQT.cpp index 321e53641ee..5905fd8ace1 100644 --- a/mozilla/gfx/src/qt/nsRenderingContextQT.cpp +++ b/mozilla/gfx/src/qt/nsRenderingContextQT.cpp @@ -1120,7 +1120,88 @@ FoundFont: return NS_OK; } -NS_IMETHODIMP nsRenderingContextQT::DrawString(const char *aString, +NS_IMETHODIMP +nsRenderingContextQT::GetTextDimensions(const char* aString, PRUint32 aLength, + nsTextDimensions& aDimensions) +{ + mFontMetrics->GetMaxAscent(aDimensions.ascent); + mFontMetrics->GetMaxDescent(aDimensions.descent); + return GetWidth(aString, aLength, aDimensions.width); +} + +NS_IMETHODIMP +nsRenderingContextQT::GetTextDimensions(const PRUnichar *aString, + PRUint32 aLength, + nsTextDimensions &aDimensions, + PRInt32 *aFontID) +{ + aDimensions.Clear(); + if (0 == aLength) + return NS_OK; + if (nsnull == aString) + return NS_ERROR_FAILURE; + + nsFontMetricsQT *metrics = (nsFontMetricsQT*)mFontMetrics; + nsFontQT *prevFont = nsnull; + int rawWidth = 0, rawAscent = 0, rawDescent = 0; + PRUint32 start = 0; + PRUint32 i; + + for (i = 0; i < aLength; i++) { + PRUnichar c = aString[i]; + nsFontQT* currFont = nsnull; + if (mCurrentFont->SupportsChar(c)) { + currFont = mCurrentFont; + goto FoundFont; + } + else { + nsFontQT **font = metrics->mLoadedFonts; + nsFontQT **lastFont = &metrics->mLoadedFonts[metrics->mLoadedFontsCount]; + while (font < lastFont) { + if ((*font)->SupportsChar(c)) { + currFont = *font; + goto FoundFont; // for speed -- avoid "if" statement + } + font++; + } + currFont = metrics->FindFont(c); + } +FoundFont: + if (prevFont) { + if (currFont != prevFont) { + rawWidth += prevFont->GetWidth(&aString[start], i - start); + if (rawAscent < prevFont->mFontMetrics->ascent()) + rawAscent = prevFont->mFontMetrics->ascent(); + if (rawDescent < prevFont->mFontMetrics->descent()) + rawDescent = prevFont->mFontMetrics->descent(); + prevFont = currFont; + start = i; + } + } + else { + prevFont = currFont; + start = i; + } + } + if (prevFont) { + rawWidth += prevFont->GetWidth(&aString[start], i - start); + if (rawAscent < prevFont->mFontMetrics->ascent()) + rawAscent = prevFont->mFontMetrics->ascent(); + if (rawDescent < prevFont->mFontMetrics->descent()) + rawDescent = prevFont->mFontMetrics->descent(); + } + + aDimensions.width = NSToCoordRound(rawWidth * mP2T); + aDimensions.ascent = NSToCoordRound(rawAscent * mP2T); + aDimensions.descent = NSToCoordRound(rawDescent * mP2T); + + if (nsnull != aFontID) + *aFontID = 0; + + return NS_OK; +} + +NS_IMETHODIMP nsRenderingContextQT::DrawString2(const char *aString, PRUint32 aLength, nscoord aX, nscoord aY, const nscoord *aSpacing) @@ -1134,11 +1215,6 @@ NS_IMETHODIMP nsRenderingContextQT::DrawString(const char *aString, nscoord x = aX; nscoord y = aY; - // Substract xFontStruct ascent since drawing specifies baseline - if (mFontMetrics) { - mFontMetrics->GetMaxAscent(y); - y += aY; - } UpdateGC(); if (nsnull != aSpacing) { @@ -1165,7 +1241,28 @@ NS_IMETHODIMP nsRenderingContextQT::DrawString(const char *aString, return NS_OK; } -NS_IMETHODIMP nsRenderingContextQT::DrawString(const PRUnichar *aString, +NS_IMETHODIMP +nsRenderingContextQT::DrawString(const char *aString, PRUint32 aLength, + nscoord aX, nscoord aY, + const nscoord* aSpacing) +{ + nscoord y; + mFontMetrics->GetMaxAscent(y); + return DrawString2(aString, aLength, aX, aY + y, aSpacing); +} + +NS_IMETHODIMP +nsRenderingContextQT::DrawString(const PRUnichar *aString, PRUint32 aLength, + nscoord aX, nscoord aY, + PRInt32 aFontID, + const nscoord* aSpacing) +{ + nscoord y; + mFontMetrics->GetMaxAscent(y); + return DrawString2(aString, aLength, aX, aY + y, aFontID, aSpacing); +} + +NS_IMETHODIMP nsRenderingContextQT::DrawString2(const PRUnichar *aString, PRUint32 aLength, nscoord aX,nscoord aY, PRInt32 aFontID, @@ -1178,11 +1275,7 @@ NS_IMETHODIMP nsRenderingContextQT::DrawString(const PRUnichar *aString, return NS_ERROR_FAILURE; nscoord x = aX; - nscoord y; - - mFontMetrics->GetMaxAscent(y); - y += aY; - aY = y; + nscoord y = aY; mTranMatrix->TransformCoord(&x,&y); diff --git a/mozilla/gfx/src/qt/nsRenderingContextQT.h b/mozilla/gfx/src/qt/nsRenderingContextQT.h index 88a6e9332ff..2d51a6219da 100644 --- a/mozilla/gfx/src/qt/nsRenderingContextQT.h +++ b/mozilla/gfx/src/qt/nsRenderingContextQT.h @@ -157,6 +157,18 @@ public: NS_IMETHOD GetWidth(const PRUnichar *aString,PRUint32 aLength, nscoord &aWidth,PRInt32 *aFontID); + NS_IMETHOD GetTextDimensions(const char* aString, PRUint32 aLength, + nsTextDimensions& aDimensions); + NS_IMETHOD GetTextDimensions(const PRUnichar *aString, PRUint32 aLength, + nsTextDimensions& aDimensions, PRInt32 *aFontID); + NS_IMETHOD DrawString2(const char *aString, PRUint32 aLength, + nscoord aX, nscoord aY, + const nscoord* aSpacing); + NS_IMETHOD DrawString2(const PRUnichar *aString, PRUint32 aLength, + nscoord aX, nscoord aY, + PRInt32 aFontID, + const nscoord* aSpacing); + #ifdef MOZ_MATHML /* Returns metrics (in app units) of an 8-bit character string */ NS_IMETHOD GetBoundingMetrics(const char *aString,PRUint32 aLength,