Revised DrawString API to take a spacing array for character spacing control

This commit is contained in:
kipp%netscape.com 1998-10-26 17:12:39 +00:00
Родитель 4c30201be5
Коммит 859cceb62f
9 изменённых файлов: 142 добавлений и 36 удалений

Просмотреть файл

@ -950,8 +950,9 @@ NS_IMETHODIMP nsRenderingContextMac :: GetWidth(const PRUnichar *aString, PRUint
//------------------------------------------------------------------------
void nsRenderingContextMac :: DrawString(const char *aString, PRUint32 aLength,
nscoord aX, nscoord aY,
nscoord aWidth)
nscoord aX, nscoord aY,
nscoord aWidth,
const nscoord* aSpacing)
{
PRInt32 x = aX;
PRInt32 y = aY;
@ -1008,7 +1009,8 @@ void nsRenderingContextMac :: DrawString(const char *aString, PRUint32 aLength,
//------------------------------------------------------------------------
void nsRenderingContextMac :: DrawString(const PRUnichar *aString, PRUint32 aLength,
nscoord aX, nscoord aY, nscoord aWidth)
nscoord aX, nscoord aY, nscoord aWidth,
const nscoord* aSpacing)
{
nsString nsStr;
nsStr.SetString(aString, aLength);
@ -1020,10 +1022,11 @@ void nsRenderingContextMac :: DrawString(const PRUnichar *aString, PRUint32 aLen
//------------------------------------------------------------------------
void nsRenderingContextMac :: DrawString(const nsString& aString,
nscoord aX, nscoord aY, nscoord aWidth)
nscoord aX, nscoord aY, nscoord aWidth,
const nscoord* aSpacing)
{
char* cStr = aString.ToNewCString();
DrawString(cStr, aString.Length(), aX, aY, aWidth);
DrawString(cStr, aString.Length(), aX, aY, aWidth, aSpacing);
delete[] cStr;
}

Просмотреть файл

@ -105,9 +105,9 @@ public:
NS_IMETHOD GetWidth(const char *aString, nscoord &aWidth);
NS_IMETHOD GetWidth(const char* aString, PRUint32 aLength, nscoord& aWidth);
NS_IMETHOD GetWidth(const PRUnichar *aString, PRUint32 aLength, nscoord &aWidth);
virtual void DrawString(const char *aString, PRUint32 aLength,nscoord aX, nscoord aY,nscoord aWidth);
virtual void DrawString(const PRUnichar *aString, PRUint32 aLength, nscoord aX, nscoord aY,nscoord aWidth);
virtual void DrawString(const nsString& aString, nscoord aX, nscoord aY,nscoord aWidth);
virtual void DrawString(const char *aString, PRUint32 aLength,nscoord aX, nscoord aY,nscoord aWidth, const nscoord* aSpacing);
virtual void DrawString(const PRUnichar *aString, PRUint32 aLength, nscoord aX, nscoord aY,nscoord aWidth, const nscoord* aSpacing);
virtual void DrawString(const nsString& aString, nscoord aX, nscoord aY,nscoord aWidth, const nscoord* aSpacing);
virtual void DrawImage(nsIImage *aImage, nscoord aX, nscoord aY);
virtual void DrawImage(nsIImage *aImage, nscoord aX, nscoord aY, nscoord aWidth, nscoord aHeight);
virtual void DrawImage(nsIImage *aImage, const nsRect& aRect);

Просмотреть файл

@ -1151,9 +1151,11 @@ NS_IMETHODIMP nsRenderingContextUnix :: GetWidth(const PRUnichar *aString,
return NS_OK;
}
void nsRenderingContextUnix :: DrawString(const char *aString, PRUint32 aLength,
nscoord aX, nscoord aY,
nscoord aWidth)
void
nsRenderingContextUnix :: DrawString(const char *aString, PRUint32 aLength,
nscoord aX, nscoord aY,
nscoord aWidth,
const nscoord* aSpacing)
{
nscoord x = aX;
nscoord y = aY;
@ -1200,8 +1202,10 @@ void nsRenderingContextUnix :: DrawString(const char *aString, PRUint32 aLength,
}
}
void nsRenderingContextUnix :: DrawString(const PRUnichar *aString, PRUint32 aLength,
nscoord aX, nscoord aY, nscoord aWidth)
void
nsRenderingContextUnix :: DrawString(const PRUnichar *aString, PRUint32 aLength,
nscoord aX, nscoord aY, nscoord aWidth,
const nscoord* aSpacing)
{
nscoord x = aX;
nscoord y = aY;
@ -1271,10 +1275,12 @@ void nsRenderingContextUnix :: DrawString(const PRUnichar *aString, PRUint32 aLe
}
}
void nsRenderingContextUnix :: DrawString(const nsString& aString,
nscoord aX, nscoord aY, nscoord aWidth)
void
nsRenderingContextUnix :: DrawString(const nsString& aString,
nscoord aX, nscoord aY, nscoord aWidth,
const nscoord* aSpacing)
{
DrawString(aString.GetUnicode(), aString.Length(), aX, aY, aWidth);
DrawString(aString.GetUnicode(), aString.Length(), aX, aY, aWidth, aSpacing);
}
void nsRenderingContextUnix :: DrawImage(nsIImage *aImage, nscoord aX, nscoord aY)

Просмотреть файл

@ -136,11 +136,15 @@ public:
virtual void DrawString(const char *aString, PRUint32 aLength,
nscoord aX, nscoord aY,
nscoord aWidth);
virtual void DrawString(const PRUnichar *aString, PRUint32 aLength, nscoord aX, nscoord aY,
nscoord aWidth);
nscoord aWidth,
const nscoord* aSpacing);
virtual void DrawString(const PRUnichar *aString, PRUint32 aLength,
nscoord aX, nscoord aY,
nscoord aWidth,
const nscoord* aSpacing);
virtual void DrawString(const nsString& aString, nscoord aX, nscoord aY,
nscoord aWidth);
nscoord aWidth,
const nscoord* aSpacing);
virtual void DrawImage(nsIImage *aImage, nscoord aX, nscoord aY);
virtual void DrawImage(nsIImage *aImage, nscoord aX, nscoord aY,

Просмотреть файл

@ -448,10 +448,12 @@ public:
* @param aX Horizontal starting point of baseline
* @param aY Vertical starting point of baseline.
* @param aWidth Width of the underline
* @param aSpacing inter-character spacing to apply
*/
virtual void DrawString(const char *aString, PRUint32 aLength,
nscoord aX, nscoord aY,
nscoord aWidth) = 0;
nscoord aWidth,
const nscoord* aSpacing = nsnull) = 0;
/**
* Draw a string in the RenderingContext
@ -460,10 +462,12 @@ public:
* @param aX Horizontal starting point of baseline
* @param aY Vertical starting point of baseline.
* @param aWidth length in twips of the underline
* @param aSpacing inter-character spacing to apply
*/
virtual void DrawString(const PRUnichar *aString, PRUint32 aLength,
nscoord aX, nscoord aY,
nscoord aWidth) = 0;
nscoord aWidth,
const nscoord* aSpacing = nsnull) = 0;
/**
* Draw a string in the RenderingContext
@ -471,9 +475,11 @@ public:
* @param aX Horizontal starting point of baseline
* @param aY Vertical starting point of baseline.
* @param aWidth Width of the underline
* @param aSpacing inter-character spacing to apply
*/
virtual void DrawString(const nsString& aString, nscoord aX, nscoord aY,
nscoord aWidth) = 0;
nscoord aWidth,
const nscoord* aSpacing = nsnull) = 0;
/**
* Copy an image to the RenderingContext

Просмотреть файл

@ -295,6 +295,44 @@ void nsTransform2D :: TransformNoXLateCoord(nscoord *ptX, nscoord *ptY)
}
}
inline PRIntn NSToIntNFloor(float aValue)
{
return ((0.0f <= aValue) ? PRIntn(aValue) : PRIntn(aValue - CEIL_CONST_FLOAT));
}
void nsTransform2D :: ScaleXCoords(const nscoord* aSrc,
PRUint32 aNumCoords,
PRIntn* aDst)
{
if (type != MG_2DIDENTITY)
{
const nscoord* end = aSrc + aNumCoords;
float scale = m00;
while (aSrc < end) {
nscoord c = *aSrc++;
*aDst++ = NSToIntNFloor(c * scale);
}
}
}
void nsTransform2D :: ScaleYCoords(const nscoord* aSrc,
PRUint32 aNumCoords,
PRIntn* aDst)
{
if (type != MG_2DIDENTITY)
{
const nscoord* end = aSrc + aNumCoords;
float scale = m11;
while (aSrc < end) {
nscoord c = *aSrc++;
*aDst++ = NSToIntNFloor(c * scale);
}
}
}
void nsTransform2D :: Transform(float *ptX, float *ptY)
{
float x, y;

Просмотреть файл

@ -185,6 +185,17 @@ public:
void Transform(float *aX, float *aY, float *aWidth, float *aHeight);
void TransformCoord(nscoord *aX, nscoord *aY, nscoord *aWidth, nscoord *aHeight);
/**
* Scale an array of X/Y coordinates by the X/Y scale factor in the
* matrix. The scale is done as if the other coordinate were zero.
*
* @param aSrc Base of coordinate input array
* @param aDst Base of coordinate output array
* @param aNumCoords Number of coordinates to scale
*/
void ScaleXCoords(const nscoord* aSrc, PRUint32 aNumCoords, PRIntn* aDst);
void ScaleYCoords(const nscoord* aSrc, PRUint32 aNumCoords, PRIntn* aDst);
/**
* add a translation to a Transform via x, y pair
*

Просмотреть файл

@ -1453,18 +1453,34 @@ nsRenderingContextWin :: GetWidth(const PRUnichar *aString,
return NS_ERROR_FAILURE;
}
void nsRenderingContextWin :: DrawString(const char *aString, PRUint32 aLength,
void
nsRenderingContextWin :: DrawString(const char *aString, PRUint32 aLength,
nscoord aX, nscoord aY,
nscoord aWidth)
nscoord aWidth,
const nscoord* aSpacing)
{
PRInt32 x = aX;
PRInt32 y = aY;
SetupFontAndColor();
INT dxMem[500];
INT* dx0;
if (nsnull != aSpacing) {
dx0 = dxMem;
if (aLength > 500) {
dx0 = new INT[aLength];
}
mTMatrix->ScaleXCoords(aSpacing, aLength, dx0);
}
mTMatrix->TransformCoord(&x, &y);
::ExtTextOut(mDC, x, y, 0, NULL, aString, aLength, NULL);
::ExtTextOut(mDC, x, y, 0, NULL, aString, aLength, aSpacing ? dx0 : NULL);
if ((nsnull != aSpacing) && (dx0 != dxMem)) {
delete [] dx0;
}
if (nsnull != mFontMetrics)
{
@ -1480,17 +1496,33 @@ void nsRenderingContextWin :: DrawString(const char *aString, PRUint32 aLength,
}
}
void nsRenderingContextWin :: DrawString(const PRUnichar *aString, PRUint32 aLength,
nscoord aX, nscoord aY, nscoord aWidth)
void
nsRenderingContextWin :: DrawString(const PRUnichar *aString, PRUint32 aLength,
nscoord aX, nscoord aY, nscoord aWidth,
const nscoord* aSpacing)
{
PRInt32 x = aX;
PRInt32 y = aY;
SetupFontAndColor();
INT dxMem[500];
INT* dx0;
if (nsnull != aSpacing) {
dx0 = dxMem;
if (aLength > 500) {
dx0 = new INT[aLength];
}
mTMatrix->ScaleXCoords(aSpacing, aLength, dx0);
}
mTMatrix->TransformCoord(&x, &y);
::ExtTextOutW(mDC, x, y, 0, NULL, aString, aLength, NULL);
::ExtTextOutW(mDC, x, y, 0, NULL, aString, aLength, aSpacing ? dx0 : NULL);
if ((nsnull != aSpacing) && (dx0 != dxMem)) {
delete [] dx0;
}
if (nsnull != mFontMetrics)
{
@ -1506,10 +1538,12 @@ void nsRenderingContextWin :: DrawString(const PRUnichar *aString, PRUint32 aLen
}
}
void nsRenderingContextWin :: DrawString(const nsString& aString,
nscoord aX, nscoord aY, nscoord aWidth)
void
nsRenderingContextWin :: DrawString(const nsString& aString,
nscoord aX, nscoord aY, nscoord aWidth,
const nscoord* aSpacing)
{
DrawString(aString.GetUnicode(), aString.Length(), aX, aY, aWidth);
DrawString(aString.GetUnicode(), aString.Length(), aX, aY, aWidth, aSpacing);
}
void nsRenderingContextWin :: DrawImage(nsIImage *aImage, nscoord aX, nscoord aY)

Просмотреть файл

@ -133,11 +133,15 @@ public:
virtual void DrawString(const char *aString, PRUint32 aLength,
nscoord aX, nscoord aY,
nscoord aWidth);
virtual void DrawString(const PRUnichar *aString, PRUint32 aLength, nscoord aX, nscoord aY,
nscoord aWidth);
nscoord aWidth,
const nscoord* aSpacing);
virtual void DrawString(const PRUnichar *aString, PRUint32 aLength,
nscoord aX, nscoord aY,
nscoord aWidth,
const nscoord* aSpacing);
virtual void DrawString(const nsString& aString, nscoord aX, nscoord aY,
nscoord aWidth);
nscoord aWidth,
const nscoord* aSpacing);
virtual void DrawImage(nsIImage *aImage, nscoord aX, nscoord aY);
virtual void DrawImage(nsIImage *aImage, nscoord aX, nscoord aY,