#include #include #include #include "window.h" #include "_window.h" static char *forimage; void processimage(windowtype *window, char *image, unsigned inset, int put) { register unsigned t1,t2; windowtype *current = window->previous; unsigned top, bottom, left, right; unsigned off1, off2, len, t; while ( current ) { if ( (top = ((t1=window->top+inset) > (t2=current->top) ? t1 : t2)) <= (bottom = ((t1=window->bottom-inset) < (t2=current->bottom) ? t1 : t2)) && (left = ((t1=window->left+inset) > (t2=current->left) ? t1 : t2)) <= (right = ((t1=window->right-inset) < (t2=current->right) ? t1 : t2))) { /* Update the forscreen and backscreen */ /* Calculate optimized index references */ off1 = ((window->right-inset) - (window->left+inset) + 1) << 1; off2 = ((current->right) - (current->left) + 1) << 1; len = (right - left + 1) << 1; /* calculate move positions */ t1 = (left - (window->left+inset)) << 1; t2 = (left - (current->left)) << 1; if ( (window->top+inset) == top) t2 += off2*(top - (current->top)); else t1 += off1*(top - (window->top+inset)); /* Move the memory appropriately */ for (t=top ; t <= bottom; t++) { if (put) { char *tmp = &image[t1]; ifn0move(¤t->backbuffer[t2],tmp,len); memset(tmp,'\0',len); } else if0move(&image[t1],¤t->backbuffer[t2],len); t1 += off1; t2 += off2; } } current = current->previous; } } char *getwinimage(windowtype *window, unsigned off) { char *image; free(forimage); forimage = NULL; if ( (image = calloc(window->size,1)) == NULL ) return NULL; if ( (forimage = malloc(window->size)) == NULL ) { free(image); return NULL; } processimage(window, image, off, 0); gettext(window->left+off, window->top+off, window->right-off, window->bottom-off,forimage); if0move(image, forimage, window->size); return image; } int putwinimage(windowtype *window, char *image, unsigned off, int update) { if ( !forimage ) { if ( (forimage = malloc(window->size)) == NULL ) return -1; gettext(window->left+off, window->top+off, window->right-off, window->bottom-off,forimage); } processimage(window, image, off, 1); ifn0move(forimage, image, window->size); if ( update ) puttext(window->left+off, window->top+off, window->right-off, window->bottom-off,forimage); else memcpy(image, forimage, window->size); free(forimage); forimage = NULL; return 0; }