Revert Disposable concept back into core
Pretty much a revert of
e858bbdcf5.
We need this in core to properly implement F12 reset.
			
			
This commit is contained in:
		
							parent
							
								
									3983fe66e9
								
							
						
					
					
						commit
						81ac0780f8
					
				
					 36 changed files with 476 additions and 210 deletions
				
			
		| 
						 | 
					@ -101,22 +101,12 @@ static void freeInstance(void *inst)
 | 
				
			||||||
void
 | 
					void
 | 
				
			||||||
raiseDisposedAccess(VALUE self);
 | 
					raiseDisposedAccess(VALUE self);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
inline void
 | 
					 | 
				
			||||||
checkDisposed(VALUE self)
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
	if (!RTYPEDDATA_DATA(self))
 | 
					 | 
				
			||||||
		raiseDisposedAccess(self);
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
template<class C>
 | 
					template<class C>
 | 
				
			||||||
inline C *
 | 
					inline C *
 | 
				
			||||||
getPrivateData(VALUE self)
 | 
					getPrivateData(VALUE self)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	C *c = static_cast<C*>(RTYPEDDATA_DATA(self));
 | 
						C *c = static_cast<C*>(RTYPEDDATA_DATA(self));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (!c)
 | 
					 | 
				
			||||||
		raiseDisposedAccess(self);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	return c;
 | 
						return c;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -124,8 +114,6 @@ template<class C>
 | 
				
			||||||
static inline C *
 | 
					static inline C *
 | 
				
			||||||
getPrivateDataCheck(VALUE self, const rb_data_type_t &type)
 | 
					getPrivateDataCheck(VALUE self, const rb_data_type_t &type)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	/* We don't check for disposed here because any disposable
 | 
					 | 
				
			||||||
	 * property is always also nullable */
 | 
					 | 
				
			||||||
	void *obj = Check_TypedStruct(self, &type);
 | 
						void *obj = Check_TypedStruct(self, &type);
 | 
				
			||||||
	return static_cast<C*>(obj);
 | 
						return static_cast<C*>(obj);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
