I shouldn't code when I'm tired either...

From: Date: Wed, 21 Jun 2006 05:42:31 +0000
Subject: I shouldn't code when I'm tired either...
Groups: php.gtk.dev 
Request: Send a blank email to php-gtk-dev+get-3129@lists.php.net to get a copy of this message
Chris was of course right in his initial analysis, we don't need an optional boolean when the default behaviour is 'true' and the behaviour of 'false' mimics another function. (Do we? It's really late here.) We just need to check for 3 params or 0 and send GTK a firm boolean '1'. For the time being, anyway - I can see this function getting extended to include color parsing at some point in the near future. So, a vaguely saner implementation of GdkPixbuf::add_alpha() is attached. 'Course it still has the other four functions alongside it, there's not much I can do about that at present... - Steph

Index: ext/gtk+/gdk.overrides =================================================================== RCS file: /repository/php-gtk/ext/gtk+/gdk.overrides,v retrieving revision 1.64 diff -u -r1.64 gdk.overrides --- ext/gtk+/gdk.overrides 17 Jun 2006 18:43:55 -0000 1.64 +++ ext/gtk+/gdk.overrides 21 Jun 2006 05:36:31 -0000 @@ -1907,6 +1907,46 @@ } %% +add-arginfo GdkPixbuf add_alpha +static +ZEND_BEGIN_ARG_INFO_EX(ARGINFO_NAME, 0, 0, 0) + ZEND_ARG_INFO(0, red) + ZEND_ARG_INFO(0, green) + ZEND_ARG_INFO(0, blue) +ZEND_END_ARG_INFO(); + +%% +override gdk_pixbuf_add_alpha +PHP_METHOD +{ + int red, blue, green; + guchar r = 255, g = 255, b = 255; + GdkPixbuf* pixbuf; + + NOT_STATIC_METHOD(); + + if (ZEND_NUM_ARGS() > 0) { + if (!php_gtk_parse_args(ZEND_NUM_ARGS(), "iii", &red, &green, &blue)) { + return; + } else { + r = (guchar)red; + g = (guchar)green; + b = (guchar)blue; + } + } else { + if (!php_gtk_parse_args(ZEND_NUM_ARGS(), "")) + return; + } + + pixbuf = gdk_pixbuf_add_alpha(GDK_PIXBUF(PHPG_GOBJECT(this_ptr)), 1, r, g, b); + + if (pixbuf) { + phpg_gobject_new(&return_value, (GObject *)pixbuf TSRMLS_CC); + g_object_unref(pixbuf); + } +} + +%% override gdk_pixbuf_get_pixels PHP_METHOD { @@ -2311,6 +2351,193 @@ %% }}} +%% {{{ GdkPixmap + +%% +override gdk_pixmap_colormap_create_from_xpm +PHP_METHOD +{ + zval *php_drawable, *php_trans_color, *php_colormap; + zval *ret_pixmap = NULL, *ret_mask = NULL; + gchar *filename; + zend_bool free_filename = FALSE; + GdkDrawable *drawable = NULL; + GdkColormap *colormap = NULL; + GdkColor *trans_color = NULL; + GdkPixmap *pixmap = NULL; + GdkBitmap *mask; + + if (!php_gtk_parse_args(ZEND_NUM_ARGS(), "OOOu", &php_drawable, gdkdrawable_ce, + &php_colormap, gdkcolormap_ce, + &php_trans_color, gdkcolor_ce, + &filename, &free_filename)) { + PHPG_THROW_CONSTRUCT_EXCEPTION(GdkPixmap); + } + + drawable = GDK_DRAWABLE(PHPG_GOBJECT(php_drawable)); + colormap = GDK_COLORMAP(PHPG_GOBJECT(php_colormap)); + trans_color = (GdkColor *) PHPG_GBOXED(php_trans_color); + + pixmap = gdk_pixmap_colormap_create_from_xpm(drawable, colormap, &mask, trans_color, filename); + if (free_filename) g_free(filename); + + if (!pixmap) { + php_error(E_WARNING, "%s() cannot load pixmap", get_active_function_name(TSRMLS_C)); + PHPG_THROW_CONSTRUCT_EXCEPTION(GdkPixmap); + } + + phpg_gobject_new(&ret_pixmap, (GObject*)pixmap TSRMLS_CC); + gdk_pixmap_unref(pixmap); + + phpg_gobject_new(&ret_mask, (GObject *)mask TSRMLS_CC); + gdk_bitmap_unref(mask); + + php_gtk_build_value(&return_value, "(NN)", ret_pixmap, ret_mask); +} + +%% +override gdk_pixmap_colormap_create_from_xpm_d +PHP_METHOD +{ + zval *php_drawable, *php_colormap, + *php_trans_color, *php_data; + zval *ret_pixmap = NULL, *ret_mask = NULL; + zval **line; + GdkDrawable *drawable = NULL; + GdkColormap *colormap = NULL; + GdkColor *trans_color = NULL; + GdkPixmap *pixmap = NULL; + GdkBitmap *mask; + char **data; + int len, i = 0; + + if (!php_gtk_parse_args(ZEND_NUM_ARGS(), "OOOa", &php_drawable, gdkdrawable_ce, + &php_colormap, gdkcolormap_ce, + &php_trans_color, gdkcolor_ce, + &php_data)) { + PHPG_THROW_CONSTRUCT_EXCEPTION(GdkPixmap); + } + + drawable = GDK_DRAWABLE(PHPG_GOBJECT(php_drawable)); + colormap = GDK_COLORMAP(PHPG_GOBJECT(php_colormap)); + trans_color = (GdkColor *) PHPG_GBOXED(php_trans_color); + + len = zend_hash_num_elements(Z_ARRVAL_P(php_data)); + data = emalloc(len * sizeof(char *)); + for (zend_hash_internal_pointer_reset(Z_ARRVAL_P(php_data)); + zend_hash_get_current_data(Z_ARRVAL_P(php_data), (void **)&line) == SUCCESS; + zend_hash_move_forward(Z_ARRVAL_P(php_data))) { + convert_to_string_ex(line); + data[i++] = Z_STRVAL_PP(line); + } + + pixmap = gdk_pixmap_colormap_create_from_xpm_d(drawable, colormap, &mask, trans_color, data); + efree(data); + + if (!pixmap) { + php_error(E_WARNING, "%s() cannot load pixmap", get_active_function_name(TSRMLS_C)); + PHPG_THROW_CONSTRUCT_EXCEPTION(GdkPixmap); + } + + phpg_gobject_new(&ret_pixmap, (GObject*)pixmap TSRMLS_CC); + gdk_pixmap_unref(pixmap); + + phpg_gobject_new(&ret_mask, (GObject *)mask TSRMLS_CC); + gdk_bitmap_unref(mask); + + php_gtk_build_value(&return_value, "(NN)", ret_pixmap, ret_mask); +} + +%% +override gdk_pixmap_create_from_xpm +PHP_METHOD +{ + zval *php_drawable, *php_trans_color; + zval *ret_pixmap = NULL, *ret_mask = NULL; + gchar *filename; + zend_bool free_filename = FALSE; + GdkDrawable *drawable = NULL; + GdkColor *trans_color = NULL; + GdkPixmap *pixmap = NULL; + GdkBitmap *mask; + + if (!php_gtk_parse_args(ZEND_NUM_ARGS(), "OOu", &php_drawable, gdkdrawable_ce, + &php_trans_color, gdkcolor_ce, + &filename, &free_filename)) { + PHPG_THROW_CONSTRUCT_EXCEPTION(GdkPixmap); + } + + drawable = GDK_DRAWABLE(PHPG_GOBJECT(php_drawable)); + trans_color = (GdkColor *) PHPG_GBOXED(php_trans_color); + + pixmap = gdk_pixmap_create_from_xpm(drawable, &mask, trans_color, filename); + if (free_filename) g_free(filename); + + if (!pixmap) { + php_error(E_WARNING, "%s() cannot load pixmap", get_active_function_name(TSRMLS_C)); + PHPG_THROW_CONSTRUCT_EXCEPTION(GdkPixmap); + } + + phpg_gobject_new(&ret_pixmap, (GObject*)pixmap TSRMLS_CC); + gdk_pixmap_unref(pixmap); + + phpg_gobject_new(&ret_mask, (GObject *)mask TSRMLS_CC); + gdk_bitmap_unref(mask); + + php_gtk_build_value(&return_value, "(NN)", ret_pixmap, ret_mask); +} + +%% +override gdk_pixmap_create_from_xpm_d +PHP_METHOD +{ + zval *php_drawable, *php_trans_color, *php_data; + zval *ret_pixmap = NULL, *ret_mask = NULL; + zval **line; + GdkDrawable *drawable = NULL; + GdkColor *trans_color = NULL; + GdkPixmap *pixmap = NULL; + GdkBitmap *mask; + char **data; + int len, i = 0; + + if (!php_gtk_parse_args(ZEND_NUM_ARGS(), "OOa", &php_drawable, gdkdrawable_ce, + &php_trans_color, gdkcolor_ce, + &php_data)) { + PHPG_THROW_CONSTRUCT_EXCEPTION(GdkPixmap); + } + + drawable = GDK_DRAWABLE(PHPG_GOBJECT(php_drawable)); + trans_color = (GdkColor *) PHPG_GBOXED(php_trans_color); + + len = zend_hash_num_elements(Z_ARRVAL_P(php_data)); + data = emalloc(len * sizeof(char *)); + for (zend_hash_internal_pointer_reset(Z_ARRVAL_P(php_data)); + zend_hash_get_current_data(Z_ARRVAL_P(php_data), (void **)&line) == SUCCESS; + zend_hash_move_forward(Z_ARRVAL_P(php_data))) { + convert_to_string_ex(line); + data[i++] = Z_STRVAL_PP(line); + } + + pixmap = gdk_pixmap_create_from_xpm_d(drawable, &mask, trans_color, data); + efree(data); + + if (!pixmap) { + php_error(E_WARNING, "%s() cannot load pixmap", get_active_function_name(TSRMLS_C)); + PHPG_THROW_CONSTRUCT_EXCEPTION(GdkPixmap); + } + + phpg_gobject_new(&ret_pixmap, (GObject*)pixmap TSRMLS_CC); + gdk_pixmap_unref(pixmap); + + phpg_gobject_new(&ret_mask, (GObject *)mask TSRMLS_CC); + gdk_bitmap_unref(mask); + + php_gtk_build_value(&return_value, "(NN)", ret_pixmap, ret_mask); +} + +%% }}} + %% {{{ GdkRectangle %%
« previous php.gtk.dev (#3129) next »