[not part of the build] Follow-up to bug 99010 - Hook GetTextDimensions() in QT and Photon from where platform gurus can take on - bug 96609
git-svn-id: svn://10.0.0.236/trunk@104521 18797224-902f-48f8-a5cc-f745e15eee43
This commit is contained in:
@@ -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();
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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);
|
||||
|
||||
|
||||
@@ -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,
|
||||
|
||||
Reference in New Issue
Block a user