URL
https://opencores.org/ocsvn/or1k/or1k/trunk
Subversion Repositories or1k
[/] [or1k/] [trunk/] [insight/] [tix/] [win/] [tixWinDraw.c] - Rev 1765
Compare with Previous | Blame | View Log
/* * tixWinDraw.c -- * * Implement the Windows specific function calls for drawing. * * Copyright (c) 1996, Expert Interface Technologies * * See the file "license.terms" for information on usage and redistribution * of this file, and for a DISCLAIMER OF ALL WARRANTIES. * */ #include <tkInt.h> #include <tkWinInt.h> #include <tixInt.h> #include <tixPort.h> /*---------------------------------------------------------------------- * TixpDrawTmpLine -- * * Draws a "temporarily" line on the desktop window with XOR * drawing mode. This function is used by the PanedWindow and * ResizeHandler to draw the rubberband lines. Calling the * function again with the same parameters cancels the temporary * lines without affecting what was originally on the screen. *---------------------------------------------------------------------- */ void TixpDrawTmpLine(x1, y1, x2, y2, tkwin) int x1; int y1; int x2; int y2; Tk_Window tkwin; { HWND desktop; HDC hdc; HPEN hpen; HGDIOBJ old; desktop = GetDesktopWindow(); hdc = GetWindowDC(desktop); hpen = CreatePen(PS_SOLID, 0, RGB(255,255,255)); old = SelectObject(hdc, hpen); SetROP2(hdc, R2_XORPEN); MoveToEx(hdc, x1, y1, NULL); LineTo(hdc, x2, y2); SelectObject(hdc, old); DeleteObject(hpen); ReleaseDC(desktop, hdc); } /*---------------------------------------------------------------------- * TixpDrawAnchorLines -- * * See comments near Tix_DrawAnchorLines. *---------------------------------------------------------------------- */ void TixpDrawAnchorLines(display, drawable, gc, x, y, w, h) Display *display; Drawable drawable; GC gc; int x; int y; int w; int h; { HDC hdc; TkWinDCState state; HPEN hpen; HGDIOBJ old; hdc = TkWinGetDrawableDC(display, drawable, &state); hpen = CreatePen(PS_DOT, 1, gc->foreground); old = SelectObject(hdc, hpen); MoveToEx(hdc, x, y, NULL); LineTo(hdc, x, y+h-1); LineTo(hdc, x+w-1, y+h-1); LineTo(hdc, x+w-1, y); LineTo(hdc, x, y); SelectObject(hdc, old); DeleteObject(hpen); TkWinReleaseDrawableDC(drawable, hdc, &state); } /*---------------------------------------------------------------------- * TixpStartSubRegionDraw -- * * Limits the subsequent drawing operations into the prescribed * rectangle region. This takes effect up to a matching * TixEndSubRegionDraw() call. * * Return value: * none. *---------------------------------------------------------------------- */ void TixpStartSubRegionDraw(display, drawable, gc, subRegPtr, origX, origY, x, y, width, height, needWidth, needHeight) Display *display; Drawable drawable; GC gc; TixpSubRegion * subRegPtr; int origX; int origY; int x; int y; int width; int height; int needWidth; int needHeight; { TkWinDrawable * wdrPtr; int depth; if ((width < needWidth) || (height < needHeight)) { subRegPtr->origX = origX; subRegPtr->origY = origY; subRegPtr->x = x; subRegPtr->y = y; subRegPtr->width = width; subRegPtr->height = height; /* * Find out the depth of the drawable and create a pixmap of * the same depth. */ wdrPtr = (TkWinDrawable *)drawable; if (wdrPtr->type == TWD_BITMAP) { depth = wdrPtr->bitmap.depth; } else { depth = wdrPtr->window.winPtr->depth; } subRegPtr->pixmap = Tk_GetPixmap(display, drawable, width, height, depth); if (subRegPtr->pixmap != None) { /* * It could be None if we have somehow exhausted the Windows * GDI resources. */ XCopyArea(display, drawable, subRegPtr->pixmap, gc, x, y, width, height, 0, 0); } } else { subRegPtr->pixmap = None; } } /*---------------------------------------------------------------------- * TixpEndSubRegionDraw -- * * *---------------------------------------------------------------------- */ void TixpEndSubRegionDraw(display, drawable, gc, subRegPtr) Display *display; Drawable drawable; GC gc; TixpSubRegion * subRegPtr; { if (subRegPtr->pixmap != None) { XCopyArea(display, subRegPtr->pixmap, drawable, gc, 0, 0, subRegPtr->width, subRegPtr->height, subRegPtr->x, subRegPtr->y); Tk_FreePixmap(display, subRegPtr->pixmap); subRegPtr->pixmap = None; } } /* *---------------------------------------------------------------------- * * TixpSubRegDisplayText -- * * Display a text string on one or more lines in a sub region. * * Results: * See TkDisplayText * * Side effects: * See TkDisplayText * *---------------------------------------------------------------------- */ void TixpSubRegDisplayText(display, drawable, gc, subRegPtr, font, string, numChars, x, y, length, justify, underline) Display *display; /* X display to use for drawing text. */ Drawable drawable; /* Window or pixmap in which to draw the * text. */ GC gc; /* Graphics context to use for drawing text. */ TixpSubRegion * subRegPtr; /* Information about the subregion */ TixFont font; /* Font that determines geometry of text * (should be same as font in gc). */ char *string; /* String to display; may contain embedded * newlines. */ int numChars; /* Number of characters to use from string. */ int x, y; /* Pixel coordinates within drawable of * upper left corner of display area. */ int length; /* Line length in pixels; used to compute * word wrap points and also for * justification. Must be > 0. */ Tk_Justify justify; /* How to justify lines. */ int underline; /* Index of character to underline, or < 0 * for no underlining. */ { if (subRegPtr->pixmap != None) { TixDisplayText(display, subRegPtr->pixmap, font, string, numChars, x - subRegPtr->x, y - subRegPtr->y, length, justify, underline, gc); } else { TixDisplayText(display, drawable, font, string, numChars, x, y, length, justify, underline, gc); } } /*---------------------------------------------------------------------- * TixpSubRegFillRectangle -- * * *---------------------------------------------------------------------- */ void TixpSubRegFillRectangle(display, drawable, gc, subRegPtr, x, y, width, height) Display *display; /* X display to use for drawing rectangle. */ Drawable drawable; /* Window or pixmap in which to draw the * rectangle. */ GC gc; /* Graphics context to use for drawing. */ TixpSubRegion * subRegPtr; /* Information about the subregion */ int x, y; /* Pixel coordinates within drawable of * upper left corner of display area. */ int width, height; /* Size of the rectangle. */ { if (subRegPtr->pixmap != None) { XFillRectangle(display, subRegPtr->pixmap, gc, x - subRegPtr->x, y - subRegPtr->x, width, height); } else { XFillRectangle(display, drawable, gc, x, y, width, height); } } /*---------------------------------------------------------------------- * TixpSubRegDrawImage -- * * Draws a Tk image in a subregion. *---------------------------------------------------------------------- */ void TixpSubRegDrawImage(subRegPtr, image, imageX, imageY, width, height, drawable, drawableX, drawableY) TixpSubRegion * subRegPtr; Tk_Image image; int imageX; int imageY; int width; int height; Drawable drawable; int drawableX; int drawableY; { if (subRegPtr->pixmap != None) { Tk_RedrawImage(image, imageX, imageY, width, height, subRegPtr->pixmap, drawableX - subRegPtr->x, drawableY - subRegPtr->y); } else { Tk_RedrawImage(image, imageX, imageY, width, height, drawable, drawableX, drawableY); } } void TixpSubRegDrawBitmap(display, drawable, gc, subRegPtr, bitmap, src_x, src_y, width, height, dest_x, dest_y, plane) Display *display; Drawable drawable; GC gc; TixpSubRegion * subRegPtr; Pixmap bitmap; int src_x, src_y; int width, height; int dest_x, dest_y; unsigned long plane; { XSetClipOrigin(display, gc, dest_x, dest_y); if (subRegPtr->pixmap != None) { XCopyPlane(display, bitmap, subRegPtr->pixmap, gc, src_x, src_y, width, height, dest_x - subRegPtr->x, dest_y - subRegPtr->y, plane); } else { XCopyPlane(display, bitmap, drawable, gc, src_x, src_y, width, height, dest_x, dest_y, plane); } XSetClipOrigin(display, gc, 0, 0); }