bitblt.c - sam - An updated version of the sam text editor. | |
git clone git://vernunftzentrum.de/sam.git | |
Log | |
Files | |
Refs | |
LICENSE | |
--- | |
bitblt.c (1958B) | |
--- | |
1 /* Copyright (c) 1998 Lucent Technologies - All rights reserved. */ | |
2 #include <u.h> | |
3 #include <libg.h> | |
4 #include "libgint.h" | |
5 | |
6 void | |
7 bitblt(Bitmap *d, Point p, Bitmap *s, Rectangle r, Fcode f) | |
8 { | |
9 bitblt2(d, p, s, r, f, _fgpixel, _bgpixel); | |
10 } | |
11 | |
12 void | |
13 bitblt2(Bitmap *d, Point p, Bitmap *s, Rectangle r, Fcode f, uint64_t fg… | |
14 { | |
15 int sx, sy, dx, dy, bfunc; | |
16 GC g; | |
17 uint64_t plane; | |
18 Bitmap *btmp; | |
19 | |
20 if (fg == 0) | |
21 fg = _fgpixel; | |
22 | |
23 if (bg == 0) | |
24 bg = _bgpixel; | |
25 | |
26 if(Dx(r)<=0 || Dy(r)<=0) | |
27 return; | |
28 sx = r.min.x; | |
29 sy = r.min.y; | |
30 if(s->flag&SHIFT){ | |
31 sx -= s->r.min.x; | |
32 sy -= s->r.min.y; | |
33 } | |
34 dx = p.x; | |
35 dy = p.y; | |
36 if(d->flag&SHIFT){ | |
37 dx -= d->r.min.x; | |
38 dy -= d->r.min.y; | |
39 } | |
40 g = _getcopygc2(f, d, s, &bfunc, fg, bg); | |
41 if(bfunc == UseCopyArea) | |
42 XCopyArea(_dpy, (Drawable)s->id, (Drawable)d->id, g, | |
43 sx, sy, Dx(r), Dy(r), dx, dy); | |
44 else if(bfunc == UseFillRectangle){ | |
45 XFillRectangle(_dpy, (Drawable)d->id, g, | |
46 dx, dy, Dx(r), Dy(r)); | |
47 }else{ | |
48 /* bfunc == UseCopyPlane */ | |
49 plane = _ld2dmask[s->ldepth]; | |
50 plane &= ~(plane>>1); | |
51 if(0/*f == S*/) | |
52 XCopyPlane(_dpy, (Drawable)s->id, (Drawable)d->id, g, | |
53 sx, sy, Dx(r), Dy(r), dx, dy, plane); | |
54 else { | |
55 /* | |
56 * CopyPlane can only do func code S, | |
57 * so copy src rect into a bitmap with the same depth | |
58 * as the dest, then do the bitblt from the tmp. | |
59 * This won't recurse again because we only get | |
60 * UseCopyPlane with differing bitmap depths | |
61 */ | |
62 btmp = _balloc(Rect(0,0,Dx(r),Dy(r)), d->ldepth); | |
63 XCopyPlane(_dpy, (Drawable)s->id, (Drawable)btmp->id, g, | |
64 sx, sy, Dx(r), Dy(r), 0, 0, plane); | |
65 bitblt(d, p, btmp, btmp->r, f); | |
66 bfree(btmp); | |
67 } | |
68 } | |
69 XFlush(_dpy); | |
70 } |