Blame


1 76193d7c 2003-09-30 devnull #include <u.h>
2 76193d7c 2003-09-30 devnull #include <libc.h>
3 76193d7c 2003-09-30 devnull #include <draw.h>
4 76193d7c 2003-09-30 devnull #include <memdraw.h>
5 76193d7c 2003-09-30 devnull #include <memlayer.h>
6 76193d7c 2003-09-30 devnull
7 76193d7c 2003-09-30 devnull struct Lline
8 76193d7c 2003-09-30 devnull {
9 76193d7c 2003-09-30 devnull Point p0;
10 76193d7c 2003-09-30 devnull Point p1;
11 76193d7c 2003-09-30 devnull Point delta;
12 76193d7c 2003-09-30 devnull int end0;
13 76193d7c 2003-09-30 devnull int end1;
14 76193d7c 2003-09-30 devnull int radius;
15 76193d7c 2003-09-30 devnull Point sp;
16 76193d7c 2003-09-30 devnull Memlayer *dstlayer;
17 76193d7c 2003-09-30 devnull Memimage *src;
18 76193d7c 2003-09-30 devnull int op;
19 76193d7c 2003-09-30 devnull };
20 76193d7c 2003-09-30 devnull
21 76193d7c 2003-09-30 devnull static void llineop(Memimage*, Rectangle, Rectangle, void*, int);
22 76193d7c 2003-09-30 devnull
23 76193d7c 2003-09-30 devnull static
24 76193d7c 2003-09-30 devnull void
25 76193d7c 2003-09-30 devnull _memline(Memimage *dst, Point p0, Point p1, int end0, int end1, int radius, Memimage *src, Point sp, Rectangle clipr, int op)
26 76193d7c 2003-09-30 devnull {
27 76193d7c 2003-09-30 devnull Rectangle r;
28 76193d7c 2003-09-30 devnull struct Lline ll;
29 76193d7c 2003-09-30 devnull Point d;
30 76193d7c 2003-09-30 devnull int srcclipped;
31 76193d7c 2003-09-30 devnull Memlayer *dl;
32 76193d7c 2003-09-30 devnull
33 76193d7c 2003-09-30 devnull if(radius < 0)
34 76193d7c 2003-09-30 devnull return;
35 76193d7c 2003-09-30 devnull if(src->layer) /* can't draw line with layered source */
36 76193d7c 2003-09-30 devnull return;
37 76193d7c 2003-09-30 devnull srcclipped = 0;
38 76193d7c 2003-09-30 devnull
39 76193d7c 2003-09-30 devnull Top:
40 76193d7c 2003-09-30 devnull dl = dst->layer;
41 76193d7c 2003-09-30 devnull if(dl == nil){
42 76193d7c 2003-09-30 devnull _memimageline(dst, p0, p1, end0, end1, radius, src, sp, clipr, op);
43 76193d7c 2003-09-30 devnull return;
44 76193d7c 2003-09-30 devnull }
45 76193d7c 2003-09-30 devnull if(!srcclipped){
46 76193d7c 2003-09-30 devnull d = subpt(sp, p0);
47 76193d7c 2003-09-30 devnull if(rectclip(&clipr, rectsubpt(src->clipr, d)) == 0)
48 76193d7c 2003-09-30 devnull return;
49 76193d7c 2003-09-30 devnull if((src->flags&Frepl)==0 && rectclip(&clipr, rectsubpt(src->r, d))==0)
50 76193d7c 2003-09-30 devnull return;
51 76193d7c 2003-09-30 devnull srcclipped = 1;
52 76193d7c 2003-09-30 devnull }
53 76193d7c 2003-09-30 devnull
54 76193d7c 2003-09-30 devnull /* dst is known to be a layer */
55 76193d7c 2003-09-30 devnull p0.x += dl->delta.x;
56 76193d7c 2003-09-30 devnull p0.y += dl->delta.y;
57 76193d7c 2003-09-30 devnull p1.x += dl->delta.x;
58 76193d7c 2003-09-30 devnull p1.y += dl->delta.y;
59 76193d7c 2003-09-30 devnull clipr.min.x += dl->delta.x;
60 76193d7c 2003-09-30 devnull clipr.min.y += dl->delta.y;
61 76193d7c 2003-09-30 devnull clipr.max.x += dl->delta.x;
62 76193d7c 2003-09-30 devnull clipr.max.y += dl->delta.y;
63 76193d7c 2003-09-30 devnull if(dl->clear){
64 76193d7c 2003-09-30 devnull dst = dst->layer->screen->image;
65 76193d7c 2003-09-30 devnull goto Top;
66 76193d7c 2003-09-30 devnull }
67 76193d7c 2003-09-30 devnull
68 76193d7c 2003-09-30 devnull /* XXX */
69 76193d7c 2003-09-30 devnull /* this is not the correct set of tests */
70 cbeb0b26 2006-04-01 devnull /* if(log2[dst->depth] != log2[src->depth] || log2[dst->depth]!=3) */
71 cbeb0b26 2006-04-01 devnull /* return; */
72 76193d7c 2003-09-30 devnull
73 76193d7c 2003-09-30 devnull /* can't use sutherland-cohen clipping because lines are wide */
74 76193d7c 2003-09-30 devnull r = memlinebbox(p0, p1, end0, end1, radius);
75 76193d7c 2003-09-30 devnull /*
76 76193d7c 2003-09-30 devnull * r is now a bounding box for the line;
77 76193d7c 2003-09-30 devnull * use it as a clipping rectangle for subdivision
78 76193d7c 2003-09-30 devnull */
79 76193d7c 2003-09-30 devnull if(rectclip(&r, clipr) == 0)
80 76193d7c 2003-09-30 devnull return;
81 76193d7c 2003-09-30 devnull ll.p0 = p0;
82 76193d7c 2003-09-30 devnull ll.p1 = p1;
83 76193d7c 2003-09-30 devnull ll.end0 = end0;
84 76193d7c 2003-09-30 devnull ll.end1 = end1;
85 76193d7c 2003-09-30 devnull ll.sp = sp;
86 76193d7c 2003-09-30 devnull ll.dstlayer = dst->layer;
87 76193d7c 2003-09-30 devnull ll.src = src;
88 76193d7c 2003-09-30 devnull ll.radius = radius;
89 76193d7c 2003-09-30 devnull ll.delta = dl->delta;
90 76193d7c 2003-09-30 devnull ll.op = op;
91 76193d7c 2003-09-30 devnull _memlayerop(llineop, dst, r, r, &ll);
92 76193d7c 2003-09-30 devnull }
93 76193d7c 2003-09-30 devnull
94 76193d7c 2003-09-30 devnull static
95 76193d7c 2003-09-30 devnull void
96 76193d7c 2003-09-30 devnull llineop(Memimage *dst, Rectangle screenr, Rectangle clipr, void *etc, int insave)
97 76193d7c 2003-09-30 devnull {
98 76193d7c 2003-09-30 devnull struct Lline *ll;
99 76193d7c 2003-09-30 devnull Point p0, p1;
100 76193d7c 2003-09-30 devnull
101 76193d7c 2003-09-30 devnull USED(screenr.min.x);
102 76193d7c 2003-09-30 devnull ll = etc;
103 76193d7c 2003-09-30 devnull if(insave && ll->dstlayer->save==nil)
104 76193d7c 2003-09-30 devnull return;
105 76193d7c 2003-09-30 devnull if(!rectclip(&clipr, screenr))
106 76193d7c 2003-09-30 devnull return;
107 76193d7c 2003-09-30 devnull if(insave){
108 76193d7c 2003-09-30 devnull p0 = subpt(ll->p0, ll->delta);
109 76193d7c 2003-09-30 devnull p1 = subpt(ll->p1, ll->delta);
110 76193d7c 2003-09-30 devnull clipr = rectsubpt(clipr, ll->delta);
111 76193d7c 2003-09-30 devnull }else{
112 76193d7c 2003-09-30 devnull p0 = ll->p0;
113 76193d7c 2003-09-30 devnull p1 = ll->p1;
114 76193d7c 2003-09-30 devnull }
115 76193d7c 2003-09-30 devnull _memline(dst, p0, p1, ll->end0, ll->end1, ll->radius, ll->src, ll->sp, clipr, ll->op);
116 76193d7c 2003-09-30 devnull }
117 76193d7c 2003-09-30 devnull
118 76193d7c 2003-09-30 devnull void
119 76193d7c 2003-09-30 devnull memline(Memimage *dst, Point p0, Point p1, int end0, int end1, int radius, Memimage *src, Point sp, int op)
120 76193d7c 2003-09-30 devnull {
121 76193d7c 2003-09-30 devnull _memline(dst, p0, p1, end0, end1, radius, src, sp, dst->clipr, op);
122 76193d7c 2003-09-30 devnull }