| 
						 | 
					@ -341,7 +329,7 @@ rb_check_argc(int actual, int expected)
 | 
				
			||||||
	RB_METHOD(Klass##Get##PropName) \
 | 
						RB_METHOD(Klass##Get##PropName) \
 | 
				
			||||||
	{ \
 | 
						{ \
 | 
				
			||||||
		RB_UNUSED_PARAM; \
 | 
							RB_UNUSED_PARAM; \
 | 
				
			||||||
		checkDisposed(self); \
 | 
							checkDisposed<Klass>(self); \
 | 
				
			||||||
		return rb_iv_get(self, prop_iv); \
 | 
							return rb_iv_get(self, prop_iv); \
 | 
				
			||||||
	} \
 | 
						} \
 | 
				
			||||||
	RB_METHOD(Klass##Set##PropName) \
 | 
						RB_METHOD(Klass##Set##PropName) \
 | 
				
			||||||
| 
						 | 
					@ -360,7 +348,9 @@ rb_check_argc(int actual, int expected)
 | 
				
			||||||
	{ \
 | 
						{ \
 | 
				
			||||||
		RB_UNUSED_PARAM; \
 | 
							RB_UNUSED_PARAM; \
 | 
				
			||||||
		Klass *k = getPrivateData<Klass>(self); \
 | 
							Klass *k = getPrivateData<Klass>(self); \
 | 
				
			||||||
		return value_fun(k->get##PropName()); \
 | 
							type value; \
 | 
				
			||||||
 | 
							GUARD_EXC( value = k->get##PropName(); ) \
 | 
				
			||||||
 | 
							return value_fun(value); \
 | 
				
			||||||
	} \
 | 
						} \
 | 
				
			||||||
	RB_METHOD(Klass##Set##PropName) \
 | 
						RB_METHOD(Klass##Set##PropName) \
 | 
				
			||||||
	{ \
 | 
						{ \
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -128,7 +128,7 @@ RB_METHOD(bitmapBlt)
 | 
				
			||||||
	src = getPrivateDataCheck<Bitmap>(srcObj, BitmapType);
 | 
						src = getPrivateDataCheck<Bitmap>(srcObj, BitmapType);
 | 
				
			||||||
	srcRect = getPrivateDataCheck<Rect>(srcRectObj, RectType);
 | 
						srcRect = getPrivateDataCheck<Rect>(srcRectObj, RectType);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	GUARD_EXC( b->blt(x, y, src, srcRect->toIntRect(), opacity); );
 | 
						GUARD_EXC( b->blt(x, y, *src, srcRect->toIntRect(), opacity); );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	return self;
 | 
						return self;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
| 
						 | 
					@ -151,7 +151,7 @@ RB_METHOD(bitmapStretchBlt)
 | 
				
			||||||
	destRect = getPrivateDataCheck<Rect>(destRectObj, RectType);
 | 
						destRect = getPrivateDataCheck<Rect>(destRectObj, RectType);
 | 
				
			||||||
	srcRect = getPrivateDataCheck<Rect>(srcRectObj, RectType);
 | 
						srcRect = getPrivateDataCheck<Rect>(srcRectObj, RectType);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	GUARD_EXC( b->stretchBlt(destRect->toIntRect(), src, srcRect->toIntRect(), opacity); );
 | 
						GUARD_EXC( b->stretchBlt(destRect->toIntRect(), *src, srcRect->toIntRect(), opacity); );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	return self;
 | 
						return self;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -64,32 +64,48 @@ RB_METHOD(disposableDispose)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	RB_UNUSED_PARAM;
 | 
						RB_UNUSED_PARAM;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	C *c = static_cast<C*>(RTYPEDDATA_DATA(self));
 | 
						C *d = getPrivateData<C>(self);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if (!d)
 | 
				
			||||||
 | 
							return Qnil;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	/* Nothing to do if already disposed */
 | 
						/* Nothing to do if already disposed */
 | 
				
			||||||
	if (!c)
 | 
						if (d->isDisposed())
 | 
				
			||||||
		return Qnil;
 | 
							return Qnil;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	disposableDisposeChildren(self);
 | 
						disposableDisposeChildren(self);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	delete c;
 | 
						d->dispose();
 | 
				
			||||||
	setPrivateData(self, 0);
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
	return Qnil;
 | 
						return Qnil;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					template<class C>
 | 
				
			||||||
RB_METHOD(disposableIsDisposed)
 | 
					RB_METHOD(disposableIsDisposed)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	RB_UNUSED_PARAM;
 | 
						RB_UNUSED_PARAM;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	return rb_bool_new(RTYPEDDATA_DATA(self) == 0);
 | 
						C *d = getPrivateData<C>(self);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if (!d)
 | 
				
			||||||
 | 
							return Qtrue;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						return rb_bool_new(d->isDisposed());
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
template<class C>
 | 
					template<class C>
 | 
				
			||||||
static void disposableBindingInit(VALUE klass)
 | 
					static void disposableBindingInit(VALUE klass)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	_rb_define_method(klass, "dispose", disposableDispose<C>);
 | 
						_rb_define_method(klass, "dispose", disposableDispose<C>);
 | 
				
			||||||
	_rb_define_method(klass, "disposed?", disposableIsDisposed);
 | 
						_rb_define_method(klass, "disposed?", disposableIsDisposed<C>);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					template<class C>
 | 
				
			||||||
 | 
					inline void
 | 
				
			||||||
 | 
					checkDisposed(VALUE self)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						if (disposableIsDisposed<C>(0, 0, self) == Qtrue)
 | 
				
			||||||
 | 
							raiseDisposedAccess(self);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#endif // DISPOSABLEBINDING_H
 | 
					#endif // DISPOSABLEBINDING_H
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -160,6 +160,9 @@ RB_METHOD(FontSetName)
 | 
				
			||||||
	return argv[0];
 | 
						return argv[0];
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					template<class C>
 | 
				
			||||||
 | 
					static void checkDisposed(VALUE) {}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
DEF_PROP_OBJ_VAL(Font, Color, Color,    "color")
 | 
					DEF_PROP_OBJ_VAL(Font, Color, Color,    "color")
 | 
				
			||||||
DEF_PROP_OBJ_VAL(Font, Color, OutColor, "out_color")
 | 
					DEF_PROP_OBJ_VAL(Font, Color, OutColor, "out_color")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -101,6 +101,8 @@ RB_METHOD(tilemapGetAutotiles)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	RB_UNUSED_PARAM;
 | 
						RB_UNUSED_PARAM;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						checkDisposed<Tilemap>(self);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	return rb_iv_get(self, "autotiles");
 | 
						return rb_iv_get(self, "autotiles");
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -119,7 +121,7 @@ RB_METHOD(tilemapGetViewport)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	RB_UNUSED_PARAM;
 | 
						RB_UNUSED_PARAM;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	checkDisposed(self);
 | 
						checkDisposed<Tilemap>(self);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	return rb_iv_get(self, "viewport");
 | 
						return rb_iv_get(self, "viewport");
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -71,6 +71,8 @@ RB_METHOD(tilemapVXGetBitmapArray)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	RB_UNUSED_PARAM;
 | 
						RB_UNUSED_PARAM;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						checkDisposed<TilemapVX>(self);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	return rb_iv_get(self, "bitmap_array");
 | 
						return rb_iv_get(self, "bitmap_array");
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -35,7 +35,7 @@ RB_METHOD(viewportElementGetViewport)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	RB_UNUSED_PARAM;
 | 
						RB_UNUSED_PARAM;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	checkDisposed(self);
 | 
						checkDisposed<C>(self);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	return rb_iv_get(self, "viewport");
 | 
						return rb_iv_get(self, "viewport");
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -155,7 +155,7 @@ defineClass(mrb_state *mrb, const char *name)
 | 
				
			||||||
#define DEF_PROP_OBJ_VAL(Klass, PropKlass, PropName, prop_iv) \
 | 
					#define DEF_PROP_OBJ_VAL(Klass, PropKlass, PropName, prop_iv) \
 | 
				
			||||||
	MRB_METHOD(Klass##Get##PropName) \
 | 
						MRB_METHOD(Klass##Get##PropName) \
 | 
				
			||||||
	{ \
 | 
						{ \
 | 
				
			||||||
		checkDisposed(mrb, self); \
 | 
							checkDisposed<Klass>(mrb, self); \
 | 
				
			||||||
		return getProperty(mrb, self, prop_iv); \
 | 
							return getProperty(mrb, self, prop_iv); \
 | 
				
			||||||
	} \
 | 
						} \
 | 
				
			||||||
	MRB_METHOD(Klass##Set##PropName) \
 | 
						MRB_METHOD(Klass##Set##PropName) \
 | 
				
			||||||
| 
						 | 
					@ -194,7 +194,9 @@ defineClass(mrb_state *mrb, const char *name)
 | 
				
			||||||
	MRB_METHOD(Klass##Get##PropName) \
 | 
						MRB_METHOD(Klass##Get##PropName) \
 | 
				
			||||||
	{ \
 | 
						{ \
 | 
				
			||||||
		Klass *k = getPrivateData<Klass>(mrb, self); \
 | 
							Klass *k = getPrivateData<Klass>(mrb, self); \
 | 
				
			||||||
		return mrb_##conv_t##_value(k->get##PropName()); \
 | 
							mrb_type value; \
 | 
				
			||||||
 | 
							GUARD_EXC( value = k->get##PropName(); ) \
 | 
				
			||||||
 | 
							return mrb_##conv_t##_value(value); \
 | 
				
			||||||
	} \
 | 
						} \
 | 
				
			||||||
	MRB_METHOD(Klass##Set##PropName) \
 | 
						MRB_METHOD(Klass##Set##PropName) \
 | 
				
			||||||
	{ \
 | 
						{ \
 | 
				
			||||||
| 
						 | 
					@ -256,21 +258,12 @@ getSym(mrb_state *mrb, CommonSymbol sym)
 | 
				
			||||||
void
 | 
					void
 | 
				
			||||||
raiseDisposedAccess(mrb_state *mrb, mrb_value self);
 | 
					raiseDisposedAccess(mrb_state *mrb, mrb_value self);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
inline void checkDisposed(mrb_state *mrb, mrb_value self)
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
	if (!DATA_PTR(self))
 | 
					 | 
				
			||||||
		raiseDisposedAccess(mrb, self);
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
template<class C>
 | 
					template<class C>
 | 
				
			||||||
inline C *
 | 
					inline C *
 | 
				
			||||||
getPrivateData(mrb_state *mrb, mrb_value self)
 | 
					getPrivateData(mrb_state *, mrb_value self)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	C *c = static_cast<C*>(DATA_PTR(self));
 | 
						C *c = static_cast<C*>(DATA_PTR(self));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (!c)
 | 
					 | 
				
			||||||
		raiseDisposedAccess(mrb, self);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	return c;
 | 
						return c;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -114,7 +114,7 @@ MRB_METHOD(bitmapBlt)
 | 
				
			||||||
	src = getPrivateDataCheck<Bitmap>(mrb, srcObj, BitmapType);
 | 
						src = getPrivateDataCheck<Bitmap>(mrb, srcObj, BitmapType);
 | 
				
			||||||
	srcRect = getPrivateDataCheck<Rect>(mrb, srcRectObj, RectType);
 | 
						srcRect = getPrivateDataCheck<Rect>(mrb, srcRectObj, RectType);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	GUARD_EXC( b->blt(x, y, src, srcRect->toIntRect(), opacity); )
 | 
						GUARD_EXC( b->blt(x, y, *src, srcRect->toIntRect(), opacity); )
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	return mrb_nil_value();
 | 
						return mrb_nil_value();
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
| 
						 | 
					@ -137,7 +137,7 @@ MRB_METHOD(bitmapStretchBlt)
 | 
				
			||||||
	destRect = getPrivateDataCheck<Rect>(mrb, destRectObj, RectType);
 | 
						destRect = getPrivateDataCheck<Rect>(mrb, destRectObj, RectType);
 | 
				
			||||||
	srcRect = getPrivateDataCheck<Rect>(mrb, srcRectObj, RectType);
 | 
						srcRect = getPrivateDataCheck<Rect>(mrb, srcRectObj, RectType);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	GUARD_EXC( b->stretchBlt(destRect->toIntRect(), src, srcRect->toIntRect(), opacity); )
 | 
						GUARD_EXC( b->stretchBlt(destRect->toIntRect(), *src, srcRect->toIntRect(), opacity); )
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	return mrb_nil_value();
 | 
						return mrb_nil_value();
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
| 
						 | 
					@ -280,7 +280,7 @@ MRB_METHOD(bitmapTextSize)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
MRB_METHOD(bitmapGetFont)
 | 
					MRB_METHOD(bitmapGetFont)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	checkDisposed(mrb, self);
 | 
						checkDisposed<Bitmap>(mrb, self);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	return getProperty(mrb, self, CSfont);
 | 
						return getProperty(mrb, self, CSfont);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -66,33 +66,47 @@ disposableDisposeChildren(mrb_state *mrb, mrb_value disp)
 | 
				
			||||||
template<class C>
 | 
					template<class C>
 | 
				
			||||||
MRB_METHOD(disposableDispose)
 | 
					MRB_METHOD(disposableDispose)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	C *c = static_cast<C*>(DATA_PTR(self));
 | 
						C *d = static_cast<C*>(DATA_PTR(self));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	/* Nothing to do if already disposed */
 | 
						if (!d)
 | 
				
			||||||
	if (!c)
 | 
							return mrb_nil_value();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if (d->isDisposed())
 | 
				
			||||||
		return mrb_nil_value();
 | 
							return mrb_nil_value();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	disposableDisposeChildren(mrb, self);
 | 
						disposableDisposeChildren(mrb, self);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	delete c;
 | 
						d->dispose();
 | 
				
			||||||
	DATA_PTR(self) = 0;
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
	return mrb_nil_value();
 | 
						return mrb_nil_value();
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
template<class C>
 | 
					template<class C>
 | 
				
			||||||
MRB_METHOD(disposableDisposed)
 | 
					MRB_METHOD(disposableIsDisposed)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	MRB_UNUSED_PARAM;
 | 
						MRB_UNUSED_PARAM;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	return mrb_bool_value(DATA_PTR(self) == 0);
 | 
						C *d = static_cast<C*>(DATA_PTR(self));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if (!d)
 | 
				
			||||||
 | 
							return mrb_true_value();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						return mrb_bool_value(d->isDisposed());
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
template<class C>
 | 
					template<class C>
 | 
				
			||||||
static void disposableBindingInit(mrb_state *mrb, RClass *klass)
 | 
					static void disposableBindingInit(mrb_state *mrb, RClass *klass)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	mrb_define_method(mrb, klass, "dispose", disposableDispose<C>, MRB_ARGS_NONE());
 | 
						mrb_define_method(mrb, klass, "dispose", disposableDispose<C>, MRB_ARGS_NONE());
 | 
				
			||||||
	mrb_define_method(mrb, klass, "disposed?", disposableDisposed<C>, MRB_ARGS_NONE());
 | 
						mrb_define_method(mrb, klass, "disposed?", disposableIsDisposed<C>, MRB_ARGS_NONE());
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					template<class C>
 | 
				
			||||||
 | 
					inline void
 | 
				
			||||||
 | 
					checkDisposed(mrb_state *mrb, mrb_value self)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						if (mrb_test(disposableIsDisposed<C>(0, self)))
 | 
				
			||||||
 | 
							raiseDisposedAccess(mrb, self);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#endif // DISPOSABLEBINDING_H
 | 
					#endif // DISPOSABLEBINDING_H
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -103,6 +103,9 @@ MRB_METHOD(FontSetName)
 | 
				
			||||||
	return name;
 | 
						return name;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					template<class C>
 | 
				
			||||||
 | 
					static void checkDisposed(mrb_state *, mrb_value) {}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
DEF_PROP_I(Font, Size)
 | 
					DEF_PROP_I(Font, Size)
 | 
				
			||||||
DEF_PROP_B(Font, Bold)
 | 
					DEF_PROP_B(Font, Bold)
 | 
				
			||||||
DEF_PROP_B(Font, Italic)
 | 
					DEF_PROP_B(Font, Italic)
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -106,6 +106,8 @@ MRB_METHOD(tilemapInitialize)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
MRB_METHOD(tilemapGetAutotiles)
 | 
					MRB_METHOD(tilemapGetAutotiles)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
 | 
						checkDisposed<Tilemap>(mrb, self);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	return getProperty(mrb, self, CSautotiles);
 | 
						return getProperty(mrb, self, CSautotiles);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -120,7 +122,7 @@ MRB_METHOD(tilemapUpdate)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
MRB_METHOD(tilemapGetViewport)
 | 
					MRB_METHOD(tilemapGetViewport)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	checkDisposed(mrb, self);
 | 
						checkDisposed<Tilemap>(mrb, self);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	return getProperty(mrb, self, CSviewport);
 | 
						return getProperty(mrb, self, CSviewport);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -32,7 +32,7 @@
 | 
				
			||||||
template<class C>
 | 
					template<class C>
 | 
				
			||||||
MRB_METHOD(viewportElementGetViewport)
 | 
					MRB_METHOD(viewportElementGetViewport)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	checkDisposed(mrb, self);
 | 
						checkDisposed<C>(mrb, self);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	return getProperty(mrb, self, CSviewport);
 | 
						return getProperty(mrb, self, CSviewport);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -297,21 +297,18 @@ Bitmap::Bitmap(const Bitmap &other)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	p->gl = shState->texPool().request(other.width(), other.height());
 | 
						p->gl = shState->texPool().request(other.width(), other.height());
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	blt(0, 0, &other, rect());
 | 
						blt(0, 0, other, rect());
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
Bitmap::~Bitmap()
 | 
					Bitmap::~Bitmap()
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	if (p->megaSurface)
 | 
						dispose();
 | 
				
			||||||
		SDL_FreeSurface(p->megaSurface);
 | 
					 | 
				
			||||||
	else
 | 
					 | 
				
			||||||
		shState->texPool().release(p->gl);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	delete p;
 | 
					 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
int Bitmap::width() const
 | 
					int Bitmap::width() const
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
 | 
						guardDisposed();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (p->megaSurface)
 | 
						if (p->megaSurface)
 | 
				
			||||||
		return p->megaSurface->w;
 | 
							return p->megaSurface->w;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -320,6 +317,8 @@ int Bitmap::width() const
 | 
				
			||||||
 | 
					
 | 
				
			||||||
int Bitmap::height() const
 | 
					int Bitmap::height() const
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
 | 
						guardDisposed();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (p->megaSurface)
 | 
						if (p->megaSurface)
 | 
				
			||||||
		return p->megaSurface->h;
 | 
							return p->megaSurface->h;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -328,14 +327,16 @@ int Bitmap::height() const
 | 
				
			||||||
 | 
					
 | 
				
			||||||
IntRect Bitmap::rect() const
 | 
					IntRect Bitmap::rect() const
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
 | 
						guardDisposed();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	return IntRect(0, 0, width(), height());
 | 
						return IntRect(0, 0, width(), height());
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void Bitmap::blt(int x, int y,
 | 
					void Bitmap::blt(int x, int y,
 | 
				
			||||||
                  const Bitmap *source, IntRect rect,
 | 
					                  const Bitmap &source, IntRect rect,
 | 
				
			||||||
                  int opacity)
 | 
					                  int opacity)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	if (!source)
 | 
						if (source.isDisposed())
 | 
				
			||||||
		return;
 | 
							return;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	// FIXME: RGSS allows the source rect to both lie outside
 | 
						// FIXME: RGSS allows the source rect to both lie outside
 | 
				
			||||||
| 
						 | 
					@ -344,23 +345,25 @@ void Bitmap::blt(int x, int y,
 | 
				
			||||||
	// doesn't fix anything for a direct stretch_blt call).
 | 
						// doesn't fix anything for a direct stretch_blt call).
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	/* Clamp rect to source bitmap size */
 | 
						/* Clamp rect to source bitmap size */
 | 
				
			||||||
	if (rect.x + rect.w > source->width())
 | 
						if (rect.x + rect.w > source.width())
 | 
				
			||||||
		rect.w = source->width() - rect.x;
 | 
							rect.w = source.width() - rect.x;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (rect.y + rect.h > source->height())
 | 
						if (rect.y + rect.h > source.height())
 | 
				
			||||||
		rect.h = source->height() - rect.y;
 | 
							rect.h = source.height() - rect.y;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	stretchBlt(IntRect(x, y, rect.w, rect.h),
 | 
						stretchBlt(IntRect(x, y, rect.w, rect.h),
 | 
				
			||||||
	           source, rect, opacity);
 | 
						           source, rect, opacity);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void Bitmap::stretchBlt(const IntRect &destRect,
 | 
					void Bitmap::stretchBlt(const IntRect &destRect,
 | 
				
			||||||
                        const Bitmap *source, const IntRect &sourceRect,
 | 
					                        const Bitmap &source, const IntRect &sourceRect,
 | 
				
			||||||
                        int opacity)
 | 
					                        int opacity)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
 | 
						guardDisposed();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	GUARD_MEGA;
 | 
						GUARD_MEGA;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (!source)
 | 
						if (source.isDisposed())
 | 
				
			||||||
		return;
 | 
							return;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	opacity = clamp(opacity, 0, 255);
 | 
						opacity = clamp(opacity, 0, 255);
 | 
				
			||||||
| 
						 | 
					@ -368,13 +371,13 @@ void Bitmap::stretchBlt(const IntRect &destRect,
 | 
				
			||||||
	if (opacity == 0)
 | 
						if (opacity == 0)
 | 
				
			||||||
		return;
 | 
							return;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (source->megaSurface())
 | 
						if (source.megaSurface())
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
		/* Don't do transparent blits for now */
 | 
							/* Don't do transparent blits for now */
 | 
				
			||||||
		if (opacity < 255)
 | 
							if (opacity < 255)
 | 
				
			||||||
			source->ensureNonMega();
 | 
								source.ensureNonMega();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		SDL_Surface *srcSurf = source->megaSurface();
 | 
							SDL_Surface *srcSurf = source.megaSurface();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		SDL_Rect srcRect = sourceRect;
 | 
							SDL_Rect srcRect = sourceRect;
 | 
				
			||||||
		SDL_Rect dstRect = destRect;
 | 
							SDL_Rect dstRect = destRect;
 | 
				
			||||||
| 
						 | 
					@ -421,7 +424,7 @@ void Bitmap::stretchBlt(const IntRect &destRect,
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
		/* Fast blit */
 | 
							/* Fast blit */
 | 
				
			||||||
		GLMeta::blitBegin(p->gl);
 | 
							GLMeta::blitBegin(p->gl);
 | 
				
			||||||
		GLMeta::blitSource(source->p->gl);
 | 
							GLMeta::blitSource(source.p->gl);
 | 
				
			||||||
		GLMeta::blitRectangle(sourceRect, destRect);
 | 
							GLMeta::blitRectangle(sourceRect, destRect);
 | 
				
			||||||
		GLMeta::blitEnd();
 | 
							GLMeta::blitEnd();
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
| 
						 | 
					@ -437,10 +440,10 @@ void Bitmap::stretchBlt(const IntRect &destRect,
 | 
				
			||||||
		GLMeta::blitRectangle(destRect, Vec2i());
 | 
							GLMeta::blitRectangle(destRect, Vec2i());
 | 
				
			||||||
		GLMeta::blitEnd();
 | 
							GLMeta::blitEnd();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		FloatRect bltSubRect((float) sourceRect.x / source->width(),
 | 
							FloatRect bltSubRect((float) sourceRect.x / source.width(),
 | 
				
			||||||
		                     (float) sourceRect.y / source->height(),
 | 
							                     (float) sourceRect.y / source.height(),
 | 
				
			||||||
		                     ((float) source->width() / sourceRect.w) * ((float) destRect.w / gpTex.width),
 | 
							                     ((float) source.width() / sourceRect.w) * ((float) destRect.w / gpTex.width),
 | 
				
			||||||
		                     ((float) source->height() / sourceRect.h) * ((float) destRect.h / gpTex.height));
 | 
							                     ((float) source.height() / sourceRect.h) * ((float) destRect.h / gpTex.height));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		BltShader &shader = shState->shaders().blt;
 | 
							BltShader &shader = shState->shaders().blt;
 | 
				
			||||||
		shader.bind();
 | 
							shader.bind();
 | 
				
			||||||
| 
						 | 
					@ -452,7 +455,7 @@ void Bitmap::stretchBlt(const IntRect &destRect,
 | 
				
			||||||
		quad.setTexPosRect(sourceRect, destRect);
 | 
							quad.setTexPosRect(sourceRect, destRect);
 | 
				
			||||||
		quad.setColor(Vec4(1, 1, 1, normOpacity));
 | 
							quad.setColor(Vec4(1, 1, 1, normOpacity));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		source->p->bindTexture(shader);
 | 
							source.p->bindTexture(shader);
 | 
				
			||||||
		p->bindFBO();
 | 
							p->bindFBO();
 | 
				
			||||||
		p->pushSetViewport(shader);
 | 
							p->pushSetViewport(shader);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -475,6 +478,8 @@ void Bitmap::fillRect(int x, int y,
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void Bitmap::fillRect(const IntRect &rect, const Vec4 &color)
 | 
					void Bitmap::fillRect(const IntRect &rect, const Vec4 &color)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
 | 
						guardDisposed();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	GUARD_MEGA;
 | 
						GUARD_MEGA;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	p->fillRect(rect, color);
 | 
						p->fillRect(rect, color);
 | 
				
			||||||
| 
						 | 
					@ -501,6 +506,8 @@ void Bitmap::gradientFillRect(const IntRect &rect,
 | 
				
			||||||
                              const Vec4 &color1, const Vec4 &color2,
 | 
					                              const Vec4 &color1, const Vec4 &color2,
 | 
				
			||||||
                              bool vertical)
 | 
					                              bool vertical)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
 | 
						guardDisposed();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	GUARD_MEGA;
 | 
						GUARD_MEGA;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	SimpleColorShader &shader = shState->shaders().simpleColor;
 | 
						SimpleColorShader &shader = shState->shaders().simpleColor;
 | 
				
			||||||
| 
						 | 
					@ -545,6 +552,8 @@ void Bitmap::clearRect(int x, int y, int width, int height)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void Bitmap::clearRect(const IntRect &rect)
 | 
					void Bitmap::clearRect(const IntRect &rect)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
 | 
						guardDisposed();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	GUARD_MEGA;
 | 
						GUARD_MEGA;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	p->fillRect(rect, Vec4());
 | 
						p->fillRect(rect, Vec4());
 | 
				
			||||||
| 
						 | 
					@ -554,6 +563,8 @@ void Bitmap::clearRect(const IntRect &rect)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void Bitmap::blur()
 | 
					void Bitmap::blur()
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
 | 
						guardDisposed();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	GUARD_MEGA;
 | 
						GUARD_MEGA;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	Quad &quad = shState->gpQuad();
 | 
						Quad &quad = shState->gpQuad();
 | 
				
			||||||
| 
						 | 
					@ -597,6 +608,8 @@ void Bitmap::blur()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void Bitmap::radialBlur(int angle, int divisions)
 | 
					void Bitmap::radialBlur(int angle, int divisions)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
 | 
						guardDisposed();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	GUARD_MEGA;
 | 
						GUARD_MEGA;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	angle     = clamp<int>(angle, 0, 359);
 | 
						angle     = clamp<int>(angle, 0, 359);
 | 
				
			||||||
| 
						 | 
					@ -690,6 +703,8 @@ void Bitmap::radialBlur(int angle, int divisions)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void Bitmap::clear()
 | 
					void Bitmap::clear()
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
 | 
						guardDisposed();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	GUARD_MEGA;
 | 
						GUARD_MEGA;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	p->bindFBO();
 | 
						p->bindFBO();
 | 
				
			||||||
| 
						 | 
					@ -707,6 +722,8 @@ void Bitmap::clear()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
Color Bitmap::getPixel(int x, int y) const
 | 
					Color Bitmap::getPixel(int x, int y) const
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
 | 
						guardDisposed();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	GUARD_MEGA;
 | 
						GUARD_MEGA;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (x < 0 || y < 0 || x >= width() || y >= height())
 | 
						if (x < 0 || y < 0 || x >= width() || y >= height())
 | 
				
			||||||
| 
						 | 
					@ -737,6 +754,8 @@ Color Bitmap::getPixel(int x, int y) const
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void Bitmap::setPixel(int x, int y, const Color &color)
 | 
					void Bitmap::setPixel(int x, int y, const Color &color)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
 | 
						guardDisposed();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	GUARD_MEGA;
 | 
						GUARD_MEGA;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	uint8_t pixel[] =
 | 
						uint8_t pixel[] =
 | 
				
			||||||
| 
						 | 
					@ -757,6 +776,8 @@ void Bitmap::setPixel(int x, int y, const Color &color)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void Bitmap::hueChange(int hue)
 | 
					void Bitmap::hueChange(int hue)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
 | 
						guardDisposed();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	GUARD_MEGA;
 | 
						GUARD_MEGA;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if ((hue % 360) == 0)
 | 
						if ((hue % 360) == 0)
 | 
				
			||||||
| 
						 | 
					@ -818,6 +839,8 @@ static std::string fixupString(const char *str)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void Bitmap::drawText(const IntRect &rect, const char *str, int align)
 | 
					void Bitmap::drawText(const IntRect &rect, const char *str, int align)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
 | 
						guardDisposed();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	GUARD_MEGA;
 | 
						GUARD_MEGA;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	std::string fixed = fixupString(str);
 | 
						std::string fixed = fixupString(str);
 | 
				
			||||||
| 
						 | 
					@ -1046,6 +1069,8 @@ static uint16_t utf8_to_ucs2(const char *_input,
 | 
				
			||||||
 | 
					
 | 
				
			||||||
IntRect Bitmap::textSize(const char *str)
 | 
					IntRect Bitmap::textSize(const char *str)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
 | 
						guardDisposed();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	GUARD_MEGA;
 | 
						GUARD_MEGA;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	TTF_Font *font = p->font->getSdlFont();
 | 
						TTF_Font *font = p->font->getSdlFont();
 | 
				
			||||||
| 
						 | 
					@ -1092,6 +1117,9 @@ SDL_Surface *Bitmap::megaSurface() const
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void Bitmap::ensureNonMega() const
 | 
					void Bitmap::ensureNonMega() const
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
 | 
						if (isDisposed())
 | 
				
			||||||
 | 
							return;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	GUARD_MEGA;
 | 
						GUARD_MEGA;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1104,3 +1132,13 @@ void Bitmap::taintArea(const IntRect &rect)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	p->addTaintedArea(rect);
 | 
						p->addTaintedArea(rect);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void Bitmap::releaseResources()
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						if (p->megaSurface)
 | 
				
			||||||
 | 
							SDL_FreeSurface(p->megaSurface);
 | 
				
			||||||
 | 
						else
 | 
				
			||||||
 | 
							shState->texPool().release(p->gl);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						delete p;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -49,11 +49,11 @@ public:
 | 
				
			||||||
	IntRect rect() const;
 | 
						IntRect rect() const;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	void blt(int x, int y,
 | 
						void blt(int x, int y,
 | 
				
			||||||
	         const Bitmap *source, IntRect rect,
 | 
						         const Bitmap &source, IntRect rect,
 | 
				
			||||||
	         int opacity = 255);
 | 
						         int opacity = 255);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	void stretchBlt(const IntRect &destRect,
 | 
						void stretchBlt(const IntRect &destRect,
 | 
				
			||||||
	                const Bitmap *source, const IntRect &sourceRect,
 | 
						                const Bitmap &source, const IntRect &sourceRect,
 | 
				
			||||||
	                int opacity = 255);
 | 
						                int opacity = 255);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	void fillRect(int x, int y,
 | 
						void fillRect(int x, int y,
 | 
				
			||||||
| 
						 | 
					@ -120,6 +120,9 @@ public:
 | 
				
			||||||
	sigc::signal<void> modified;
 | 
						sigc::signal<void> modified;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
private:
 | 
					private:
 | 
				
			||||||
 | 
						void releaseResources();
 | 
				
			||||||
 | 
						const char *klassName() const { return "bitmap"; }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	BitmapPrivate *p;
 | 
						BitmapPrivate *p;
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -24,69 +24,65 @@
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include "exception.h"
 | 
					#include "exception.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include <assert.h>
 | 
				
			||||||
#include <sigc++/signal.h>
 | 
					#include <sigc++/signal.h>
 | 
				
			||||||
#include <sigc++/connection.h>
 | 
					#include <sigc++/connection.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
class Disposable
 | 
					class Disposable
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
public:
 | 
					public:
 | 
				
			||||||
	~Disposable()
 | 
						Disposable()
 | 
				
			||||||
 | 
						    : disposed(false)
 | 
				
			||||||
 | 
						{}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						virtual ~Disposable()
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
 | 
							assert(disposed);
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						void dispose()
 | 
				
			||||||
 | 
						{
 | 
				
			||||||
 | 
							if (disposed)
 | 
				
			||||||
 | 
								return;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							releaseResources();
 | 
				
			||||||
 | 
							disposed = true;
 | 
				
			||||||
		wasDisposed();
 | 
							wasDisposed();
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	sigc::signal<void> wasDisposed;
 | 
						bool isDisposed() const
 | 
				
			||||||
};
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
/* A helper struct which monitors the dispose signal of
 | 
					 | 
				
			||||||
 * properties, and automatically sets the prop pointer to
 | 
					 | 
				
			||||||
 * null. Can call an optional notify method when prop is
 | 
					 | 
				
			||||||
 * nulled */
 | 
					 | 
				
			||||||
template<class C, typename P>
 | 
					 | 
				
			||||||
struct DisposeWatch
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
	typedef void (C::*NotifyFun)();
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	DisposeWatch(C &owner, P *&propLocation, NotifyFun notify = 0)
 | 
					 | 
				
			||||||
	    : owner(owner),
 | 
					 | 
				
			||||||
	      notify(notify),
 | 
					 | 
				
			||||||
	      propLocation(propLocation)
 | 
					 | 
				
			||||||
	{}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	~DisposeWatch()
 | 
					 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
		dispCon.disconnect();
 | 
							return disposed;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	/* Call this when a new object was set for the prop */
 | 
						sigc::signal<void> wasDisposed;
 | 
				
			||||||
	void update(Disposable *prop)
 | 
					
 | 
				
			||||||
 | 
					protected:
 | 
				
			||||||
 | 
						void guardDisposed() const
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
		dispCon.disconnect();
 | 
							if (isDisposed())
 | 
				
			||||||
 | 
								throw Exception(Exception::RGSSError,
 | 
				
			||||||
		if (!prop)
 | 
							                    "disposed %s", klassName());
 | 
				
			||||||
			return;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
		dispCon = prop->wasDisposed.connect
 | 
					 | 
				
			||||||
			(sigc::mem_fun(this, &DisposeWatch::onDisposed));
 | 
					 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
private:
 | 
					private:
 | 
				
			||||||
	/* The object owning the prop (and this helper) */
 | 
						virtual void releaseResources() = 0;
 | 
				
			||||||
	C  &owner;
 | 
						virtual const char *klassName() const = 0;
 | 
				
			||||||
	/* Optional notify method */
 | 
					 | 
				
			||||||
	const NotifyFun notify;
 | 
					 | 
				
			||||||
	/* Location of the prop pointer inside the owner */
 | 
					 | 
				
			||||||
	P * &propLocation;
 | 
					 | 
				
			||||||
	sigc::connection dispCon;
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
	void onDisposed()
 | 
						bool disposed;
 | 
				
			||||||
	{
 | 
					 | 
				
			||||||
		dispCon.disconnect();
 | 
					 | 
				
			||||||
		propLocation = 0;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
		if (notify)
 | 
					 | 
				
			||||||
			(owner.*notify)();
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					template<class C>
 | 
				
			||||||
 | 
					inline bool
 | 
				
			||||||
 | 
					nullOrDisposed(const C *d)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						if (!d)
 | 
				
			||||||
 | 
							return true;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if (d->isDisposed())
 | 
				
			||||||
 | 
							return true;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						return false;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#endif // DISPOSABLE_H
 | 
					#endif // DISPOSABLE_H
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -341,8 +341,7 @@ void Font::setSize(int value)
 | 
				
			||||||
	p->sdlFont = 0;
 | 
						p->sdlFont = 0;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#undef CHK_DISP
 | 
					static void guardDisposed() {}
 | 
				
			||||||
#define CHK_DISP
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
DEF_ATTR_RD_SIMPLE(Font, Size,     int,    p->size)
 | 
					DEF_ATTR_RD_SIMPLE(Font, Size,     int,    p->size)
 | 
				
			||||||
DEF_ATTR_SIMPLE   (Font, Bold,     bool,   p->bold)
 | 
					DEF_ATTR_SIMPLE   (Font, Bold,     bool,   p->bold)
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -674,11 +674,7 @@ void Graphics::frameReset()
 | 
				
			||||||
	p->fpsLimiter.resetFrameAdjust();
 | 
						p->fpsLimiter.resetFrameAdjust();
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#undef RET_IF_DISP
 | 
					static void guardDisposed() {}
 | 
				
			||||||
#define RET_IF_DISP(x)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#undef CHK_DISP
 | 
					 | 
				
			||||||
#define CHK_DISP
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
DEF_ATTR_RD_SIMPLE(Graphics, FrameRate, int, p->frameRate)
 | 
					DEF_ATTR_RD_SIMPLE(Graphics, FrameRate, int, p->frameRate)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -45,7 +45,6 @@ static float fwrap(float value, float range)
 | 
				
			||||||
struct PlanePrivate
 | 
					struct PlanePrivate
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	Bitmap *bitmap;
 | 
						Bitmap *bitmap;
 | 
				
			||||||
	DisposeWatch<PlanePrivate, Bitmap> bitmapWatch;
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
	NormValue opacity;
 | 
						NormValue opacity;
 | 
				
			||||||
	BlendType blendType;
 | 
						BlendType blendType;
 | 
				
			||||||
| 
						 | 
					@ -67,7 +66,6 @@ struct PlanePrivate
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	PlanePrivate()
 | 
						PlanePrivate()
 | 
				
			||||||
	    : bitmap(0),
 | 
						    : bitmap(0),
 | 
				
			||||||
	      bitmapWatch(*this, bitmap),
 | 
					 | 
				
			||||||
	      opacity(255),
 | 
						      opacity(255),
 | 
				
			||||||
	      blendType(BlendNormal),
 | 
						      blendType(BlendNormal),
 | 
				
			||||||
	      color(&tmp.color),
 | 
						      color(&tmp.color),
 | 
				
			||||||
| 
						 | 
					@ -103,7 +101,7 @@ struct PlanePrivate
 | 
				
			||||||
			return;
 | 
								return;
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		if (!bitmap)
 | 
							if (nullOrDisposed(bitmap))
 | 
				
			||||||
			return;
 | 
								return;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		/* Scaled (zoomed) bitmap dimensions */
 | 
							/* Scaled (zoomed) bitmap dimensions */
 | 
				
			||||||
| 
						 | 
					@ -169,15 +167,14 @@ DEF_ATTR_OBJ_VALUE(Plane, Tone,      Tone*,   p->tone)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
Plane::~Plane()
 | 
					Plane::~Plane()
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	unlink();
 | 
						dispose();
 | 
				
			||||||
 | 
					 | 
				
			||||||
	delete p;
 | 
					 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void Plane::setBitmap(Bitmap *value)
 | 
					void Plane::setBitmap(Bitmap *value)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
 | 
						guardDisposed();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	p->bitmap = value;
 | 
						p->bitmap = value;
 | 
				
			||||||
	p->bitmapWatch.update(value);
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (!value)
 | 
						if (!value)
 | 
				
			||||||
		return;
 | 
							return;
 | 
				
			||||||
| 
						 | 
					@ -187,6 +184,8 @@ void Plane::setBitmap(Bitmap *value)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void Plane::setOX(int value)
 | 
					void Plane::setOX(int value)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
 | 
						guardDisposed();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (p->ox == value)
 | 
						if (p->ox == value)
 | 
				
			||||||
	        return;
 | 
						        return;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -196,6 +195,8 @@ void Plane::setOX(int value)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void Plane::setOY(int value)
 | 
					void Plane::setOY(int value)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
 | 
						guardDisposed();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (p->oy == value)
 | 
						if (p->oy == value)
 | 
				
			||||||
	        return;
 | 
						        return;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -205,6 +206,8 @@ void Plane::setOY(int value)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void Plane::setZoomX(float value)
 | 
					void Plane::setZoomX(float value)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
 | 
						guardDisposed();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (p->zoomX == value)
 | 
						if (p->zoomX == value)
 | 
				
			||||||
	        return;
 | 
						        return;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -214,6 +217,8 @@ void Plane::setZoomX(float value)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void Plane::setZoomY(float value)
 | 
					void Plane::setZoomY(float value)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
 | 
						guardDisposed();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (p->zoomY == value)
 | 
						if (p->zoomY == value)
 | 
				
			||||||
	        return;
 | 
						        return;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -223,6 +228,8 @@ void Plane::setZoomY(float value)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void Plane::setBlendType(int value)
 | 
					void Plane::setBlendType(int value)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
 | 
						guardDisposed();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	switch (value)
 | 
						switch (value)
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
	default :
 | 
						default :
 | 
				
			||||||
| 
						 | 
					@ -246,7 +253,7 @@ void Plane::initDynAttribs()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void Plane::draw()
 | 
					void Plane::draw()
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	if (!p->bitmap)
 | 
						if (nullOrDisposed(p->bitmap))
 | 
				
			||||||
		return;
 | 
							return;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (!p->opacity)
 | 
						if (!p->opacity)
 | 
				
			||||||
| 
						 | 
					@ -301,3 +308,10 @@ void Plane::onGeometryChange(const Scene::Geometry &geo)
 | 
				
			||||||
	p->sceneGeo = geo;
 | 
						p->sceneGeo = geo;
 | 
				
			||||||
	p->quadSourceDirty = true;
 | 
						p->quadSourceDirty = true;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void Plane::releaseResources()
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						unlink();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						delete p;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -54,6 +54,11 @@ private:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	void draw();
 | 
						void draw();
 | 
				
			||||||
	void onGeometryChange(const Scene::Geometry &);
 | 
						void onGeometryChange(const Scene::Geometry &);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						void releaseResources();
 | 
				
			||||||
 | 
						const char *klassName() const { return "plane"; }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						ABOUT_TO_ACCESS_DISP
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#endif // PLANE_H
 | 
					#endif // PLANE_H
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -134,11 +134,15 @@ void SceneElement::setScene(Scene &scene)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
int SceneElement::getZ() const
 | 
					int SceneElement::getZ() const
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
 | 
						aboutToAccess();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	return z;
 | 
						return z;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void SceneElement::setZ(int value)
 | 
					void SceneElement::setZ(int value)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
 | 
						aboutToAccess();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (z == value)
 | 
						if (z == value)
 | 
				
			||||||
		return;
 | 
							return;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -148,11 +152,15 @@ void SceneElement::setZ(int value)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
bool SceneElement::getVisible() const
 | 
					bool SceneElement::getVisible() const
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
 | 
						aboutToAccess();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	return visible;
 | 
						return visible;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void SceneElement::setVisible(bool value)
 | 
					void SceneElement::setVisible(bool value)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
 | 
						aboutToAccess();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	visible = value;
 | 
						visible = value;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -79,6 +79,8 @@ public:
 | 
				
			||||||
	DECL_ATTR_VIRT( Z,       int  )
 | 
						DECL_ATTR_VIRT( Z,       int  )
 | 
				
			||||||
	DECL_ATTR_VIRT( Visible, bool )
 | 
						DECL_ATTR_VIRT( Visible, bool )
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						virtual void aboutToAccess() const = 0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
protected:
 | 
					protected:
 | 
				
			||||||
	/* A bit about OpenGL state:
 | 
						/* A bit about OpenGL state:
 | 
				
			||||||
	 *
 | 
						 *
 | 
				
			||||||
| 
						 | 
					@ -134,4 +136,10 @@ private:
 | 
				
			||||||
	int spriteY;
 | 
						int spriteY;
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define ABOUT_TO_ACCESS_NOOP \
 | 
				
			||||||
 | 
						void aboutToAccess() const {}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define ABOUT_TO_ACCESS_DISP \
 | 
				
			||||||
 | 
						void aboutToAccess() const { guardDisposed(); }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#endif // SCENE_H
 | 
					#endif // SCENE_H
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -43,7 +43,6 @@
 | 
				
			||||||
struct SpritePrivate
 | 
					struct SpritePrivate
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	Bitmap *bitmap;
 | 
						Bitmap *bitmap;
 | 
				
			||||||
	DisposeWatch<SpritePrivate, Bitmap> bitmapWatch;
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
	Quad quad;
 | 
						Quad quad;
 | 
				
			||||||
	Transform trans;
 | 
						Transform trans;
 | 
				
			||||||
| 
						 | 
					@ -87,7 +86,6 @@ struct SpritePrivate
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	SpritePrivate()
 | 
						SpritePrivate()
 | 
				
			||||||
	    : bitmap(0),
 | 
						    : bitmap(0),
 | 
				
			||||||
	      bitmapWatch(*this, bitmap),
 | 
					 | 
				
			||||||
	      srcRect(&tmp.rect),
 | 
						      srcRect(&tmp.rect),
 | 
				
			||||||
	      mirrored(false),
 | 
						      mirrored(false),
 | 
				
			||||||
	      bushDepth(0),
 | 
						      bushDepth(0),
 | 
				
			||||||
| 
						 | 
					@ -159,7 +157,7 @@ struct SpritePrivate
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
		isVisible = false;
 | 
							isVisible = false;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		if (!bitmap)
 | 
							if (nullOrDisposed(bitmap))
 | 
				
			||||||
			return;
 | 
								return;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		if (!opacity)
 | 
							if (!opacity)
 | 
				
			||||||
| 
						 | 
					@ -209,7 +207,7 @@ struct SpritePrivate
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	void updateWave()
 | 
						void updateWave()
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
		if (!bitmap)
 | 
							if (nullOrDisposed(bitmap))
 | 
				
			||||||
			return;
 | 
								return;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		if (wave.amp == 0)
 | 
							if (wave.amp == 0)
 | 
				
			||||||
| 
						 | 
					@ -298,9 +296,7 @@ Sprite::Sprite(Viewport *viewport)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
Sprite::~Sprite()
 | 
					Sprite::~Sprite()
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	unlink();
 | 
						dispose();
 | 
				
			||||||
 | 
					 | 
				
			||||||
	delete p;
 | 
					 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
DEF_ATTR_RD_SIMPLE(Sprite, Bitmap,     Bitmap*, p->bitmap)
 | 
					DEF_ATTR_RD_SIMPLE(Sprite, Bitmap,     Bitmap*, p->bitmap)
 | 
				
			||||||
| 
						 | 
					@ -330,11 +326,12 @@ DEF_ATTR_OBJ_VALUE(Sprite, Tone,        Tone*,  p->tone)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void Sprite::setBitmap(Bitmap *bitmap)
 | 
					void Sprite::setBitmap(Bitmap *bitmap)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
 | 
						guardDisposed();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (p->bitmap == bitmap)
 | 
						if (p->bitmap == bitmap)
 | 
				
			||||||
		return;
 | 
							return;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	p->bitmap = bitmap;
 | 
						p->bitmap = bitmap;
 | 
				
			||||||
	p->bitmapWatch.update(bitmap);
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (!bitmap)
 | 
						if (!bitmap)
 | 
				
			||||||
		return;
 | 
							return;
 | 
				
			||||||
| 
						 | 
					@ -350,6 +347,8 @@ void Sprite::setBitmap(Bitmap *bitmap)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void Sprite::setX(int value)
 | 
					void Sprite::setX(int value)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
 | 
						guardDisposed();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (p->trans.getPosition().x == value)
 | 
						if (p->trans.getPosition().x == value)
 | 
				
			||||||
		return;
 | 
							return;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -358,6 +357,8 @@ void Sprite::setX(int value)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void Sprite::setY(int value)
 | 
					void Sprite::setY(int value)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
 | 
						guardDisposed();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (p->trans.getPosition().y == value)
 | 
						if (p->trans.getPosition().y == value)
 | 
				
			||||||
		return;
 | 
							return;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -372,6 +373,8 @@ void Sprite::setY(int value)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void Sprite::setOX(int value)
 | 
					void Sprite::setOX(int value)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
 | 
						guardDisposed();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (p->trans.getOrigin().x == value)
 | 
						if (p->trans.getOrigin().x == value)
 | 
				
			||||||
		return;
 | 
							return;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -380,6 +383,8 @@ void Sprite::setOX(int value)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void Sprite::setOY(int value)
 | 
					void Sprite::setOY(int value)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
 | 
						guardDisposed();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (p->trans.getOrigin().y == value)
 | 
						if (p->trans.getOrigin().y == value)
 | 
				
			||||||
		return;
 | 
							return;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -388,6 +393,8 @@ void Sprite::setOY(int value)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void Sprite::setZoomX(float value)
 | 
					void Sprite::setZoomX(float value)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
 | 
						guardDisposed();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (p->trans.getScale().x == value)
 | 
						if (p->trans.getScale().x == value)
 | 
				
			||||||
		return;
 | 
							return;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -396,6 +403,8 @@ void Sprite::setZoomX(float value)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void Sprite::setZoomY(float value)
 | 
					void Sprite::setZoomY(float value)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
 | 
						guardDisposed();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (p->trans.getScale().y == value)
 | 
						if (p->trans.getScale().y == value)
 | 
				
			||||||
		return;
 | 
							return;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -408,6 +417,8 @@ void Sprite::setZoomY(float value)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void Sprite::setAngle(float value)
 | 
					void Sprite::setAngle(float value)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
 | 
						guardDisposed();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (p->trans.getRotation() == value)
 | 
						if (p->trans.getRotation() == value)
 | 
				
			||||||
		return;
 | 
							return;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -416,6 +427,8 @@ void Sprite::setAngle(float value)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void Sprite::setMirror(bool mirrored)
 | 
					void Sprite::setMirror(bool mirrored)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
 | 
						guardDisposed();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (p->mirrored == mirrored)
 | 
						if (p->mirrored == mirrored)
 | 
				
			||||||
		return;
 | 
							return;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -425,6 +438,8 @@ void Sprite::setMirror(bool mirrored)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void Sprite::setBushDepth(int value)
 | 
					void Sprite::setBushDepth(int value)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
 | 
						guardDisposed();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (p->bushDepth == value)
 | 
						if (p->bushDepth == value)
 | 
				
			||||||
		return;
 | 
							return;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -434,6 +449,8 @@ void Sprite::setBushDepth(int value)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void Sprite::setBlendType(int type)
 | 
					void Sprite::setBlendType(int type)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
 | 
						guardDisposed();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	switch (type)
 | 
						switch (type)
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
	default :
 | 
						default :
 | 
				
			||||||
| 
						 | 
					@ -452,6 +469,7 @@ void Sprite::setBlendType(int type)
 | 
				
			||||||
#define DEF_WAVE_SETTER(Name, name, type) \
 | 
					#define DEF_WAVE_SETTER(Name, name, type) \
 | 
				
			||||||
	void Sprite::setWave##Name(type value) \
 | 
						void Sprite::setWave##Name(type value) \
 | 
				
			||||||
	{ \
 | 
						{ \
 | 
				
			||||||
 | 
							guardDisposed(); \
 | 
				
			||||||
		if (p->wave.name == value) \
 | 
							if (p->wave.name == value) \
 | 
				
			||||||
			return; \
 | 
								return; \
 | 
				
			||||||
		p->wave.name = value; \
 | 
							p->wave.name = value; \
 | 
				
			||||||
| 
						 | 
					@ -477,6 +495,8 @@ void Sprite::initDynAttribs()
 | 
				
			||||||
/* Flashable */
 | 
					/* Flashable */
 | 
				
			||||||
void Sprite::update()
 | 
					void Sprite::update()
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
 | 
						guardDisposed();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	Flashable::update();
 | 
						Flashable::update();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	p->wave.phase += p->wave.speed / 180;
 | 
						p->wave.phase += p->wave.speed / 180;
 | 
				
			||||||
| 
						 | 
					@ -556,3 +576,10 @@ void Sprite::onGeometryChange(const Scene::Geometry &geo)
 | 
				
			||||||
	p->sceneRect.w = geo.rect.w;
 | 
						p->sceneRect.w = geo.rect.w;
 | 
				
			||||||
	p->sceneRect.h = geo.rect.h;
 | 
						p->sceneRect.h = geo.rect.h;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void Sprite::releaseResources()
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						unlink();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						delete p;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -74,6 +74,11 @@ private:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	void draw();
 | 
						void draw();
 | 
				
			||||||
	void onGeometryChange(const Scene::Geometry &);
 | 
						void onGeometryChange(const Scene::Geometry &);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						void releaseResources();
 | 
				
			||||||
 | 
						const char *klassName() const { return "sprite"; }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						ABOUT_TO_ACCESS_DISP
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#endif // SPRITE_H
 | 
					#endif // SPRITE_H
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -291,7 +291,7 @@ void build(TEXFBO &tf, Bitmap *bitmaps[BM_COUNT])
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	Bitmap *bm;
 | 
						Bitmap *bm;
 | 
				
			||||||
#define EXEC_BLITS(part) \
 | 
					#define EXEC_BLITS(part) \
 | 
				
			||||||
	if ((bm = bitmaps[BM_##part])) \
 | 
						if (!nullOrDisposed(bm = bitmaps[BM_##part])) \
 | 
				
			||||||
	{ \
 | 
						{ \
 | 
				
			||||||
		GLMeta::blitSource(bm->getGLTypes()); \
 | 
							GLMeta::blitSource(bm->getGLTypes()); \
 | 
				
			||||||
		for (size_t i = 0; i < blits##part##N; ++i) \
 | 
							for (size_t i = 0; i < blits##part##N; ++i) \
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -38,7 +38,6 @@
 | 
				
			||||||
#include "tileatlas.h"
 | 
					#include "tileatlas.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include <sigc++/connection.h>
 | 
					#include <sigc++/connection.h>
 | 
				
			||||||
#include <sigc++/bind.h>
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include <string.h>
 | 
					#include <string.h>
 | 
				
			||||||
#include <stdint.h>
 | 
					#include <stdint.h>
 | 
				
			||||||
| 
						 | 
					@ -204,6 +203,8 @@ struct GroundLayer : public ViewportElement
 | 
				
			||||||
	void drawFlashInt();
 | 
						void drawFlashInt();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	void onGeometryChange(const Scene::Geometry &geo);
 | 
						void onGeometryChange(const Scene::Geometry &geo);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						ABOUT_TO_ACCESS_NOOP
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
struct ZLayer : public ViewportElement
 | 
					struct ZLayer : public ViewportElement
 | 
				
			||||||
| 
						 | 
					@ -232,6 +233,8 @@ struct ZLayer : public ViewportElement
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	void initUpdateZ();
 | 
						void initUpdateZ();
 | 
				
			||||||
	void finiUpdateZ(ZLayer *prev);
 | 
						void finiUpdateZ(ZLayer *prev);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						ABOUT_TO_ACCESS_NOOP
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
struct TilemapPrivate
 | 
					struct TilemapPrivate
 | 
				
			||||||
| 
						 | 
					@ -242,7 +245,6 @@ struct TilemapPrivate
 | 
				
			||||||
	Bitmap *autotiles[autotileCount];
 | 
						Bitmap *autotiles[autotileCount];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	Bitmap *tileset;
 | 
						Bitmap *tileset;
 | 
				
			||||||
	DisposeWatch<TilemapPrivate, Bitmap> tilesetWatch;
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
	Table *mapData;
 | 
						Table *mapData;
 | 
				
			||||||
	Table *flashData;
 | 
						Table *flashData;
 | 
				
			||||||
| 
						 | 
					@ -347,7 +349,6 @@ struct TilemapPrivate
 | 
				
			||||||
	TilemapPrivate(Viewport *viewport)
 | 
						TilemapPrivate(Viewport *viewport)
 | 
				
			||||||
	    : viewport(viewport),
 | 
						    : viewport(viewport),
 | 
				
			||||||
	      tileset(0),
 | 
						      tileset(0),
 | 
				
			||||||
	      tilesetWatch(*this, tileset),
 | 
					 | 
				
			||||||
	      mapData(0),
 | 
						      mapData(0),
 | 
				
			||||||
	      flashData(0),
 | 
						      flashData(0),
 | 
				
			||||||
	      priorities(0),
 | 
						      priorities(0),
 | 
				
			||||||
| 
						 | 
					@ -432,7 +433,7 @@ struct TilemapPrivate
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	void updateAtlasInfo()
 | 
						void updateAtlasInfo()
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
		if (!tileset)
 | 
							if (nullOrDisposed(tileset))
 | 
				
			||||||
		{
 | 
							{
 | 
				
			||||||
			atlas.size = Vec2i();
 | 
								atlas.size = Vec2i();
 | 
				
			||||||
			return;
 | 
								return;
 | 
				
			||||||
| 
						 | 
					@ -458,7 +459,7 @@ struct TilemapPrivate
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		for (int i = 0; i < autotileCount; ++i)
 | 
							for (int i = 0; i < autotileCount; ++i)
 | 
				
			||||||
		{
 | 
							{
 | 
				
			||||||
			if (!autotiles[i])
 | 
								if (nullOrDisposed(autotiles[i]))
 | 
				
			||||||
				continue;
 | 
									continue;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
			if (autotiles[i]->megaSurface())
 | 
								if (autotiles[i]->megaSurface())
 | 
				
			||||||
| 
						 | 
					@ -506,20 +507,10 @@ struct TilemapPrivate
 | 
				
			||||||
		flashDirty = true;
 | 
							flashDirty = true;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	void onAutotileDisposed(int i)
 | 
					 | 
				
			||||||
	{
 | 
					 | 
				
			||||||
		/* RMXP actually crashes if an active autotile bitmap is disposed..
 | 
					 | 
				
			||||||
		 * let's not crash ourselves, for consistency's sake */
 | 
					 | 
				
			||||||
		autotiles[i] = 0;
 | 
					 | 
				
			||||||
		autotilesCon[i].disconnect();
 | 
					 | 
				
			||||||
		autotilesDispCon[i].disconnect();
 | 
					 | 
				
			||||||
		atlasDirty = true;
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	/* Checks for the minimum amount of data needed to display */
 | 
						/* Checks for the minimum amount of data needed to display */
 | 
				
			||||||
	bool verifyResources()
 | 
						bool verifyResources()
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
		if (!tileset)
 | 
							if (nullOrDisposed(tileset))
 | 
				
			||||||
			return false;
 | 
								return false;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		if (!mapData)
 | 
							if (!mapData)
 | 
				
			||||||
| 
						 | 
					@ -1208,7 +1199,7 @@ void Tilemap::Autotiles::set(int i, Bitmap *bitmap)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	p->autotilesDispCon[i].disconnect();
 | 
						p->autotilesDispCon[i].disconnect();
 | 
				
			||||||
	p->autotilesDispCon[i] = bitmap->wasDisposed.connect
 | 
						p->autotilesDispCon[i] = bitmap->wasDisposed.connect
 | 
				
			||||||
	        (sigc::bind(sigc::mem_fun(p, &TilemapPrivate::onAutotileDisposed), i));
 | 
						        (sigc::mem_fun(p, &TilemapPrivate::invalidateAtlasContents));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	p->updateAutotileInfo();
 | 
						p->updateAutotileInfo();
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
| 
						 | 
					@ -1229,11 +1220,13 @@ Tilemap::Tilemap(Viewport *viewport)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
Tilemap::~Tilemap()
 | 
					Tilemap::~Tilemap()
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	delete p;
 | 
						dispose();
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void Tilemap::update()
 | 
					void Tilemap::update()
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
 | 
						guardDisposed();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (!p->tilemapReady)
 | 
						if (!p->tilemapReady)
 | 
				
			||||||
		return;
 | 
							return;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1253,6 +1246,8 @@ void Tilemap::update()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
Tilemap::Autotiles &Tilemap::getAutotiles() const
 | 
					Tilemap::Autotiles &Tilemap::getAutotiles() const
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
 | 
						guardDisposed();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	return p->autotilesProxy;
 | 
						return p->autotilesProxy;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1267,11 +1262,12 @@ DEF_ATTR_RD_SIMPLE(Tilemap, OY, int, p->offset.y)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void Tilemap::setTileset(Bitmap *value)
 | 
					void Tilemap::setTileset(Bitmap *value)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
 | 
						guardDisposed();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (p->tileset == value)
 | 
						if (p->tileset == value)
 | 
				
			||||||
		return;
 | 
							return;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	p->tileset = value;
 | 
						p->tileset = value;
 | 
				
			||||||
	p->tilesetWatch.update(value);
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (!value)
 | 
						if (!value)
 | 
				
			||||||
		return;
 | 
							return;
 | 
				
			||||||
| 
						 | 
					@ -1286,6 +1282,8 @@ void Tilemap::setTileset(Bitmap *value)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void Tilemap::setMapData(Table *value)
 | 
					void Tilemap::setMapData(Table *value)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
 | 
						guardDisposed();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (p->mapData == value)
 | 
						if (p->mapData == value)
 | 
				
			||||||
		return;
 | 
							return;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1302,6 +1300,8 @@ void Tilemap::setMapData(Table *value)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void Tilemap::setFlashData(Table *value)
 | 
					void Tilemap::setFlashData(Table *value)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
 | 
						guardDisposed();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (p->flashData == value)
 | 
						if (p->flashData == value)
 | 
				
			||||||
		return;
 | 
							return;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1318,6 +1318,8 @@ void Tilemap::setFlashData(Table *value)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void Tilemap::setPriorities(Table *value)
 | 
					void Tilemap::setPriorities(Table *value)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
 | 
						guardDisposed();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (p->priorities == value)
 | 
						if (p->priorities == value)
 | 
				
			||||||
		return;
 | 
							return;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1334,6 +1336,8 @@ void Tilemap::setPriorities(Table *value)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void Tilemap::setVisible(bool value)
 | 
					void Tilemap::setVisible(bool value)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
 | 
						guardDisposed();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (p->visible == value)
 | 
						if (p->visible == value)
 | 
				
			||||||
		return;
 | 
							return;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1349,6 +1353,8 @@ void Tilemap::setVisible(bool value)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void Tilemap::setOX(int value)
 | 
					void Tilemap::setOX(int value)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
 | 
						guardDisposed();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (p->offset.x == value)
 | 
						if (p->offset.x == value)
 | 
				
			||||||
		return;
 | 
							return;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1359,6 +1365,8 @@ void Tilemap::setOX(int value)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void Tilemap::setOY(int value)
 | 
					void Tilemap::setOY(int value)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
 | 
						guardDisposed();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (p->offset.y == value)
 | 
						if (p->offset.y == value)
 | 
				
			||||||
		return;
 | 
							return;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1367,3 +1375,8 @@ void Tilemap::setOY(int value)
 | 
				
			||||||
	p->zOrderDirty = true;
 | 
						p->zOrderDirty = true;
 | 
				
			||||||
	p->mapViewportDirty = true;
 | 
						p->mapViewportDirty = true;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void Tilemap::releaseResources()
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						delete p;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -68,6 +68,9 @@ public:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
private:
 | 
					private:
 | 
				
			||||||
	TilemapPrivate *p;
 | 
						TilemapPrivate *p;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						void releaseResources();
 | 
				
			||||||
 | 
						const char *klassName() const { return "tilemap"; }
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#endif // TILEMAP_H
 | 
					#endif // TILEMAP_H
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -36,7 +36,6 @@
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include <vector>
 | 
					#include <vector>
 | 
				
			||||||
#include <sigc++/connection.h>
 | 
					#include <sigc++/connection.h>
 | 
				
			||||||
#include <sigc++/bind.h>
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
// FIXME: Implement flash
 | 
					// FIXME: Implement flash
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -95,6 +94,8 @@ struct TilemapVXPrivate : public ViewportElement, TileAtlasVX::Reader
 | 
				
			||||||
		{
 | 
							{
 | 
				
			||||||
			p->drawAbove();
 | 
								p->drawAbove();
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							ABOUT_TO_ACCESS_NOOP
 | 
				
			||||||
	};
 | 
						};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	AboveLayer above;
 | 
						AboveLayer above;
 | 
				
			||||||
| 
						 | 
					@ -154,15 +155,6 @@ struct TilemapVXPrivate : public ViewportElement, TileAtlasVX::Reader
 | 
				
			||||||
		atlasDirty = true;
 | 
							atlasDirty = true;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	void onBitmapDisposed(int i)
 | 
					 | 
				
			||||||
	{
 | 
					 | 
				
			||||||
		bitmaps[i] = 0;
 | 
					 | 
				
			||||||
		bmChangedCons[i].disconnect();
 | 
					 | 
				
			||||||
		bmDisposedCons[i].disconnect();
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
		atlasDirty = true;
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	void invalidateBuffers()
 | 
						void invalidateBuffers()
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
		buffersDirty = true;
 | 
							buffersDirty = true;
 | 
				
			||||||
| 
						 | 
					@ -290,7 +282,7 @@ struct TilemapVXPrivate : public ViewportElement, TileAtlasVX::Reader
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
		ShaderBase *shader;
 | 
							ShaderBase *shader;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		if (bitmaps[BM_A1] != 0)
 | 
							if (!nullOrDisposed(bitmaps[BM_A1]))
 | 
				
			||||||
		{
 | 
							{
 | 
				
			||||||
			/* Animated tileset */
 | 
								/* Animated tileset */
 | 
				
			||||||
			TilemapVXShader &tmShader = shState->shaders().tilemapVX;
 | 
								TilemapVXShader &tmShader = shState->shaders().tilemapVX;
 | 
				
			||||||
| 
						 | 
					@ -351,6 +343,8 @@ struct TilemapVXPrivate : public ViewportElement, TileAtlasVX::Reader
 | 
				
			||||||
		mapViewportDirty = true;
 | 
							mapViewportDirty = true;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						ABOUT_TO_ACCESS_NOOP
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	/* TileAtlasVX::Reader */
 | 
						/* TileAtlasVX::Reader */
 | 
				
			||||||
	void onQuads(const FloatRect *t, const FloatRect *p,
 | 
						void onQuads(const FloatRect *t, const FloatRect *p,
 | 
				
			||||||
	              size_t n, bool overPlayer)
 | 
						              size_t n, bool overPlayer)
 | 
				
			||||||
| 
						 | 
					@ -379,7 +373,7 @@ void TilemapVX::BitmapArray::set(int i, Bitmap *bitmap)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	p->bmDisposedCons[i].disconnect();
 | 
						p->bmDisposedCons[i].disconnect();
 | 
				
			||||||
	p->bmDisposedCons[i] = bitmap->wasDisposed.connect
 | 
						p->bmDisposedCons[i] = bitmap->wasDisposed.connect
 | 
				
			||||||
		(sigc::bind(sigc::mem_fun(p, &TilemapVXPrivate::onBitmapDisposed), i));
 | 
							(sigc::mem_fun(p, &TilemapVXPrivate::invalidateAtlas));
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
Bitmap *TilemapVX::BitmapArray::get(int i) const
 | 
					Bitmap *TilemapVX::BitmapArray::get(int i) const
 | 
				
			||||||
| 
						 | 
					@ -398,11 +392,13 @@ TilemapVX::TilemapVX(Viewport *viewport)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
TilemapVX::~TilemapVX()
 | 
					TilemapVX::~TilemapVX()
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	delete p;
 | 
						dispose();
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void TilemapVX::update()
 | 
					void TilemapVX::update()
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
 | 
						guardDisposed();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (++p->frameIdx >= 30*3*4)
 | 
						if (++p->frameIdx >= 30*3*4)
 | 
				
			||||||
		p->frameIdx = 0;
 | 
							p->frameIdx = 0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -419,6 +415,8 @@ void TilemapVX::update()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
TilemapVX::BitmapArray &TilemapVX::getBitmapArray() const
 | 
					TilemapVX::BitmapArray &TilemapVX::getBitmapArray() const
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
 | 
						guardDisposed();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	return p->bitmapsProxy;
 | 
						return p->bitmapsProxy;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -430,22 +428,30 @@ DEF_ATTR_RD_SIMPLE(TilemapVX, OY, int, p->offset.y)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
Viewport *TilemapVX::getViewport() const
 | 
					Viewport *TilemapVX::getViewport() const
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
 | 
						guardDisposed();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	return p->getViewport();
 | 
						return p->getViewport();
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
bool TilemapVX::getVisible() const
 | 
					bool TilemapVX::getVisible() const
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
 | 
						guardDisposed();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	return p->getVisible();
 | 
						return p->getVisible();
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void TilemapVX::setViewport(Viewport *value)
 | 
					void TilemapVX::setViewport(Viewport *value)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
 | 
						guardDisposed();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	p->setViewport(value);
 | 
						p->setViewport(value);
 | 
				
			||||||
	p->above.setViewport(value);
 | 
						p->above.setViewport(value);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void TilemapVX::setMapData(Table *value)
 | 
					void TilemapVX::setMapData(Table *value)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
 | 
						guardDisposed();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (p->mapData == value)
 | 
						if (p->mapData == value)
 | 
				
			||||||
		return;
 | 
							return;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -459,6 +465,8 @@ void TilemapVX::setMapData(Table *value)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void TilemapVX::setFlashData(Table *value)
 | 
					void TilemapVX::setFlashData(Table *value)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
 | 
						guardDisposed();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (p->flashData == value)
 | 
						if (p->flashData == value)
 | 
				
			||||||
		return;
 | 
							return;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -467,6 +475,8 @@ void TilemapVX::setFlashData(Table *value)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void TilemapVX::setFlags(Table *value)
 | 
					void TilemapVX::setFlags(Table *value)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
 | 
						guardDisposed();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (p->flags == value)
 | 
						if (p->flags == value)
 | 
				
			||||||
		return;
 | 
							return;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -480,12 +490,16 @@ void TilemapVX::setFlags(Table *value)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void TilemapVX::setVisible(bool value)
 | 
					void TilemapVX::setVisible(bool value)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
 | 
						guardDisposed();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	p->setVisible(value);
 | 
						p->setVisible(value);
 | 
				
			||||||
	p->above.setVisible(value);
 | 
						p->above.setVisible(value);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void TilemapVX::setOX(int value)
 | 
					void TilemapVX::setOX(int value)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
 | 
						guardDisposed();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (p->offset.x == value)
 | 
						if (p->offset.x == value)
 | 
				
			||||||
		return;
 | 
							return;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -495,9 +509,16 @@ void TilemapVX::setOX(int value)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void TilemapVX::setOY(int value)
 | 
					void TilemapVX::setOY(int value)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
 | 
						guardDisposed();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (p->offset.y == value)
 | 
						if (p->offset.y == value)
 | 
				
			||||||
		return;
 | 
							return;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	p->offset.y = value;
 | 
						p->offset.y = value;
 | 
				
			||||||
	p->mapViewportDirty = true;
 | 
						p->mapViewportDirty = true;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void TilemapVX::releaseResources()
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						delete p;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -66,6 +66,9 @@ public:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
private:
 | 
					private:
 | 
				
			||||||
	TilemapVXPrivate *p;
 | 
						TilemapVXPrivate *p;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						void releaseResources();
 | 
				
			||||||
 | 
						const char *klassName() const { return "tilemap"; }
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#endif // TILEMAPVX_H
 | 
					#endif // TILEMAPVX_H
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -119,6 +119,7 @@ inline bool contains(const C &c, const V &v)
 | 
				
			||||||
#define DEF_ATTR_RD_SIMPLE_DETAILED(klass, name, type, location, keyword1) \
 | 
					#define DEF_ATTR_RD_SIMPLE_DETAILED(klass, name, type, location, keyword1) \
 | 
				
			||||||
	type klass :: get##name() keyword1 \
 | 
						type klass :: get##name() keyword1 \
 | 
				
			||||||
	{ \
 | 
						{ \
 | 
				
			||||||
 | 
							guardDisposed(); \
 | 
				
			||||||
		return location; \
 | 
							return location; \
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -126,6 +127,7 @@ inline bool contains(const C &c, const V &v)
 | 
				
			||||||
	DEF_ATTR_RD_SIMPLE_DETAILED(klass, name, type, location, keyword1) \
 | 
						DEF_ATTR_RD_SIMPLE_DETAILED(klass, name, type, location, keyword1) \
 | 
				
			||||||
	void klass :: set##name(type value) \
 | 
						void klass :: set##name(type value) \
 | 
				
			||||||
{ \
 | 
					{ \
 | 
				
			||||||
 | 
						guardDisposed(); \
 | 
				
			||||||
	location = value; \
 | 
						location = value; \
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -141,6 +143,7 @@ inline bool contains(const C &c, const V &v)
 | 
				
			||||||
	DEF_ATTR_RD_SIMPLE_DETAILED(klass, name, type, location, const) \
 | 
						DEF_ATTR_RD_SIMPLE_DETAILED(klass, name, type, location, const) \
 | 
				
			||||||
	void klass :: set##name(type value) \
 | 
						void klass :: set##name(type value) \
 | 
				
			||||||
	{ \
 | 
						{ \
 | 
				
			||||||
 | 
							guardDisposed(); \
 | 
				
			||||||
		*location = *value; \
 | 
							*location = *value; \
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -148,6 +151,7 @@ inline bool contains(const C &c, const V &v)
 | 
				
			||||||
	DEF_ATTR_RD_SIMPLE_DETAILED(klass, name, type, location, ) \
 | 
						DEF_ATTR_RD_SIMPLE_DETAILED(klass, name, type, location, ) \
 | 
				
			||||||
	void klass :: set##name(type value) \
 | 
						void klass :: set##name(type value) \
 | 
				
			||||||
	{ \
 | 
						{ \
 | 
				
			||||||
 | 
							guardDisposed(); \
 | 
				
			||||||
		*location = *value; \
 | 
							*location = *value; \
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -134,9 +134,14 @@ void Viewport::initViewport(int x, int y, int width, int height)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
Viewport::~Viewport()
 | 
					Viewport::~Viewport()
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	unlink();
 | 
						dispose();
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	delete p;
 | 
					void Viewport::update()
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						guardDisposed();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						Flashable::update();
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
DEF_ATTR_RD_SIMPLE(Viewport, OX,   int,   geometry.xOrigin)
 | 
					DEF_ATTR_RD_SIMPLE(Viewport, OX,   int,   geometry.xOrigin)
 | 
				
			||||||
| 
						 | 
					@ -148,6 +153,8 @@ DEF_ATTR_OBJ_VALUE(Viewport, Tone,  Tone*,  p->tone)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void Viewport::setOX(int value)
 | 
					void Viewport::setOX(int value)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
 | 
						guardDisposed();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (geometry.xOrigin == value)
 | 
						if (geometry.xOrigin == value)
 | 
				
			||||||
		return;
 | 
							return;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -157,6 +164,8 @@ void Viewport::setOX(int value)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void Viewport::setOY(int value)
 | 
					void Viewport::setOY(int value)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
 | 
						guardDisposed();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (geometry.yOrigin == value)
 | 
						if (geometry.yOrigin == value)
 | 
				
			||||||
		return;
 | 
							return;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -212,6 +221,13 @@ void Viewport::onGeometryChange(const Geometry &geo)
 | 
				
			||||||
	p->recomputeOnScreen();
 | 
						p->recomputeOnScreen();
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void Viewport::releaseResources()
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						unlink();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						delete p;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
ViewportElement::ViewportElement(Viewport *viewport, int z, int spriteY)
 | 
					ViewportElement::ViewportElement(Viewport *viewport, int z, int spriteY)
 | 
				
			||||||
    : SceneElement(viewport ? *viewport : *shState->screen(), z, spriteY),
 | 
					    : SceneElement(viewport ? *viewport : *shState->screen(), z, spriteY),
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -37,6 +37,8 @@ public:
 | 
				
			||||||
	Viewport();
 | 
						Viewport();
 | 
				
			||||||
	~Viewport();
 | 
						~Viewport();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						void update();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	DECL_ATTR( Rect,  Rect*  )
 | 
						DECL_ATTR( Rect,  Rect*  )
 | 
				
			||||||
	DECL_ATTR( OX,    int    )
 | 
						DECL_ATTR( OX,    int    )
 | 
				
			||||||
	DECL_ATTR( OY,    int    )
 | 
						DECL_ATTR( OY,    int    )
 | 
				
			||||||
| 
						 | 
					@ -54,6 +56,11 @@ private:
 | 
				
			||||||
	void onGeometryChange(const Geometry &);
 | 
						void onGeometryChange(const Geometry &);
 | 
				
			||||||
	bool isEffectiveViewport(Rect *&, Color *&, Tone *&) const;
 | 
						bool isEffectiveViewport(Rect *&, Color *&, Tone *&) const;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						void releaseResources();
 | 
				
			||||||
 | 
						const char *klassName() const { return "viewport"; }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						ABOUT_TO_ACCESS_DISP
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	ViewportPrivate *p;
 | 
						ViewportPrivate *p;
 | 
				
			||||||
	friend struct ViewportPrivate;
 | 
						friend struct ViewportPrivate;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -169,10 +169,8 @@ struct QuadChunk
 | 
				
			||||||
struct WindowPrivate
 | 
					struct WindowPrivate
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	Bitmap *windowskin;
 | 
						Bitmap *windowskin;
 | 
				
			||||||
	DisposeWatch<WindowPrivate, Bitmap> windowskinWatch;
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
	Bitmap *contents;
 | 
						Bitmap *contents;
 | 
				
			||||||
	DisposeWatch<WindowPrivate, Bitmap> contentsWatch;
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
	bool bgStretch;
 | 
						bool bgStretch;
 | 
				
			||||||
	Rect *cursorRect;
 | 
						Rect *cursorRect;
 | 
				
			||||||
| 
						 | 
					@ -226,6 +224,8 @@ struct WindowPrivate
 | 
				
			||||||
		{
 | 
							{
 | 
				
			||||||
			unlink();
 | 
								unlink();
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							ABOUT_TO_ACCESS_NOOP
 | 
				
			||||||
	};
 | 
						};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	WindowControls controlsElement;
 | 
						WindowControls controlsElement;
 | 
				
			||||||
| 
						 | 
					@ -250,9 +250,7 @@ struct WindowPrivate
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	WindowPrivate(Viewport *viewport = 0)
 | 
						WindowPrivate(Viewport *viewport = 0)
 | 
				
			||||||
	    : windowskin(0),
 | 
						    : windowskin(0),
 | 
				
			||||||
	      windowskinWatch(*this, windowskin),
 | 
					 | 
				
			||||||
	      contents(0),
 | 
						      contents(0),
 | 
				
			||||||
	      contentsWatch(*this, contents, &WindowPrivate::markControlVertDirty),
 | 
					 | 
				
			||||||
	      bgStretch(true),
 | 
						      bgStretch(true),
 | 
				
			||||||
	      cursorRect(&tmp.rect),
 | 
						      cursorRect(&tmp.rect),
 | 
				
			||||||
	      active(true),
 | 
						      active(true),
 | 
				
			||||||
| 
						 | 
					@ -550,7 +548,7 @@ struct WindowPrivate
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	void drawBase()
 | 
						void drawBase()
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
		if (!windowskin)
 | 
							if (nullOrDisposed(windowskin))
 | 
				
			||||||
			return;
 | 
								return;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		if (size == Vec2i(0, 0))
 | 
							if (size == Vec2i(0, 0))
 | 
				
			||||||
| 
						 | 
					@ -584,7 +582,7 @@ struct WindowPrivate
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	void drawControls()
 | 
						void drawControls()
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
		if (!windowskin && !contents)
 | 
							if (nullOrDisposed(windowskin) && nullOrDisposed(contents))
 | 
				
			||||||
			return;
 | 
								return;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		if (size == Vec2i(0, 0))
 | 
							if (size == Vec2i(0, 0))
 | 
				
			||||||
| 
						 | 
					@ -612,7 +610,7 @@ struct WindowPrivate
 | 
				
			||||||
		shader.bind();
 | 
							shader.bind();
 | 
				
			||||||
		shader.applyViewportProj();
 | 
							shader.applyViewportProj();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		if (windowskin)
 | 
							if (!nullOrDisposed(windowskin))
 | 
				
			||||||
		{
 | 
							{
 | 
				
			||||||
			shader.setTranslation(Vec2i(effectX, effectY));
 | 
								shader.setTranslation(Vec2i(effectX, effectY));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -625,7 +623,7 @@ struct WindowPrivate
 | 
				
			||||||
			TEX::setSmooth(false);
 | 
								TEX::setSmooth(false);
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		if (contents)
 | 
							if (!nullOrDisposed(contents))
 | 
				
			||||||
		{
 | 
							{
 | 
				
			||||||
			/* Draw contents bitmap */
 | 
								/* Draw contents bitmap */
 | 
				
			||||||
			glState.scissorBox.setIntersect(contentsRect);
 | 
								glState.scissorBox.setIntersect(contentsRect);
 | 
				
			||||||
| 
						 | 
					@ -692,15 +690,13 @@ Window::Window(Viewport *viewport)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
Window::~Window()
 | 
					Window::~Window()
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	p->controlsElement.release();
 | 
						dispose();
 | 
				
			||||||
 | 
					 | 
				
			||||||
	unlink();
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	delete p;
 | 
					 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void Window::update()
 | 
					void Window::update()
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
 | 
						guardDisposed();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	p->updateControls();
 | 
						p->updateControls();
 | 
				
			||||||
	p->stepAnimations();
 | 
						p->stepAnimations();
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
| 
						 | 
					@ -725,8 +721,9 @@ DEF_ATTR_OBJ_VALUE(Window, CursorRect,      Rect*,   p->cursorRect)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void Window::setWindowskin(Bitmap *value)
 | 
					void Window::setWindowskin(Bitmap *value)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
 | 
						guardDisposed();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	p->windowskin = value;
 | 
						p->windowskin = value;
 | 
				
			||||||
	p->windowskinWatch.update(value);
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (!value)
 | 
						if (!value)
 | 
				
			||||||
		return;
 | 
							return;
 | 
				
			||||||
| 
						 | 
					@ -736,11 +733,12 @@ void Window::setWindowskin(Bitmap *value)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void Window::setContents(Bitmap *value)
 | 
					void Window::setContents(Bitmap *value)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
 | 
						guardDisposed();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (p->contents == value)
 | 
						if (p->contents == value)
 | 
				
			||||||
		return;
 | 
							return;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	p->contents = value;
 | 
						p->contents = value;
 | 
				
			||||||
	p->contentsWatch.update(value);
 | 
					 | 
				
			||||||
	p->controlsVertDirty = true;
 | 
						p->controlsVertDirty = true;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (!value)
 | 
						if (!value)
 | 
				
			||||||
| 
						 | 
					@ -752,6 +750,8 @@ void Window::setContents(Bitmap *value)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void Window::setStretch(bool value)
 | 
					void Window::setStretch(bool value)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
 | 
						guardDisposed();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (value == p->bgStretch)
 | 
						if (value == p->bgStretch)
 | 
				
			||||||
		return;
 | 
							return;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -761,6 +761,8 @@ void Window::setStretch(bool value)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void Window::setActive(bool value)
 | 
					void Window::setActive(bool value)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
 | 
						guardDisposed();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (p->active == value)
 | 
						if (p->active == value)
 | 
				
			||||||
		return;
 | 
							return;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -770,6 +772,8 @@ void Window::setActive(bool value)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void Window::setPause(bool value)
 | 
					void Window::setPause(bool value)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
 | 
						guardDisposed();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (p->pause == value)
 | 
						if (p->pause == value)
 | 
				
			||||||
		return;
 | 
							return;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -781,6 +785,8 @@ void Window::setPause(bool value)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void Window::setWidth(int value)
 | 
					void Window::setWidth(int value)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
 | 
						guardDisposed();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (p->size.x == value)
 | 
						if (p->size.x == value)
 | 
				
			||||||
		return;
 | 
							return;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -790,6 +796,8 @@ void Window::setWidth(int value)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void Window::setHeight(int value)
 | 
					void Window::setHeight(int value)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
 | 
						guardDisposed();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (p->size.y == value)
 | 
						if (p->size.y == value)
 | 
				
			||||||
		return;
 | 
							return;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -799,6 +807,8 @@ void Window::setHeight(int value)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void Window::setOX(int value)
 | 
					void Window::setOX(int value)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
 | 
						guardDisposed();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (p->contentsOffset.x == value)
 | 
						if (p->contentsOffset.x == value)
 | 
				
			||||||
		return;
 | 
							return;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -808,6 +818,8 @@ void Window::setOX(int value)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void Window::setOY(int value)
 | 
					void Window::setOY(int value)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
 | 
						guardDisposed();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (p->contentsOffset.y == value)
 | 
						if (p->contentsOffset.y == value)
 | 
				
			||||||
		return;
 | 
							return;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -817,6 +829,8 @@ void Window::setOY(int value)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void Window::setOpacity(int value)
 | 
					void Window::setOpacity(int value)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
 | 
						guardDisposed();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (p->opacity == value)
 | 
						if (p->opacity == value)
 | 
				
			||||||
		return;
 | 
							return;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -826,6 +840,8 @@ void Window::setOpacity(int value)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void Window::setBackOpacity(int value)
 | 
					void Window::setBackOpacity(int value)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
 | 
						guardDisposed();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (p->backOpacity == value)
 | 
						if (p->backOpacity == value)
 | 
				
			||||||
		return;
 | 
							return;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -835,6 +851,8 @@ void Window::setBackOpacity(int value)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void Window::setContentsOpacity(int value)
 | 
					void Window::setContentsOpacity(int value)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
 | 
						guardDisposed();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (p->contentsOpacity == value)
 | 
						if (p->contentsOpacity == value)
 | 
				
			||||||
		return;
 | 
							return;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -878,3 +896,12 @@ void Window::onViewportChange()
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	p->controlsElement.setScene(*this->scene);
 | 
						p->controlsElement.setScene(*this->scene);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void Window::releaseResources()
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						p->controlsElement.release();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						unlink();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						delete p;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -67,6 +67,11 @@ private:
 | 
				
			||||||
	void setVisible(bool value);
 | 
						void setVisible(bool value);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	void onViewportChange();
 | 
						void onViewportChange();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						void releaseResources();
 | 
				
			||||||
 | 
						const char *klassName() const { return "window"; }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						ABOUT_TO_ACCESS_DISP
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#endif // WINDOW_H
 | 
					#endif // WINDOW_H
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -148,15 +148,11 @@ static const uint8_t pauseQuad[] =
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static elementsN(pauseQuad);
 | 
					static elementsN(pauseQuad);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
typedef DisposeWatch<WindowVXPrivate, Bitmap> BitmapWatch;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
struct WindowVXPrivate
 | 
					struct WindowVXPrivate
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	Bitmap *windowskin;
 | 
						Bitmap *windowskin;
 | 
				
			||||||
	BitmapWatch windowskinWatch;
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
	Bitmap *contents;
 | 
						Bitmap *contents;
 | 
				
			||||||
	BitmapWatch contentsWatch;
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
	Rect *cursorRect;
 | 
						Rect *cursorRect;
 | 
				
			||||||
	bool active;
 | 
						bool active;
 | 
				
			||||||
| 
						 | 
					@ -227,9 +223,7 @@ struct WindowVXPrivate
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	WindowVXPrivate(int x, int y, int w, int h)
 | 
						WindowVXPrivate(int x, int y, int w, int h)
 | 
				
			||||||
	    : windowskin(0),
 | 
						    : windowskin(0),
 | 
				
			||||||
	      windowskinWatch(*this, windowskin),
 | 
					 | 
				
			||||||
	      contents(0),
 | 
						      contents(0),
 | 
				
			||||||
	      contentsWatch(*this, contents),
 | 
					 | 
				
			||||||
	      cursorRect(&tmp.rect),
 | 
						      cursorRect(&tmp.rect),
 | 
				
			||||||
	      active(true),
 | 
						      active(true),
 | 
				
			||||||
	      arrowsVisible(true),
 | 
						      arrowsVisible(true),
 | 
				
			||||||
| 
						 | 
					@ -401,7 +395,7 @@ struct WindowVXPrivate
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	void redrawBaseTex()
 | 
						void redrawBaseTex()
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
		if (!windowskin)
 | 
							if (nullOrDisposed(windowskin))
 | 
				
			||||||
			return;
 | 
								return;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		if (base.tex.tex == TEX::ID(0))
 | 
							if (base.tex.tex == TEX::ID(0))
 | 
				
			||||||
| 
						 | 
					@ -514,7 +508,7 @@ struct WindowVXPrivate
 | 
				
			||||||
		size_t i = 0;
 | 
							size_t i = 0;
 | 
				
			||||||
		Vertex *vert = &ctrlVert.vertices[0];
 | 
							Vertex *vert = &ctrlVert.vertices[0];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		if (contents && arrowsVisible)
 | 
							if (!nullOrDisposed(contents) && arrowsVisible)
 | 
				
			||||||
		{
 | 
							{
 | 
				
			||||||
			if (contentsOff.x > 0)
 | 
								if (contentsOff.x > 0)
 | 
				
			||||||
				i += Quad::setTexPosRect(&vert[i*4], scrollArrowSrc.l, arrowPos.l);
 | 
									i += Quad::setTexPosRect(&vert[i*4], scrollArrowSrc.l, arrowPos.l);
 | 
				
			||||||
| 
						 | 
					@ -721,6 +715,9 @@ struct WindowVXPrivate
 | 
				
			||||||
		if (base.tex.tex == TEX::ID(0))
 | 
							if (base.tex.tex == TEX::ID(0))
 | 
				
			||||||
			return;
 | 
								return;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							bool windowskinValid = !nullOrDisposed(windowskin);
 | 
				
			||||||
 | 
							bool contentsValid = !nullOrDisposed(contents);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		Vec2i trans(geo.x + sceneOffset.x,
 | 
							Vec2i trans(geo.x + sceneOffset.x,
 | 
				
			||||||
		            geo.y + sceneOffset.y);
 | 
							            geo.y + sceneOffset.y);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -728,7 +725,7 @@ struct WindowVXPrivate
 | 
				
			||||||
		shader.bind();
 | 
							shader.bind();
 | 
				
			||||||
		shader.applyViewportProj();
 | 
							shader.applyViewportProj();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		if (windowskin)
 | 
							if (windowskinValid)
 | 
				
			||||||
		{
 | 
							{
 | 
				
			||||||
			shader.setTranslation(trans);
 | 
								shader.setTranslation(trans);
 | 
				
			||||||
			shader.setTexSize(Vec2i(base.tex.width, base.tex.height));
 | 
								shader.setTexSize(Vec2i(base.tex.width, base.tex.height));
 | 
				
			||||||
| 
						 | 
					@ -749,9 +746,9 @@ struct WindowVXPrivate
 | 
				
			||||||
		if (openness < 255)
 | 
							if (openness < 255)
 | 
				
			||||||
			return;
 | 
								return;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		bool drawCursor = cursorVert.count() > 0 && windowskin;
 | 
							bool drawCursor = cursorVert.count() > 0 && windowskinValid;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		if (drawCursor || contents)
 | 
							if (drawCursor || contentsValid)
 | 
				
			||||||
		{
 | 
							{
 | 
				
			||||||
			/* Translate cliprect from local into screen space */
 | 
								/* Translate cliprect from local into screen space */
 | 
				
			||||||
			IntRect clip = clipRect;
 | 
								IntRect clip = clipRect;
 | 
				
			||||||
| 
						 | 
					@ -789,7 +786,7 @@ struct WindowVXPrivate
 | 
				
			||||||
				TEX::setSmooth(false);
 | 
									TEX::setSmooth(false);
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
			if (contents)
 | 
								if (contentsValid)
 | 
				
			||||||
			{
 | 
								{
 | 
				
			||||||
				if (rgssVer <= 2)
 | 
									if (rgssVer <= 2)
 | 
				
			||||||
					glState.scissorBox.setIntersect(clip);
 | 
										glState.scissorBox.setIntersect(clip);
 | 
				
			||||||
| 
						 | 
					@ -828,13 +825,13 @@ WindowVX::WindowVX(int x, int y, int width, int height)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
WindowVX::~WindowVX()
 | 
					WindowVX::~WindowVX()
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	unlink();
 | 
						dispose();
 | 
				
			||||||
 | 
					 | 
				
			||||||
	delete p;
 | 
					 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void WindowVX::update()
 | 
					void WindowVX::update()
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
 | 
						guardDisposed();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	p->stepAnimations();
 | 
						p->stepAnimations();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	p->updatePauseQuad();
 | 
						p->updatePauseQuad();
 | 
				
			||||||
| 
						 | 
					@ -843,6 +840,8 @@ void WindowVX::update()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void WindowVX::move(int x, int y, int width, int height)
 | 
					void WindowVX::move(int x, int y, int width, int height)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
 | 
						guardDisposed();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	p->width = width;
 | 
						p->width = width;
 | 
				
			||||||
	p->height = height;
 | 
						p->height = height;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -857,11 +856,15 @@ void WindowVX::move(int x, int y, int width, int height)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
bool WindowVX::isOpen() const
 | 
					bool WindowVX::isOpen() const
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
 | 
						guardDisposed();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	return p->openness == 255;
 | 
						return p->openness == 255;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
bool WindowVX::isClosed() const
 | 
					bool WindowVX::isClosed() const
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
 | 
						guardDisposed();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	return p->openness == 0;
 | 
						return p->openness == 0;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -889,21 +892,23 @@ DEF_ATTR_OBJ_VALUE(WindowVX, Tone,            Tone*,   p->tone)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void WindowVX::setWindowskin(Bitmap *value)
 | 
					void WindowVX::setWindowskin(Bitmap *value)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
 | 
						guardDisposed();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (p->windowskin == value)
 | 
						if (p->windowskin == value)
 | 
				
			||||||
		return;
 | 
							return;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	p->windowskin = value;
 | 
						p->windowskin = value;
 | 
				
			||||||
	p->windowskinWatch.update(value);
 | 
					 | 
				
			||||||
	p->base.texDirty = true;
 | 
						p->base.texDirty = true;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void WindowVX::setContents(Bitmap *value)
 | 
					void WindowVX::setContents(Bitmap *value)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
 | 
						guardDisposed();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (p->contents == value)
 | 
						if (p->contents == value)
 | 
				
			||||||
		return;
 | 
							return;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	p->contents = value;
 | 
						p->contents = value;
 | 
				
			||||||
	p->contentsWatch.update(value);
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
	FloatRect rect = p->contents->rect();
 | 
						FloatRect rect = p->contents->rect();
 | 
				
			||||||
	p->contentsQuad.setTexPosRect(rect, rect);
 | 
						p->contentsQuad.setTexPosRect(rect, rect);
 | 
				
			||||||
| 
						 | 
					@ -912,6 +917,8 @@ void WindowVX::setContents(Bitmap *value)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void WindowVX::setActive(bool value)
 | 
					void WindowVX::setActive(bool value)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
 | 
						guardDisposed();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (p->active == value)
 | 
						if (p->active == value)
 | 
				
			||||||
		return;
 | 
							return;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -922,6 +929,8 @@ void WindowVX::setActive(bool value)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void WindowVX::setArrowsVisible(bool value)
 | 
					void WindowVX::setArrowsVisible(bool value)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
 | 
						guardDisposed();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (p->arrowsVisible == value)
 | 
						if (p->arrowsVisible == value)
 | 
				
			||||||
		return;
 | 
							return;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -931,6 +940,8 @@ void WindowVX::setArrowsVisible(bool value)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void WindowVX::setPause(bool value)
 | 
					void WindowVX::setPause(bool value)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
 | 
						guardDisposed();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (p->pause == value)
 | 
						if (p->pause == value)
 | 
				
			||||||
		return;
 | 
							return;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -942,6 +953,8 @@ void WindowVX::setPause(bool value)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void WindowVX::setWidth(int value)
 | 
					void WindowVX::setWidth(int value)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
 | 
						guardDisposed();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (p->width == value)
 | 
						if (p->width == value)
 | 
				
			||||||
		return;
 | 
							return;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -956,6 +969,8 @@ void WindowVX::setWidth(int value)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void WindowVX::setHeight(int value)
 | 
					void WindowVX::setHeight(int value)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
 | 
						guardDisposed();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (p->height == value)
 | 
						if (p->height == value)
 | 
				
			||||||
		return;
 | 
							return;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -970,6 +985,8 @@ void WindowVX::setHeight(int value)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void WindowVX::setOX(int value)
 | 
					void WindowVX::setOX(int value)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
 | 
						guardDisposed();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (p->contentsOff.x == value)
 | 
						if (p->contentsOff.x == value)
 | 
				
			||||||
		return;
 | 
							return;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -979,6 +996,8 @@ void WindowVX::setOX(int value)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void WindowVX::setOY(int value)
 | 
					void WindowVX::setOY(int value)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
 | 
						guardDisposed();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (p->contentsOff.y == value)
 | 
						if (p->contentsOff.y == value)
 | 
				
			||||||
		return;
 | 
							return;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -988,6 +1007,8 @@ void WindowVX::setOY(int value)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void WindowVX::setPadding(int value)
 | 
					void WindowVX::setPadding(int value)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
 | 
						guardDisposed();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (p->padding == value)
 | 
						if (p->padding == value)
 | 
				
			||||||
		return;
 | 
							return;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -998,6 +1019,8 @@ void WindowVX::setPadding(int value)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void WindowVX::setPaddingBottom(int value)
 | 
					void WindowVX::setPaddingBottom(int value)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
 | 
						guardDisposed();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (p->paddingBottom == value)
 | 
						if (p->paddingBottom == value)
 | 
				
			||||||
		return;
 | 
							return;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1007,6 +1030,8 @@ void WindowVX::setPaddingBottom(int value)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void WindowVX::setOpacity(int value)
 | 
					void WindowVX::setOpacity(int value)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
 | 
						guardDisposed();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (p->opacity == value)
 | 
						if (p->opacity == value)
 | 
				
			||||||
		return;
 | 
							return;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1016,6 +1041,8 @@ void WindowVX::setOpacity(int value)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void WindowVX::setBackOpacity(int value)
 | 
					void WindowVX::setBackOpacity(int value)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
 | 
						guardDisposed();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (p->backOpacity == value)
 | 
						if (p->backOpacity == value)
 | 
				
			||||||
		return;
 | 
							return;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1025,6 +1052,8 @@ void WindowVX::setBackOpacity(int value)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void WindowVX::setContentsOpacity(int value)
 | 
					void WindowVX::setContentsOpacity(int value)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
 | 
						guardDisposed();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (p->contentsOpacity == value)
 | 
						if (p->contentsOpacity == value)
 | 
				
			||||||
		return;
 | 
							return;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1034,6 +1063,8 @@ void WindowVX::setContentsOpacity(int value)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void WindowVX::setOpenness(int value)
 | 
					void WindowVX::setOpenness(int value)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
 | 
						guardDisposed();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (p->openness == value)
 | 
						if (p->openness == value)
 | 
				
			||||||
		return;
 | 
							return;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1063,3 +1094,10 @@ void WindowVX::onGeometryChange(const Scene::Geometry &geo)
 | 
				
			||||||
	p->sceneOffset.x = geo.rect.x - geo.xOrigin;
 | 
						p->sceneOffset.x = geo.rect.x - geo.xOrigin;
 | 
				
			||||||
	p->sceneOffset.y = geo.rect.y - geo.yOrigin;
 | 
						p->sceneOffset.y = geo.rect.y - geo.yOrigin;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void WindowVX::releaseResources()
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						unlink();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						delete p;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -73,6 +73,11 @@ private:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	void draw();
 | 
						void draw();
 | 
				
			||||||
	void onGeometryChange(const Scene::Geometry &);
 | 
						void onGeometryChange(const Scene::Geometry &);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						void releaseResources();
 | 
				
			||||||
 | 
						const char *klassName() const { return "window"; }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						ABOUT_TO_ACCESS_DISP
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#endif // WINDOWVX_H
 | 
					#endif // WINDOWVX_H
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue