Implimented nsImageGTK. Fixed some compling problems in the other files due

to headers needed in nsImageGTK
This commit is contained in:
pavlov%pavlov.net 1998-11-07 17:24:46 +00:00
Родитель 9ef6528746
Коммит 733e8c1795
5 изменённых файлов: 433 добавлений и 48 удалений

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

@ -16,10 +16,11 @@
* Reserved.
*/
#include <gdk/gdk.h>
#include "xp_core.h"
#include "nsFontMetricsGTK.h"
#include <gdk/gdk.h>
static NS_DEFINE_IID(kIFontMetricsIID, NS_IFONT_METRICS_IID);

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

@ -16,6 +16,8 @@
* Reserved.
*/
#include <gtk/gtk.h>
#include "nscore.h"
#include "nsIFactory.h"
#include "nsISupports.h"
@ -24,7 +26,7 @@
#include "nsRenderingContextGTK.h"
#include "nsImageGTK.h"
#include "nsDeviceContextGTK.h"
#include <gtk/gtk.h>
static NS_DEFINE_IID(kCFontMetrics, NS_FONT_METRICS_CID);
static NS_DEFINE_IID(kCRenderingContext, NS_RENDERING_CONTEXT_CID);

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

@ -16,9 +16,14 @@
* Reserved.
*/
#include <gtk/gtk.h>
#include "nsImageGTK.h"
#include "nsRenderingContextGTK.h"
#include <gtk/gtk.h>
#include "nspr.h"
#define IsFlagSet(a,b) (a & b)
static NS_DEFINE_IID(kIImageIID, NS_IIMAGE_IID);
@ -27,12 +32,45 @@ static NS_DEFINE_IID(kIImageIID, NS_IIMAGE_IID);
nsImageGTK :: nsImageGTK()
{
NS_INIT_REFCNT();
mImage = nsnull ;
mImageBits = nsnull;
mConvertedBits = nsnull;
mBitsForCreate = nsnull;
mWidth = 0;
mHeight = 0;
mDepth = 0;
mOriginalDepth = 0;
mColorMap = nsnull;
mAlphaBits = nsnull;
mStaticImage = PR_FALSE;
}
//------------------------------------------------------------
nsImageGTK :: ~nsImageGTK()
{
if (nsnull != mImage) {
gdk_image_destroy(mImage);
mImage = nsnull;
}
if(nsnull != mConvertedBits) {
delete[] (PRUint8*)mConvertedBits;
mConvertedBits = nsnull;
}
if(nsnull != mImageBits) {
delete[] (PRUint8*)mImageBits;
mImageBits = nsnull;
}
if(nsnull!= mColorMap)
delete mColorMap;
if (nsnull != mAlphaBits) {
delete mAlphaBits;
}
}
NS_IMPL_ISUPPORTS(nsImageGTK, kIImageIID);
@ -41,14 +79,104 @@ NS_IMPL_ISUPPORTS(nsImageGTK, kIImageIID);
nsresult nsImageGTK :: Init(PRInt32 aWidth, PRInt32 aHeight, PRInt32 aDepth,nsMaskRequirements aMaskRequirements)
{
if(nsnull != mImageBits)
delete[] (PRUint8*)mImageBits;
if(nsnull != mColorMap)
delete[] mColorMap;
if (nsnull != mImage) {
gdk_image_destroy(mImage);
mImage = nsnull;
}
mWidth = aWidth;
mHeight = aHeight;
mDepth = aDepth;
mOriginalDepth = aDepth;
mOriginalRowBytes = CalcBytesSpan(aWidth);
mConverted = PR_FALSE;
ComputePaletteSize(aDepth);
// create the memory for the image
ComputMetrics();
mImageBits = (PRUint8*) new PRUint8[mSizeImage];
mAlphaBits = (PRUint8*) new PRUint8[mSizeImage];
mColorMap = new nsColorMap;
if (mColorMap != nsnull) {
mColorMap->NumColors = mNumPalleteColors;
mColorMap->Index = new PRUint8[3 * mNumPalleteColors];
memset(mColorMap->Index, 0, sizeof(PRUint8) * (3 * mNumPalleteColors));
}
return NS_OK;
}
//------------------------------------------------------------
void nsImageGTK::ComputMetrics()
{
mRowBytes = CalcBytesSpan(mWidth);
mSizeImage = mRowBytes * mHeight;
}
//------------------------------------------------------------
// figure out how big our palette needs to be
void nsImageGTK :: ComputePaletteSize(PRIntn nBitCount)
{
switch (nBitCount)
{
case 8:
mNumPalleteColors = 256;
mNumBytesPixel = 1;
break;
case 16:
mNumPalleteColors = 0;
mNumBytesPixel = 2;
break;
case 24:
mNumPalleteColors = 0;
mNumBytesPixel = 3;
break;
default:
mNumPalleteColors = -1;
mNumBytesPixel = 0;
break;
}
}
//------------------------------------------------------------
PRInt32 nsImageGTK :: CalcBytesSpan(PRUint32 aWidth)
{
PRInt32 spanbytes;
spanbytes = (aWidth * mDepth) >> 5;
if (((PRUint32)aWidth * mDepth) & 0x1F)
spanbytes++;
spanbytes <<= 2;
return(spanbytes);
}
//------------------------------------------------------------
// set up the pallete to the passed in color array, RGB only in this array
void nsImageGTK :: ImageUpdated(nsIDeviceContext *aContext, PRUint8 aFlags, nsRect *aUpdateRect)
{
if (nsnull == mImage)
return;
if (IsFlagSet(nsImageUpdateFlags_kBitsChanged, aFlags)){
}
}
@ -56,21 +184,58 @@ void nsImageGTK :: ImageUpdated(nsIDeviceContext *aContext, PRUint8 aFlags, nsRe
// Draw the bitmap, this method has a source and destination coordinates
NS_IMETHODIMP nsImageGTK :: Draw(nsIRenderingContext &aContext, nsDrawingSurface aSurface,
PRInt32 aSX, PRInt32 aSY,
PRInt32 aSWidth, PRInt32 aSHeight,
PRInt32 aDX, PRInt32 aDY,
PRInt32 aDWidth, PRInt32 aDHeight)
PRInt32 aSX, PRInt32 aSY, PRInt32 aSWidth, PRInt32 aSHeight,
PRInt32 aDX, PRInt32 aDY, PRInt32 aDWidth, PRInt32 aDHeight)
{
nsDrawingSurfaceGTK *drawing = (nsDrawingSurfaceGTK*)aSurface;
if ((PR_FALSE==mStaticImage) || (nsnull == mImage)) {
BuildImage(aSurface);
}
if (nsnull == mImage)
return NS_ERROR_FAILURE;
gdk_draw_image(drawing->drawable, drawing->gc, mImage,
aSX, aSY,
aDX, aDY,
aDWidth, aDHeight);
/*
XPutImage(drawing->display,drawing->drawable,drawing->gc,mImage,
aSX,aSY,aDX,aDY,aDWidth,aDHeight);
*/
return NS_OK;
}
//------------------------------------------------------------
// Draw the bitmap, this draw just has destination coordinates
NS_IMETHODIMP nsImageGTK :: Draw(nsIRenderingContext &aContext, nsDrawingSurface aSurface,
NS_IMETHODIMP nsImageGTK :: Draw(nsIRenderingContext &aContext,
nsDrawingSurface aSurface,
PRInt32 aX, PRInt32 aY,
PRInt32 aWidth, PRInt32 aHeight)
{
nsDrawingSurfaceGTK *drawing = (nsDrawingSurfaceGTK*) aSurface;
BuildImage(aSurface);
// Build Image each time if it's not static.
if ((PR_FALSE==mStaticImage) || (nsnull == mImage)) {
BuildImage(aSurface);
}
if (nsnull == mImage)
return NS_ERROR_FAILURE;
gdk_draw_image(drawing->drawable, drawing->gc, mImage,
0, 0,
aX, aY,
aWidth, aHeight);
/*
XPutImage(drawing->display,drawing->drawable,drawing->gc,mImage,
0,0,aX,aY,aWidth,aHeight);
*/
return NS_OK;
}
@ -78,7 +243,6 @@ NS_IMETHODIMP nsImageGTK :: Draw(nsIRenderingContext &aContext, nsDrawingSurface
void nsImageGTK::CompositeImage(nsIImage *aTheImage, nsPoint *aULLocation,nsBlendQuality aBlendQuality)
{
}
//------------------------------------------------------------
@ -86,15 +250,201 @@ void nsImageGTK::CompositeImage(nsIImage *aTheImage, nsPoint *aULLocation,nsBlen
// lets build an alpha mask from this image
PRBool nsImageGTK::SetAlphaMask(nsIImage *aTheMask)
{
PRInt32 num;
PRUint8 *srcbits;
if (aTheMask &&
(((nsImageGTK*)aTheMask)->mNumBytesPixel == 1)) {
mLocation.x = 0;
mLocation.y = 0;
mAlphaDepth = 8;
mAlphaWidth = aTheMask->GetWidth();
mAlphaHeight = aTheMask->GetWidth();
num = mAlphaWidth*mAlphaHeight;
mARowBytes = aTheMask->GetLineStride();
mAlphaBits = new unsigned char[mARowBytes * mAlphaHeight];
srcbits = aTheMask->GetBits();
memcpy(mAlphaBits,srcbits,num);
return(PR_TRUE);
}
return(PR_FALSE);
}
nsresult nsImageGTK::Optimize(nsIDeviceContext* aContext)
void nsImageGTK::AllocConvertedBits(PRUint32 aSize)
{
if (nsnull == mConvertedBits)
mConvertedBits = (PRUint8*) new PRUint8[aSize];
}
//------------------------------------------------------------
void nsImageGTK::ConvertImage(nsDrawingSurface aDrawingSurface)
{
nsDrawingSurfaceGTK *drawing =(nsDrawingSurfaceGTK*) aDrawingSurface;
PRUint8 *tempbuffer,*cursrc,*curdest;
PRInt32 x,y;
PRUint16 red,green,blue,*cur16;
mBitsForCreate = mImageBits;
#if 0
if((drawing->depth==24) && (mOriginalDepth==8))
{
// convert this nsImage to a 24 bit image
mDepth = 24;
ComputePaletteSize(mDepth);
ComputMetrics();
AllocConvertedBits(mSizeImage);
tempbuffer = mConvertedBits;
mBitsForCreate = mConvertedBits;
for(y=0;y<mHeight;y++)
{
cursrc = mImageBits+(y*mOriginalRowBytes);
curdest =tempbuffer+(y*mRowBytes);
for(x=0;x<mOriginalRowBytes;x++)
{
*curdest = mColorMap->Index[(3*(*cursrc))+2]; // red
curdest++;
*curdest = mColorMap->Index[(3*(*cursrc))+1]; // green
curdest++;
*curdest = mColorMap->Index[(3*(*cursrc))]; // blue
curdest++;
cursrc++;
}
}
#if 0
if(mColorMap)
delete mColorMap;
// after we are finished converting the image, build a new color map
mColorMap = new nsColorMap;
if (mColorMap != nsnull)
{
mColorMap->NumColors = mNumPalleteColors;
mColorMap->Index = new PRUint8[3 * mNumPalleteColors];
memset(mColorMap->Index, 0, sizeof(PRUint8) * (3 * mNumPalleteColors));
}
#endif
}
// convert the 8 bit image to 16 bit
if((drawing->depth==16) && (mOriginalDepth==8))
{
mDepth = 16;
ComputePaletteSize(mDepth);
ComputMetrics();
AllocConvertedBits(mSizeImage);
tempbuffer = mConvertedBits;
mBitsForCreate = mConvertedBits;
for(y=0;y<mHeight;y++)
{
cursrc = mImageBits+(y*mOriginalRowBytes);
cur16 = (PRUint16*) (tempbuffer+(y*mRowBytes));
for(x=0;x<mOriginalRowBytes;x++)
{
blue = mColorMap->Index[(3*(*cursrc))+2]; // red
green = mColorMap->Index[(3*(*cursrc))+1]; // green
red = mColorMap->Index[(3*(*cursrc))]; // blue
cursrc++;
*cur16 = ((red&0xf8)<<8)|((green&0xfc)<<3)| ((blue&0xf8)>>3);
cur16++;
}
}
#if 0
if (mColorMap != nsnull)
{
mColorMap->NumColors = mNumPalleteColors;
mColorMap->Index = new PRUint8[3 * mNumPalleteColors];
memset(mColorMap->Index, 0, sizeof(PRUint8) * (3 * mNumPalleteColors));
}
#endif
}
#endif
}
nsresult nsImageGTK::BuildImage(nsDrawingSurface aDrawingSurface)
{
if (nsnull != mImage) {
// XDestroyImage(mImage);
gdk_image_destroy(mImage);
mImage = nsnull;
}
ConvertImage(aDrawingSurface);
CreateImage(aDrawingSurface);
return NS_OK;
}
nsIImage* nsImageGTK::DuplicateImage()
//------------------------------------------------------------
nsresult nsImageGTK::Optimize(nsIDeviceContext* aContext)
{
return NULL;
mStaticImage = PR_TRUE;
#if 0
BuildImage(aDrawingSurface);
#endif
return NS_OK;
}
//------------------------------------------------------------
void nsImageGTK::CreateImage(nsDrawingSurface aSurface)
{
PRUint32 wdepth;
GdkVisual * visual ;
PRUint32 format ;
nsDrawingSurfaceGTK *drawing =(nsDrawingSurfaceGTK*) aSurface;
if(mImageBits) {
format = ZPixmap;
#if 0
/* Need to support monochrome too */
if (drawing->visual->c_class == TrueColor ||
drawing->visual->c_class == DirectColor) {
format = ZPixmap;
}
else {
printf("Format XYPixmap\n");
format = XYPixmap;
}
#endif
/* printf("Width %d Height %d Visual Depth %d Image Depth %d\n",
mWidth, mHeight,
drawing->depth, mDepth); */
// FIXME we should be storing the visual somewhere
mImage = gdk_image_new(GDK_IMAGE_NORMAL,
gdk_visual_get_best(),
mWidth,
mHeight);
/*
mImage = ::XCreateImage(drawing->display,
drawing->visual,
drawing->depth,
format,
0,
(char *)mBitsForCreate,
(unsigned int)mWidth,
(unsigned int)mHeight,
32,mRowBytes);
mImage->byte_order = ImageByteOrder(drawing->display);
mImage->bits_per_pixel = drawing->depth;
mImage->bitmap_bit_order = BitmapBitOrder(drawing->display);
mImage->bitmap_unit = 32;
*/
}
return ;
}

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

@ -21,6 +21,11 @@
#include "nsIImage.h"
#include "X11/Xlib.h"
#include "X11/Xutil.h"
#undef Bool
class nsImageGTK : public nsIImage
{
public:
@ -32,35 +37,31 @@ public:
/**
@see nsIImage.h
*/
virtual PRInt32 GetHeight() { return 0; }
virtual PRInt32 GetWidth() { return 0; }
virtual PRUint8* GetBits() { return nsnull; }
virtual PRInt32 GetHeight() { return mHeight; }
virtual PRInt32 GetWidth() { return mWidth; }
virtual PRUint8* GetBits() { return mImageBits; }
virtual void* GetBitInfo() { return nsnull; }
virtual PRInt32 GetLineStride() {return 0; }
NS_IMETHOD Draw(nsIRenderingContext &aContext,
nsDrawingSurface aSurface,
PRInt32 aX, PRInt32 aY,
PRInt32 aWidth, PRInt32 aHeight);
NS_IMETHOD Draw(nsIRenderingContext &aContext,
nsDrawingSurface aSurface,
PRInt32 aSX, PRInt32 aSY,
PRInt32 aSWidth, PRInt32 aSHeight,
PRInt32 aDX, PRInt32 aDY,
PRInt32 aDWidth, PRInt32 aDHeight);
virtual nsColorMap* GetColorMap() {return nsnull;}
virtual PRInt32 GetLineStride() {return mRowBytes; }
NS_IMETHOD Draw(nsIRenderingContext &aContext, nsDrawingSurface aSurface, PRInt32 aX, PRInt32 aY, PRInt32 aWidth, PRInt32 aHeight);
NS_IMETHOD Draw(nsIRenderingContext &aContext, nsDrawingSurface aSurface, PRInt32 aSX, PRInt32 aSY, PRInt32 aSWidth, PRInt32 aSHeight,
PRInt32 aDX, PRInt32 aDY, PRInt32 aDWidth, PRInt32 aDHeight);
virtual nsColorMap* GetColorMap() {return mColorMap;}
virtual void ImageUpdated(nsIDeviceContext *aContext, PRUint8 aFlags, nsRect *aUpdateRect);
virtual nsresult Init(PRInt32 aWidth, PRInt32 aHeight, PRInt32 aDepth, nsMaskRequirements aMaskRequirements);
virtual PRBool IsOptimized() { return PR_FALSE; }
virtual PRBool IsOptimized() { return (mImage!=nsnull); }
virtual nsresult BuildImage(nsDrawingSurface aDrawingSurface);
virtual nsresult Optimize(nsIDeviceContext* aContext);
virtual PRUint8* GetAlphaBits() { return nsnull; }
virtual PRUint8* GetAlphaBits() { return mAlphaBits; }
virtual PRInt32 GetAlphaWidth() { return 0;}
virtual PRInt32 GetAlphaHeight() {return 0;}
virtual PRInt32 GetAlphaXLoc() {return 0;}
virtual PRInt32 GetAlphaYLoc() {return 0;}
virtual PRInt32 GetAlphaLineStride(){ return 0; }
virtual void CompositeImage(nsIImage *aTheImage,nsPoint *aULLocation,nsBlendQuality aQuality);
virtual nsIImage* DuplicateImage() {return(nsnull);}
virtual nsIImage* DuplicateImage();
void AllocConvertedBits(PRUint32 aSize);
/**
* Return the image size of the Device Independent Bitmap(DIB).
@ -80,17 +81,48 @@ public:
* @return the number of bytes in this span
*/
PRInt32 CalcBytesSpan(PRUint32 aWidth);
PRBool SetAlphaMask(nsIImage *aTheMask);
virtual void SetAlphaLevel(PRInt32 aAlphaLevel) {mAlphaLevel=aAlphaLevel;}
virtual PRInt32 GetAlphaLevel() {return(mAlphaLevel);}
void MoveAlphaMask(PRInt32 aX, PRInt32 aY){}
virtual void SetAlphaLevel(PRInt32 /* aAlphaLevel */) {}
virtual PRInt32 GetAlphaLevel() {return(0);}
virtual void MoveAlphaMask(PRInt32 /* aX */, PRInt32 /* aY */) {}
private:
PRInt16 mAlphaLevel; // an alpha level every pixel uses
void CreateImage(nsDrawingSurface aSurface);
void ConvertImage(nsDrawingSurface aSurface);
/**
* Calculate the amount of memory needed for the initialization of the image
*/
void ComputMetrics();
void ComputePaletteSize(PRIntn nBitCount);
private:
PRBool mStaticImage;
PRInt32 mWidth;
PRInt32 mHeight;
PRInt32 mDepth; // bits per pixel
PRInt32 mOriginalDepth; // bits per pixel
PRInt32 mRowBytes;
PRInt32 mOriginalRowBytes;
GdkPixmap *mThePixMap;
PRUint8 *mImageBits;
PRUint8 *mConvertedBits;
PRBool mConverted;
PRUint8 *mBitsForCreate;
PRInt32 mSizeImage;
GdkImage *mImage ;
nsColorMap *mColorMap;
PRInt16 mNumPalleteColors;
PRInt8 mNumBytesPixel;
// alpha layer members
PRUint8 *mAlphaBits;
PRInt8 mAlphaDepth; // alpha layer depth
PRInt16 mARowBytes;
PRInt16 mAlphaWidth; // alpha layer width
PRInt16 mAlphaHeight; // alpha layer height
nsPoint mLocation; // alpha mask location
};

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

@ -16,9 +16,9 @@
* Reserved.
*/
#include <gtk/gtk.h>
#include "nsRenderingContextGTK.h"
#include <math.h>
#include <gtk/gtk.h>
typedef unsigned char BYTE;
@ -261,7 +261,7 @@ NS_IMETHODIMP nsRenderingContextGTK::CreateDrawingSurface(nsRect *aBounds,
PRUint32 aSurfFlags,
nsDrawingSurface &aSurface)
{
#if 0
GdkPixmap *pixmap = gdk_pixmap_new(mRenderingSurface->drawable, aBounds->width,
aBounds->height, -1);
@ -270,8 +270,8 @@ NS_IMETHODIMP nsRenderingContextGTK::CreateDrawingSurface(nsRect *aBounds,
surface->drawable = pixmap ;
surface->gc = mRenderingSurface->gc;
return ((nsDrawingSurface)surface);
#endif
// return ((nsDrawingSurface)surface);
return NS_OK;
}