8 ttfnewbitmap(int w, int h)
12 b = mallocz(sizeof(TTBitmap), 1);
13 if(b == nil) return nil;
16 b->stride = w + 7 >> 3;
17 b->bit = mallocz(b->stride * h, 1);
26 ttffreebitmap(TTBitmap *b)
34 ttfblit(TTBitmap *dst, int dx, int dy, TTBitmap *src, int sx0, int sy0, int sx1, int sy1)
38 int x, y, ss, ds, dx1, dy1;
42 if(sx1 > src->width) sx1 = src->width;
43 if(sy1 > src->height) sy1 = src->height;
55 sx1 -= dx1 - dst->width;
58 if(dy1 > dst->height) sy1 -= dy1 - dst->height;
59 if(sx1 <= sx0 || sy1 <= sy0) return;
60 ss = src->stride - ((sx1-1 >> 3) - (sx0 >> 3) + 1);
61 ds = dst->stride - ((dx1-1 >> 3) - (dx >> 3) + 1);
62 sp = src->bit + sy0 * src->stride + (sx0 >> 3);
63 dp = dst->bit + dy * dst->stride + (dx >> 3);
66 if(sx0 >> 3 == sx1 >> 3){
67 b = (*sp++ << 8 & 0xff << 8-(sx0 & 7)) & -0x10000 >> (sx1 & 7);
68 if((sx0 & 7) == 0) b >>= 8;
69 x = (dx & 7) + (sx1 - sx0);
72 b = *sp++ << 8 & 0xff << (-sx0 & 7);
75 x = (sx1 >> 3) - (sx0+7 >> 3);
78 *dp++ |= b >> (dx & 7) + (-sx0 & 7);
82 b |= *sp++ & -0x100 >> (sx1 & 7);
83 x = (dx & 7) + (-sx0 & 7) + (sx1 & 7);
86 *dp++ |= b >> (dx & 7) + (-sx0 & 7);