Implement wxMask copy ctor for wxGTK.

Without copy ctor copying masks simply crashed because the same pointer was
deleted twice.

Also added a (completely trivial but better than nothing...) unit test for
wxBitmap to check that copying masks does work now.

Closes #11854.

git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@63774 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
Vadim Zeitlin
2010-03-28 23:20:49 +00:00
parent 6f4968ce94
commit 27297c823a
13 changed files with 56 additions and 6 deletions

View File

@@ -503,6 +503,7 @@ All (GUI):
GTK: GTK:
- wxRadioBox constructor uses default consistent with other ports now. - wxRadioBox constructor uses default consistent with other ports now.
- Implement wxMask copy ctor.
- Partially implemented wxTextCtrl::GetStyle() (Igor Romanov). - Partially implemented wxTextCtrl::GetStyle() (Igor Romanov).
- Corrected themed border display. - Corrected themed border display.
- Fix wxClipboard::GetData() for asymmetric wxDataObjects (Timothy Lee). - Fix wxClipboard::GetData() for asymmetric wxDataObjects (Timothy Lee).

View File

@@ -21,6 +21,7 @@ class WXDLLIMPEXP_CORE wxMask: public wxMaskBase
{ {
public: public:
wxMask(); wxMask();
wxMask(const wxMask& mask);
wxMask( const wxBitmap& bitmap, const wxColour& colour ); wxMask( const wxBitmap& bitmap, const wxColour& colour );
#if wxUSE_PALETTE #if wxUSE_PALETTE
wxMask( const wxBitmap& bitmap, int paletteIndex ); wxMask( const wxBitmap& bitmap, int paletteIndex );

View File

@@ -79,6 +79,23 @@ wxMask::wxMask()
m_bitmap = NULL; m_bitmap = NULL;
} }
wxMask::wxMask(const wxMask& mask)
{
if ( !mask.m_bitmap )
{
m_bitmap = NULL;
return;
}
// create a copy of an existing mask
gint w, h;
gdk_drawable_get_size(mask.m_bitmap, &w, &h);
m_bitmap = gdk_pixmap_new(mask.m_bitmap, w, h, 1);
wxGtkObject<GdkGC> gc(gdk_gc_new(m_bitmap));
gdk_draw_drawable(m_bitmap, gc, mask.m_bitmap, 0, 0, 0, 0, -1, -1);
}
wxMask::wxMask( const wxBitmap& bitmap, const wxColour& colour ) wxMask::wxMask( const wxBitmap& bitmap, const wxColour& colour )
{ {
m_bitmap = NULL; m_bitmap = NULL;
@@ -859,12 +876,7 @@ wxGDIRefData* wxBitmap::CloneGDIRefData(const wxGDIRefData* data) const
} }
if (oldRef->m_mask != NULL) if (oldRef->m_mask != NULL)
{ {
newRef->m_mask = new wxMask; newRef->m_mask = new wxMask(*oldRef->m_mask);
newRef->m_mask->m_bitmap = gdk_pixmap_new(
oldRef->m_mask->m_bitmap, oldRef->m_width, oldRef->m_height, 1);
wxGtkObject<GdkGC> gc(gdk_gc_new(newRef->m_mask->m_bitmap));
gdk_draw_drawable(newRef->m_mask->m_bitmap,
gc, oldRef->m_mask->m_bitmap, 0, 0, 0, 0, -1, -1);
} }
return newRef; return newRef;

View File

@@ -135,6 +135,7 @@ TEST_GUI_OBJECTS = \
test_gui_rect.o \ test_gui_rect.o \
test_gui_size.o \ test_gui_size.o \
test_gui_point.o \ test_gui_point.o \
test_gui_bitmap.o \
test_gui_colour.o \ test_gui_colour.o \
test_gui_ellipsization.o \ test_gui_ellipsization.o \
test_gui_measuring.o \ test_gui_measuring.o \
@@ -573,6 +574,9 @@ test_gui_size.o: $(srcdir)/geometry/size.cpp $(TEST_GUI_ODEP)
test_gui_point.o: $(srcdir)/geometry/point.cpp $(TEST_GUI_ODEP) test_gui_point.o: $(srcdir)/geometry/point.cpp $(TEST_GUI_ODEP)
$(CXXC) -c -o $@ $(TEST_GUI_CXXFLAGS) $(srcdir)/geometry/point.cpp $(CXXC) -c -o $@ $(TEST_GUI_CXXFLAGS) $(srcdir)/geometry/point.cpp
test_gui_bitmap.o: $(srcdir)/graphics/bitmap.cpp $(TEST_GUI_ODEP)
$(CXXC) -c -o $@ $(TEST_GUI_CXXFLAGS) $(srcdir)/graphics/bitmap.cpp
test_gui_colour.o: $(srcdir)/graphics/colour.cpp $(TEST_GUI_ODEP) test_gui_colour.o: $(srcdir)/graphics/colour.cpp $(TEST_GUI_ODEP)
$(CXXC) -c -o $@ $(TEST_GUI_CXXFLAGS) $(srcdir)/graphics/colour.cpp $(CXXC) -c -o $@ $(TEST_GUI_CXXFLAGS) $(srcdir)/graphics/colour.cpp

