diff options
author | Dave Hayden <opaquedave@php.net> | 2001-08-20 03:32:43 +0000 |
---|---|---|
committer | Dave Hayden <opaquedave@php.net> | 2001-08-20 03:32:43 +0000 |
commit | 22aed399e77c6a17cfddc18de1d0b1f8cf1ff76f (patch) | |
tree | 24761163d49c637ffbb8bfc98630e1b6911c772f | |
parent | 91997ed31cf158c7bdb5cf6581e15e1611093407 (diff) | |
download | php-git-22aed399e77c6a17cfddc18de1d0b1f8cf1ff76f.tar.gz |
Added flags for SWFDisplayItem_addAction
Added Ming RINIT function
Added error handler for reporting Ming errors in PHP environment
Added size arg to drawGlyph function
Added swfdisplayitem_addAction function
Added ming_useSWFVersion function for selecting SWF 4 compatibility
Added SWFBitmap object
Added hacky SWFInput object for loading data from file/network/process
-rw-r--r-- | ext/ming/ming.c | 275 |
1 files changed, 197 insertions, 78 deletions
diff --git a/ext/ming/ming.c b/ext/ming/ming.c index 507af0572f..67f35bec7e 100644 --- a/ext/ming/ming.c +++ b/ext/ming/ming.c @@ -33,6 +33,7 @@ static zend_function_entry ming_functions[] = { PHP_FALIAS(ming_setcubicthreshold, ming_setCubicThreshold, NULL) PHP_FALIAS(ming_setscale, ming_setScale, NULL) + PHP_FALIAS(ming_useswfversion, ming_useSWFVersion, NULL) PHP_FALIAS(swfbutton_keypress, swfbutton_keypress, NULL) { NULL, NULL, NULL } }; @@ -75,6 +76,18 @@ PHP_FUNCTION(ming_setScale) Ming_setScale(Z_DVAL_PP(num)); } +PHP_FUNCTION(ming_useSWFVersion) +{ + zval **num; + + if(ZEND_NUM_ARGS() != 1 || zend_get_parameters_ex(1, &num) == FAILURE) + WRONG_PARAM_COUNT; + + convert_to_long_ex(num); + + Ming_useSWFVersion(Z_LVAL_PP(num)); +} + static int le_swfmoviep; static int le_swfshapep; static int le_swffillp; @@ -88,8 +101,11 @@ static int le_swfbuttonp; static int le_swfactionp; static int le_swfmorphp; static int le_swfspritep; +static int le_swfinputp; static int le_fopen; +static int le_socket; +static int le_popen; zend_class_entry movie_class_entry; zend_class_entry shape_class_entry; @@ -160,6 +176,8 @@ SWFCharacter getCharacter(zval *id TSRMLS_DC) return (SWFCharacter)getMorph(id TSRMLS_CC); else if(id->value.obj.ce == &sprite_class_entry) return (SWFCharacter)getSprite(id TSRMLS_CC); + else if(id->value.obj.ce == &bitmap_class_entry) + return (SWFCharacter)getBitmap(id TSRMLS_CC); else php_error(E_ERROR, "called object is not an SWFCharacter"); } @@ -167,6 +185,64 @@ SWFCharacter getCharacter(zval *id TSRMLS_DC) /* }}} */ /* }}} */ +/* {{{ getInput - utility func for making an SWFInput from an fopened resource */ + +static void destroy_SWFInput_resource(zend_rsrc_list_entry *resource) +{ + destroySWFInput((SWFInput)resource->ptr); +} + +#define SOCKBUF_INCREMENT 10240 + +/* turn a socket into an SWFInput by copying everything to a buffer. */ +/* not pretty, but it works */ + +static SWFInput newSWFInput_sock(int socket) +{ + char *buffer = NULL; + int l, offset = 0, alloced = 0; + + do + { + if(offset <= alloced) + { + alloced += SOCKBUF_INCREMENT; + buffer = realloc(buffer, alloced); + } + + l = php_sock_fread(buffer+offset, SOCKBUF_INCREMENT, socket); + + offset += l; + } + while(l > 0); + + return newSWFInput_allocedBuffer(buffer, offset); +} + +static SWFInput getInput(zval **zfile) +{ + FILE *file; + int type, s, offset; + char *buffer; + SWFInput input; + + file = (FILE *)zend_fetch_resource(zfile, -1, "File-Handle", &type, 3, + le_fopen, le_socket, le_popen); + + if(type == le_socket) + input = newSWFInput_sock(*(int *)file); + else + { + input = newSWFInput_file(file); + zend_list_addref((*zfile)->value.lval); + } + + zend_list_addref(zend_list_insert(input, le_swfinputp)); + + return input; +} + +/* }}} */ /* {{{ SWFAction */ @@ -189,11 +265,10 @@ PHP_FUNCTION(swfaction_init) convert_to_string_ex(script); - /* XXX - need to deal with compiler errors */ action = compileSWFActionCode(Z_STRVAL_PP(script)); if(!action) - php_error(E_ERROR, "Couldn't compile code. And I'm not smart enough to tell you why, sorry."); + php_error(E_ERROR, "Couldn't compile actionscript."); ret = zend_list_insert(action, le_swfactionp); @@ -234,77 +309,55 @@ static zend_function_entry swfbitmap_functions[] = { PHP_FUNCTION(swfbitmap_init) { - zval **file, **mask; - char *filename, *maskname = NULL; + zval **zfile, **zmask = NULL; SWFBitmap bitmap; - int ret, l; + SWFInput input, maskinput; + int ret, type; if(ZEND_NUM_ARGS() == 1) { - if(zend_get_parameters_ex(1, &file) == FAILURE) + if(zend_get_parameters_ex(1, &zfile) == FAILURE) WRONG_PARAM_COUNT; } else if(ZEND_NUM_ARGS() == 2) { - if(zend_get_parameters_ex(2, &file, &mask) == FAILURE) + if(zend_get_parameters_ex(2, &zfile, &zmask) == FAILURE) WRONG_PARAM_COUNT; - - maskname = Z_STRVAL_PP(mask); } else WRONG_PARAM_COUNT; - filename = Z_STRVAL_PP(file); - l = Z_STRLEN_PP(file); + if((*zfile)->type != IS_RESOURCE) + { + convert_to_string_ex(zfile); + input = newSWFInput_buffer(Z_STRVAL_PP(zfile), Z_STRLEN_PP(zfile)); + zend_list_addref(zend_list_insert(input, le_swfinputp)); + } + else + input = getInput(zfile); - if(strncasecmp(filename+l-4, ".jpg", 4) == 0 || - strncasecmp(filename+l-5, ".jpeg", 5) == 0) + if(zmask != NULL) { - if(maskname != NULL) + if((*zmask)->type != IS_RESOURCE) { - FILE *jpeg, *mask; - if((jpeg = VCWD_FOPEN(filename, "rb")) == NULL) - php_error(E_ERROR, "Couldn't find file %s", filename); - - if((mask = VCWD_FOPEN(maskname, "rb")) == NULL) - php_error(E_ERROR, "Couldn't find file %s", maskname); - - bitmap = newSWFJpegWithAlpha(jpeg, mask); - - ZEND_REGISTER_RESOURCE(NULL, jpeg, le_fopen); - ZEND_REGISTER_RESOURCE(NULL, mask, le_fopen); + convert_to_string_ex(zmask); + maskinput = newSWFInput_buffer(Z_STRVAL_PP(zmask), Z_STRLEN_PP(zmask)); + zend_list_addref(zend_list_insert(maskinput, le_swfinputp)); } else - { - FILE *jpeg; - - if((jpeg = VCWD_FOPEN(filename, "rb")) == NULL) - php_error(E_ERROR, "Couldn't find file %s", filename); - - bitmap = newSWFJpegBitmap(jpeg); - - ZEND_REGISTER_RESOURCE(NULL, jpeg, le_fopen); - } - } - else if(strncasecmp(filename+l-4, ".dbl", 4) == 0) - { - FILE *dbl; - - if((dbl = VCWD_FOPEN(filename, "rb")) == NULL) - php_error(E_ERROR, "Couldn't find file %s", filename); + maskinput = getInput(zmask); - bitmap = newSWFDBLBitmap(dbl); - - ZEND_REGISTER_RESOURCE(NULL, dbl, le_fopen); + bitmap = newSWFJpegWithAlpha_fromInput(input, maskinput); } else - php_error(E_ERROR, "Sorry, can't tell what type of file %s is", filename); + bitmap = newSWFBitmap_fromInput(input); ret = zend_list_insert(bitmap, le_swfbitmapp); object_init_ex(getThis(), &bitmap_class_entry); add_property_resource(getThis(), "bitmap", ret); zend_list_addref(ret); } + static void destroy_SWFBitmap_resource(zend_rsrc_list_entry *resource TSRMLS_DC) { destroySWFBitmap((SWFBitmap)resource->ptr); @@ -578,6 +631,7 @@ static zend_function_entry swfdisplayitem_functions[] = { PHP_FALIAS(addcolor, swfdisplayitem_addColor, NULL) PHP_FALIAS(multcolor, swfdisplayitem_multColor, NULL) PHP_FALIAS(setname, swfdisplayitem_setName, NULL) + PHP_FALIAS(addaction, swfdisplayitem_addAction, NULL) { NULL, NULL, NULL } }; @@ -922,6 +976,28 @@ PHP_FUNCTION(swfdisplayitem_setName) } /* }}} */ +/* {{{ proto void swfdisplayitem_addAction(SWFAction action, int flags) + Adds this SWFAction to the given SWFSprite instance. */ + +PHP_FUNCTION(swfdisplayitem_addAction) +{ + zval **zaction, **flags; + SWFAction action; + SWFDisplayItem item = getDisplayItem(getThis()); + + if(ZEND_NUM_ARGS() != 2 || + zend_get_parameters_ex(2, &zaction, &flags) == FAILURE) + WRONG_PARAM_COUNT; + + convert_to_object_ex(zaction); + convert_to_long_ex(flags); + + action = (SWFBlock)getAction(*zaction); + + SWFDisplayItem_addAction(item, action, Z_LVAL_PP(flags)); +} + +/* }}} */ /* }}} */ /* {{{ SWFFill */ @@ -1637,28 +1713,22 @@ PHP_FUNCTION(swfmovie_streamMp3) FILE *file; zval **zfile; SWFSound sound; + SWFInput input; SWFMovie movie = getMovie(getThis() TSRMLS_CC); if(ZEND_NUM_ARGS() != 1 || zend_get_parameters_ex(1, &zfile) == FAILURE) WRONG_PARAM_COUNT; - if((*zfile)->type == IS_RESOURCE) - { - ZEND_FETCH_RESOURCE(file, FILE *, zfile, -1,"File-Handle",php_file_le_fopen()); - } - else + if((*zfile)->type != IS_RESOURCE) { convert_to_string_ex(zfile); - - file = VCWD_FOPEN(Z_STRVAL_PP(zfile), "rb"); - - if(!file) - php_error(E_ERROR, "Couldn't find file %s", Z_STRVAL_PP(zfile)); - - ZEND_REGISTER_RESOURCE(NULL, file, le_fopen); + input = newSWFInput_buffer(Z_STRVAL_PP(zfile), Z_STRLEN_PP(zfile)); + zend_list_addref(zend_list_insert(input, le_swfinputp)); } + else + input = getInput(zfile); - sound = newSWFSound(file); + sound = newSWFSound_fromInput(input); SWFMovie_setSoundStream(movie, sound); } @@ -2142,20 +2212,34 @@ PHP_FUNCTION(swfshape_drawcurve) } /* }}} */ -/* {{{ proto void swfshape_drawglyph(SWFFont font, string character) +/* {{{ proto void swfshape_drawglyph(SWFFont font, string character [, int size]) Draws the first character in the given string into the shape using the glyph definition from the given font */ PHP_FUNCTION(swfshape_drawglyph) { - zval **font, **c; + zval **font, **c, **zsize; + int size; - if((ZEND_NUM_ARGS() != 2) || zend_get_parameters_ex(2, &font, &c) == FAILURE) - WRONG_PARAM_COUNT; + if(ZEND_NUM_ARGS() == 2) + { + if(zend_get_parameters_ex(2, &font, &c) == FAILURE) + WRONG_PARAM_COUNT; + + size = 1024/Ming_getScale(); + } + else if(ZEND_NUM_ARGS() == 3) + { + if(zend_get_parameters_ex(3, &font, &c, &zsize) == FAILURE) + WRONG_PARAM_COUNT; + + convert_to_long_ex(zsize); + size = Z_LVAL_PP(zsize); + } convert_to_string_ex(c); - SWFShape_drawFontGlyph(getShape(getThis() TSRMLS_CC), getFont(*font TSRMLS_CC), Z_STRVAL_PP(c)[0]); + SWFShape_drawSizedGlyph(getShape(getThis() TSRMLS_CC), getFont(*font TSRMLS_CC), Z_STRVAL_PP(c)[0], size); } /* }}} */ @@ -2919,16 +3003,17 @@ PHP_FUNCTION(swftextfield_addString) /* }}} */ -zend_module_entry ming_module_entry = { - "ming", - ming_functions, - PHP_MINIT(ming), - NULL, - NULL, - NULL, - PHP_MINFO(ming), - STANDARD_MODULE_PROPERTIES -}; +zend_module_entry ming_module_entry = + { + "ming", + ming_functions, + PHP_MINIT(ming), /* module init function */ + NULL, /* module shutdown function */ + PHP_RINIT(ming), /* request init function */ + NULL, /* request shutdown function */ + PHP_MINFO(ming), /* module info function */ + STANDARD_MODULE_PROPERTIES + }; #if defined(COMPILE_DL) || defined(COMPILE_DL_MING) ZEND_GET_MODULE(ming) @@ -2949,13 +3034,36 @@ PHP_MINFO_FUNCTION(ming) /* {{{ proto PHP_MINIT_FUNCTION(ming) */ -PHP_MINIT_FUNCTION(ming) +#define ERROR_BUFSIZE 1024 + +/* custom error handler propagates ming errors up to php */ +void php_ming_error(char *msg, ...) { + va_list args; + char buffer[ERROR_BUFSIZE]; + + va_start(args, msg); + vsnprintf(buffer, ERROR_BUFSIZE, msg, args); + va_end(args); + + php_error(E_ERROR, buffer); +} + +PHP_RINIT_FUNCTION(ming) +{ + /* XXX - this didn't work so well last I tried.. */ + if(Ming_init() != 0) php_error(E_ERROR, "Error initializing Ming module"); +} - le_fopen = php_file_le_fopen(); +PHP_MINIT_FUNCTION(ming) +{ + Ming_setErrorFunction(php_ming_error); + le_fopen = php_file_le_fopen(); + le_popen = php_file_le_popen(); + le_socket = php_file_le_socket(); #define CONSTANT(s,c) REGISTER_LONG_CONSTANT((s), (c), CONST_CS | CONST_PERSISTENT) @@ -2988,9 +3096,7 @@ PHP_MINIT_FUNCTION(ming) CONSTANT("SWFTEXTFIELD_WORDWRAP", SWFTEXTFIELD_WORDWRAP); CONSTANT("SWFTEXTFIELD_DRAWBOX", SWFTEXTFIELD_DRAWBOX); CONSTANT("SWFTEXTFIELD_NOSELECT", SWFTEXTFIELD_NOSELECT); -#ifdef SWFTEXTFIELD_HTML CONSTANT("SWFTEXTFIELD_HTML", SWFTEXTFIELD_HTML); -#endif /* flags for SWFTextField_align */ CONSTANT("SWFTEXTFIELD_ALIGN_LEFT", SWFTEXTFIELD_ALIGN_LEFT); @@ -2998,6 +3104,17 @@ PHP_MINIT_FUNCTION(ming) CONSTANT("SWFTEXTFIELD_ALIGN_CENTER", SWFTEXTFIELD_ALIGN_CENTER); CONSTANT("SWFTEXTFIELD_ALIGN_JUSTIFY", SWFTEXTFIELD_ALIGN_JUSTIFY); + /* flags for SWFDisplayItem_addAction */ + CONSTANT("SWFACTION_ONLOAD", SWFACTION_ONLOAD); + CONSTANT("SWFACTION_ENTERFRAME", SWFACTION_ENTERFRAME); + CONSTANT("SWFACTION_UNLOAD", SWFACTION_UNLOAD); + CONSTANT("SWFACTION_MOUSEMOVE", SWFACTION_MOUSEMOVE); + CONSTANT("SWFACTION_MOUSEDOWN", SWFACTION_MOUSEDOWN); + CONSTANT("SWFACTION_MOUSEUP", SWFACTION_MOUSEUP); + CONSTANT("SWFACTION_KEYDOWN", SWFACTION_KEYDOWN); + CONSTANT("SWFACTION_KEYUP", SWFACTION_KEYUP); + CONSTANT("SWFACTION_DATA", SWFACTION_DATA); + le_swfmoviep = zend_register_list_destructors_ex(destroy_SWFMovie_resource, NULL, "SWFMovie", module_number); le_swfshapep = zend_register_list_destructors_ex(destroy_SWFShape_resource, NULL, "SWFShape", module_number); le_swffillp = zend_register_list_destructors_ex(destroy_SWFFill_resource, NULL, "SWFFill", module_number); @@ -3013,6 +3130,8 @@ PHP_MINIT_FUNCTION(ming) le_swfdisplayitemp = zend_register_list_destructors_ex(NULL, NULL, "SWFDisplayItem", module_number); le_swfactionp = zend_register_list_destructors_ex(NULL, NULL, "SWFAction", module_number); + le_swfinputp = zend_register_list_destructors_ex(destroy_SWFInput_resource, NULL, "SWFInput", module_number); + INIT_CLASS_ENTRY(shape_class_entry, "swfshape", swfshape_functions); INIT_CLASS_ENTRY(fill_class_entry, "swffill", swffill_functions); INIT_CLASS_ENTRY(gradient_class_entry, "swfgradient", swfgradient_functions); |