summaryrefslogtreecommitdiff
path: root/src/libs/gfxlib.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/libs/gfxlib.h')
-rw-r--r--src/libs/gfxlib.h474
1 files changed, 474 insertions, 0 deletions
diff --git a/src/libs/gfxlib.h b/src/libs/gfxlib.h
new file mode 100644
index 0000000..9a16a69
--- /dev/null
+++ b/src/libs/gfxlib.h
@@ -0,0 +1,474 @@
+//Copyright Paul Reiche, Fred Ford. 1992-2002
+
+/*
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program 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 General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ */
+
+#ifndef LIBS_GFXLIB_H_
+#define LIBS_GFXLIB_H_
+
+#include "port.h"
+#include "libs/compiler.h"
+
+typedef struct Color Color;
+struct Color {
+ BYTE r;
+ BYTE g;
+ BYTE b;
+ BYTE a;
+};
+
+#include "libs/reslib.h"
+
+#if defined(__cplusplus)
+extern "C" {
+#endif
+
+typedef struct context_desc CONTEXT_DESC;
+typedef struct frame_desc FRAME_DESC;
+typedef struct font_desc FONT_DESC;
+typedef struct drawable_desc DRAWABLE_DESC;
+
+typedef CONTEXT_DESC *CONTEXT;
+typedef FRAME_DESC *FRAME;
+typedef FONT_DESC *FONT;
+typedef DRAWABLE_DESC *DRAWABLE;
+
+typedef UWORD TIME_VALUE;
+
+#define TIME_SHIFT 8
+#define MAX_TIME_VALUE ((1 << TIME_SHIFT) + 1)
+
+typedef SWORD COORD;
+
+static inline bool
+sameColor(Color c1, Color c2)
+{
+ return c1.r == c2.r &&
+ c1.g == c2.g &&
+ c1.b == c2.b &&
+ c1.a == c2.a;
+}
+
+// Transform a 5-bits color component to an 8-bits color component.
+// Form 1, calculates '(r5 / 31.0) * 255.0, highest value is 0xff:
+#define CC5TO8(c) (((c) << 3) | ((c) >> 2))
+// Form 2, calculates '(r5 / 32.0) * 256.0, highest value is 0xf8:
+//#define CC5TO8(c) ((c) << 3)
+
+#define BUILD_COLOR(col, c256) col
+ // BUILD_COLOR used to combine a 15-bit RGB color tripple with a
+ // destination VGA palette index into a 32-bit value.
+ // Now, it is an empty wrapper which returns the first argument,
+ // which is of type Color, and ignores the second argument,
+ // the palette index.
+ //
+ // It is a remnant of 8bpp hardware paletted display (VGA).
+ // The palette index would be overwritten with the RGB value
+ // and the drawing op would use this index on screen.
+ // The palette indices 0-15, as used in DOS SC2, are unchanged
+ // from the standard VGA palette and are identical to 16-color EGA.
+ // Various frames, borders, menus, etc. frequently refer to these
+ // first 16 colors and normally do not change the RGB values from
+ // the standard ones (see colors.h; most likely unchanged from SC1)
+ // The palette index is meaningless in UQM for the most part.
+ // New code should just use index 0.
+
+// Turn a 15 bits color into a 24-bits color.
+// r, g, and b are each 5-bits color components.
+static inline Color
+colorFromRgb15 (BYTE r, BYTE g, BYTE b)
+{
+ Color c;
+ c.r = CC5TO8 (r);
+ c.g = CC5TO8 (g);
+ c.b = CC5TO8 (b);
+ c.a = 0xff;
+
+ return c;
+}
+#define MAKE_RGB15(r, g, b) colorFromRgb15 ((r), (g), (b))
+
+#ifdef NOTYET /* Need C'99 support */
+#define MAKE_RGB15(r, g, b) (Color) { \
+ .r = CC5TO8 (r), \
+ .g = CC5TO8 (g), \
+ .b = CC5TO8 (b), \
+ .a = 0xff \
+ }
+#endif
+
+// Temporary, until we can use C'99 features. Then MAKE_RGB15 will be usable
+// anywhere.
+// This define is intended for global initialisations, where the
+// expression must be constant.
+#define MAKE_RGB15_INIT(r, g, b) { \
+ CC5TO8 (r), \
+ CC5TO8 (g), \
+ CC5TO8 (b), \
+ 0xff \
+ }
+
+static inline Color
+buildColorRgba (BYTE r, BYTE g, BYTE b, BYTE a)
+{
+ Color c;
+ c.r = r;
+ c.g = g;
+ c.b = b;
+ c.a = a;
+
+ return c;
+}
+#define BUILD_COLOR_RGBA(r, g, b, a) \
+ buildColorRgba ((r), (g), (b), (a))
+
+
+typedef BYTE CREATE_FLAGS;
+// WANT_MASK is deprecated (and non-functional). It used to generate a bitmap
+// of changed pixels for a target DRAWABLE, so that DRAW_SUBTRACTIVE could
+// paint background pixels over them, i.e. a revert draw. The backgrounds
+// are fully erased now instead.
+#define WANT_MASK (CREATE_FLAGS)(1 << 0)
+#define WANT_PIXMAP (CREATE_FLAGS)(1 << 1)
+// MAPPED_TO_DISPLAY is deprecated but still checked by LoadDisplayPixmap().
+// Its former use was to indicate a pre-scaled graphic for the display.
+#define MAPPED_TO_DISPLAY (CREATE_FLAGS)(1 << 2)
+#define WANT_ALPHA (CREATE_FLAGS)(1 << 3)
+
+typedef struct extent
+{
+ COORD width, height;
+} EXTENT;
+
+typedef struct point
+{
+ COORD x, y;
+} POINT;
+
+typedef struct stamp
+{
+ POINT origin;
+ FRAME frame;
+} STAMP;
+
+typedef struct rect
+{
+ POINT corner;
+ EXTENT extent;
+} RECT;
+
+typedef struct line
+{
+ POINT first, second;
+} LINE;
+
+static inline POINT
+MAKE_POINT (COORD x, COORD y)
+{
+ POINT pt = {x, y};
+ return pt;
+}
+
+static inline bool
+pointsEqual (POINT p1, POINT p2)
+{
+ return p1.x == p2.x && p1.y == p2.y;
+}
+
+static inline bool
+extentsEqual (EXTENT e1, EXTENT e2)
+{
+ return e1.width == e2.width && e1.height == e2.height;
+}
+
+static inline bool
+rectsEqual (RECT r1, RECT r2)
+{
+ return pointsEqual (r1.corner, r2.corner)
+ && extentsEqual (r1.extent, r2.extent);
+}
+
+static inline bool
+pointWithinRect (RECT r, POINT p)
+{
+ return p.x >= r.corner.x && p.y >= r.corner.y
+ && p.x < r.corner.x + r.extent.width
+ && p.y < r.corner.y + r.extent.height;
+}
+
+typedef enum
+{
+ ALIGN_LEFT,
+ ALIGN_CENTER,
+ ALIGN_RIGHT
+} TEXT_ALIGN;
+
+typedef enum
+{
+ VALIGN_TOP,
+ VALIGN_MIDDLE,
+ VALIGN_BOTTOM
+} TEXT_VALIGN;
+
+typedef struct text
+{
+ POINT baseline;
+ const UNICODE *pStr;
+ TEXT_ALIGN align;
+ COUNT CharCount;
+} TEXT;
+
+#if defined(__cplusplus)
+}
+#endif
+
+#include "libs/strlib.h"
+
+#if defined(__cplusplus)
+extern "C" {
+#endif
+
+typedef STRING_TABLE COLORMAP_REF;
+typedef STRING COLORMAP;
+// COLORMAPPTR is really a pointer to colortable entry structure
+// which is documented in doc/devel/strtab, .ct files section
+typedef void *COLORMAPPTR;
+
+#include "graphics/prim.h"
+
+
+typedef BYTE BATCH_FLAGS;
+// This flag is currently unused but it might make sense to restore it
+#define BATCH_BUILD_PAGE (BATCH_FLAGS)(1 << 0)
+
+typedef struct
+{
+ TIME_VALUE last_time_val;
+ POINT EndPoint;
+ STAMP IntersectStamp;
+} INTERSECT_CONTROL;
+
+typedef BYTE INTERSECT_CODE;
+
+#define INTERSECT_LEFT (INTERSECT_CODE)(1 << 0)
+#define INTERSECT_TOP (INTERSECT_CODE)(1 << 1)
+#define INTERSECT_RIGHT (INTERSECT_CODE)(1 << 2)
+#define INTERSECT_BOTTOM (INTERSECT_CODE)(1 << 3)
+#define INTERSECT_NOCLIP (INTERSECT_CODE)(1 << 7)
+#define INTERSECT_ALL_SIDES (INTERSECT_CODE)(INTERSECT_LEFT | \
+ INTERSECT_TOP | \
+ INTERSECT_RIGHT | \
+ INTERSECT_BOTTOM)
+
+typedef POINT HOT_SPOT;
+
+extern HOT_SPOT MAKE_HOT_SPOT (COORD, COORD);
+
+extern INTERSECT_CODE BoxIntersect (RECT *pr1, RECT *pr2, RECT *printer);
+extern void BoxUnion (RECT *pr1, RECT *pr2, RECT *punion);
+
+typedef enum
+{
+ FadeAllToWhite = 250,
+ FadeSomeToWhite,
+ FadeAllToBlack,
+ FadeAllToColor,
+ FadeSomeToBlack,
+ FadeSomeToColor
+} ScreenFadeType;
+
+typedef enum
+{
+ DRAW_REPLACE = 0,
+ // Pixels in the target FRAME are replaced entirely.
+ // Non-stamp primitives with Color.a < 255 to RGB targets are
+ // equivalent to DRAW_ALPHA with (DrawMode.factor = Color.a),
+ // except the Text primitives.
+ // DrawMode.factor: ignored
+ // Text: supported (except DRAW_ALPHA via Color.a)
+ // RGBA sources (WANT_ALPHA): per-pixel alpha blending performed
+ // RGBA targets (WANT_ALPHA): replace directly supported
+ DRAW_ADDITIVE,
+ // Pixel channels of the source FRAME or Color channels of
+ // a primitive are modulated by (DrawMode.factor / 255) and added
+ // to the pixel channels of the target FRAME.
+ // DrawMode.factor range: -32767..32767 (negative values make
+ // draw subtractive); 255 = 1:1 ratio
+ // Text: not yet supported
+ // RGBA sources (WANT_ALPHA): alpha channel ignored
+ // RGBA targets (WANT_ALPHA): not yet supported
+ DRAW_ALPHA,
+ // Pixel channels of the source FRAME or Color channels of
+ // a primitive are modulated by (DrawMode.factor / 255) and added
+ // to the pixel channels of the target FRAME, modulated by
+ // (1 - DrawMode.factor / 255)
+ // DrawMode.factor range: 0..255; 255 = fully opaque
+ // Text: supported
+ // RGBA sources (WANT_ALPHA): alpha channel ignored
+ // RGBA targets (WANT_ALPHA): not yet supported
+
+ DRAW_DEFAULT = DRAW_REPLACE,
+} DrawKind;
+
+typedef struct
+{
+ BYTE kind;
+ SWORD factor;
+} DrawMode;
+
+#define DRAW_REPLACE_MODE MAKE_DRAW_MODE (DRAW_REPLACE, 0)
+#define DRAW_FACTOR_1 0xff
+
+static inline DrawMode
+MAKE_DRAW_MODE (DrawKind kind, SWORD factor)
+{
+ DrawMode mode;
+ mode.kind = kind;
+ mode.factor = factor;
+ return mode;
+}
+
+extern CONTEXT SetContext (CONTEXT Context);
+extern Color SetContextForeGroundColor (Color Color);
+extern Color GetContextForeGroundColor (void);
+extern Color SetContextBackGroundColor (Color Color);
+extern Color GetContextBackGroundColor (void);
+extern FRAME SetContextFGFrame (FRAME Frame);
+extern FRAME GetContextFGFrame (void);
+// Context cliprect defines the drawing bounds. Additionally, all
+// drawing positions (x,y) are relative to the cliprect corner.
+extern BOOLEAN SetContextClipRect (RECT *pRect);
+// The returned rect is always filled in. If the context cliprect
+// is undefined, the returned rect has foreground frame dimensions.
+extern BOOLEAN GetContextClipRect (RECT *pRect);
+// The actual origin will be orgOffset + context ClipRect.corner
+extern POINT SetContextOrigin (POINT orgOffset);
+extern DrawMode SetContextDrawMode (DrawMode);
+extern DrawMode GetContextDrawMode (void);
+// 'area' may be NULL to copy the entire CONTEXT cliprect
+// 'area' is relative to the CONTEXT cliprect
+extern DRAWABLE CopyContextRect (const RECT* area);
+
+extern TIME_VALUE DrawablesIntersect (INTERSECT_CONTROL *pControl0,
+ INTERSECT_CONTROL *pControl1, TIME_VALUE max_time_val);
+extern void DrawStamp (STAMP *pStamp);
+extern void DrawFilledStamp (STAMP *pStamp);
+extern void DrawPoint (POINT *pPoint);
+extern void DrawRectangle (RECT *pRect);
+extern void DrawFilledRectangle (RECT *pRect);
+extern void DrawLine (LINE *pLine);
+extern void font_DrawText (TEXT *pText);
+extern void font_DrawTracedText (TEXT *pText, Color text, Color trace);
+extern void DrawBatch (PRIMITIVE *pBasePrim, PRIM_LINKS PrimLinks,
+ BATCH_FLAGS BatchFlags);
+extern void BatchGraphics (void);
+extern void UnbatchGraphics (void);
+extern void FlushGraphics (void);
+extern void ClearDrawable (void);
+#ifdef DEBUG
+extern CONTEXT CreateContextAux (const char *name);
+#define CreateContext(name) CreateContextAux((name))
+#else /* if !defined(DEBUG) */
+extern CONTEXT CreateContextAux (void);
+#define CreateContext(name) CreateContextAux()
+#endif /* !defined(DEBUG) */
+extern BOOLEAN DestroyContext (CONTEXT ContextRef);
+extern DRAWABLE CreateDisplay (CREATE_FLAGS CreateFlags, SIZE *pwidth,
+ SIZE *pheight);
+extern DRAWABLE CreateDrawable (CREATE_FLAGS CreateFlags, SIZE width,
+ SIZE height, COUNT num_frames);
+extern BOOLEAN DestroyDrawable (DRAWABLE Drawable);
+extern BOOLEAN GetFrameRect (FRAME Frame, RECT *pRect);
+#ifdef DEBUG
+extern const char *GetContextName (CONTEXT context);
+extern CONTEXT GetFirstContext (void);
+extern CONTEXT GetNextContext (CONTEXT context);
+extern size_t GetContextCount (void);
+#endif /* DEBUG */
+
+extern HOT_SPOT SetFrameHot (FRAME Frame, HOT_SPOT HotSpot);
+extern HOT_SPOT GetFrameHot (FRAME Frame);
+extern BOOLEAN InstallGraphicResTypes (void);
+extern DRAWABLE LoadGraphicFile (const char *pStr);
+extern FONT LoadFontFile (const char *pStr);
+extern void *LoadGraphicInstance (RESOURCE res);
+extern DRAWABLE LoadDisplayPixmap (const RECT *area, FRAME frame);
+extern FRAME SetContextFontEffect (FRAME EffectFrame);
+extern FONT SetContextFont (FONT Font);
+extern BOOLEAN DestroyFont (FONT FontRef);
+// The returned pRect is relative to the context drawing origin
+extern BOOLEAN TextRect (TEXT *pText, RECT *pRect, BYTE *pdelta);
+extern BOOLEAN GetContextFontLeading (SIZE *pheight);
+extern BOOLEAN GetContextFontLeadingWidth (SIZE *pwidth);
+extern COUNT GetFrameCount (FRAME Frame);
+extern COUNT GetFrameIndex (FRAME Frame);
+extern FRAME SetAbsFrameIndex (FRAME Frame, COUNT FrameIndex);
+extern FRAME SetRelFrameIndex (FRAME Frame, SIZE FrameOffs);
+extern FRAME SetEquFrameIndex (FRAME DstFrame, FRAME SrcFrame);
+extern FRAME IncFrameIndex (FRAME Frame);
+extern FRAME DecFrameIndex (FRAME Frame);
+extern DRAWABLE CopyFrameRect (FRAME Frame, const RECT *area);
+extern DRAWABLE CloneFrame (FRAME Frame);
+extern DRAWABLE RotateFrame (FRAME Frame, int angle_deg);
+extern DRAWABLE RescaleFrame (FRAME, int width, int height);
+// This pair works for both paletted and trucolor frames
+extern BOOLEAN ReadFramePixelColors (FRAME frame, Color *pixels,
+ int width, int height);
+extern BOOLEAN WriteFramePixelColors (FRAME frame, const Color *pixels,
+ int width, int height);
+// This pair only works for paletted frames
+extern BOOLEAN ReadFramePixelIndexes (FRAME frame, BYTE *pixels,
+ int width, int height);
+extern BOOLEAN WriteFramePixelIndexes (FRAME frame, const BYTE *pixels,
+ int width, int height);
+extern void SetFrameTransparentColor (FRAME, Color);
+
+// If the frame is an active SCREEN_DRAWABLE, this call must be
+// preceeded by FlushGraphics() for draw commands to have taken effect
+extern Color GetFramePixel (FRAME, POINT pixelPt);
+
+extern FRAME CaptureDrawable (DRAWABLE Drawable);
+extern DRAWABLE ReleaseDrawable (FRAME Frame);
+
+extern DRAWABLE GetFrameParentDrawable (FRAME Frame);
+
+extern BOOLEAN SetColorMap (COLORMAPPTR ColorMapPtr);
+extern DWORD XFormColorMap (COLORMAPPTR ColorMapPtr, SIZE TimeInterval);
+extern DWORD FadeScreen (ScreenFadeType fadeType, SIZE TimeInterval);
+extern void FlushColorXForms (void);
+#define InitColorMapResources InitStringTableResources
+#define LoadColorMapFile LoadStringTableFile
+#define LoadColorMapInstance LoadStringTableInstance
+#define CaptureColorMap CaptureStringTable
+#define ReleaseColorMap ReleaseStringTable
+#define DestroyColorMap DestroyStringTable
+#define GetColorMapRef GetStringTable
+#define GetColorMapCount GetStringTableCount
+#define GetColorMapIndex GetStringTableIndex
+#define SetAbsColorMapIndex SetAbsStringTableIndex
+#define SetRelColorMapIndex SetRelStringTableIndex
+#define GetColorMapLength GetStringLengthBin
+
+extern COLORMAPPTR GetColorMapAddress (COLORMAP);
+
+void SetSystemRect (const RECT *pRect);
+void ClearSystemRect (void);
+
+#if defined(__cplusplus)
+}
+#endif
+
+#endif /* LIBS_GFXLIB_H_ */