make some reference handling a little more direct and less obscure

git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@73386 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
Paul Cornett
2013-01-20 01:46:50 +00:00
parent 0ab8f4023c
commit eb6ee8ab39

View File

@@ -996,7 +996,7 @@ void wxWindowDCImpl::DoDrawIcon( const wxIcon &icon, wxCoord x, wxCoord y )
DoDrawBitmap( (const wxBitmap&)icon, x, y, true ); DoDrawBitmap( (const wxBitmap&)icon, x, y, true );
} }
// scale a pixbuf, return new pixbuf, unref old one // scale a pixbuf
static GdkPixbuf* static GdkPixbuf*
Scale(GdkPixbuf* pixbuf, int dst_w, int dst_h, double sx, double sy) Scale(GdkPixbuf* pixbuf, int dst_w, int dst_h, double sx, double sy)
{ {
@@ -1004,20 +1004,21 @@ Scale(GdkPixbuf* pixbuf, int dst_w, int dst_h, double sx, double sy)
GDK_COLORSPACE_RGB, gdk_pixbuf_get_has_alpha(pixbuf), 8, dst_w, dst_h); GDK_COLORSPACE_RGB, gdk_pixbuf_get_has_alpha(pixbuf), 8, dst_w, dst_h);
gdk_pixbuf_scale(pixbuf, pixbuf_scaled, gdk_pixbuf_scale(pixbuf, pixbuf_scaled,
0, 0, dst_w, dst_h, 0, 0, sx, sy, GDK_INTERP_NEAREST); 0, 0, dst_w, dst_h, 0, 0, sx, sy, GDK_INTERP_NEAREST);
g_object_unref(pixbuf);
return pixbuf_scaled; return pixbuf_scaled;
} }
// scale part of a pixmap using pixbuf scaling, return pixbuf // scale part of a pixmap using pixbuf scaling
static GdkPixbuf* static GdkPixbuf*
Scale(GdkPixmap* pixmap, int x, int y, int w, int h, int dst_w, int dst_h, double sx, double sy) Scale(GdkPixmap* pixmap, int x, int y, int w, int h, int dst_w, int dst_h, double sx, double sy)
{ {
GdkPixbuf* pixbuf = gdk_pixbuf_get_from_drawable( GdkPixbuf* pixbuf = gdk_pixbuf_get_from_drawable(
NULL, pixmap, NULL, x, y, 0, 0, w, h); NULL, pixmap, NULL, x, y, 0, 0, w, h);
return Scale(pixbuf, dst_w, dst_h, sx, sy); GdkPixbuf* pixbuf2 = Scale(pixbuf, dst_w, dst_h, sx, sy);
g_object_unref(pixbuf);
return pixbuf2;
} }
// scale part of a mask pixmap, return new mask, unref old one // scale part of a mask pixmap
static GdkPixmap* static GdkPixmap*
ScaleMask(GdkPixmap* mask, int x, int y, int w, int h, int dst_w, int dst_h, double sx, double sy) ScaleMask(GdkPixmap* mask, int x, int y, int w, int h, int dst_w, int dst_h, double sx, double sy)
{ {
@@ -1041,12 +1042,10 @@ ScaleMask(GdkPixmap* mask, int x, int y, int w, int h, int dst_w, int dst_h, dou
g_object_unref(pixbuf); g_object_unref(pixbuf);
GdkPixmap* pixmap = gdk_bitmap_create_from_data(mask, data, dst_w, dst_h); GdkPixmap* pixmap = gdk_bitmap_create_from_data(mask, data, dst_w, dst_h);
delete[] data; delete[] data;
g_object_unref(mask);
return pixmap; return pixmap;
} }
// Make a new mask from part of a mask and a clip region. // Make a new mask from part of a mask and a clip region.
// Return new mask, unref old one.
static GdkPixmap* static GdkPixmap*
ClipMask(GdkPixmap* mask, GdkRegion* clipRegion, int x, int y, int dst_x, int dst_y, int w, int h) ClipMask(GdkPixmap* mask, GdkRegion* clipRegion, int x, int y, int dst_x, int dst_y, int w, int h)
{ {
@@ -1061,7 +1060,6 @@ ClipMask(GdkPixmap* mask, GdkRegion* clipRegion, int x, int y, int dst_x, int ds
// draw old mask onto new one, with clip // draw old mask onto new one, with clip
gdk_draw_drawable(pixmap, gc, mask, x, y, 0, 0, w, h); gdk_draw_drawable(pixmap, gc, mask, x, y, 0, 0, w, h);
g_object_unref(gc); g_object_unref(gc);
g_object_unref(mask);
return pixmap; return pixmap;
} }
@@ -1136,39 +1134,42 @@ void wxWindowDCImpl::DoDrawBitmap( const wxBitmap &bitmap,
} }
if (mask) if (mask)
{ {
g_object_ref(mask); GdkPixmap* mask_new = NULL;
if (isScaled) if (isScaled)
{
mask = ScaleMask(mask, 0, 0, w, h, ww, hh, m_scaleX, m_scaleY); mask = ScaleMask(mask, 0, 0, w, h, ww, hh, m_scaleX, m_scaleY);
mask_new = mask;
}
if (overlap == wxPartRegion) if (overlap == wxPartRegion)
{ {
// need a new mask that also masks the clipped area, // need a new mask that also masks the clipped area,
// because gc can't have both a mask and a clip region // because gc can't have both a mask and a clip region
mask = ClipMask(mask, clipRegion, 0, 0, xx, yy, ww, hh); mask = ClipMask(mask, clipRegion, 0, 0, xx, yy, ww, hh);
if (mask_new)
g_object_unref(mask_new);
mask_new = mask;
} }
gdk_gc_set_clip_mask(use_gc, mask); gdk_gc_set_clip_mask(use_gc, mask);
gdk_gc_set_clip_origin(use_gc, xx, yy); gdk_gc_set_clip_origin(use_gc, xx, yy);
if (mask_new)
g_object_unref(mask_new);
} }
// determine whether to use pixmap or pixbuf // determine whether to use pixmap or pixbuf
GdkPixmap* pixmap = NULL; GdkPixmap* pixmap = NULL;
GdkPixmap* pixmap_new = NULL;
GdkPixbuf* pixbuf = NULL; GdkPixbuf* pixbuf = NULL;
GdkPixbuf* pixbuf_new = NULL;
if (bitmap.HasPixmap()) if (bitmap.HasPixmap())
pixmap = bitmap.GetPixmap(); pixmap = bitmap.GetPixmap();
if (pixmap && gdk_drawable_get_depth(pixmap) == 1) if (pixmap && gdk_drawable_get_depth(pixmap) == 1)
{ {
// convert mono pixmap to color using text fg/bg colors // convert mono pixmap to color using text fg/bg colors
pixmap = MonoToColor(pixmap, 0, 0, w, h); pixmap = MonoToColor(pixmap, 0, 0, w, h);
pixmap_new = pixmap;
} }
else if (hasAlpha || pixmap == NULL) else if (hasAlpha || pixmap == NULL)
{
pixmap = NULL;
pixbuf = bitmap.GetPixbuf(); pixbuf = bitmap.GetPixbuf();
g_object_ref(pixbuf);
}
else
{
g_object_ref(pixmap);
}
if (isScaled) if (isScaled)
{ {
@@ -1176,26 +1177,26 @@ void wxWindowDCImpl::DoDrawBitmap( const wxBitmap &bitmap,
pixbuf = Scale(pixbuf, ww, hh, m_scaleX, m_scaleY); pixbuf = Scale(pixbuf, ww, hh, m_scaleX, m_scaleY);
else else
pixbuf = Scale(pixmap, 0, 0, w, h, ww, hh, m_scaleX, m_scaleY); pixbuf = Scale(pixmap, 0, 0, w, h, ww, hh, m_scaleX, m_scaleY);
pixbuf_new = pixbuf;
} }
if (pixbuf) if (pixbuf)
{ {
gdk_draw_pixbuf(m_gdkwindow, use_gc, pixbuf, gdk_draw_pixbuf(m_gdkwindow, use_gc, pixbuf,
0, 0, xx, yy, ww, hh, GDK_RGB_DITHER_NORMAL, 0, 0); 0, 0, xx, yy, ww, hh, GDK_RGB_DITHER_NORMAL, 0, 0);
g_object_unref(pixbuf);
} }
else else
{ {
gdk_draw_drawable(m_gdkwindow, use_gc, pixmap, 0, 0, xx, yy, ww, hh); gdk_draw_drawable(m_gdkwindow, use_gc, pixmap, 0, 0, xx, yy, ww, hh);
} }
if (pixmap) if (pixbuf_new)
g_object_unref(pixmap); g_object_unref(pixbuf_new);
if (pixmap_new)
g_object_unref(pixmap_new);
if (mask) if (mask)
{
g_object_unref(mask);
gdk_gc_set_clip_region(use_gc, clipRegion); gdk_gc_set_clip_region(use_gc, clipRegion);
}
} }
bool wxWindowDCImpl::DoBlit( wxCoord xdest, wxCoord ydest, bool wxWindowDCImpl::DoBlit( wxCoord xdest, wxCoord ydest,
@@ -1304,7 +1305,6 @@ bool wxWindowDCImpl::DoBlit( wxCoord xdest, wxCoord ydest,
if (mask) if (mask)
{ {
g_object_ref(mask);
int srcMask_x = src_x; int srcMask_x = src_x;
int srcMask_y = src_y; int srcMask_y = src_y;
if (xsrcMask != -1 || ysrcMask != -1) if (xsrcMask != -1 || ysrcMask != -1)
@@ -1312,10 +1312,12 @@ bool wxWindowDCImpl::DoBlit( wxCoord xdest, wxCoord ydest,
srcMask_x = source->LogicalToDeviceX(xsrcMask); srcMask_x = source->LogicalToDeviceX(xsrcMask);
srcMask_y = source->LogicalToDeviceY(ysrcMask); srcMask_y = source->LogicalToDeviceY(ysrcMask);
} }
GdkPixmap* mask_new = NULL;
if (isScaled) if (isScaled)
{ {
mask = ScaleMask(mask, srcMask_x, srcMask_y, mask = ScaleMask(mask, srcMask_x, srcMask_y,
src_w, src_h, dst_w, dst_h, scale_x, scale_y); src_w, src_h, dst_w, dst_h, scale_x, scale_y);
mask_new = mask;
srcMask_x = 0; srcMask_x = 0;
srcMask_y = 0; srcMask_y = 0;
} }
@@ -1325,11 +1327,16 @@ bool wxWindowDCImpl::DoBlit( wxCoord xdest, wxCoord ydest,
// because gc can't have both a mask and a clip region // because gc can't have both a mask and a clip region
mask = ClipMask(mask, clipRegion, mask = ClipMask(mask, clipRegion,
srcMask_x, srcMask_y, dst_x, dst_y, dst_w, dst_h); srcMask_x, srcMask_y, dst_x, dst_y, dst_w, dst_h);
if (mask_new)
g_object_unref(mask_new);
mask_new = mask;
srcMask_x = 0; srcMask_x = 0;
srcMask_y = 0; srcMask_y = 0;
} }
gdk_gc_set_clip_mask(use_gc, mask); gdk_gc_set_clip_mask(use_gc, mask);
gdk_gc_set_clip_origin(use_gc, dst_x - srcMask_x, dst_y - srcMask_y); gdk_gc_set_clip_origin(use_gc, dst_x - srcMask_x, dst_y - srcMask_y);
if (mask_new)
g_object_unref(mask_new);
} }
GdkPixmap* pixmap = NULL; GdkPixmap* pixmap = NULL;
@@ -1369,10 +1376,8 @@ bool wxWindowDCImpl::DoBlit( wxCoord xdest, wxCoord ydest,
if (pixmap) if (pixmap)
g_object_unref(pixmap); g_object_unref(pixmap);
if (mask) if (mask)
{
g_object_unref(mask);
gdk_gc_set_clip_region(use_gc, clipRegion); gdk_gc_set_clip_region(use_gc, clipRegion);
}
return true; return true;
} }