This is old C++ code originally intended to be a playground for 3D math.
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 

57 lines
1.5 KiB

using namespace std;
#include <cstdlib>
#include "canvas_x11_shm.h"
canvas_x11_shm::canvas_x11_shm(unsigned xs, unsigned ys) :
canvas_x11(xs, ys) {
XDestroyImage(ximg);
//delete [] sinfo->p_screenbuf;
ximg = XShmCreateImage(disp->getdisplay(), scr->getvisual(),
scr->getdepth(), ZPixmap, 0, &shminfo,
x_size, y_size);
shminfo.shmid=shmget(IPC_PRIVATE, ximg->bytes_per_line*ximg->height,
IPC_CREAT | 0777);
if(shminfo.shmid < 0) {
XDestroyImage(ximg);
ximg=NULL;
exit(EXIT_FAILURE);
}
else {
shminfo.shmaddr=ximg->data=(char*)shmat(shminfo.shmid,0,0);
if(shminfo.shmaddr == (char*)-1) {
XDestroyImage(ximg);
ximg=NULL;
exit(EXIT_FAILURE);
}
else {
shminfo.readOnly=false;
XShmAttach(disp->getdisplay(), &shminfo);
}
}
sinfo->p_screenbuf=(unsigned char*)(ximg->data);
}
canvas_x11_shm::~canvas_x11_shm() {
XShmDetach(disp->getdisplay(), &shminfo);
if(ximg) {
XDestroyImage(ximg);
ximg=NULL;
}
shmdt(shminfo.shmaddr);
shmctl(shminfo.shmid, IPC_RMID, NULL);
}
void canvas_x11_shm::blit_screen(void) {
while(blit != NO_BLIT) {}
blit=BLIT;
XShmPutImage(disp->getdisplay(), win->getwindow(), scr->getgc(),
ximg, 0,0,0,0, x_size, y_size, false);
blit=NO_BLIT;
}