(********************************************************************) (* *) (* graph.s7i Basic graphic library *) (* Copyright (C) 1994, 1995, 2004, 2005, 2007 Thomas Mertes *) (* 2009 - 2013, 2017, 2018 Thomas Mertes *) (* 2020 - 2022, 2024, 2025 Thomas Mertes *) (* *) (* This file is part of the Seed7 Runtime Library. *) (* *) (* The Seed7 Runtime Library is free software; you can *) (* redistribute it and/or modify it under the terms of the GNU *) (* Lesser General Public License as published by the Free Software *) (* Foundation; either version 2.1 of the License, or (at your *) (* option) any later version. *) (* *) (* The Seed7 Runtime Library is distributed in the hope that it *) (* will be useful, but WITHOUT ANY WARRANTY; without even the *) (* implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR *) (* PURPOSE. See the GNU Lesser General Public License for more *) (* details. *) (* *) (* You should have received a copy of the GNU Lesser General *) (* Public License along with this program; if not, write to the *) (* Free Software Foundation, Inc., 51 Franklin Street, *) (* Fifth Floor, Boston, MA 02110-1301, USA. *) (* *) (********************************************************************) include "pixel.s7i"; include "float.s7i"; include "bstring.s7i"; const type: PRIMITIVE_WINDOW is newtype; IN_PARAM_IS_REFERENCE(PRIMITIVE_WINDOW); const creator: (ref PRIMITIVE_WINDOW: dest) ::= (in PRIMITIVE_WINDOW: source) is action "DRW_CREATE"; const destroyer: destroy (ref PRIMITIVE_WINDOW: aValue) is action "DRW_DESTR"; const proc: (inout PRIMITIVE_WINDOW: dest) := (in PRIMITIVE_WINDOW: source) is action "DRW_CPY"; const func boolean: (in PRIMITIVE_WINDOW: win1) = (in PRIMITIVE_WINDOW: win2) is action "DRW_EQ"; const func boolean: (in PRIMITIVE_WINDOW: win1) <> (in PRIMITIVE_WINDOW: win2) is action "DRW_NE"; const func PRIMITIVE_WINDOW: _GENERATE_EMPTY_WINDOW is action "DRW_EMPTY"; const PRIMITIVE_WINDOW: (attr PRIMITIVE_WINDOW) . value is _GENERATE_EMPTY_WINDOW; const proc: DRAW_PPOINT (inout PRIMITIVE_WINDOW: aWindow, in integer: x, in integer: y, in pixel: col) is action "DRW_PPOINT"; const proc: DRAW_PLINE (inout PRIMITIVE_WINDOW: aWindow, in integer: x1, in integer: y1, in integer: x2, in integer: y2, in pixel: col) is action "DRW_PLINE"; const proc: DRAW_PRECT (inout PRIMITIVE_WINDOW: aWindow, in integer: x, in integer: y, in integer: width, in integer: height, in pixel: col) is action "DRW_PRECT"; const proc: DRAW_CIRCLE(inout PRIMITIVE_WINDOW: aWindow, in integer: x, in integer: y, in integer: radius, in pixel: col) is action "DRW_PCIRCLE"; const proc: DRAW_CLEAR(inout PRIMITIVE_WINDOW: aWindow, in pixel: col) is action "DRW_CLEAR"; const proc: FILL_CIRCLE(inout PRIMITIVE_WINDOW: aWindow, in integer: x, in integer: y, in integer: radius, in pixel: col) is action "DRW_PFCIRCLE"; const proc: DRAW_ARC(inout PRIMITIVE_WINDOW: aWindow, in integer: x, in integer: y, in integer: radius, in float: startAngle, in float: sweepAngle, in pixel: col) is action "DRW_PARC"; const proc: DRAW_ARC(inout PRIMITIVE_WINDOW: aWindow, in integer: x, in integer: y, in integer: radius, in float: startAngle, in float: sweepAngle, in integer: width, in pixel: col) is action "DRW_PFARC"; const proc: FILL_ARCCHORD(inout PRIMITIVE_WINDOW: aWindow, in integer: x, in integer: y, in integer: radius, in float: startAngle, in float: sweepAngle, in pixel: col) is action "DRW_PFARCCHORD"; const proc: FILL_ARCPIESLICE(inout PRIMITIVE_WINDOW: aWindow, in integer: x, in integer: y, in integer: radius, in float: startAngle, in float: sweepAngle, in pixel: col) is action "DRW_PFARCPIESLICE"; const proc: FILL_ELLIPSE(inout PRIMITIVE_WINDOW: aWindow, in integer: x, in integer: y, in integer: width, in integer: height, in pixel: col) is action "DRW_PFELLIPSE"; (** * Flush graphic commands such that the contents of all windows is up to date. * An animation can be created by using ''flushGrapic'' every time before * the program waits for a fraction of a second. *) const proc: flushGraphic is action "DRW_FLUSH"; (** * Open a top-level window with the name ''windowName''. * The created window has window decorations such as title bar and * border and it is managed by the window manager. * @param xPos X-position of the left corner of the new window. * @param yPos Y-position of the left corner of the new window. * @param width Width of the new window. * @param height Height of the new window. * @param windowName Name of the window (usually displayed in title bar). * @return the new generated window. *) const func PRIMITIVE_WINDOW: openWindow ( ref integer: xPos, ref integer: yPos, ref integer: width, ref integer: height, ref string: windowName) is action "DRW_OPEN"; (** * Open a sub window inside of ''parent_window''. * The new sub window has no window decorations and is not managed by * the window manager. If the empty window is used as ''parent_window'' * an unmanaged top level window without window decorations is generated. * The coordinates ''xPos'' and ''yPos'' are measured relative to the top * left corner of the ''parent_window'' drawing area (inside of the window * decorations). If the empty window is used as ''parent_window'' the * coordinates ''xPos'' and ''yPos'' are measured relative to the top left * corner of the screen. * @param parent-window Parent window (can be the empty window). * @param xPos X-position of the left corner of the new window. * @param yPos Y-position of the left corner of the new window. * @param width Width of the new window. * @param height Height of the new window. * @return the new generated window. *) const func PRIMITIVE_WINDOW: openSubWindow ( in PRIMITIVE_WINDOW: aWindow, ref integer: xPos, ref integer: yPos, ref integer: width, ref integer: height) is action "DRW_OPEN_SUB_WINDOW"; (** * Set the window name (title) of ''aWindow''. * @param aWindow Window for which the name should be set. * @param windowName New name (title) of the window. *) const proc: setWindowName (in PRIMITIVE_WINDOW: aWindow, in string: windowName) is action "DRW_SET_WINDOW_NAME"; (** * Set the visibility of the mouse cursor in ''aWindow''. * @param aWindow Window for which the mouse cursor visibility is set. * @param visible TRUE, if the mouse cursor should be visible in ''aWindow'', or * FALSE, if the mouse curser should be invisible in ''aWindow''. *) const proc: setCursorVisible (in PRIMITIVE_WINDOW: aWindow, in boolean: visible) is action "DRW_SET_CURSOR_VISIBLE"; (** * Capture a rectangular area from the screen. * The function takes a screenshot of the rectangular area. * The ''left'' and ''upper'' coordinates are measured relative to * the top left corner of the screen. * @param left X-position of the upper left corner of the capture area. * @param upper Y-position of the upper left corner of the capture area. * @param width Width of the capture area. * @param height Height of the capture area. * @return the content of the rectangular screen area as pixmap. * @exception RANGE_ERROR If ''height'' or ''width'' are negative. *) const func PRIMITIVE_WINDOW: capturePixmap ( ref integer: left, ref integer: upper, ref integer: width, ref integer: height) is action "DRW_CAPTURE"; const func bstring: getPixelData ( in PRIMITIVE_WINDOW: aWindow) is action "DRW_GET_PIXEL_DATA"; const func bstring: getPixelData ( ref array array pixel: image) is action "DRW_GET_PIXEL_DATA_FROM_ARRAY"; const func pixel: getPixel ( in PRIMITIVE_WINDOW: aWindow, ref integer: x, ref integer: y) is action "DRW_GET_PIXEL"; const func pixel: getPixel ( in bstring: bImage, in integer: width, in integer: height, in integer: x, in integer: y) is action "DRW_GET_IMAGE_PIXEL"; (** * Copy a rectangular area from ''sourceWindow'' to ''destWindow''. * Coordinates are measured relative to the top left corner of the * corresponding window drawing area (inside of the window decorations). * @param sourceWindow Source window. * @param destWindow Destination window. * @param src_x X-position of the top left corner of the source area. * @param src_y Y-position of the top left corner of the source area. * @param width Width of the rectangular area. * @param height Height of the rectangular area. * @param dest_x X-position of the top left corner of the destination area. * @param dest_y Y-position of the top left corner of the destination area. *) const proc: copyArea (in PRIMITIVE_WINDOW: sourceWindow, inout PRIMITIVE_WINDOW: destWindow, ref integer: src_x, ref integer: src_y, ref integer: width, ref integer: height, ref integer: dest_x, ref integer: dest_y) is action "DRW_COPYAREA"; const proc: SET_TRANSPARENTCOLOR (in PRIMITIVE_WINDOW: pixmap, ref pixel: col) is action "DRW_SET_TRANSPARENT_COLOR"; const func integer: hashCode (in PRIMITIVE_WINDOW: aWindow) is action "DRW_HASHCODE"; const func integer: compare (in PRIMITIVE_WINDOW: window1, in PRIMITIVE_WINDOW: window2) is action "DRW_CMP"; const proc: setContent (inout PRIMITIVE_WINDOW: aWindow, in PRIMITIVE_WINDOW: pixmap) is action "DRW_SET_CONTENT"; const proc: DRAW_TEXT (inout PRIMITIVE_WINDOW: aWindow, ref integer: x, ref integer: y, in string: stri, ref pixel: col, ref pixel: bkcol) is action "DRW_TEXT"; (** * Determine the height of the screen in pixels. *) const func integer: screenHeight is action "DRW_SCREEN_HEIGHT"; (** * Determine the width of the screen in pixels. *) const func integer: screenWidth is action "DRW_SCREEN_WIDTH"; (** * Determine the height of the window drawing area in pixels. * This excludes window decorations at top and bottom. Add top and bottom * border widths to get the height inclusive window decorations. *) const func integer: height (in PRIMITIVE_WINDOW: aWindow) is action "DRW_HEIGHT"; (** * Determine the width of the window drawing area in pixels. * This excludes window declarations left and right. Add left and right * border widths to get the width inclusive window decorations. *) const func integer: width (in PRIMITIVE_WINDOW: aWindow) is action "DRW_WIDTH"; (** * Determine the X position of the top left corner of a window in pixels. * If window decorations are present this uses the top left corner of * the window decorations. For a sub window the X position is relative * to the top left corner of the parent window drawing area (inside of * the window decorations). For top level windows the X position is * relative to the top left corner of the screen. * @exception RANGE_ERROR If ''actual_window'' is a pixmap. *) const func integer: xPos (in PRIMITIVE_WINDOW: aWindow) is action "DRW_XPOS"; (** * Determine the Y position of the top left corner of a window in pixels. * If window decorations are present this uses the top left corner of * the window decorations. For a sub window the Y position is relative * to the top left corner of the parent window drawing area (inside of * the window decorations). For top level windows the Y position is * relative to the top left corner of the screen. * @exception RANGE_ERROR If ''actual_window'' is a pixmap. *) const func integer: yPos (in PRIMITIVE_WINDOW: aWindow) is action "DRW_YPOS"; (** * Move the top left corner of a window to the coordinates x/y. * If window decorations are present the top left corner of the * window decorations will be at the position x/y. For a sub window * the position is relative to the top left corner of the parent window * drawing area (inside of the window decorations). For top level windows * the position is relative to the top left corner of the screen. *) const proc: setPos (in PRIMITIVE_WINDOW: aWindow, in integer: xPos, in integer: yPos) is action "DRW_SET_POS"; (** * Set the size of the window ''aWindow'' to ''width'' and ''height''. *) const proc: setSize (in PRIMITIVE_WINDOW: aWindow, in integer: width, in integer: height) is action "DRW_SET_SIZE"; (** * Lower a window to the bottom so that it does not obscure any other window. *) const proc: toBottom (in PRIMITIVE_WINDOW: aWindow) is action "DRW_TO_BOTTOM"; (** * Raise a window to the top so that no other window obscures it. *) const proc: toTop (in PRIMITIVE_WINDOW: aWindow) is action "DRW_TO_TOP"; (** * Determine the border widths of a window in pixels. * These are the widths of the window decorations in the succession * top, right, bottom, left. * @return an array with border widths (top, right, bottom, left). *) const func array integer: getBorder (in PRIMITIVE_WINDOW: aWindow) is action "DRW_BORDER"; (** * Return the X position of the pointer relative to the specified window. * The point of origin is the top left corner of the drawing area * of the given 'aWindow' (inside of the window decorations). * If 'aWindow' is the empty window the pointer X position is * relative to the top left corner of the screen. *) const func integer: pointerXPos (in PRIMITIVE_WINDOW: aWindow) is action "DRW_POINTER_XPOS"; (** * Return the Y position of the pointer relative to the specified window. * The point of origin is the top left corner of the drawing area * of the given 'aWindow' (inside of the window decorations). * If 'aWindow' is the empty window the pointer Y position is * relative to the top left corner of the screen. *) const func integer: pointerYPos (in PRIMITIVE_WINDOW: aWindow) is action "DRW_POINTER_YPOS"; (** * Set the pointer x and y position relative to ''aWindow''. * The point of origin is the top left corner of the drawing area * of the given ''aWindow'' (inside of the window decorations). * If ''aWindow'' is the empty window the pointer x and y position * is relative to the top left corner of the screen. *) const proc: setPointerPos (in PRIMITIVE_WINDOW: aWindow, in integer: xPos, in integer: yPos) is action "DRW_SET_POINTER_POS"; (** * Select if ''aKey'' is returned as key, or if it triggers a default action. * A program might be notified when a window is resized. * By default, this notification is switched off. It can be switched on with: * selectInput(curr_win, KEY_RESIZE, TRUE); * By default, closing a window terminates the program. * To get a notification for a window close (instead of a program termination) do: * selectInput(curr_win, KEY_CLOSE, TRUE); * If the notification is turned on the function getc(GRAPH_KEYBOARD) * might return the corresponding notification character (KEY_RESIZE or KEY_CLOSE). * @param aWindow Window for which the key behavior is specified. * @param aKey KEY_CLOSE or KEY_RESIZE. * @param active TRUE if reading from the KEYBOARD returns ''aKey'', or * FALSE if ''aKey'' triggers a default action. *) const proc: selectInput (in PRIMITIVE_WINDOW: aWindow, in char: aKey, in boolean: active) is action "GKB_SELECT_INPUT";