/* vim: set ft=cpp: */ %% ignore GdkDebugFlag GdkColorInfoFlags %% ignore gdk_pixmap_new %% override gdk_color_parse PHP_FUNCTION(gdk_color_parse) { gchar *color_spec; GdkColor color; if (!php_gtk_parse_args(ZEND_NUM_ARGS(), "s", &color_spec)) { return; } if (gdk_color_parse(color_spec, &color)) *return_value = *php_gdk_color_new(&color); else php_error(E_WARNING, "%s() could not parse color spec '%s'", get_active_function_name(TSRMLS_C), color_spec); } %% override gdk_pixmap_create_from_xpm PHP_FUNCTION(gdk_pixmap_create_from_xpm) { zval *php_window, *php_trans_color; gchar *filename; GdkWindow *window = NULL; GdkColor *trans_color = NULL; GdkPixmap *pixmap = NULL; GdkBitmap *mask; if (!php_gtk_parse_args(ZEND_NUM_ARGS(), "NNs", &php_window, gdk_window_ce, &php_trans_color, gdk_color_ce, &filename)) return; if (Z_TYPE_P(php_window) != IS_NULL) window = PHP_GDK_WINDOW_GET(php_window); if (Z_TYPE_P(php_trans_color) != IS_NULL) trans_color = PHP_GDK_COLOR_GET(php_trans_color); pixmap = gdk_pixmap_create_from_xpm(window, &mask, trans_color, filename); if (!pixmap) { php_error(E_WARNING, "%s() cannot load pixmap", get_active_function_name(TSRMLS_C)); return; } *return_value = *php_gtk_build_value("(NN)", php_gdk_pixmap_new(pixmap), php_gdk_bitmap_new(mask)); gdk_pixmap_unref(pixmap); gdk_bitmap_unref(mask); } %% override gdk_pixmap_create_from_xpm_d PHP_FUNCTION(gdk_pixmap_create_from_xpm_d) { zval *php_window, *php_trans_color, *php_data; zval **line; GdkWindow *window = NULL; GdkColor *trans_color = NULL; GdkPixmap *pixmap = NULL; GdkBitmap *mask; char **data; int len, i = 0; if (!php_gtk_parse_args(ZEND_NUM_ARGS(), "NNa/", &php_window, gdk_window_ce, &php_trans_color, gdk_color_ce, &php_data)) return; if (Z_TYPE_P(php_window) != IS_NULL) window = PHP_GDK_WINDOW_GET(php_window); if (Z_TYPE_P(php_trans_color) != IS_NULL) trans_color = PHP_GDK_COLOR_GET(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(window, &mask, trans_color, data); efree(data); if (!pixmap) { php_error(E_WARNING, "%s() cannot create pixmap", get_active_function_name(TSRMLS_C)); return; } *return_value = *php_gtk_build_value("(NN)", php_gdk_pixmap_new(pixmap), php_gdk_bitmap_new(mask)); gdk_pixmap_unref(pixmap); gdk_bitmap_unref(mask); } %% override gdk_pixmap_colormap_create_from_xpm PHP_FUNCTION(gdk_pixmap_colormap_create_from_xpm) { zval *php_window, *php_trans_color, *php_colormap; gchar *filename; GdkWindow *window = NULL; GdkColormap *colormap = NULL; GdkColor *trans_color = NULL; GdkPixmap *pixmap = NULL; GdkBitmap *mask; if (!php_gtk_parse_args(ZEND_NUM_ARGS(), "NNNs", &php_window, gdk_window_ce, &php_colormap, gdk_colormap_ce, &php_trans_color, gdk_color_ce, &filename)) return; if (Z_TYPE_P(php_window) != IS_NULL) window = PHP_GDK_WINDOW_GET(php_window); if (Z_TYPE_P(php_colormap) != IS_NULL) colormap = PHP_GDK_COLORMAP_GET(php_colormap); if (Z_TYPE_P(php_trans_color) != IS_NULL) trans_color = PHP_GDK_COLOR_GET(php_trans_color); pixmap = gdk_pixmap_colormap_create_from_xpm(window, colormap, &mask, trans_color, filename); if (!pixmap) { php_error(E_WARNING, "%s() cannot load pixmap", get_active_function_name(TSRMLS_C)); return; } *return_value = *php_gtk_build_value("(NN)", php_gdk_pixmap_new(pixmap), php_gdk_bitmap_new(mask)); gdk_pixmap_unref(pixmap); gdk_bitmap_unref(mask); } %% override gdk_pixmap_colormap_create_from_xpm_d PHP_FUNCTION(gdk_pixmap_colormap_create_from_xpm_d) { zval *php_window, *php_colormap, *php_trans_color, *php_data; zval **line; GdkWindow *window = 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(), "NNNa/", &php_window, gdk_window_ce, &php_colormap, gdk_colormap_ce, &php_trans_color, gdk_color_ce, &php_data)) return; if (Z_TYPE_P(php_window) != IS_NULL) window = PHP_GDK_WINDOW_GET(php_window); if (Z_TYPE_P(php_colormap) != IS_NULL) colormap = PHP_GDK_COLORMAP_GET(php_colormap); if (Z_TYPE_P(php_trans_color) != IS_NULL) trans_color = PHP_GDK_COLOR_GET(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(window, colormap, &mask, trans_color, data); efree(data); if (!pixmap) { php_error(E_WARNING, "%s() cannot create pixmap", get_active_function_name(TSRMLS_C)); return; } *return_value = *php_gtk_build_value("(NN)", php_gdk_pixmap_new(pixmap), php_gdk_bitmap_new(mask)); gdk_pixmap_unref(pixmap); gdk_bitmap_unref(mask); } %% override gdk_cursor_new_from_pixmap PHP_FUNCTION(gdk_cursor_new_from_pixmap) { zval *source, *mask, *fg, *bg; long x, y,i,j; int width,height; GdkPixmap *dest; GdkWindow *swin; GdkGC *gc; GdkImage *simage, *dimage; guint32 pixel; if (!php_gtk_parse_args(ZEND_NUM_ARGS(), "OOOOii", &source, gdk_pixmap_ce, &mask, gdk_bitmap_ce, &fg, gdk_color_ce, &bg, gdk_color_ce, &x, &y)) { return; } swin = PHP_GDK_WINDOW_GET(source); gdk_window_get_size(swin, &width, &height); simage = gdk_image_get(swin, 0, 0, width, height); dest = gdk_pixmap_new(NULL, width, height, 1); dimage = gdk_image_get(dest, 0, 0, width, height); for (i = 0; i < height; i++) { for (j = 0; j < width; j++) { pixel = gdk_image_get_pixel(simage, j, i); gdk_image_put_pixel(dimage, j, i, (pixel > 0)); } } gc = gdk_gc_new(dest); gdk_draw_image(dest, gc, dimage, 0, 0, 0, 0, width, height); PHP_GTK_SEPARATE_RETURN(return_value, php_gdk_cursor_new(gdk_cursor_new_from_pixmap(dest, PHP_GDK_BITMAP_GET(mask), PHP_GDK_COLOR_GET(fg), PHP_GDK_COLOR_GET(bg), (gint)x, (gint)y))); /* cleanup */ gdk_gc_unref(gc); gdk_image_destroy(simage); gdk_image_destroy(dimage); gdk_pixmap_unref(dest); }