Browse Source

fix impedence mismatch between libgd alpha (0 = opaque, 127 = transparent) and libcaca alpha (0 = transparent, 255 = opaque)

tags/v0.99.beta17
Ben Wiley Sittler bsittler 16 years ago
parent
commit
f75f27aec8
1 changed files with 43 additions and 32 deletions
  1. +43
    -32
      caca-php/php_caca.c

+ 43
- 32
caca-php/php_caca.c View File

@@ -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);


Loading…
Cancel
Save