This is XCopyImg.c in view mode; [Download] [Up]
/* * This software is copyrighted as noted below. It may be freely copied, * modified, and redistributed, provided that the copyright notices are * preserved on all copies. * * There is no warranty or other guarantee of fitness for this software, * it is provided solely "as is". Bug reports or fixes may be sent * to the author, who may or may not act on them as he desires. * * You may not include this software in a program or other software product * without supplying the source, or without informing the end-user that the * source is available for no extra charge. * * If you modify this software, you should include a notice giving the * name of the person performing the modification, the date of modification, * and the reason for such modification. */ /* * Author: Martin R. Friedmann * Dept of Electrical Engineering and Computer Science * University of Michigan * Date: Tue, Nov 14, 1989 * Copyright (c) 1989, University of Michigan */ #include "X11/Xlib.h" #include "getx11.h" /* this function provides a client side, block move within a single image * structure for panning around in the magnified image. bcopy is probubly * faster on most machines... */ int XCopyImage ( image, src_x, src_y, width, height, dst_x, dst_y ) XImage *image; int src_x, src_y, width, height, dst_x, dst_y; { int line_width = image->bytes_per_line; if ( width == 0 ) return; switch ( image->bits_per_pixel ) { case 1: return False; case 8: do { char *srcline, *dstline; register char *src, *dst; register int counter; if ( src_y < dst_y ) { srcline = image->data + line_width * (src_y+height-1) + src_x; dstline = image->data + line_width * (dst_y+height-1) + dst_x; if ( src_x < dst_x ) { dstline += width - 1; while ( --height >= 0 ) { src = srcline + width - 1; dst = dstline; counter = width; duff8( counter, *dst-- = *src-- ); srcline -= line_width; dstline -= line_width; } } else { srcline += width - 1; while ( --height >= 0 ) { src = srcline - width + 1; dst = dstline; counter = width; duff8( counter, *dst++ = *src++ ); srcline -= line_width; dstline -= line_width; } } } else { srcline = image->data + line_width * src_y + src_x; dstline = image->data + line_width * dst_y + dst_x; if ( src_x < dst_x ) { dstline += width - 1; while ( --height >= 0 ) { src = srcline + width - 1; dst = dstline; counter = width; duff8( counter, *dst-- = *src-- ); srcline += line_width; dstline += line_width; } } else { srcline += width - 1; while ( --height >= 0 ) { src = srcline - width + 1; dst = dstline; counter = width; duff8( counter, *dst++ = *src++ ); srcline += line_width; dstline += line_width; } } } } while (0); return True; case 32: do { register long *srcline, *dstline; register long *src, *dst; if ( src_y < dst_y ) { srcline = (long *) ((char *)image->data + line_width * (src_y+height-1) + src_x * sizeof(long)); dstline = (long *) ((char *)image->data + line_width * (dst_y+height-1) + dst_x * sizeof(long)); if ( src_x < dst_x ) { dstline += width - 1; while ( --height >= 0 ) { src = srcline + width - 1; dst = dstline; while ( src >= srcline ) *dst-- = *src--; srcline -= line_width/sizeof(long); dstline -= line_width/sizeof(long); } } else { srcline += width - 1; while ( --height >= 0 ) { src = srcline - width + 1; dst = dstline; while ( src <= srcline ) *dst++ = *src++; srcline -= line_width/sizeof(long); dstline -= line_width/sizeof(long); } } } else { srcline = (long *) ((char *)image->data + line_width * src_y + src_x * sizeof(long)); dstline = (long *) ((char *)image->data + line_width * dst_y + dst_x * sizeof(long)); if ( src_x < dst_x ) { dstline += width - 1; while ( --height >= 0 ) { src = srcline + width - 1; dst = dstline; while ( src >= srcline ) *dst-- = *src--; srcline += line_width/sizeof(long); dstline += line_width/sizeof(long); } } else { srcline += width - 1; while ( --height >= 0 ) { src = srcline - width + 1; dst = dstline; while ( src <= srcline ) *dst++ = *src++; srcline += line_width/sizeof(long); dstline += line_width/sizeof(long); } } } } while (0); return True; } return False; }
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.