[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:
rbs%maths.uq.edu.au
2001-10-03 05:03:58 +00:00
parent b05eb6115c
commit f2d2fb9282
4 changed files with 167 additions and 17 deletions

View File

@@ -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();

View File

@@ -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);

View File

@@ -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);

View File

@@ -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,