|
DataMuseum.dkPresents historical artifacts from the history of: DKUUG/EUUG Conference tapes |
This is an automatic "excavation" of a thematic subset of
See our Wiki for more about DKUUG/EUUG Conference tapes Excavated with: AutoArchaeologist - Free & Open Source Software. |
top - metrics - downloadIndex: T i
Length: 15224 (0x3b78) Types: TextFile Names: »image.c«
└─⟦a0efdde77⟧ Bits:30001252 EUUGD11 Tape, 1987 Spring Conference Helsinki └─⟦526ad3590⟧ »EUUGD11/gnu-31mar87/X.V10.R4.tar.Z« └─⟦2109abc41⟧ └─⟦this⟧ »./X.V10R4/Toolkit/Xr/usr/contrib/RB/image.c«
/* * $Source: /u1/Xr/usr/contrib/RB/RCS/image.c,v $ * $Header: image.c,v 1.1 86/12/17 08:53:37 swick Exp $ */ #ifndef lint static char *rcsid_image_c = "$Header: image.c,v 1.1 86/12/17 08:53:37 swick Exp $"; #endif lint static char rcsid[] = "$Header: image.c,v 1.1 86/12/17 08:53:37 swick Exp $"; /*************************************<+>************************************* ***************************************************************************** ** ** File: image.c ** ** Project: X-ray Toolbox ** ** Description: This file contains the routines necessary to create ** a window and display and redisplay a raster image * within it. ** ** ******************************************************************* ** * (c) Copyright Hewlett-Packard Company, 1986. All rights are * ** * reserved. Copying or other reproduction of this program except * ** * for archival purposes is prohibited without the prior written * ** * consent of Hewlett-Packard Company. * ** ******************************************************************* ** ** ** ------------------------ MODIFICATION RECORD ------------------------ * * $Log: image.c,v $ * Revision 1.1 86/12/17 08:53:37 swick * Initial revision * * ***************************************************************************** *************************************<+>*************************************/ #include <X/Xlib.h> #include <Xr/defs.h> #include <Xr/types.h> #include "image.h" Image (windowId, message, data) Window windowId; INT32 message; INT8 * data; { switch (message) { /* * Set up the editors needed to handle the display of the * image and create a panel to display the image. */ case MSG_NEW: { mainWindowId = XCreateWindow (RootWindow, 0, 0, 1, 1, xrBorderWidth, xrWindowForeground, xrWindowBackground); subWindowId = XCreateWindow (mainWindowId, 0, 0, 1, 1, 1, BlackPixmap, WhitePixmap); XDefineCursor (mainWindowId, xrDefaultCursor); XDefineCursor (subWindowId, xrDefaultCursor); XSelectInput (mainWindowId, ButtonPressed | ButtonReleased | EnterWindow | ExposeWindow); XrSetRect (&windowData.windowRect, 0, 0, 0, 0); windowData.foreTile = BlackPixmap; windowData.backTile = WhitePixmap; XrInput (mainWindowId, MSG_ADDWINDOW, &windowData); windowFunct.processFlag = TRUE; windowFunct.funct = (xrPFI) ImageEdit; windowFunct.instance = (INT32) mainWindowId; windowFunct.message = (INT32) MSG_EDIT; windowFunct.eventCount = 1; windowFunct.eventList = &eventSet[0]; XrInput (mainWindowId, MSG_ADDWINDOWFUNCT, &windowFunct); XrTitleBar (NULL, MSG_SIZE, &titleBarInfo); XrScrollBar (NULL, MSG_SIZE, &scrollHorInfo); XrScrollBar (NULL, MSG_SIZE, &scrollVertInfo); titleBarInfo.editorWindowId = mainWindowId; scrollHorInfo.editorWindowId = mainWindowId; scrollVertInfo.editorWindowId = mainWindowId; titleBar = XrTitleBar (NULL, MSG_NEW, &titleBarInfo); } break; /* * Add a pixmap or bitmap into the window by setting the window * sizes, setting the editors, mapping the windows, and writing * the bits. */ case MSG_UPDATE: { WindowInfo info; INT32 moreWidth; XSelectInput (mainWindowId, NULL); XQueryWindow (windowId, &info); mainWindowX = info.x + info.width + 20; mainWindowY = info.y; pixmap = (xrPixmap *) data; /* * Calculate the necessary width of the window. */ if (horScrollable == TRUE) XrScrollBar (scrollHor, MSG_FREE, NULL); horScrollable = FALSE; XrTitleBar (NULL, MSG_SIZE, &titleBarInfo); mainWindowWidth = titleBarInfo.editorRect.width; if (pixmap -> height > maxWindowHeight - titleBarInfo.editorRect.height - 10) { moreWidth = scrollVertInfo.editorRect.width; mainWindowWidth += moreWidth; } else moreWidth = 0; if (mainWindowWidth - 10 < pixmap -> width) mainWindowWidth = pixmap -> width + 10 + moreWidth; if (mainWindowWidth > maxWindowWidth) { mainWindowWidth = maxWindowWidth; horScrollable = TRUE; } titleBarInfo.editorRect.width = mainWindowWidth; /* * Calculate the height of the window. */ if (vertScrollable == TRUE) XrScrollBar (scrollVert, MSG_FREE, NULL); vertScrollable = FALSE; mainWindowHeight = titleBarInfo.editorRect.height + pixmap -> height + 10; if (horScrollable) mainWindowHeight += scrollHorInfo.editorRect.height; if (mainWindowHeight > maxWindowHeight) { mainWindowHeight = maxWindowHeight; vertScrollable = TRUE; } /* * Position the scroll bars. */ if (horScrollable) { scrollHorInfo.editorRect.x = 5; scrollHorInfo.editorRect.width = mainWindowWidth - 10 + 1; if (vertScrollable) scrollHorInfo.editorRect.width -= scrollVertInfo.editorRect.width; scrollHor = XrScrollBar (NULL, MSG_NEW, &scrollHorInfo); } if (vertScrollable) { scrollVertInfo.editorRect.y = titleBarInfo.editorRect.height + 5; scrollVertInfo.editorRect.height = mainWindowHeight - titleBarInfo.editorRect.height - 10 + 1; if (horScrollable) scrollVertInfo.editorRect.height -= scrollHorInfo.editorRect.height; scrollVert = XrScrollBar (NULL, MSG_NEW, &scrollVertInfo); } /* * Calculate the sub window size, position and mapping point. */ if (horScrollable) { subWindowX = 5; subWindowWidth = scrollHorInfo.editorRect.width - 2; } else { subWindowWidth = pixmap -> width; if (!vertScrollable) subWindowX = (mainWindowWidth - subWindowWidth) / 2; else subWindowX = (mainWindowWidth - subWindowWidth - scrollVertInfo.editorRect.width) / 2; XrScrollBar (scrollHor, MSG_SETSTATE, 0); } subWindowY = titleBarInfo.editorRect.height + 5; if (vertScrollable) subWindowHeight = scrollVertInfo.editorRect.height - 2; else { subWindowHeight = pixmap -> height; XrScrollBar (scrollVert, MSG_SETSTATE, 0); } scrollHorInfo.editorRect.y = subWindowY + subWindowHeight + 1; scrollVertInfo.editorRect.x = subWindowX + subWindowWidth + 1; pixmapMapX = 0; pixmapMapY = 0; /* * Get both windows set to the correct size. */ XConfigureWindow (mainWindowId, mainWindowX, mainWindowY, mainWindowWidth, mainWindowHeight); XConfigureWindow (subWindowId, subWindowX, subWindowY, subWindowWidth, subWindowHeight); XMapWindow (mainWindowId); XMapWindow (subWindowId); XrSetRect(&windowData.windowRect, mainWindowX, mainWindowY, mainWindowWidth, mainWindowHeight); windowData.foreTile = BlackPixmap; windowData.backTile = WhitePixmap; XrInput (mainWindowId, MSG_SETWINDOWDATA, &windowData); /* * Resize the editors and reposition the editors. */ XrTitleBar (titleBar, MSG_RESIZE, &titleBarInfo.editorRect); XrTitleBar (titleBar, MSG_SETSTATE, XrVISIBLE | XrSENSITIVE); if (horScrollable) { XrScrollBar(scrollHor, MSG_RESIZE, &scrollHorInfo.editorRect); XrScrollBar(scrollHor, MSG_SETSTATE, XrVISIBLE | XrSENSITIVE); } if (vertScrollable) { XrScrollBar(scrollVert, MSG_RESIZE, &scrollVertInfo.editorRect); XrScrollBar(scrollVert, MSG_SETSTATE, XrVISIBLE | XrSENSITIVE); } /* * Display the image. */ if (pixmap -> depth == XrBIT1) XBitmapBitsPut (subWindowId, -pixmapMapX, -pixmapMapY, pixmap -> width, pixmap -> height, pixmap -> raster, 1, 0, 0, GXcopy, AllPlanes); else XPixmapBitsPutZ (subWindowId, -pixmapMapX, -pixmapMapY, pixmap -> width, pixmap -> height, pixmap -> raster, 0, GXcopy, AllPlanes); XSelectInput (mainWindowId, ButtonPressed | ButtonReleased | EnterWindow | ExposeWindow); XFlush(); } break; case MSG_REDRAW: { POINT * mapPt; mapPt = (POINT *) data; if (mapPt != NULL) { pixmapMapX = mapPt -> x; pixmapMapY = mapPt -> y; } if (pixmap -> depth == XrBIT1) XBitmapBitsPut (subWindowId, -pixmapMapX, -pixmapMapY, pixmap -> width, pixmap -> height, pixmap -> raster, 1, 0, 0, GXcopy, AllPlanes); else XPixmapBitsPutZ (subWindowId, -pixmapMapX, -pixmapMapY, pixmap -> width, pixmap -> height, pixmap -> raster, 0, GXcopy, AllPlanes); } break; default: break; } } /************************************************************************ * * ImageEdit is the editing routine for the image window. It is * called by XrInput upon an enter window event. It handles the * scrolling and redisplay of the image. * ************************************************************************/ ImageEdit (windowId, message, input) Window windowId; INT32 message; XEvent * input; { XExposeEvent * regionInput; XMouseOrCrossingEvent * crossInput; RECTANGLE redrawRect; xrEvent * xrInput; xrSBParameters parms; if (input -> type & ExposeWindow) { if (input -> subwindow == 0) { Image (0, MSG_REDRAW, NULL); XrTitleBar (titleBar, MSG_REDRAW, XrREDRAW_ALL); if (horScrollable) XrScrollBar (scrollHor, MSG_REDRAW, XrREDRAW_ALL); if (vertScrollable) XrScrollBar (scrollVert, MSG_REDRAW, XrREDRAW_ALL); } input -> type = XrXRAY; input -> window = 0; XrInput (0, MSG_PUSHEVENT, input); return(TRUE); } /* * Turn off the event processing for this function so that recursive * calls do not get generated. */ XSync (1); XSelectInput (mainWindowId, ButtonPressed | ButtonReleased); while (1) { XrInput (mainWindowId, MSG_BLKHOTREAD, input); if (input -> window != mainWindowId && input -> window != subWindowId) { XrInput (mainWindowId, MSG_PUSHEVENT, input); XSelectInput (mainWindowId, ButtonPressed | ButtonReleased | EnterWindow | ExposeWindow); return (TRUE); } else if (input -> type == XrXRAY) { xrInput = (xrEvent *) input; switch (xrInput -> inputType) { case XrEDITOR: if (xrInput -> inputCode == XrTITLEBAR) ; else if (xrInput -> inputCode == XrSCROLLBAR) { XrScrollBar ((xrEditor *) xrInput -> valuePtr, MSG_GETPARAMETERS, &parms); if (xrInput -> value1 == XrSCROLL_LEFT || xrInput -> value1 == XrSCROLL_UP) { parms.slidePosition -= 5; DrawImage (xrInput -> valuePtr, &parms); while (XrInput (0, MSG_NONBLKREAD, input) == FALSE) { parms.slidePosition -= 5; DrawImage (xrInput -> valuePtr, &parms); } } else if (xrInput -> value1 == XrSCROLL_RIGHT || xrInput -> value1 == XrSCROLL_DOWN) { parms.slidePosition += 5; DrawImage (xrInput -> valuePtr, &parms); while (XrInput (0, MSG_NONBLKREAD, input) == FALSE) { parms.slidePosition += 5; DrawImage (xrInput -> valuePtr, &parms); } } else if (xrInput -> value1 == XrSCROLL_LESS || xrInput -> value1 == XrSCROLL_MORE) { parms.slidePosition = xrInput -> value3; DrawImage (xrInput -> valuePtr, &parms); } else { parms.slidePosition = xrInput -> value2; DrawImage (xrInput -> valuePtr, &parms); } } break; default: break; } } } } /************************************************************************ * * DrawImage uses the horizontal or vertical scroll parameters to * calculate what part of the image is to be displayed. It them * call Image to display the image. * ************************************************************************/ DrawImage (editorInstance, parms) xrEditor * editorInstance; xrSBParameters * parms; { if (parms -> slidePosition < 0) parms -> slidePosition = 0; if (parms -> slidePosition > 100) parms -> slidePosition = 100; XrScrollBar (editorInstance, MSG_SETPARAMETERS, parms); if (editorInstance == scrollHor) pixmapMapX = parms -> slidePosition * (pixmap -> width - subWindowWidth) / 100; else pixmapMapY = parms -> slidePosition * (pixmap -> height - subWindowHeight) / 100; Image (0, MSG_REDRAW, NULL); }