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:
@@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user