View File

@@ -120,6 +120,7 @@ TEST_GUI_OBJECTS = \
$(OBJS)\test_gui_rect.obj \ $(OBJS)\test_gui_rect.obj \
$(OBJS)\test_gui_size.obj \ $(OBJS)\test_gui_size.obj \
$(OBJS)\test_gui_point.obj \ $(OBJS)\test_gui_point.obj \
$(OBJS)\test_gui_bitmap.obj \
$(OBJS)\test_gui_colour.obj \ $(OBJS)\test_gui_colour.obj \
$(OBJS)\test_gui_ellipsization.obj \ $(OBJS)\test_gui_ellipsization.obj \
$(OBJS)\test_gui_measuring.obj \ $(OBJS)\test_gui_measuring.obj \
@@ -627,6 +628,9 @@ $(OBJS)\test_gui_size.obj: .\geometry\size.cpp
$(OBJS)\test_gui_point.obj: .\geometry\point.cpp $(OBJS)\test_gui_point.obj: .\geometry\point.cpp
$(CXX) -q -c -P -o$@ $(TEST_GUI_CXXFLAGS) .\geometry\point.cpp $(CXX) -q -c -P -o$@ $(TEST_GUI_CXXFLAGS) .\geometry\point.cpp
$(OBJS)\test_gui_bitmap.obj: .\graphics\bitmap.cpp
$(CXX) -q -c -P -o$@ $(TEST_GUI_CXXFLAGS) .\graphics\bitmap.cpp
$(OBJS)\test_gui_colour.obj: .\graphics\colour.cpp $(OBJS)\test_gui_colour.obj: .\graphics\colour.cpp
$(CXX) -q -c -P -o$@ $(TEST_GUI_CXXFLAGS) .\graphics\colour.cpp $(CXX) -q -c -P -o$@ $(TEST_GUI_CXXFLAGS) .\graphics\colour.cpp

View File

@@ -114,6 +114,7 @@ TEST_GUI_OBJECTS = \
$(OBJS)\test_gui_rect.o \ $(OBJS)\test_gui_rect.o \
$(OBJS)\test_gui_size.o \ $(OBJS)\test_gui_size.o \
$(OBJS)\test_gui_point.o \ $(OBJS)\test_gui_point.o \
$(OBJS)\test_gui_bitmap.o \
$(OBJS)\test_gui_colour.o \ $(OBJS)\test_gui_colour.o \
$(OBJS)\test_gui_ellipsization.o \ $(OBJS)\test_gui_ellipsization.o \
$(OBJS)\test_gui_measuring.o \ $(OBJS)\test_gui_measuring.o \
@@ -609,6 +610,9 @@ $(OBJS)\test_gui_size.o: ./geometry/size.cpp
$(OBJS)\test_gui_point.o: ./geometry/point.cpp $(OBJS)\test_gui_point.o: ./geometry/point.cpp
$(CXX) -c -o $@ $(TEST_GUI_CXXFLAGS) $(CPPDEPS) $< $(CXX) -c -o $@ $(TEST_GUI_CXXFLAGS) $(CPPDEPS) $<
$(OBJS)\test_gui_bitmap.o: ./graphics/bitmap.cpp
$(CXX) -c -o $@ $(TEST_GUI_CXXFLAGS) $(CPPDEPS) $<
$(OBJS)\test_gui_colour.o: ./graphics/colour.cpp $(OBJS)\test_gui_colour.o: ./graphics/colour.cpp
$(CXX) -c -o $@ $(TEST_GUI_CXXFLAGS) $(CPPDEPS) $< $(CXX) -c -o $@ $(TEST_GUI_CXXFLAGS) $(CPPDEPS) $<

View File

