Ignore:
Timestamp:
Oct 22, 2006, 11:13:32 PM (13 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.
File:
1 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
Note: See TracChangeset for help on using the changeset viewer.