fullwidth characters. * Added a case to test/fullwidth.c for cucul_blit and fullwidth chars.tags/v0.99.beta14
@@ -274,9 +274,6 @@ int cucul_clear_canvas(cucul_canvas_t *cv) | |||||
* - \c EINVAL A mask was specified but the mask size and source canvas | * - \c EINVAL A mask was specified but the mask size and source canvas | ||||
* size do not match. | * size do not match. | ||||
* | * | ||||
* FIXME: this function may corrupt the canvas if fullwidth characters | |||||
* appear at odd places. | |||||
* | |||||
* \param dst The destination canvas. | * \param dst The destination canvas. | ||||
* \param x X coordinate. | * \param x X coordinate. | ||||
* \param y Y coordinate. | * \param y Y coordinate. | ||||
@@ -308,28 +305,42 @@ int cucul_blit(cucul_canvas_t *dst, int x, int y, | |||||
for(j = startj; j < endj; j++) | for(j = startj; j < endj; j++) | ||||
{ | { | ||||
unsigned int dstix = (j + y) * dst->width + starti + x; | |||||
unsigned int srcix = j * src->width + starti; | |||||
int stride = endi - starti; | |||||
/* FIXME: we are ignoring the mask here */ | |||||
if((starti + x) && dst->chars[dstix] == CUCUL_MAGIC_FULLWIDTH) | |||||
dst->chars[dstix - 1] = ' '; | |||||
if((unsigned int)(endi + x) < dst->width | |||||
&& dst->chars[dstix + stride] == CUCUL_MAGIC_FULLWIDTH) | |||||
dst->chars[dstix + stride] = ' '; | |||||
if(mask) | if(mask) | ||||
{ | { | ||||
for(i = starti; i < endi; i++) | |||||
for(i = 0; i < stride; i++) | |||||
{ | { | ||||
if(mask->chars[j * src->width + i] == (uint32_t)' ') | |||||
if(mask->chars[srcix + i] == (uint32_t)' ') | |||||
continue; | continue; | ||||
dst->chars[(j + y) * dst->width + (i + x)] | |||||
= src->chars[j * src->width + i]; | |||||
dst->attr[(j + y) * dst->width + (i + x)] | |||||
= src->attr[j * src->width + i]; | |||||
dst->chars[dstix + i] = src->chars[srcix + i]; | |||||
dst->attr[dstix + i] = src->attr[srcix + i]; | |||||
} | } | ||||
} | } | ||||
else | else | ||||
{ | { | ||||
memcpy(dst->chars + (j + y) * dst->width + starti + x, | |||||
src->chars + j * src->width + starti, | |||||
(endi - starti) * 4); | |||||
memcpy(dst->attr + (j + y) * dst->width + starti + x, | |||||
src->attr + j * src->width + starti, | |||||
(endi - starti) * 4); | |||||
memcpy(dst->chars + dstix, src->chars + srcix, (stride) * 4); | |||||
memcpy(dst->attr + dstix, src->attr + srcix, (stride) * 4); | |||||
} | } | ||||
/* Fix split fullwidth chars */ | |||||
if(src->chars[srcix] == CUCUL_MAGIC_FULLWIDTH) | |||||
dst->chars[dstix] = ' '; | |||||
if((unsigned int)endi < src->width | |||||
&& src->chars[endi] == CUCUL_MAGIC_FULLWIDTH) | |||||
dst->chars[dstix + stride - 1] = ' '; | |||||
} | } | ||||
return 0; | return 0; | ||||
@@ -92,6 +92,7 @@ int cucul_flip(cucul_canvas_t *cv) | |||||
if(cleft == cright) | if(cleft == cright) | ||||
*cleft = flipchar(*cleft); | *cleft = flipchar(*cleft); | ||||
/* Fix fullwidth characters. Could it be done in one loop? */ | |||||
cleft = cv->chars + y * cv->width; | cleft = cv->chars + y * cv->width; | ||||
cright = cleft + cv->width - 1; | cright = cleft + cv->width - 1; | ||||
for( ; cleft < cright; cleft++) | for( ; cleft < cright; cleft++) | ||||
@@ -187,6 +188,7 @@ int cucul_rotate(cucul_canvas_t *cv) | |||||
if(cbegin == cend) | if(cbegin == cend) | ||||
*cbegin = rotatechar(*cbegin); | *cbegin = rotatechar(*cbegin); | ||||
/* Fix fullwidth characters. Could it be done in one loop? */ | |||||
for(y = 0; y < cv->height; y++) | for(y = 0; y < cv->height; y++) | ||||
{ | { | ||||
cbegin = cv->chars + y * cv->width; | cbegin = cv->chars + y * cv->width; | ||||
@@ -28,7 +28,7 @@ | |||||
int main(int argc, char *argv[]) | int main(int argc, char *argv[]) | ||||
{ | { | ||||
cucul_canvas_t *cv, *caca; | |||||
cucul_canvas_t *cv, *caca, *line; | |||||
caca_display_t *dp; | caca_display_t *dp; | ||||
unsigned int i; | unsigned int i; | ||||
@@ -37,7 +37,9 @@ int main(int argc, char *argv[]) | |||||
dp = caca_create_display(cv); | dp = caca_create_display(cv); | ||||
caca = cucul_create_canvas(6, 10); | caca = cucul_create_canvas(6, 10); | ||||
line = cucul_create_canvas(2, 1); | |||||
/* Line of x's */ | |||||
for(i = 0; i < 10; i++) | for(i = 0; i < 10; i++) | ||||
{ | { | ||||
cucul_set_color(caca, CUCUL_COLOR_WHITE, CUCUL_COLOR_BLUE); | cucul_set_color(caca, CUCUL_COLOR_WHITE, CUCUL_COLOR_BLUE); | ||||
@@ -48,6 +50,7 @@ int main(int argc, char *argv[]) | |||||
cucul_blit(cv, 1, 1, caca, NULL); | cucul_blit(cv, 1, 1, caca, NULL); | ||||
/* Line of ホ's */ | |||||
for(i = 0; i < 10; i++) | for(i = 0; i < 10; i++) | ||||
{ | { | ||||
cucul_set_color(caca, CUCUL_COLOR_WHITE, CUCUL_COLOR_BLUE); | cucul_set_color(caca, CUCUL_COLOR_WHITE, CUCUL_COLOR_BLUE); | ||||
@@ -58,11 +61,26 @@ int main(int argc, char *argv[]) | |||||
cucul_blit(cv, 15, 1, caca, NULL); | cucul_blit(cv, 15, 1, caca, NULL); | ||||
/* Line of canvas */ | |||||
cucul_set_color(line, CUCUL_COLOR_WHITE, CUCUL_COLOR_MAGENTA); | |||||
cucul_putstr(line, 0, 0, "ほ"); | |||||
for(i = 0; i < 10; i++) | |||||
{ | |||||
cucul_set_color(caca, CUCUL_COLOR_WHITE, CUCUL_COLOR_BLUE); | |||||
cucul_putstr(caca, 0, i, CACA); | |||||
cucul_blit(caca, i - 2, i, line, NULL); | |||||
} | |||||
cucul_blit(cv, 29, 1, caca, NULL); | |||||
caca_refresh_display(dp); | caca_refresh_display(dp); | ||||
caca_get_event(dp, CACA_EVENT_KEY_PRESS, NULL, -1); | caca_get_event(dp, CACA_EVENT_KEY_PRESS, NULL, -1); | ||||
caca_free_display(dp); | caca_free_display(dp); | ||||
cucul_free_canvas(line); | |||||
cucul_free_canvas(caca); | |||||
cucul_free_canvas(cv); | cucul_free_canvas(cv); | ||||
return 0; | return 0; | ||||