Blame


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