|
|
@@ -227,7 +227,7 @@ PHP_MINIT_FUNCTION(caca) { |
|
|
|
le_caca_file = zend_register_list_destructors_ex(php_caca_file_dtor, NULL, PHP_CACA_FILE_RES_NAME, module_number); |
|
|
|
le_caca_display = zend_register_list_destructors_ex(php_caca_display_dtor, NULL, PHP_CACA_DISPLAY_RES_NAME, module_number); |
|
|
|
le_caca_event = zend_register_list_destructors_ex(php_caca_event_dtor, NULL, PHP_CACA_EVENT_RES_NAME, module_number); |
|
|
|
|
|
|
|
|
|
|
|
REGISTER_LONG_CONSTANT("CACA_BLACK", CACA_BLACK, CONST_CS | CONST_PERSISTENT); |
|
|
|
REGISTER_LONG_CONSTANT("CACA_BLUE", CACA_BLUE, CONST_CS | CONST_PERSISTENT); |
|
|
|
REGISTER_LONG_CONSTANT("CACA_GREEN", CACA_GREEN, CONST_CS | CONST_PERSISTENT); |
|
|
@@ -325,21 +325,21 @@ PHP_MINIT_FUNCTION(caca) { |
|
|
|
if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "r", &_zval) == FAILURE) { \ |
|
|
|
RETURN_FALSE; \ |
|
|
|
} \ |
|
|
|
ZEND_FETCH_RESOURCE(canvas, caca_canvas_t*, &_zval, -1, PHP_CACA_CANVAS_RES_NAME, le_caca_canvas); |
|
|
|
ZEND_FETCH_RESOURCE(canvas, caca_canvas_t*, &_zval, -1, PHP_CACA_CANVAS_RES_NAME, le_caca_canvas); |
|
|
|
|
|
|
|
#define FETCH_DISPLAY(display) \ |
|
|
|
zval *_zval; \ |
|
|
|
if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "r", &_zval) == FAILURE) { \ |
|
|
|
RETURN_FALSE; \ |
|
|
|
} \ |
|
|
|
ZEND_FETCH_RESOURCE(display, caca_display_t*, &_zval, -1, PHP_CACA_DISPLAY_RES_NAME, le_caca_display); |
|
|
|
ZEND_FETCH_RESOURCE(display, caca_display_t*, &_zval, -1, PHP_CACA_DISPLAY_RES_NAME, le_caca_display); |
|
|
|
|
|
|
|
#define FETCH_EVENT(event) \ |
|
|
|
zval *_zval; \ |
|
|
|
if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "r", &_zval) == FAILURE) { \ |
|
|
|
RETURN_FALSE; \ |
|
|
|
} \ |
|
|
|
ZEND_FETCH_RESOURCE(event, caca_event_t*, &_zval, -1, PHP_CACA_EVENT_RES_NAME, le_caca_event); |
|
|
|
ZEND_FETCH_RESOURCE(event, caca_event_t*, &_zval, -1, PHP_CACA_EVENT_RES_NAME, le_caca_event); |
|
|
|
|
|
|
|
#define FETCH_LONG(l) \ |
|
|
|
if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "l", &l) == FAILURE) { \ |
|
|
@@ -363,7 +363,7 @@ void *fetch_external_resource(zval *_zval, char const *type_name) { |
|
|
|
int resource_id = _zval->value.lval; |
|
|
|
int resource_type; |
|
|
|
void *result = zend_list_find(resource_id, &resource_type); |
|
|
|
if (!result) |
|
|
|
if (!result) |
|
|
|
return NULL; |
|
|
|
char *resource_type_name = zend_rsrc_list_get_rsrc_type(resource_id); |
|
|
|
return (strcmp(resource_type_name, type_name) == 0) ? result : NULL; |
|
|
@@ -374,12 +374,23 @@ void *fetch_external_resource(zval *_zval, char const *type_name) { |
|
|
|
#ifdef HAVE_GD |
|
|
|
void *gd_get_pixels(gdImage *img) { |
|
|
|
void *result; |
|
|
|
int j, pitch; |
|
|
|
int i, j, pitch; |
|
|
|
if (img->trueColor) { |
|
|
|
pitch = img->sx * sizeof(int); |
|
|
|
result = malloc(img->sy * pitch); |
|
|
|
for (j = 0; j < img->sy; j++) |
|
|
|
memcpy(result + (j * pitch), (const void *) img->tpixels[j], pitch); |
|
|
|
if (result) |
|
|
|
{ |
|
|
|
for (i = 0; i < img->sy; i++) { |
|
|
|
for (j = 0; j < img->sx; j++) { |
|
|
|
uint8_t *dst = ((uint8_t *) result) + i * pitch + j * 4; |
|
|
|
|
|
|
|
dst[0] = (127 - (img->tpixels[i][j] & 0x7f000000) >> 24); |
|
|
|
dst[1] = (img->tpixels[i][j] & 0x00ff0000) >> 16; |
|
|
|
dst[2] = (img->tpixels[i][j] & 0x0000ff00) >> 8; |
|
|
|
dst[3] = img->tpixels[i][j] & 0x000000ff; |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
else { |
|
|
|
pitch = img->sx * sizeof(char); |
|
|
@@ -447,7 +458,7 @@ PHP_FUNCTION(caca_get_canvas_height) { |
|
|
|
PHP_FUNCTION(caca_get_canvas_chars) { |
|
|
|
caca_canvas_t *canvas; |
|
|
|
FETCH_CANVAS(canvas); |
|
|
|
RETURN_STRING((char *) caca_get_canvas_chars(canvas), 1); |
|
|
|
RETURN_STRING((char *) caca_get_canvas_chars(canvas), 1); |
|
|
|
} |
|
|
|
|
|
|
|
PHP_FUNCTION(caca_get_canvas_attrs) { |
|
|
@@ -778,16 +789,16 @@ PHP_FUNCTION(caca_draw_polyline) { |
|
|
|
int tbl_count = 0; |
|
|
|
tbl_x = malloc(sizeof(int) * lenmax); |
|
|
|
tbl_y = malloc(sizeof(int) * lenmax); |
|
|
|
|
|
|
|
|
|
|
|
HashPosition pos; |
|
|
|
zval **pt, **x, **y; |
|
|
|
for ( |
|
|
|
zend_hash_internal_pointer_reset_ex(arr_hash, &pos); |
|
|
|
zend_hash_get_current_data_ex(arr_hash, (void**) &pt, &pos) == SUCCESS; |
|
|
|
zend_hash_internal_pointer_reset_ex(arr_hash, &pos); |
|
|
|
zend_hash_get_current_data_ex(arr_hash, (void**) &pt, &pos) == SUCCESS; |
|
|
|
zend_hash_move_forward_ex(arr_hash, &pos) |
|
|
|
) { |
|
|
|
if ( |
|
|
|
Z_TYPE_P(*pt) == IS_ARRAY |
|
|
|
Z_TYPE_P(*pt) == IS_ARRAY |
|
|
|
&& (zend_hash_index_find(Z_ARRVAL_P(*pt), 0, (void**) &x) != FAILURE) |
|
|
|
&& (zend_hash_index_find(Z_ARRVAL_P(*pt), 1, (void**) &y) != FAILURE) |
|
|
|
) { |
|
|
@@ -834,16 +845,16 @@ PHP_FUNCTION(caca_draw_thin_polyline) { |
|
|
|
if (!tbl_x || !tbl_y) { |
|
|
|
RETURN_FALSE; |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
HashPosition pos; |
|
|
|
zval **pt, **x, **y; |
|
|
|
for ( |
|
|
|
zend_hash_internal_pointer_reset_ex(arr_hash, &pos); |
|
|
|
zend_hash_get_current_data_ex(arr_hash, (void**) &pt, &pos) == SUCCESS; |
|
|
|
zend_hash_internal_pointer_reset_ex(arr_hash, &pos); |
|
|
|
zend_hash_get_current_data_ex(arr_hash, (void**) &pt, &pos) == SUCCESS; |
|
|
|
zend_hash_move_forward_ex(arr_hash, &pos) |
|
|
|
) { |
|
|
|
if ( |
|
|
|
Z_TYPE_P(*pt) == IS_ARRAY |
|
|
|
Z_TYPE_P(*pt) == IS_ARRAY |
|
|
|
&& (zend_hash_index_find(Z_ARRVAL_P(*pt), 0, (void**) &x) != FAILURE) |
|
|
|
&& (zend_hash_index_find(Z_ARRVAL_P(*pt), 1, (void**) &y) != FAILURE) |
|
|
|
) { |
|
|
@@ -1175,7 +1186,7 @@ PHP_FUNCTION(caca_get_dither_antialias_list) { |
|
|
|
|
|
|
|
char const * const *list = caca_get_dither_antialias_list(dither); |
|
|
|
int i; |
|
|
|
array_init(return_value); |
|
|
|
array_init(return_value); |
|
|
|
for(i = 0; list[i]; i += 1) |
|
|
|
add_next_index_string(return_value, (char*) list[i], 1); |
|
|
|
} |
|
|
@@ -1212,7 +1223,7 @@ PHP_FUNCTION(caca_get_dither_color_list) { |
|
|
|
|
|
|
|
char const * const *list = caca_get_dither_antialias_list(dither); |
|
|
|
int i; |
|
|
|
array_init(return_value); |
|
|
|
array_init(return_value); |
|
|
|
for(i = 0; list[i]; i += 2) |
|
|
|
add_assoc_string(return_value, (char*) list[i], (char*) list[i + 1], 1); |
|
|
|
} |
|
|
@@ -1249,7 +1260,7 @@ PHP_FUNCTION(caca_get_dither_charset_list) { |
|
|
|
|
|
|
|
char const * const *list = caca_get_dither_charset_list(dither); |
|
|
|
int i; |
|
|
|
array_init(return_value); |
|
|
|
array_init(return_value); |
|
|
|
for(i = 0; list[i]; i += 2) |
|
|
|
add_assoc_string(return_value, (char*) list[i], (char*) list[i + 1], 1); |
|
|
|
} |
|
|
@@ -1286,7 +1297,7 @@ PHP_FUNCTION(caca_get_dither_algorithm_list) { |
|
|
|
|
|
|
|
char const * const *list = caca_get_dither_algorithm_list(dither); |
|
|
|
int i; |
|
|
|
array_init(return_value); |
|
|
|
array_init(return_value); |
|
|
|
for(i = 0; list[i]; i += 2) |
|
|
|
add_assoc_string(return_value, (char*) list[i], (char*) list[i + 1], 1); |
|
|
|
} |
|
|
@@ -1371,7 +1382,7 @@ PHP_FUNCTION(caca_get_font_list) { |
|
|
|
} |
|
|
|
char const * const *list = caca_get_font_list(); |
|
|
|
int i; |
|
|
|
array_init(return_value); |
|
|
|
array_init(return_value); |
|
|
|
for(i = 0; list[i]; i += 1) |
|
|
|
add_next_index_string(return_value, (char*) list[i], 1); |
|
|
|
} |
|
|
@@ -1407,7 +1418,7 @@ PHP_FUNCTION(caca_get_font_blocks) { |
|
|
|
uint32_t const *list = caca_get_font_blocks(font); |
|
|
|
|
|
|
|
int i; |
|
|
|
array_init(return_value); |
|
|
|
array_init(return_value); |
|
|
|
for(i = 0; list[i]; i += 1) |
|
|
|
add_next_index_long(return_value, list[i]); |
|
|
|
} |
|
|
@@ -1439,10 +1450,10 @@ PHP_FUNCTION(caca_render_canvas) { |
|
|
|
for (i = 0; i < img->sy; i++) { |
|
|
|
for (j = 0; j < img->sx; j++) { |
|
|
|
uint8_t *src = buffer + i * pitch + j * 4; |
|
|
|
img->tpixels[i][j] = *(src + 3) | (*(src + 2) << 8) | (*(src + 1) << 16) | ((*(src + 0) & 0xfe) << 23); |
|
|
|
img->tpixels[i][j] = *(src + 3) | (*(src + 2) << 8) | (*(src + 1) << 16) | (((127 - *(src + 0)) & 0xfe) << 23); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
free(buffer); |
|
|
|
RETURN_TRUE; |
|
|
|
#else |
|
|
@@ -1540,7 +1551,7 @@ PHP_FUNCTION(caca_file_read) { |
|
|
|
} |
|
|
|
caca_file_read(file, buffer, len); |
|
|
|
|
|
|
|
RETURN_STRINGL(buffer, len, 1); |
|
|
|
RETURN_STRINGL(buffer, len, 1); |
|
|
|
} |
|
|
|
|
|
|
|
PHP_FUNCTION(caca_file_write) { |
|
|
@@ -1575,7 +1586,7 @@ PHP_FUNCTION(caca_file_gets) { |
|
|
|
if (!result) { |
|
|
|
RETURN_FALSE; |
|
|
|
} |
|
|
|
RETURN_STRINGL(result, len, 1); |
|
|
|
RETURN_STRINGL(result, len, 1); |
|
|
|
} |
|
|
|
|
|
|
|
PHP_FUNCTION(caca_file_eof) { |
|
|
@@ -1620,7 +1631,7 @@ PHP_FUNCTION(caca_get_import_list) { |
|
|
|
} |
|
|
|
char const * const *list = caca_get_import_list(); |
|
|
|
int i; |
|
|
|
array_init(return_value); |
|
|
|
array_init(return_value); |
|
|
|
for(i = 0; list[i]; i += 2) |
|
|
|
add_assoc_string(return_value, (char*) list[i], (char*) list[i + 1], 1); |
|
|
|
} |
|
|
@@ -1645,7 +1656,7 @@ PHP_FUNCTION(caca_export_string) { |
|
|
|
memcpy(copy, buffer, len); |
|
|
|
free(buffer); |
|
|
|
|
|
|
|
RETURN_STRINGL((char*) copy, len, 0); |
|
|
|
RETURN_STRINGL((char*) copy, len, 0); |
|
|
|
} |
|
|
|
|
|
|
|
PHP_FUNCTION(caca_get_export_list) { |
|
|
@@ -1654,7 +1665,7 @@ PHP_FUNCTION(caca_get_export_list) { |
|
|
|
} |
|
|
|
char const * const *list = caca_get_export_list(); |
|
|
|
int i; |
|
|
|
array_init(return_value); |
|
|
|
array_init(return_value); |
|
|
|
for(i = 0; list[i]; i += 2) |
|
|
|
add_assoc_string(return_value, (char*) list[i], (char*) list[i + 1], 1); |
|
|
|
} |
|
|
@@ -1693,7 +1704,7 @@ PHP_FUNCTION(caca_get_display_driver_list) { |
|
|
|
} |
|
|
|
char const * const *list = caca_get_display_driver_list(); |
|
|
|
int i; |
|
|
|
array_init(return_value); |
|
|
|
array_init(return_value); |
|
|
|
for(i = 0; list[i]; i += 2) |
|
|
|
add_assoc_string(return_value, (char*) list[i], (char*) list[i + 1], 1); |
|
|
|
} |
|
|
@@ -1820,7 +1831,7 @@ PHP_FUNCTION(caca_get_event) { |
|
|
|
caca_get_event(display, g, event, aa); |
|
|
|
|
|
|
|
if (caca_get_event_type(event) == CACA_EVENT_NONE) { |
|
|
|
efree(event); |
|
|
|
efree(event); |
|
|
|
RETURN_FALSE; |
|
|
|
} |
|
|
|
ZEND_REGISTER_RESOURCE(return_value, event, le_caca_event); |
|
|
|