From 5983b93a4d8205a4669b92d6ada60aa53c02c664 Mon Sep 17 00:00:00 2001 From: groogy Date: Tue, 16 Nov 2010 20:31:57 +0000 Subject: [PATCH] Created the graphics module and the Color class. SFML::Color is not done yet. git-svn-id: https://sfml.svn.sourceforge.net/svnroot/sfml/branches/sfml2@1662 4e206d99-4929-0410-ac5d-dfc041789085 --- bindings/ruby/sfml-graphics/Makefile | 187 ++++++++++++++++++ bindings/ruby/sfml-graphics/extconf.rb | 26 +++ .../ruby/sfml-graphics/graphics/Color.cpp | 92 +++++++++ .../ruby/sfml-graphics/graphics/Color.hpp | 31 +++ bindings/ruby/sfml-graphics/graphics/main.cpp | 66 +++++++ bindings/ruby/sfml-graphics/graphics/main.hpp | 42 ++++ 6 files changed, 444 insertions(+) create mode 100644 bindings/ruby/sfml-graphics/Makefile create mode 100644 bindings/ruby/sfml-graphics/extconf.rb create mode 100644 bindings/ruby/sfml-graphics/graphics/Color.cpp create mode 100644 bindings/ruby/sfml-graphics/graphics/Color.hpp create mode 100644 bindings/ruby/sfml-graphics/graphics/main.cpp create mode 100644 bindings/ruby/sfml-graphics/graphics/main.hpp diff --git a/bindings/ruby/sfml-graphics/Makefile b/bindings/ruby/sfml-graphics/Makefile new file mode 100644 index 000000000..7ec1c9962 --- /dev/null +++ b/bindings/ruby/sfml-graphics/Makefile @@ -0,0 +1,187 @@ + +SHELL = /bin/sh + +#### Start of system configuration section. #### + +srcdir = graphics +topdir = /usr/include/ruby-1.9.1 +hdrdir = /usr/include/ruby-1.9.1 +arch_hdrdir = /usr/include/ruby-1.9.1/$(arch) +VPATH = $(srcdir):$(arch_hdrdir)/ruby:$(hdrdir)/ruby +prefix = $(DESTDIR)/usr +rubylibprefix = $(libdir)/$(RUBY_BASE_NAME) +exec_prefix = $(prefix) +vendorhdrdir = $(rubyhdrdir)/vendor_ruby +sitehdrdir = $(rubyhdrdir)/site_ruby +rubyhdrdir = $(includedir)/$(RUBY_BASE_NAME)-$(ruby_version) +vendordir = $(DESTDIR)/usr/lib/ruby/vendor_ruby +sitedir = $(DESTDIR)/usr/local/lib/site_ruby +ridir = $(datarootdir)/$(RI_BASE_NAME) +mandir = $(prefix)/share/man +localedir = $(datarootdir)/locale +libdir = $(exec_prefix)/lib +psdir = $(docdir) +pdfdir = $(docdir) +dvidir = $(docdir) +htmldir = $(docdir) +infodir = $(prefix)/share/info +docdir = $(datarootdir)/doc/$(PACKAGE) +oldincludedir = $(DESTDIR)/usr/include +includedir = $(prefix)/include +localstatedir = $(DESTDIR)/var +sharedstatedir = $(prefix)/com +sysconfdir = $(DESTDIR)/etc +datadir = $(datarootdir) +datarootdir = $(prefix)/share +libexecdir = $(prefix)/lib/ruby1.9.1 +sbindir = $(exec_prefix)/sbin +bindir = $(exec_prefix)/bin +rubylibdir = $(rubylibprefix)/$(ruby_version) +archdir = $(rubylibdir)/$(arch) +sitelibdir = $(sitedir)/$(ruby_version) +sitearchdir = $(sitelibdir)/$(sitearch) +vendorlibdir = $(vendordir)/$(ruby_version) +vendorarchdir = $(vendorlibdir)/$(sitearch) + +CC = gcc +CXX = g++ +LIBRUBY = $(LIBRUBY_SO) +LIBRUBY_A = lib$(RUBY_SO_NAME)-static.a +LIBRUBYARG_SHARED = -l$(RUBY_SO_NAME) +LIBRUBYARG_STATIC = -l$(RUBY_SO_NAME)-static +OUTFLAG = -o +COUTFLAG = -o + +RUBY_EXTCONF_H = +cflags = $(optflags) $(debugflags) $(warnflags) +optflags = -O3 +debugflags = -ggdb +warnflags = -Wextra -Wno-unused-parameter -Wno-parentheses -Wpointer-arith -Wwrite-strings -Wno-missing-field-initializers -Wno-long-long +CFLAGS = -fPIC -fno-strict-aliasing -g -g -O2 -fPIC +INCFLAGS = -I. -I$(arch_hdrdir) -I$(hdrdir)/ruby/backward -I$(hdrdir) -I$(srcdir) +DEFS = -D_FILE_OFFSET_BITS=64 +CPPFLAGS = $(DEFS) $(cppflags) +CXXFLAGS = $(CFLAGS) -fno-strict-aliasing -g +ldflags = -L. -rdynamic -Wl,-export-dynamic +dldflags = +ARCH_FLAG = +DLDFLAGS = $(ldflags) $(dldflags) +LDSHARED = $(CC) -shared +LDSHAREDXX = $(CXX) -shared +AR = ar +EXEEXT = + +RUBY_BASE_NAME = ruby +RUBY_INSTALL_NAME = ruby1.9.1 +RUBY_SO_NAME = ruby-1.9.1 +arch = i686-linux +sitearch = $(arch) +ruby_version = 1.9.1 +ruby = /usr/bin/ruby1.9.1 +RUBY = $(ruby) +RM = rm -f +RM_RF = $(RUBY) -run -e rm -- -rf +RMDIRS = $(RUBY) -run -e rmdir -- -p +MAKEDIRS = /bin/mkdir -p +INSTALL = /usr/bin/install -c +INSTALL_PROG = $(INSTALL) -m 0755 +INSTALL_DATA = $(INSTALL) -m 644 +COPY = cp + +#### End of system configuration section. #### + +preload = + +libpath = . $(libdir) +LIBPATH = -L. -L$(libdir) +DEFFILE = + +CLEANFILES = mkmf.log +DISTCLEANFILES = +DISTCLEANDIRS = + +extout = +extout_prefix = +target_prefix = /sfml +LOCAL_LIBS = +LIBS = $(LIBRUBYARG_SHARED) -lsfml-graphics -lpthread -lrt -ldl -lcrypt -lm -lc +SRCS = main.cpp Color.cpp +OBJS = main.o Color.o +TARGET = graphics +DLLIB = $(TARGET).so +EXTSTATIC = +STATIC_LIB = + +BINDIR = $(bindir) +RUBYCOMMONDIR = $(sitedir)$(target_prefix) +RUBYLIBDIR = $(sitelibdir)$(target_prefix) +RUBYARCHDIR = $(sitearchdir)$(target_prefix) +HDRDIR = $(rubyhdrdir)/ruby$(target_prefix) +ARCHHDRDIR = $(rubyhdrdir)/$(arch)/ruby$(target_prefix) + +TARGET_SO = $(DLLIB) +CLEANLIBS = $(TARGET).so +CLEANOBJS = *.o *.bak + +all: $(DLLIB) +static: $(STATIC_LIB) +.PHONY: all install static install-so install-rb +.PHONY: clean clean-so clean-rb + +clean-rb-default:: +clean-rb:: +clean-so:: +clean: clean-so clean-rb-default clean-rb + @-$(RM) $(CLEANLIBS) $(CLEANOBJS) $(CLEANFILES) + +distclean-rb-default:: +distclean-rb:: +distclean-so:: +distclean: clean distclean-so distclean-rb-default distclean-rb + @-$(RM) Makefile $(RUBY_EXTCONF_H) conftest.* mkmf.log + @-$(RM) core ruby$(EXEEXT) *~ $(DISTCLEANFILES) + @-$(RMDIRS) $(DISTCLEANDIRS) + +realclean: distclean +install: install-so install-rb + +install-so: $(RUBYARCHDIR) +install-so: $(RUBYARCHDIR)/$(DLLIB) +$(RUBYARCHDIR)/$(DLLIB): $(DLLIB) + @-$(MAKEDIRS) $(@D) + $(INSTALL_PROG) $(DLLIB) $(@D) +install-rb: pre-install-rb install-rb-default +install-rb-default: pre-install-rb-default +pre-install-rb: Makefile +pre-install-rb-default: Makefile +$(RUBYARCHDIR): + $(MAKEDIRS) $@ + +site-install: site-install-so site-install-rb +site-install-so: install-so +site-install-rb: install-rb + +.SUFFIXES: .c .m .cc .cxx .cpp .C .o + +.cc.o: + $(CXX) $(INCFLAGS) $(CPPFLAGS) $(CXXFLAGS) $(COUTFLAG)$@ -c $< + +.cxx.o: + $(CXX) $(INCFLAGS) $(CPPFLAGS) $(CXXFLAGS) $(COUTFLAG)$@ -c $< + +.cpp.o: + $(CXX) $(INCFLAGS) $(CPPFLAGS) $(CXXFLAGS) $(COUTFLAG)$@ -c $< + +.C.o: + $(CXX) $(INCFLAGS) $(CPPFLAGS) $(CXXFLAGS) $(COUTFLAG)$@ -c $< + +.c.o: + $(CC) $(INCFLAGS) $(CPPFLAGS) $(CFLAGS) $(COUTFLAG)$@ -c $< + +$(DLLIB): $(OBJS) Makefile + @-$(RM) $(@) + $(LDSHAREDXX) -o $@ $(OBJS) $(LIBPATH) $(DLDFLAGS) $(LOCAL_LIBS) $(LIBS) + + + +$(OBJS): $(hdrdir)/ruby.h $(hdrdir)/ruby/defines.h $(arch_hdrdir)/ruby/config.h diff --git a/bindings/ruby/sfml-graphics/extconf.rb b/bindings/ruby/sfml-graphics/extconf.rb new file mode 100644 index 000000000..8db2a5619 --- /dev/null +++ b/bindings/ruby/sfml-graphics/extconf.rb @@ -0,0 +1,26 @@ +# rbSFML - Copyright (c) 2010 Henrik Valter Vogelius Hansson - groogy@groogy.se +# This software is provided 'as-is', without any express or +# implied warranty. In no event will the authors be held +# liable for any damages arising from the use of this software. +# +# Permission is granted to anyone to use this software for any purpose, +# including commercial applications, and to alter it and redistribute +# it freely, subject to the following restrictions: +# +# 1. The origin of this software must not be misrepresented; +# you must not claim that you wrote the original software. +# If you use this software in a product, an acknowledgment +# in the product documentation would be appreciated but +# is not required. +# +# 2. Altered source versions must be plainly marked as such, +# and must not be misrepresented as being the original software. +# +# 3. This notice may not be removed or altered from any +# source distribution. + +require 'mkmf' + +dir_config("graphics") +have_library("sfml-graphics") +create_makefile("sfml/graphics", "graphics") diff --git a/bindings/ruby/sfml-graphics/graphics/Color.cpp b/bindings/ruby/sfml-graphics/graphics/Color.cpp new file mode 100644 index 000000000..cdac53e7a --- /dev/null +++ b/bindings/ruby/sfml-graphics/graphics/Color.cpp @@ -0,0 +1,92 @@ +/* rbSFML - Copyright (c) 2010 Henrik Valter Vogelius Hansson - groogy@groogy.se + * This software is provided 'as-is', without any express or + * implied warranty. In no event will the authors be held + * liable for any damages arising from the use of this software. + * + * Permission is granted to anyone to use this software for any purpose, + * including commercial applications, and to alter it and redistribute + * it freely, subject to the following restrictions: + * + * 1. The origin of this software must not be misrepresented; + * you must not claim that you wrote the original software. + * If you use this software in a product, an acknowledgment + * in the product documentation would be appreciated but + * is not required. + * + * 2. Altered source versions must be plainly marked as such, + * and must not be misrepresented as being the original software. + * + * 3. This notice may not be removed or altered from any + * source distribution. + */ + +#include "Color.hpp" +#include "main.hpp" +#include + +VALUE globalColorClass; + +/* Internal function + * Will copy the x and y from aSource to self. + */ +static void Color_internal_CopyFrom( VALUE self, VALUE aSource ) +{ + VALUE r = rb_funcall( aSource, rb_intern( "r" ), 0 ); + VALUE g = rb_funcall( aSource, rb_intern( "g" ), 0 ); + VALUE b = rb_funcall( aSource, rb_intern( "b" ), 0 ); + VALUE a = rb_funcall( aSource, rb_intern( "a" ), 0 ); + + rb_funcall( self, rb_intern( "r=" ), 1, r ); + rb_funcall( self, rb_intern( "g=" ), 1, g ); + rb_funcall( self, rb_intern( "b=" ), 1, b ); + rb_funcall( self, rb_intern( "a=" ), 1, a ); +} + + +static VALUE Color_Initialize( int argc, VALUE * args, VALUE self ) +{ + rb_iv_set( self, "@r", INT2NUM( 0 ) ); + rb_iv_set( self, "@g", INT2NUM( 0 ) ); + rb_iv_set( self, "@b", INT2NUM( 0 ) ); + rb_iv_set( self, "@a", INT2NUM( 255 ) ); + + switch( argc ) + { + case 0: + // Nothing needs to be done + break; + case 1: + Color_internal_CopyFrom( self, args[0] ); + break; + case 4: + VALIDATE_CLASS( args[3], rb_cFixnum, "alpha" ); + rb_iv_set( self, "@a", args[3]); + case 3: + VALIDATE_CLASS( args[0], rb_cFixnum, "red" ); + VALIDATE_CLASS( args[1], rb_cFixnum, "green" ); + VALIDATE_CLASS( args[2], rb_cFixnum, "blue" ); + rb_iv_set( self, "@r", args[0]); + rb_iv_set( self, "@g", args[1]); + rb_iv_set( self, "@b", args[2]); + break; + default: + rb_raise( rb_eArgError, "Expected 0, 3 or 4 arguments but was given %d", argc ); + } + return self; +} + +void Init_Color( void ) +{ +/* SFML namespace which contains the classes of this module. */ + VALUE sfml = rb_define_module( "SFML" ); +/* Utility class for manipulating time. + * + * sf::Clock is a lightweight class for measuring time. + * + * Its resolution depends on the underlying OS, but you can generally expect a 1 ms resolution. + */ + globalColorClass = rb_define_class_under( sfml, "Color", rb_cObject ); + + // Instance methods + rb_define_method( globalColorClass, "initialize", Color_Initialize, -1 ); +} diff --git a/bindings/ruby/sfml-graphics/graphics/Color.hpp b/bindings/ruby/sfml-graphics/graphics/Color.hpp new file mode 100644 index 000000000..6234561ea --- /dev/null +++ b/bindings/ruby/sfml-graphics/graphics/Color.hpp @@ -0,0 +1,31 @@ +/* rbSFML - Copyright (c) 2010 Henrik Valter Vogelius Hansson - groogy@groogy.se + * This software is provided 'as-is', without any express or + * implied warranty. In no event will the authors be held + * liable for any damages arising from the use of this software. + * + * Permission is granted to anyone to use this software for any purpose, + * including commercial applications, and to alter it and redistribute + * it freely, subject to the following restrictions: + * + * 1. The origin of this software must not be misrepresented; + * you must not claim that you wrote the original software. + * If you use this software in a product, an acknowledgment + * in the product documentation would be appreciated but + * is not required. + * + * 2. Altered source versions must be plainly marked as such, + * and must not be misrepresented as being the original software. + * + * 3. This notice may not be removed or altered from any + * source distribution. + */ + +#ifndef SFML_RUBYEXT_CLOCK_HEADER_ +#define SFML_RUBYEXT_CLOCK_HEADER_ + +#include "ruby.h" + +// Ruby initiation function +void Init_Clock( void ); + +#endif // SFML_RUBYEXT_CLOCK_HEADER_ diff --git a/bindings/ruby/sfml-graphics/graphics/main.cpp b/bindings/ruby/sfml-graphics/graphics/main.cpp new file mode 100644 index 000000000..75578a961 --- /dev/null +++ b/bindings/ruby/sfml-graphics/graphics/main.cpp @@ -0,0 +1,66 @@ +/* rbSFML - Copyright (c) 2010 Henrik Valter Vogelius Hansson - groogy@groogy.se + * This software is provided 'as-is', without any express or + * implied warranty. In no event will the authors be held + * liable for any damages arising from the use of this software. + * + * Permission is granted to anyone to use this software for any purpose, + * including commercial applications, and to alter it and redistribute + * it freely, subject to the following restrictions: + * + * 1. The origin of this software must not be misrepresented; + * you must not claim that you wrote the original software. + * If you use this software in a product, an acknowledgment + * in the product documentation would be appreciated but + * is not required. + * + * 2. Altered source versions must be plainly marked as such, + * and must not be misrepresented as being the original software. + * + * 3. This notice may not be removed or altered from any + * source distribution. + */ + +#include "main.hpp" + +VALUE globalSFMLNamespace; + +/* External classes */ +VALUE globalVector2Class; +VALUE globalVector3Class; +VALUE globalWindowClass; + +bool CheckDependencies( void ) +{ + if( rb_cvar_defined( globalSFMLNamespace, rb_intern( "WindowLoaded" ) ) == Qtrue ) + { + return true; + } + + return false; +} + +VALUE RetrieveSFMLClass( const char * aName ) +{ + ID name = rb_intern( aName ); + if( rb_cvar_defined( globalSFMLNamespace, name ) == Qfalse ) + { + rb_raise( rb_eRuntimeError, "This module depends on SFML::%s", aName ); + } + + return rb_cvar_get( globalSFMLNamespace, name ); +} + +void Init_system( void ) +{ + /* SFML namespace which contains the classes of this module. */ + globalSFMLNamespace = rb_define_module( "SFML" ); + if( CheckDependencies() == false ) + { + rb_raise( rb_eRuntimeError, "This module depends on sfml-window" ); + } + globalVector2Class = RetrieveSFMLClass( "Vector2" ); + globalVector3Class = RetrieveSFMLClass( "Vector3" ); + globalWindowClass = RetrieveSFMLClass( "Window" ); + + rb_define_const(globalSFMLNamespace, "GraphicsLoaded", Qtrue); +} diff --git a/bindings/ruby/sfml-graphics/graphics/main.hpp b/bindings/ruby/sfml-graphics/graphics/main.hpp new file mode 100644 index 000000000..5dc59fdf3 --- /dev/null +++ b/bindings/ruby/sfml-graphics/graphics/main.hpp @@ -0,0 +1,42 @@ +/* rbSFML - Copyright (c) 2010 Henrik Valter Vogelius Hansson - groogy@groogy.se + * This software is provided 'as-is', without any express or + * implied warranty. In no event will the authors be held + * liable for any damages arising from the use of this software. + * + * Permission is granted to anyone to use this software for any purpose, + * including commercial applications, and to alter it and redistribute + * it freely, subject to the following restrictions: + * + * 1. The origin of this software must not be misrepresented; + * you must not claim that you wrote the original software. + * If you use this software in a product, an acknowledgment + * in the product documentation would be appreciated but + * is not required. + * + * 2. Altered source versions must be plainly marked as such, + * and must not be misrepresented as being the original software. + * + * 3. This notice may not be removed or altered from any + * source distribution. + */ + +#ifndef SFML_RUBYEXT_MAIN_HEADER_ +#define SFML_RUBYEXT_MAIN_HEADER_ + +#include "ruby.h" + +// Ruby initiation function +extern "C" void Init_graphics( void ); + +typedef VALUE ( *RubyFunctionPtr )( ... ); + +#define VALIDATE_CLASS( variable, type, name ) \ +if( rb_obj_is_kind_of( variable, type ) != Qtrue ) \ +{ \ + rb_raise( rb_eTypeError, "%s argument must be instance of %s", name, rb_string_value_cstr ( &type ) ); \ +} + +#define rb_define_singleton_method( klass, name, func, argc, ... ) rb_define_singleton_method( klass, name, reinterpret_cast< RubyFunctionPtr >( func ), argc, ##__VA_ARGS__ ) +#define rb_define_method( klass, name, func, argc, ... ) rb_define_method( klass, name, reinterpret_cast< RubyFunctionPtr >( func ), argc, ##__VA_ARGS__ ) + +#endif // SFML_RUBYEXT_MAIN_HEADER_