* Deal with non-pseudocolor colormaps properly.

* Implemented GdkFont functions.
* Added support for 's#' parse arg spec.
This commit is contained in:
Andrei Zmievski
2001-02-10 05:10:44 +00:00
parent 4609cecd2c
commit fea2d4e6d3
3 changed files with 56 additions and 9 deletions
-1
View File
@@ -7,7 +7,6 @@
* Modify generic get/set property handlers to percolate up the inheritance chain
looking for attributes.
* Implemented optional zval separation when parsing arguments.
* Implement s# parse arg support.
* Think about separating static class methods, Gtk::widget_push_colormap ->
GtkWidget::push_colormap.
+35 -3
View File
@@ -508,11 +508,11 @@ static void gdk_colormap_get_property(zval *result, zval *object, zend_llist_ele
zend_overloaded_element *property = (zend_overloaded_element *)(*element)->data;
zend_llist_element *next;
char *prop_name = Z_STRVAL(property->element);
int prop_index;
int prop_index, i;
ZVAL_NULL(result);
if (!strcmp(prop_name, "colors")) {
if (!strcmp(prop_name, "colors") && cmap->colors) {
next = (*element)->next;
if (next) {
property = (zend_overloaded_element *)next->data;
@@ -526,6 +526,10 @@ static void gdk_colormap_get_property(zval *result, zval *object, zend_llist_ele
*result = *php_gdk_color_new(&cmap->colors[prop_index]);
}
} else {
array_init(result);
for (i = 0; i < cmap->size; i++)
add_next_index_zval(result, php_gdk_color_new(&cmap->colors[i]));
}
}
}
@@ -670,19 +674,47 @@ static void gdk_visual_get_property(zval *result, zval *object, zend_llist_eleme
/* GdkFont */
PHP_FUNCTION(gdk_font_width)
{
char *text;
int length;
if (!php_gtk_parse_args(ZEND_NUM_ARGS(), "s#", &text, &length))
return;
RETURN_LONG(gdk_text_width(PHP_GDK_FONT_GET(this_ptr), text, length));
}
PHP_FUNCTION(gdk_font_height)
{
char *text;
int length;
if (!php_gtk_parse_args(ZEND_NUM_ARGS(), "s#", &text, &length))
return;
RETURN_LONG(gdk_text_height(PHP_GDK_FONT_GET(this_ptr), text, length));
}
PHP_FUNCTION(gdk_font_measure)
{
char *text;
int length;
if (!php_gtk_parse_args(ZEND_NUM_ARGS(), "s#", &text, &length))
return;
RETURN_LONG(gdk_text_measure(PHP_GDK_FONT_GET(this_ptr), text, length));
}
PHP_FUNCTION(gdk_font_extents)
{
char *text;
int length, lbearing, rbearing, width, ascent, descent;
if (!php_gtk_parse_args(ZEND_NUM_ARGS(), "s#", &text, &length))
return;
gdk_text_extents(PHP_GDK_FONT_GET(this_ptr), text, length, &lbearing, &rbearing, &width, &ascent, &descent);
*return_value = *php_gtk_build_value("(iiiii)", lbearing, rbearing, width, ascent, descent);
}
static function_entry php_gdk_font_functions[] = {
+21 -5
View File
@@ -24,9 +24,12 @@
#if HAVE_PHP_GTK
static char *parse_arg_impl(zval **arg, va_list *va, int spec, char *buf)
static char *parse_arg_impl(zval **arg, va_list *va, char **spec, char *buf)
{
switch (spec) {
char *spec_walk = *spec;
char c = *spec_walk++;
switch (c) {
case 'h':
{
short *p = va_arg(*va, short *);
@@ -66,6 +69,10 @@ static char *parse_arg_impl(zval **arg, va_list *va, int spec, char *buf)
*p = Z_STRVAL_PP(arg);
if ((int)strlen(*p) != Z_STRLEN_PP(arg))
return "string without null bytes";
if (*spec_walk == '#') {
int *p = va_arg(*va, int *);
*p = Z_STRLEN_PP(arg);
}
}
break;
@@ -138,12 +145,17 @@ static char *parse_arg_impl(zval **arg, va_list *va, int spec, char *buf)
*p = *arg;
}
break;
default:
return "<unknown>";
}
*spec = spec_walk;
return NULL;
}
static int parse_arg(int arg_num, zval **arg, va_list *va, int spec, int quiet)
static int parse_arg(int arg_num, zval **arg, va_list *va, char **spec, int quiet)
{
char *expected_type;
char *actual_type;
@@ -230,6 +242,10 @@ static int parse_va_args(int argc, zval ***args, char *format, va_list *va, int
max_argc++;
break;
case '#':
/* Pass */
break;
default:
g_assert_not_reached();
break;
@@ -252,10 +268,10 @@ static int parse_va_args(int argc, zval ***args, char *format, va_list *va, int
return 0;
}
for (i = 0; i < argc; i++, format++) {
for (i = 0; i < argc; i++) {
if (*format == '|')
format++;
if (!parse_arg(i+1, args[i], va, *format, quiet))
if (!parse_arg(i+1, args[i], va, &format, quiet))
return 0;
}