1
2 #ifndef _global_h
3 # include "global.h"
4 #endif
5 #ifndef _imgbuff_h
6 # include "imgbuff.H"
7 #endif
8
ImageBuffer()9 ImageBuffer::ImageBuffer() {
10 ximage=0;
11 width=0;
12 height=0;
13 #ifdef USE_MIT_SHM
14 int major,minor;
15 Bool pmaps;
16
17 shm=(shared)?XShmQueryVersion(dpy,&major,&minor,&pmaps):0;
18 if (shm&&verbose) {
19 printf( "--- using shared memory extension V%d.%d %s\n", major, minor,
20 ((pmaps)?"(shared pixmaps supported)":"") );
21 }
22 #endif
23 }
24
~ImageBuffer()25 ImageBuffer::~ImageBuffer() {
26 FreeData();
27 }
28
FreeData()29 void ImageBuffer::FreeData() {
30 if (ximage) {
31 #ifdef USE_MIT_SHM
32 if (shm) {
33 XShmDetach(dpy,&shminfo);
34 XDestroyImage(ximage);
35 shmdt(shminfo.shmaddr);
36 shmctl(shminfo.shmid, IPC_RMID, 0 );
37 }
38 else
39 #endif
40 {
41 free( ximage->data );
42 ximage->data = 0L;
43 XDestroyImage(ximage);
44 }
45 ximage=0;
46 }
47 }
48
AllocData(int w,int h,int bpp8)49 void ImageBuffer::AllocData(int w, int h, int bpp8) {
50 FreeData();
51 width = w;
52 height = h;
53
54 #ifdef USE_MIT_SHM
55 if (shm) {
56 ximage = XShmCreateImage(dpy, DefaultVisual(dpy,scr),
57 DefaultDepth(dpy,scr), ZPixmap, NULL, &shminfo, width, height );
58 shminfo.shmid = shmget(IPC_PRIVATE, ximage->bytes_per_line * ximage->height, IPC_CREAT|0777);
59 shminfo.shmaddr = ximage->data = (char*)shmat(shminfo.shmid,0,0);
60 shminfo.readOnly = False;
61 XShmAttach(dpy,&shminfo);
62 }
63 else
64 #endif
65 {
66 char *data=(char*)malloc(width*height*bpp8);
67 ximage = XCreateImage(dpy, DefaultVisual(dpy,scr),
68 DefaultDepth(dpy,scr), ZPixmap, 0,
69 data, width, height, (8*bpp8), width*bpp8 );
70 }
71 }
72
73
Init(int w,int h,int bpp8)74 XImage *ImageBuffer::Init(int w,int h,int bpp8) {
75
76 // w+=10; h+=10;
77 if (w>width||h>height) {
78 FreeData();
79 AllocData(w,h,bpp8);
80 }
81 return ximage;
82 }
83
84