Changeset 1224


Ignore:
Timestamp:
Oct 22, 2006, 11:13:32 PM (14 years ago)
Author:
Sam Hocevar
Message:
  • Made cucul_blit(), and therefore cucul_set_canvas_boundaries(), support fullwidth characters.
  • Added a case to test/fullwidth.c for cucul_blit and fullwidth chars.
Location:
libcaca/trunk
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • libcaca/trunk/cucul/canvas.c

    r1221 r1224  
    275275 *    size do not match.
    276276 *
    277  *  FIXME: this function may corrupt the canvas if fullwidth characters
    278  *         appear at odd places.
    279  *
    280277 *  \param dst The destination canvas.
    281278 *  \param x X coordinate.
     
    309306    for(j = startj; j < endj; j++)
    310307    {
     308        unsigned int dstix = (j + y) * dst->width + starti + x;
     309        unsigned int srcix = j * src->width + starti;
     310        int stride = endi - starti;
     311
     312        /* FIXME: we are ignoring the mask here */
     313        if((starti + x) && dst->chars[dstix] == CUCUL_MAGIC_FULLWIDTH)
     314            dst->chars[dstix - 1] = ' ';
     315
     316        if((unsigned int)(endi + x) < dst->width
     317                && dst->chars[dstix + stride] == CUCUL_MAGIC_FULLWIDTH)
     318            dst->chars[dstix + stride] = ' ';
     319
    311320        if(mask)
    312321        {
    313             for(i = starti; i < endi; i++)
     322            for(i = 0; i < stride; i++)
    314323            {
    315                 if(mask->chars[j * src->width + i] == (uint32_t)' ')
     324                if(mask->chars[srcix + i] == (uint32_t)' ')
    316325                    continue;
    317326
    318                 dst->chars[(j + y) * dst->width + (i + x)]
    319                                              = src->chars[j * src->width + i];
    320                 dst->attr[(j + y) * dst->width + (i + x)]
    321                                              = src->attr[j * src->width + i];
     327                dst->chars[dstix + i] = src->chars[srcix + i];
     328                dst->attr[dstix + i] = src->attr[srcix + i];
    322329            }
    323330        }
    324331        else
    325332        {
    326             memcpy(dst->chars + (j + y) * dst->width + starti + x,
    327                    src->chars + j * src->width + starti,
    328                    (endi - starti) * 4);
    329             memcpy(dst->attr + (j + y) * dst->width + starti + x,
    330                    src->attr + j * src->width + starti,
    331                    (endi - starti) * 4);
     333            memcpy(dst->chars + dstix, src->chars + srcix, (stride) * 4);
     334            memcpy(dst->attr + dstix, src->attr + srcix, (stride) * 4);
    332335        }
     336
     337        /* Fix split fullwidth chars */
     338        if(src->chars[srcix] == CUCUL_MAGIC_FULLWIDTH)
     339            dst->chars[dstix] = ' ';
     340
     341        if((unsigned int)endi < src->width
     342                && src->chars[endi] == CUCUL_MAGIC_FULLWIDTH)
     343            dst->chars[dstix + stride - 1] = ' ';
    333344    }
    334345
  • libcaca/trunk/cucul/transform.c

    r1223 r1224  
    9393            *cleft = flipchar(*cleft);
    9494
     95        /* Fix fullwidth characters. Could it be done in one loop? */
    9596        cleft = cv->chars + y * cv->width;
    9697        cright = cleft + cv->width - 1;
     
    188189        *cbegin = rotatechar(*cbegin);
    189190
     191    /* Fix fullwidth characters. Could it be done in one loop? */
    190192    for(y = 0; y < cv->height; y++)
    191193    {
  • libcaca/trunk/test/fullwidth.c

    r1217 r1224  
    2929int main(int argc, char *argv[])
    3030{
    31     cucul_canvas_t *cv, *caca;
     31    cucul_canvas_t *cv, *caca, *line;
    3232    caca_display_t *dp;
    3333
     
    3838
    3939    caca = cucul_create_canvas(6, 10);
     40    line = cucul_create_canvas(2, 1);
    4041
     42    /* Line of x's */
    4143    for(i = 0; i < 10; i++)
    4244    {
     
    4951    cucul_blit(cv, 1, 1, caca, NULL);
    5052
     53    /* Line of ホ's */
    5154    for(i = 0; i < 10; i++)
    5255    {
     
    5962    cucul_blit(cv, 15, 1, caca, NULL);
    6063
     64    /* Line of canvas */
     65    cucul_set_color(line, CUCUL_COLOR_WHITE, CUCUL_COLOR_MAGENTA);
     66    cucul_putstr(line, 0, 0, "ほ");
     67    for(i = 0; i < 10; i++)
     68    {
     69        cucul_set_color(caca, CUCUL_COLOR_WHITE, CUCUL_COLOR_BLUE);
     70        cucul_putstr(caca, 0, i, CACA);
     71        cucul_blit(caca, i - 2, i, line, NULL);
     72    }
     73
     74    cucul_blit(cv, 29, 1, caca, NULL);
     75
    6176    caca_refresh_display(dp);
    6277
     
    6479
    6580    caca_free_display(dp);
     81
     82    cucul_free_canvas(line);
     83    cucul_free_canvas(caca);
    6684    cucul_free_canvas(cv);
    6785
Note: See TracChangeset for help on using the changeset viewer.