ext/wxBrush.cpp in rwx-0.0.1.dev vs ext/wxBrush.cpp in rwx-0.0.1.1.dev

- old
+ new

@@ -6,28 +6,53 @@ */ #include "wxBrush.hpp" #include "wxColor.hpp" #include "wxBitmap.hpp" +#include "wxApp.hpp" #define _self unwrap<wxBrush*>(self) VALUE rb_cWXBrush; typedef std::map<wxBrush*,VALUE> brushlisttype; brushlisttype brushlistholder; + template <> +VALUE wrap< wxBrush >(wxBrush *bitmap ) +{ + if(!bitmap || !bitmap->IsOk()) + return Qnil; + return wrapTypedPtr(bitmap,rb_cWXBrush); +} + +template <> +VALUE wrap< wxBrush >(const wxBrush &bitmap ) +{ + if(bitmap.IsOk()) + return wrapTypedPtr(const_cast<wxBrush*>(&bitmap),rb_cWXBrush); + return Qnil; +} + +template <> wxBrush unwrap< wxBrush >(const VALUE &vbrush) { - return NIL_P(vbrush) ? wxNullBrush : *unwrap< wxBrush* >(vbrush); + if(NIL_P(vbrush)) + return wxNullBrush; + if(is_wrapable<wxColor>(vbrush)) + return wxBrush(unwrap<wxColor>(vbrush)); + if(rb_obj_is_kind_of(vbrush,rb_cWXBrush)) + return *unwrap< wxBrush* >(vbrush); + else + return wxBrush(unwrap<wxBitmap>(vbrush)); } namespace RubyWX { namespace Brush { DLL_LOCAL VALUE _alloc(VALUE self) { - return wrap(new wxBrush(*wxBLACK)); + return wrapTypedPtr(new wxBrush,self); } macro_attr(Colour,wxColour) macro_attr_enum(Style,wxBrushStyle) macro_attr(Stipple,wxBitmap) @@ -35,10 +60,15 @@ singlereturn(IsHatch) void define_const() { +#if 0 + rb_mWX = rb_define_module("WX"); + rb_cWXBrush = rb_define_class_under(rb_mWX,"Brush",rb_cObject); +#endif + if(rb_const_defined(rb_cWXBrush,rb_intern("BLACK"))) return; rb_define_const(rb_cWXBrush,"BLACK",wrap(wxBLACK_BRUSH)); rb_define_const(rb_cWXBrush,"BLUE",wrap(wxBLUE_BRUSH)); @@ -113,29 +143,53 @@ _setStipple(self, RARRAY_AREF(data,2)); return Qnil; } +struct equal_obj { + wxBrush* self; + VALUE other; +}; + +VALUE _equal_block(equal_obj *obj) +{ + return wrap(*obj->self == unwrap<wxBrush>(obj->other)); +} + +VALUE _equal_rescue(VALUE val) +{ + return Qfalse; +} + /* * call-seq: * == brush -> bool * * compares two brush. * * */ DLL_LOCAL VALUE _equal(VALUE self, VALUE other) { - return wrap((*_self) == unwrap<wxBrush>(other)); + equal_obj obj; + obj.self = _self; + obj.other = other; + + return rb_rescue( + RUBY_METHOD_FUNC(_equal_block),(VALUE)&obj, + RUBY_METHOD_FUNC(_equal_rescue),Qnil + ); } - DLL_LOCAL VALUE _class_get(int argc,VALUE *argv,VALUE self) { VALUE color,style; rb_scan_args(argc, argv, "11",&color,&style); + + app_protected(); + //TODO add refcounting wxBrush *brush = wxTheBrushList->FindOrCreateBrush( unwrap<wxColor>(color), NIL_P(style) ? wxBRUSHSTYLE_SOLID : unwrapenum<wxBrushStyle>(style) ); @@ -147,11 +201,11 @@ brushlisttype::iterator it = brushlistholder.find(brush); if(it != brushlistholder.end()) { return it->second; } else { //wrap wxBrush pointer to ruby object - VALUE result = wrap(brush); + VALUE result = wrapTypedPtr(brush, self); //BrushList objects should not be changed rb_obj_freeze(result); //Prevent BrushList objects from been deleted rwx_refobject(result); @@ -216,16 +270,22 @@ */ DLL_LOCAL void Init_WXBrush(VALUE rb_mWX) { #if 0 + rb_mWX = rb_define_module("WX"); +#endif + using namespace RubyWX::Brush; + rb_cWXBrush = rb_define_class_under(rb_mWX,"Brush",rb_cObject); + rb_define_alloc_func(rb_cWXBrush,_alloc); + +#if 0 rb_define_attr(rb_cWXBrush,"color",1,1); rb_define_attr(rb_cWXBrush,"style",1,1); rb_define_attr(rb_cWXBrush,"stipple",1,1); - //need to rb_define_const(rb_cWXBrush,"BLACK",wrap(wxBLACK_BRUSH)); rb_define_const(rb_cWXBrush,"BLUE",wrap(wxBLUE_BRUSH)); rb_define_const(rb_cWXBrush,"CYAN",wrap(wxCYAN_BRUSH)); rb_define_const(rb_cWXBrush,"GREEN",wrap(wxGREEN_BRUSH)); rb_define_const(rb_cWXBrush,"YELLOW",wrap(wxYELLOW_BRUSH)); @@ -235,25 +295,21 @@ rb_define_const(rb_cWXBrush,"RED",wrap(wxRED_BRUSH)); rb_define_const(rb_cWXBrush,"TRANSPARENT",wrap(wxTRANSPARENT_BRUSH)); rb_define_const(rb_cWXBrush,"WHITE",wrap(wxWHITE_BRUSH)); #endif - using namespace RubyWX::Brush; - rb_cWXBrush = rb_define_class_under(rb_mWX,"Brush",rb_cObject); - rb_define_alloc_func(rb_cWXBrush,_alloc); - rb_define_method(rb_cWXBrush,"initialize",RUBY_METHOD_FUNC(_initialize),-1); rb_define_private_method(rb_cWXBrush,"initialize_copy",RUBY_METHOD_FUNC(_initialize_copy),1); rb_define_attr_method(rb_cWXBrush,"color",_getColour,_setColour); rb_define_attr_method(rb_cWXBrush,"style",_getStyle,_setStyle); rb_define_attr_method(rb_cWXBrush,"stipple",_getStipple,_setStipple); rb_define_method(rb_cWXBrush,"hatch?",RUBY_METHOD_FUNC(_IsHatch),0); rb_define_method(rb_cWXBrush,"marshal_dump",RUBY_METHOD_FUNC(_marshal_dump),0); - rb_define_method(rb_cWXBrush,"marshal_load",RUBY_METHOD_FUNC(_marshal_load),1); + rb_define_method(rb_cWXBrush,"marshal_load",RUBY_METHOD_FUNC(_marshal_load),-2); rb_define_method(rb_cWXBrush,"==",RUBY_METHOD_FUNC(_equal),1); // // rb_define_method(rb_cWXBrush,"to_s",RUBY_METHOD_FUNC(_tos),0); @@ -270,10 +326,11 @@ ->add(wxBRUSHSTYLE_BDIAGONAL_HATCH,"bdiagonal_hatch") ->add(wxBRUSHSTYLE_CROSSDIAG_HATCH,"crossdiag_hatch") ->add(wxBRUSHSTYLE_FDIAGONAL_HATCH,"fdiagonal_hatch") ->add(wxBRUSHSTYLE_CROSS_HATCH,"cross_hatch") ->add(wxBRUSHSTYLE_HORIZONTAL_HATCH,"horizontal_hatch") - ->add(wxBRUSHSTYLE_VERTICAL_HATCH,"vertical_hatch"); + ->add(wxBRUSHSTYLE_VERTICAL_HATCH,"vertical_hatch") + ->allow_array = false; }