summaryrefslogtreecommitdiff
path: root/tix/win/tixWinDraw.c
diff options
context:
space:
mode:
Diffstat (limited to 'tix/win/tixWinDraw.c')
-rw-r--r--tix/win/tixWinDraw.c310
1 files changed, 310 insertions, 0 deletions
diff --git a/tix/win/tixWinDraw.c b/tix/win/tixWinDraw.c
new file mode 100644
index 00000000000..97b02b55f4c
--- /dev/null
+++ b/tix/win/tixWinDraw.c
@@ -0,0 +1,310 @@
+/*
+ * 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);
+}