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