Bug 256328 - tiling artifacts on some X servers. r=blizzard, sr=roc, a=asa

This commit is contained in:
tor%cs.brown.edu 2004-09-23 23:02:19 +00:00
Родитель b3e7984269
Коммит 88f87a5840
3 изменённых файлов: 70 добавлений и 2 удалений

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

@ -333,6 +333,13 @@ static const nsModuleComponentInfo components[] =
#endif #endif
}; };
PR_STATIC_CALLBACK(nsresult)
nsGfxGTKModuleCtor(nsIModule *self)
{
nsImageGTK::Startup();
return NS_OK;
}
PR_STATIC_CALLBACK(void) PR_STATIC_CALLBACK(void)
nsGfxGTKModuleDtor(nsIModule *self) nsGfxGTKModuleDtor(nsIModule *self)
{ {
@ -345,5 +352,5 @@ nsGfxGTKModuleDtor(nsIModule *self)
#endif #endif
} }
NS_IMPL_NSGETMODULE_WITH_DTOR(nsGfxGTKModule, components, nsGfxGTKModuleDtor) NS_IMPL_NSGETMODULE_WITH_CTOR_DTOR(nsGfxGTKModule, components,
nsGfxGTKModuleCtor, nsGfxGTKModuleDtor)

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

@ -70,6 +70,10 @@
static GdkGC *s1bitGC = nsnull; static GdkGC *s1bitGC = nsnull;
static GdkGC *sXbitGC = nsnull; static GdkGC *sXbitGC = nsnull;
/* XFree86 <= 4.3 has a bug in their stipple code (fbgc.c < 1.13) that
prevents us from doing fast tiling. */
static PRBool sNeedSlowTile = PR_FALSE;
NS_IMPL_ISUPPORTS1(nsImageGTK, nsIImage) NS_IMPL_ISUPPORTS1(nsImageGTK, nsIImage)
//------------------------------------------------------------ //------------------------------------------------------------
@ -140,6 +144,15 @@ nsImageGTK::~nsImageGTK()
#endif #endif
} }
/* static */ void
nsImageGTK::Startup()
{
Display *dpy = GDK_DISPLAY();
if (strstr(ServerVendor(dpy), "XFree86") && VendorRelease(dpy) <= 40300000)
sNeedSlowTile = PR_TRUE;
}
/* static */ void /* static */ void
nsImageGTK::Shutdown() nsImageGTK::Shutdown()
{ {
@ -1689,6 +1702,43 @@ void nsImageGTK::TilePixmap(GdkPixmap *src, GdkPixmap *dest,
gdk_gc_unref(gc); gdk_gc_unref(gc);
} }
void nsImageGTK::SlowTile(nsDrawingSurfaceGTK *aSurface,
const nsRect &aTileRect,
PRInt32 aSXOffset, PRInt32 aSYOffset)
{
GdkPixmap *tileImg;
GdkPixmap *tileMask;
nsRect tmpRect(0,0,aTileRect.width, aTileRect.height);
tileImg = gdk_pixmap_new(nsnull, aTileRect.width,
aTileRect.height, aSurface->GetDepth());
#ifdef MOZ_WIDGET_GTK2
gdk_drawable_set_colormap(GDK_DRAWABLE(tileImg), gdk_rgb_get_colormap());
#endif
TilePixmap(mImagePixmap, tileImg, aSXOffset, aSYOffset, tmpRect,
tmpRect, PR_FALSE);
// tile alpha mask
tileMask = gdk_pixmap_new(nsnull, aTileRect.width, aTileRect.height,
mAlphaDepth);
TilePixmap(mAlphaPixmap, tileMask, aSXOffset, aSYOffset, tmpRect,
tmpRect, PR_FALSE);
GdkGC *fgc = gdk_gc_new(aSurface->GetDrawable());
gdk_gc_set_clip_mask(fgc, (GdkBitmap*)tileMask);
gdk_gc_set_clip_origin(fgc, aTileRect.x, aTileRect.y);
// and copy it back
gdk_window_copy_area(aSurface->GetDrawable(), fgc, aTileRect.x,
aTileRect.y, tileImg, 0, 0,
aTileRect.width, aTileRect.height);
gdk_gc_unref(fgc);
gdk_pixmap_unref(tileImg);
gdk_pixmap_unref(tileMask);
}
NS_IMETHODIMP nsImageGTK::DrawTile(nsIRenderingContext &aContext, NS_IMETHODIMP nsImageGTK::DrawTile(nsIRenderingContext &aContext,
nsIDrawingSurface* aSurface, nsIDrawingSurface* aSurface,
@ -1780,6 +1830,11 @@ NS_IMETHODIMP nsImageGTK::DrawTile(nsIRenderingContext &aContext,
} }
if (mAlphaDepth == 1) { if (mAlphaDepth == 1) {
if (sNeedSlowTile) {
SlowTile(drawing, aTileRect, aSXOffset, aSYOffset);
return NS_OK;
}
GdkGC *tileGC; GdkGC *tileGC;
GdkGCValues values; GdkGCValues values;
GdkGCValuesMask valuesMask; GdkGCValuesMask valuesMask;

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

@ -45,12 +45,15 @@
#include <gdk/gdk.h> #include <gdk/gdk.h>
#include "nsRegion.h" #include "nsRegion.h"
class nsDrawingSurfaceGTK;
class nsImageGTK : public nsIImage class nsImageGTK : public nsIImage
{ {
public: public:
nsImageGTK(); nsImageGTK();
virtual ~nsImageGTK(); virtual ~nsImageGTK();
static void Startup();
static void Shutdown(); static void Shutdown();
NS_DECL_ISUPPORTS NS_DECL_ISUPPORTS
@ -174,6 +177,9 @@ private:
inline void CreateOffscreenPixmap(PRInt32 aWidth, PRInt32 aHeight); inline void CreateOffscreenPixmap(PRInt32 aWidth, PRInt32 aHeight);
inline void SetupGCForAlpha(GdkGC *aGC, PRInt32 aX, PRInt32 aY); inline void SetupGCForAlpha(GdkGC *aGC, PRInt32 aX, PRInt32 aY);
void SlowTile(nsDrawingSurfaceGTK *aSurface, const nsRect &aTileRect,
PRInt32 aSXOffset, PRInt32 aSYOffset);
PRUint8 *mImageBits; PRUint8 *mImageBits;
GdkPixmap *mImagePixmap; GdkPixmap *mImagePixmap;
PRUint8 *mTrueAlphaBits; PRUint8 *mTrueAlphaBits;