@@ -115,6 +115,7 @@ TEST_GUI_OBJECTS = \
$(OBJS)\test_gui_rect.obj \ $(OBJS)\test_gui_rect.obj \
$(OBJS)\test_gui_size.obj \ $(OBJS)\test_gui_size.obj \
$(OBJS)\test_gui_point.obj \ $(OBJS)\test_gui_point.obj \
$(OBJS)\test_gui_bitmap.obj \
$(OBJS)\test_gui_colour.obj \ $(OBJS)\test_gui_colour.obj \
$(OBJS)\test_gui_ellipsization.obj \ $(OBJS)\test_gui_ellipsization.obj \
$(OBJS)\test_gui_measuring.obj \ $(OBJS)\test_gui_measuring.obj \
@@ -753,6 +754,9 @@ $(OBJS)\test_gui_size.obj: .\geometry\size.cpp
$(OBJS)\test_gui_point.obj: .\geometry\point.cpp $(OBJS)\test_gui_point.obj: .\geometry\point.cpp
$(CXX) /c /nologo /TP /Fo$@ $(TEST_GUI_CXXFLAGS) .\geometry\point.cpp $(CXX) /c /nologo /TP /Fo$@ $(TEST_GUI_CXXFLAGS) .\geometry\point.cpp
$(OBJS)\test_gui_bitmap.obj: .\graphics\bitmap.cpp
$(CXX) /c /nologo /TP /Fo$@ $(TEST_GUI_CXXFLAGS) .\graphics\bitmap.cpp
$(OBJS)\test_gui_colour.obj: .\graphics\colour.cpp $(OBJS)\test_gui_colour.obj: .\graphics\colour.cpp
$(CXX) /c /nologo /TP /Fo$@ $(TEST_GUI_CXXFLAGS) .\graphics\colour.cpp $(CXX) /c /nologo /TP /Fo$@ $(TEST_GUI_CXXFLAGS) .\graphics\colour.cpp

View File

@@ -358,6 +358,7 @@ TEST_GUI_OBJECTS = &
$(OBJS)\test_gui_rect.obj & $(OBJS)\test_gui_rect.obj &
$(OBJS)\test_gui_size.obj & $(OBJS)\test_gui_size.obj &
$(OBJS)\test_gui_point.obj & $(OBJS)\test_gui_point.obj &
$(OBJS)\test_gui_bitmap.obj &
$(OBJS)\test_gui_colour.obj & $(OBJS)\test_gui_colour.obj &
$(OBJS)\test_gui_ellipsization.obj & $(OBJS)\test_gui_ellipsization.obj &
$(OBJS)\test_gui_measuring.obj & $(OBJS)\test_gui_measuring.obj &
@@ -664,6 +665,9 @@ $(OBJS)\test_gui_size.obj : .AUTODEPEND .\geometry\size.cpp
$(OBJS)\test_gui_point.obj : .AUTODEPEND .\geometry\point.cpp $(OBJS)\test_gui_point.obj : .AUTODEPEND .\geometry\point.cpp
$(CXX) -bt=nt -zq -fo=$^@ $(TEST_GUI_CXXFLAGS) $< $(CXX) -bt=nt -zq -fo=$^@ $(TEST_GUI_CXXFLAGS) $<
$(OBJS)\test_gui_bitmap.obj : .AUTODEPEND .\graphics\bitmap.cpp
$(CXX) -bt=nt -zq -fo=$^@ $(TEST_GUI_CXXFLAGS) $<
$(OBJS)\test_gui_colour.obj : .AUTODEPEND .\graphics\colour.cpp $(OBJS)\test_gui_colour.obj : .AUTODEPEND .\graphics\colour.cpp
$(CXX) -bt=nt -zq -fo=$^@ $(TEST_GUI_CXXFLAGS) $< $(CXX) -bt=nt -zq -fo=$^@ $(TEST_GUI_CXXFLAGS) $<

View File

@@ -116,6 +116,7 @@
geometry/rect.cpp geometry/rect.cpp
geometry/size.cpp geometry/size.cpp
geometry/point.cpp geometry/point.cpp
graphics/bitmap.cpp
graphics/colour.cpp graphics/colour.cpp
graphics/ellipsization.cpp graphics/ellipsization.cpp
graphics/measuring.cpp graphics/measuring.cpp

View File

@@ -235,6 +235,10 @@ LINK32=link.exe
# PROP Default_Filter "" # PROP Default_Filter ""
# Begin Source File # Begin Source File
SOURCE=.\graphics\bitmap.cpp
# End Source File
# Begin Source File
SOURCE=.\sizers\boxsizer.cpp SOURCE=.\sizers\boxsizer.cpp
# End Source File # End Source File
# Begin Source File # Begin Source File

View File

@@ -565,6 +565,9 @@
Name="Source Files" Name="Source Files"
Filter="cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx" Filter="cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx"
UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}"> UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}">
<File
RelativePath=".\graphics\bitmap.cpp">
</File>
<File <File
RelativePath=".\sizers\boxsizer.cpp"> RelativePath=".\sizers\boxsizer.cpp">
</File> </File>

View File

@@ -827,6 +827,10 @@
Filter="cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx" Filter="cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx"
UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}" UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}"
> >
<File
RelativePath=".\graphics\bitmap.cpp"
>
</File>
<File <File
RelativePath=".\sizers\boxsizer.cpp" RelativePath=".\sizers\boxsizer.cpp"
> >

View File

@@ -799,6 +799,10 @@
Filter="cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx" Filter="cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx"
UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}" UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}"
> >
<File
RelativePath=".\graphics\bitmap.cpp"
>
</File>
<File <File
RelativePath=".\sizers\boxsizer.cpp" RelativePath=".\sizers\boxsizer.cpp"
> >