From 5983b93a4d8205a4669b92d6ada60aa53c02c664 Mon Sep 17 00:00:00 2001
From: groogy <groogy@4e206d99-4929-0410-ac5d-dfc041789085>
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 00000000..7ec1c996
--- /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 00000000..8db2a561
--- /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 00000000..cdac53e7
--- /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 <SFML/Graphics/Color.hpp>
+
+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 00000000..6234561e
--- /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 00000000..75578a96
--- /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 00000000..5dc59fdf
--- /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_