Blame


1 76193d7c 2003-09-30 devnull #include "x11-inc.h"
2 76193d7c 2003-09-30 devnull
3 76193d7c 2003-09-30 devnull #include <u.h>
4 76193d7c 2003-09-30 devnull #include <libc.h>
5 76193d7c 2003-09-30 devnull #include <draw.h>
6 76193d7c 2003-09-30 devnull #include <memdraw.h>
7 76193d7c 2003-09-30 devnull #include "x11-memdraw.h"
8 76193d7c 2003-09-30 devnull
9 76193d7c 2003-09-30 devnull static int xdraw(Memdrawparam*);
10 76193d7c 2003-09-30 devnull
11 76193d7c 2003-09-30 devnull /*
12 76193d7c 2003-09-30 devnull * The X acceleration doesn't fit into the standard hwaccel
13 76193d7c 2003-09-30 devnull * model because we have the extra steps of pulling the image
14 76193d7c 2003-09-30 devnull * data off the server and putting it back when we're done.
15 76193d7c 2003-09-30 devnull */
16 76193d7c 2003-09-30 devnull void
17 76193d7c 2003-09-30 devnull memimagedraw(Memimage *dst, Rectangle r, Memimage *src, Point sp,
18 76193d7c 2003-09-30 devnull Memimage *mask, Point mp, int op)
19 76193d7c 2003-09-30 devnull {
20 76193d7c 2003-09-30 devnull Memdrawparam *par;
21 76193d7c 2003-09-30 devnull
22 76193d7c 2003-09-30 devnull if((par = _memimagedrawsetup(dst, r, src, sp, mask, mp, op)) == nil)
23 76193d7c 2003-09-30 devnull return;
24 76193d7c 2003-09-30 devnull
25 76193d7c 2003-09-30 devnull /* only fetch dst data if we need it */
26 76193d7c 2003-09-30 devnull if((par->state&(Simplemask|Fullmask)) != (Simplemask|Fullmask))
27 76193d7c 2003-09-30 devnull xgetxdata(dst, par->r);
28 76193d7c 2003-09-30 devnull
29 76193d7c 2003-09-30 devnull /* always fetch source and mask */
30 76193d7c 2003-09-30 devnull xgetxdata(src, par->sr);
31 76193d7c 2003-09-30 devnull xgetxdata(mask, par->mr);
32 76193d7c 2003-09-30 devnull
33 76193d7c 2003-09-30 devnull /* now can run memimagedraw on the in-memory bits */
34 76193d7c 2003-09-30 devnull _memimagedraw(par);
35 76193d7c 2003-09-30 devnull
36 98014aa5 2003-10-03 devnull if(xdraw(par))
37 98014aa5 2003-10-03 devnull return;
38 98014aa5 2003-10-03 devnull
39 76193d7c 2003-09-30 devnull /* put bits back on x server */
40 76193d7c 2003-09-30 devnull xputxdata(dst, par->r);
41 76193d7c 2003-09-30 devnull }
42 76193d7c 2003-09-30 devnull
43 76193d7c 2003-09-30 devnull static int
44 76193d7c 2003-09-30 devnull xdraw(Memdrawparam *par)
45 76193d7c 2003-09-30 devnull {
46 76193d7c 2003-09-30 devnull u32int sdval;
47 76193d7c 2003-09-30 devnull uint m, state;
48 76193d7c 2003-09-30 devnull Memimage *src, *dst, *mask;
49 76193d7c 2003-09-30 devnull Point dp, mp, sp;
50 76193d7c 2003-09-30 devnull Rectangle r;
51 76193d7c 2003-09-30 devnull Xmem *xdst, *xmask, *xsrc;
52 76193d7c 2003-09-30 devnull XGC gc;
53 76193d7c 2003-09-30 devnull
54 76193d7c 2003-09-30 devnull if(par->dst->X == nil)
55 76193d7c 2003-09-30 devnull return 0;
56 76193d7c 2003-09-30 devnull
57 76193d7c 2003-09-30 devnull dst = par->dst;
58 76193d7c 2003-09-30 devnull mask = par->mask;
59 76193d7c 2003-09-30 devnull r = par->r;
60 76193d7c 2003-09-30 devnull src = par->src;
61 76193d7c 2003-09-30 devnull state = par->state;
62 76193d7c 2003-09-30 devnull
63 76193d7c 2003-09-30 devnull /*
64 76193d7c 2003-09-30 devnull * If we have an opaque mask and source is one opaque pixel,
65 76193d7c 2003-09-30 devnull * we can convert to the destination format and just XFillRectangle.
66 76193d7c 2003-09-30 devnull */
67 76193d7c 2003-09-30 devnull m = Simplesrc|Simplemask|Fullmask;
68 76193d7c 2003-09-30 devnull if((state&m) == m){
69 76193d7c 2003-09-30 devnull xfillcolor(dst, r, par->sdval);
70 98014aa5 2003-10-03 devnull // xdirtyxdata(dst, r);
71 76193d7c 2003-09-30 devnull return 1;
72 76193d7c 2003-09-30 devnull }
73 76193d7c 2003-09-30 devnull
74 76193d7c 2003-09-30 devnull /*
75 76193d7c 2003-09-30 devnull * If no source alpha and an opaque mask, we can just copy
76 76193d7c 2003-09-30 devnull * the source onto the destination. If the channels are the
77 76193d7c 2003-09-30 devnull * same and the source is not replicated, XCopyArea works.
78 76193d7c 2003-09-30 devnull */
79 76193d7c 2003-09-30 devnull m = Simplemask|Fullmask;
80 76193d7c 2003-09-30 devnull if((state&(m|Replsrc))==m && src->chan==dst->chan && src->X){
81 76193d7c 2003-09-30 devnull xdst = dst->X;
82 76193d7c 2003-09-30 devnull xsrc = src->X;
83 76193d7c 2003-09-30 devnull dp = subpt(r.min, dst->r.min);
84 76193d7c 2003-09-30 devnull sp = subpt(par->sr.min, src->r.min);
85 76193d7c 2003-09-30 devnull gc = dst->chan==GREY1 ? _x.gccopy0 : _x.gccopy;
86 76193d7c 2003-09-30 devnull
87 76193d7c 2003-09-30 devnull XCopyArea(_x.display, xsrc->pixmap, xdst->pixmap, gc,
88 76193d7c 2003-09-30 devnull sp.x, sp.y, Dx(r), Dy(r), dp.x, dp.y);
89 98014aa5 2003-10-03 devnull // xdirtyxdata(dst, r);
90 76193d7c 2003-09-30 devnull return 1;
91 76193d7c 2003-09-30 devnull }
92 76193d7c 2003-09-30 devnull
93 76193d7c 2003-09-30 devnull /*
94 76193d7c 2003-09-30 devnull * If no source alpha, a 1-bit mask, and a simple source,
95 76193d7c 2003-09-30 devnull * we can copy through the mask onto the destination.
96 76193d7c 2003-09-30 devnull */
97 76193d7c 2003-09-30 devnull if(dst->X && mask->X && !(mask->flags&Frepl)
98 76193d7c 2003-09-30 devnull && mask->chan==GREY1 && (state&Simplesrc)){
99 76193d7c 2003-09-30 devnull xdst = dst->X;
100 76193d7c 2003-09-30 devnull xmask = mask->X;
101 76193d7c 2003-09-30 devnull sdval = par->sdval;
102 76193d7c 2003-09-30 devnull
103 76193d7c 2003-09-30 devnull dp = subpt(r.min, dst->r.min);
104 76193d7c 2003-09-30 devnull mp = subpt(r.min, subpt(par->mr.min, mask->r.min));
105 76193d7c 2003-09-30 devnull
106 76193d7c 2003-09-30 devnull if(dst->chan == GREY1){
107 76193d7c 2003-09-30 devnull gc = _x.gcsimplesrc0;
108 76193d7c 2003-09-30 devnull if(_x.gcsimplesrc0color != sdval){
109 76193d7c 2003-09-30 devnull XSetForeground(_x.display, gc, sdval);
110 76193d7c 2003-09-30 devnull _x.gcsimplesrc0color = sdval;
111 76193d7c 2003-09-30 devnull }
112 76193d7c 2003-09-30 devnull if(_x.gcsimplesrc0pixmap != xmask->pixmap){
113 76193d7c 2003-09-30 devnull XSetStipple(_x.display, gc, xmask->pixmap);
114 76193d7c 2003-09-30 devnull _x.gcsimplesrc0pixmap = xmask->pixmap;
115 76193d7c 2003-09-30 devnull }
116 76193d7c 2003-09-30 devnull }else{
117 76193d7c 2003-09-30 devnull /* this doesn't work on rob's mac? */
118 161060a4 2003-10-11 devnull return 0;
119 76193d7c 2003-09-30 devnull gc = _x.gcsimplesrc;
120 76193d7c 2003-09-30 devnull if(dst->chan == CMAP8 && _x.usetable)
121 76193d7c 2003-09-30 devnull sdval = _x.tox11[sdval];
122 76193d7c 2003-09-30 devnull
123 76193d7c 2003-09-30 devnull if(_x.gcsimplesrccolor != sdval){
124 76193d7c 2003-09-30 devnull XSetForeground(_x.display, gc, sdval);
125 76193d7c 2003-09-30 devnull _x.gcsimplesrccolor = sdval;
126 76193d7c 2003-09-30 devnull }
127 76193d7c 2003-09-30 devnull if(_x.gcsimplesrcpixmap != xmask->pixmap){
128 76193d7c 2003-09-30 devnull XSetStipple(_x.display, gc, xmask->pixmap);
129 76193d7c 2003-09-30 devnull _x.gcsimplesrcpixmap = xmask->pixmap;
130 76193d7c 2003-09-30 devnull }
131 76193d7c 2003-09-30 devnull }
132 76193d7c 2003-09-30 devnull XSetTSOrigin(_x.display, gc, mp.x, mp.y);
133 76193d7c 2003-09-30 devnull XFillRectangle(_x.display, xdst->pixmap, gc, dp.x, dp.y,
134 76193d7c 2003-09-30 devnull Dx(r), Dy(r));
135 98014aa5 2003-10-03 devnull // xdirtyxdata(dst, r);
136 76193d7c 2003-09-30 devnull return 1;
137 76193d7c 2003-09-30 devnull }
138 76193d7c 2003-09-30 devnull
139 76193d7c 2003-09-30 devnull /*
140 76193d7c 2003-09-30 devnull * Can't accelerate.
141 76193d7c 2003-09-30 devnull */
142 76193d7c 2003-09-30 devnull return 0;
143 76193d7c 2003-09-30 devnull }
144 76193d7c 2003-09-30 devnull