2010年12月31日 星期五

將二個bitmap合成一個bitmap(印出bitmap字串)

之前有寫一個印出bitmap字的程式
現在將這個功能擴充成印出bitmap字串
void combinetext(Bitmap *bitmap, Bitmap *font)
{
    int x1 = bitmap->x;
    int y1 = bitmap->y;
    unsigned int width1 = bitmap->width;
    unsigned int height1 = bitmap->height;
    unsigned int pitch1 = bitmap->pitch;
    unsigned char* data1 = bitmap->data;

    int x2 = x1 + width1 + font->x;
    int y2 = font->y;
    unsigned int width2 = font->width;
    unsigned int height2 = font->height;
    unsigned int pitch2 = font->pitch;
    unsigned char* data2 = font->data;

    int x3 = x1;
    if(x1 > x2) {
        x3 = x2;
    }
    unsigned int width3 = width1 + font->x + width2;
    int y3 = y1;
    unsigned int height3 = height1;
    if(y1 > y2) {
        y3 = y2;
        height3 += (y1 - y2);
    }
    if(y1+height1 < y2+height2) {
        height3 += (y2+height2) - (y1+height1);
    }
    unsigned int pitch3 = width3/8;
    if(width3 % 8 != 0) {
        pitch3 += 1;
    }

    int size3 = pitch3 * height3;
    unsigned char *data3 = calloc(size3, sizeof(unsigned char));
    int shiftX1 = 0;
    int shiftY1 = (height3+y3) - (height1+y1);
    for(int j=0; j<height1; j++) {
        int nj = j+shiftY1;
        for(int i=0; i<pitch1; i++) {
            int n = shiftX1/8+i+nj*pitch3;
            unsigned char data = data1[i+j*pitch1];
            int shift = shiftX1%8;
            if(shift == 0) {
                data3[n] |= data;
            } else {
                data3[n] |= (0x7f & data>>shift);
                data3[n+1] |= data<<(8-shift);
            }
        }
    }
    int shiftX2 = x2-x3;
    int shiftY2 = (height3+y3) - (height2+y2);
    for(int j=0; j<height2; j++) {
        int nj = j+shiftY2;
        for(int i=0; i<pitch2; i++) {
            int n = shiftX2/8+i+nj*pitch3;
            unsigned char data = data2[i+j*pitch2];
            int shift = shiftX2%8;
            if(shift == 0) {
                data3[n] |= data;
            } else {
                data3[n] |= (0x7f & data>>shift);
                data3[n+1] |= data<<(8-shift);
            }
        }
    }
    free(bitmap->data);

    bitmap->x = x3;
    bitmap->y = y3;
    bitmap->width = width3;
    bitmap->height = height3;
    bitmap->pitch = pitch3;
    bitmap->data = data3;
}

沒有留言: