/* graphics.h -
 *
 *     *********************************************************************
 *     * Copyright (C) 1985, 1990 Regents of the University of California. *
 *     * Permission to use, copy, modify, and distribute this              *
 *     * software and its documentation for any purpose and without        *
 *     * fee is hereby granted, provided that the above copyright          *
 *     * notice appear in all copies.  The University of California        *
 *     * makes no representations about the suitability of this            *
 *     * software for any purpose.  It is provided "as is" without         *
 *     * express or implied warranty.  Export of this software outside     *
 *     * of the United States of America may require an export license.    *
 *     *********************************************************************
 *
 * This file contains a bunch of macros that look like
 * normal procedure calls but really indirect through procedure
 * pointers in order to achieve graphics display independence.
 */

/* rcsid "$Header: /usr/cvsroot/magic-8.0/graphics/graphics.h,v 1.3 2010/06/24 12:37:18 tim Exp $" */

#ifndef _MAGIC__GRAPHICS__GRAPHICS_H
#define	_MAGIC__GRAPHICS__GRAPHICS_H

#include "utils/magic.h"
#include "utils/geometry.h"

/* Forward declaration to avoid circular include with windows/windows.h */
struct WIND_S1;
typedef struct WIND_S1 MagWindow;

/* TileType is defined in database/database.h, which sits above graphics in
 * the include hierarchy;  repeat the (identical) typedef here so prototypes
 * can name it without creating a circular dependency. */
typedef int TileType;

/* data structures */
typedef struct {
    int idx, mask, color, outline, fill, stipple;
    char shortname;
    char *longname;
} GR_STYLE_LINE;

typedef struct {	/* Colormap table entry */
    char *name;
    unsigned char red;
    unsigned char green;
    unsigned char blue;
} colorEntry;

/* Housekeeping and initialization routines */
extern bool (*GrInitPtr)();
extern void (*GrClosePtr)();
extern int (*GrTextSizePtr)();

/*
 * Display painting and text routines
 *
 *    You must call GrLock() before using these, and
 *    call GrUnlock() afterwards.
 */
extern void (*GrLockPtr)();
extern void (*GrUnlockPtr)();
extern bool GrHaveLock();
extern void GrClipTo();
extern void GrClipBox(Rect *prect, int style);
extern void GrClipLine();
extern bool GrPutText(char *str, int style, Point *p, int pos, int size, bool adjust, Rect *clip, Rect *actual);
extern void GrFillPolygon();
extern void (*GrDrawGlyphPtr)();
extern void (*GrBitBltPtr)();
extern int  (*GrReadPixelPtr)(MagWindow *w, int x, int y);
extern void (*GrFlushPtr)();

/* Tablet routines */
extern void (*GrEnableTabletPtr)();
extern void (*GrDisableTabletPtr)();
extern void (*GrSetCursorPtr)();

/* graphics routines that are called in the same way for all displays */
extern int  GrLoadStyles();
extern bool GrLoadCursors();
extern bool GrSetDisplay();
extern bool GrIsDisplay();
extern void GrLabelSize();
extern void GrSetStuff();
extern void GrDrawFastBox();
extern void GrGuessDisplayType();
extern int  GrGetStyleFromName();
extern bool GrDrawGlyphNum();

#define GrFastBox(x)	GrDrawFastBox(x, 0)

/* external color map routines */
extern bool GrReadCMap(char *techStyle, char *dispType, char *monType, char *path, char *libPath);
extern bool GrSaveCMap(char *techStyle, char *dispType, char *monType, char *path, char *libPath);
extern bool GrGetColor(int color, int *red, int *green, int *blue);
extern bool GrPutColor(int color, int red, int green, int blue);
extern int  GrNameToColor();
extern void GrPutManyColors();
extern void (*GrSetCMapPtr)();
extern void GrResetCMap();

/* Routines for windows, called only if non-null.  See SUN160 driver for
 * details.
 */
extern bool (*GrCreateWindowPtr)();	/* Passed a window just after it is
					 * created.
					 */
extern void (*GrDeleteWindowPtr)();	/* Passed a window just before it
					 * is destroyed.
					 */
extern void (*GrDamagedPtr)();		/* Called at a conventient time after
					 * receiving a SIG_WINCH signal.
					 */
extern void (*GrUpdateIconPtr)(); 	/* Adjust text on icon.
					 */
extern bool (*GrEventPendingPtr)(); 	/* Check for pending graphics events.
					 */
extern void (*GrConfigureWindowPtr)();	/* Called to reconfigure size/location
					 * of an existing window.
					 */
extern void (*GrOverWindowPtr)();	/* Raise window to top of stack.
					 */
extern void (*GrUnderWindowPtr)();	/* Lower window to bottom of stack.
					 */
extern int (*GrWindowIdPtr)(); 		/* Get the window ID from a window name
					 */
extern char *(*GrWindowNamePtr)(); 	/* Get the window name from a MagWin ptr.
					 */
extern bool (*GrGetCursorPosPtr)(); 	/* Get the current cursor position
					 */
extern bool (*GrGetCursorRootPosPtr)();	/* Get the current cursor position
					 * in root (screen) coordinates
					 */

/* Backing store mechanism (added 4/2/05) */
extern bool (*GrGetBackingStorePtr)();
extern bool (*GrScrollBackingStorePtr)();
extern void (*GrPutBackingStorePtr)();
extern void (*GrCreateBackingStorePtr)();
extern void (*GrFreeBackingStorePtr)();

/* Routines called by the signals module just before Magic is stopped
 * (such as via ^Z) and just after it is resumed.
 */
extern void (*GrStopPtr)();
extern void (*GrResumePtr)();
#define GrStop	(*GrStopPtr)
#define GrResume (*GrResumePtr)

/* C99 compat */
extern void GrClipTriangle(Rect *r, Rect *c, bool clipped, TileType dinfo, Point *points, int *np);
extern void GrBox();
extern bool GrFontText();
extern void GrDiagonal();
extern bool grTkLoadFont();
extern void grTkFreeFonts();
extern bool grtoglLoadFont();
extern void GrDrawTriangleEdge();
extern bool GrReadGlyphs();

/* Number of colors defined in the colormap */
extern int GrNumColors;

/* Different graphics (OpenGL vs. X11, for instance) have different
 * definitions of line and rectangle/polygon coordinates.  Usually
 * this boils down to a single pixel difference on rectangle edges.
 * GrPixelCorrect should be set to 0 for OpenGL and other real-valued
 * coordinate systems, 1 for X11 and other pixel-based systems.
 */
extern int GrPixelCorrect;

/* The size of the screen in screen coordinates */
extern Rect GrScreenRect;

/* The size of crosses (drawn for zero-size boxes), in pixels. */
extern Rect GrCrossRect;

/* Multiples of the grid spacing which we draw lighter, for a fading effect */
extern unsigned char GrGridMultiple;

/* Style tables */
extern GR_STYLE_LINE *GrStyleTable;
extern int **GrStippleTable;
extern int GrStyleNames[];

#ifndef lint

/* Constants for easy access */

#define GrLock (*GrLockPtr)
#define GrUnlock (*GrUnlockPtr)
#define GrInit (*GrInitPtr)
#define GrClose (*GrClosePtr)
#define GrSetCMap (*GrSetCMapPtr)
#define GrTextSize (*GrTextSizePtr)
#define GrDrawGlyph (*GrDrawGlyphPtr)
#define GrBitBlt (*GrBitBltPtr)
#define	GrReadPixel (*GrReadPixelPtr)
#define GrFlush (*GrFlushPtr)

#define GrEnableTablet (*GrEnableTabletPtr)
#define GrDisableTablet (*GrDisableTabletPtr)
#define GrGetCursorPos (*GrGetCursorPosPtr)
#define GrGetCursorRootPos (*GrGetCursorRootPosPtr)
#define GrGetButtons (*GrGetButtonsPtr)
#define GrSetCursor (*GrSetCursorPtr)

#endif

enum { DISPLAY_IDLE, DISPLAY_IN_PROGRESS, DISPLAY_BREAK_PENDING, DISPLAY_SUSPEND };
extern unsigned char GrDisplayStatus;

/* constants */

/* Rectangle filling styles.
 * (note: this must match the array in grDStyle.c)
 */

#define GR_STSOLID      0
#define GR_STCROSS      1
#define GR_STOUTLINE    2
#define GR_STSTIPPLE    3
#define GR_STGRID       4

/* 4 text sizes that are specified by the graphics driver, plus a 5th one.
 * This last one is for systems that allow the user to specify a default font
 * (such as a sun) -- on other systems it's size is decided by the driver.
 *
 * Note:
 *    These must be in sequential, ascending order.
 */
#define GR_TEXT_SMALL	0
#define GR_TEXT_MEDIUM	1
#define GR_TEXT_LARGE	2
#define GR_TEXT_XLARGE	3
#define GR_TEXT_DEFAULT	4

/* Default cursor position -- used on startup and if we can't read the cursor */
#define GR_CURSOR_X	100
#define GR_CURSOR_Y	100

/* Special full-screen access for window manager only */
#define GR_LOCK_SCREEN	(MagWindow *)(-1)

#endif /* _MAGIC__GRAPHICS__GRAPHICS_H */
