]> git.lizzy.rs Git - plan9front.git/blob - sys/src/libttf/bit.c
newt: remove fn f, replace with walk
[plan9front.git] / sys / src / libttf / bit.c
1 #include <u.h>
2 #include <libc.h>
3 #include <bio.h>
4 #include <ttf.h>
5 #include "impl.h"
6
7 TTBitmap *
8 ttfnewbitmap(int w, int h)
9 {
10         TTBitmap *b;
11
12         b = mallocz(sizeof(TTBitmap), 1);
13         if(b == nil) return nil;
14         b->width = w;
15         b->height = h;
16         b->stride = w + 7 >> 3;
17         b->bit = mallocz(b->stride * h, 1);
18         if(b->bit == nil){
19                 free(b);
20                 return nil;
21         }
22         return b;
23 }
24
25 void
26 ttffreebitmap(TTBitmap *b)
27 {
28         if(b == nil) return;
29         free(b->bit);
30         free(b);
31 }
32
33 void
34 ttfblit(TTBitmap *dst, int dx, int dy, TTBitmap *src, int sx0, int sy0, int sx1, int sy1)
35 {
36         uchar *sp, *dp;
37         u32int b;
38         int x, y, ss, ds, dx1, dy1;
39
40         if(sx0 < 0) sx0 = 0;
41         if(sy0 < 0) sy0 = 0;
42         if(sx1 > src->width) sx1 = src->width;
43         if(sy1 > src->height) sy1 = src->height;
44         if(dx < 0){
45                 sx0 -= dx;
46                 dx = 0;
47         }
48         if(dy < 0){
49                 sy0 -= dy;
50                 dy = 0;
51         }
52         dx1 = dx + sx1 - sx0;
53         dy1 = dy + sy1 - sy0;
54         if(dx1 > dst->width){
55                 sx1 -= dx1 - dst->width;
56                 dx1 = dst->width;
57         }
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);
64         y = sy1 - sy0;
65         do{
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);
70                 }else{
71                         if((sx0 & 7) != 0)
72                                 b = *sp++ << 8 & 0xff << (-sx0 & 7);
73                         else
74                                 b = 0;
75                         x = (sx1 >> 3) - (sx0+7 >> 3);
76                         while(--x >= 0){
77                                 b |= *sp++;
78                                 *dp++ |= b >> (dx & 7) + (-sx0 & 7);
79                                 b <<= 8;
80                         }
81                         if((sx1 & 7) != 0)
82                                 b |= *sp++ & -0x100 >> (sx1 & 7);
83                         x = (dx & 7) + (-sx0 & 7) + (sx1 & 7);
84                 }
85                 for(; x > 0; x -= 8){
86                         *dp++ |= b >> (dx & 7) + (-sx0 & 7);
87                         b <<= 8;
88                 }
89                 sp += ss;
90                 dp += ds;
91         }while(--y > 0);
92 }