summaryrefslogtreecommitdiff
path: root/src/libs/graphics/frame.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/libs/graphics/frame.c')
-rw-r--r--src/libs/graphics/frame.c266
1 files changed, 266 insertions, 0 deletions
diff --git a/src/libs/graphics/frame.c b/src/libs/graphics/frame.c
new file mode 100644
index 0000000..0539746
--- /dev/null
+++ b/src/libs/graphics/frame.c
@@ -0,0 +1,266 @@
+//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.
+ */
+
+#include "gfxintrn.h"
+#include "gfx_common.h"
+#include "tfb_draw.h"
+#include "tfb_prim.h"
+
+HOT_SPOT
+MAKE_HOT_SPOT (COORD x, COORD y)
+{
+ HOT_SPOT hs;
+ hs.x = x;
+ hs.y = y;
+ return hs;
+}
+
+// XXX: INTERNAL_PRIMITIVE and INTERNAL_PRIM_DESC are not used
+typedef union
+{
+ POINT Point;
+ STAMP Stamp;
+ BRESENHAM_LINE Line;
+ TEXT Text;
+ RECT Rect;
+} INTERNAL_PRIM_DESC;
+
+typedef struct
+{
+ PRIM_LINKS Links;
+ GRAPHICS_PRIM Type;
+ Color Color;
+ INTERNAL_PRIM_DESC Object;
+} INTERNAL_PRIMITIVE;
+
+
+// pValidRect or origin may be NULL
+BOOLEAN
+GetContextValidRect (RECT *pValidRect, POINT *origin)
+{
+ RECT tempRect;
+ POINT tempPt;
+
+ if (!pValidRect)
+ pValidRect = &tempRect;
+ if (!origin)
+ origin = &tempPt;
+
+ // Start with a rect the size of foreground frame
+ pValidRect->corner.x = 0;
+ pValidRect->corner.y = 0;
+ pValidRect->extent = GetFrameBounds (_CurFramePtr);
+ *origin = _CurFramePtr->HotSpot;
+
+ if (_pCurContext->ClipRect.extent.width)
+ {
+ // If the cliprect is completely outside of the valid frame
+ // bounds we have nothing to draw
+ if (!BoxIntersect (&_pCurContext->ClipRect,
+ pValidRect, pValidRect))
+ return (FALSE);
+
+ // Foreground frame hotspot defines a drawing position offset
+ // WRT the context cliprect
+ origin->x += _pCurContext->ClipRect.corner.x;
+ origin->y += _pCurContext->ClipRect.corner.y;
+ }
+
+ return (TRUE);
+}
+
+static void
+ClearBackGround (RECT *pClipRect)
+{
+ RECT clearRect;
+ Color color = _get_context_bg_color ();
+ clearRect.corner.x = 0;
+ clearRect.corner.y = 0;
+ clearRect.extent = pClipRect->extent;
+ TFB_Prim_FillRect (&clearRect, color, DRAW_REPLACE_MODE,
+ pClipRect->corner);
+}
+
+void
+DrawBatch (PRIMITIVE *lpBasePrim, PRIM_LINKS PrimLinks,
+ BATCH_FLAGS BatchFlags)
+{
+ RECT ValidRect;
+ POINT origin;
+
+ if (GraphicsSystemActive () && GetContextValidRect (&ValidRect, &origin))
+ {
+ COUNT CurIndex;
+ PRIMITIVE *lpPrim;
+ DrawMode mode = _get_context_draw_mode ();
+
+ BatchGraphics ();
+
+ if (BatchFlags & BATCH_BUILD_PAGE)
+ {
+ ClearBackGround (&ValidRect);
+ }
+
+ CurIndex = GetPredLink (PrimLinks);
+
+ for (; CurIndex != END_OF_LIST;
+ CurIndex = GetSuccLink (GetPrimLinks (lpPrim)))
+ {
+ GRAPHICS_PRIM PrimType;
+ PRIMITIVE *lpWorkPrim;
+ RECT ClipRect;
+ Color color;
+
+ lpPrim = &lpBasePrim[CurIndex];
+ PrimType = GetPrimType (lpPrim);
+ if (!ValidPrimType (PrimType))
+ continue;
+
+ lpWorkPrim = lpPrim;
+
+ switch (PrimType)
+ {
+ case POINT_PRIM:
+ color = GetPrimColor (lpWorkPrim);
+ TFB_Prim_Point (&lpWorkPrim->Object.Point, color,
+ mode, origin);
+ break;
+ case STAMP_PRIM:
+ TFB_Prim_Stamp (&lpWorkPrim->Object.Stamp, mode, origin);
+ break;
+ case STAMPFILL_PRIM:
+ color = GetPrimColor (lpWorkPrim);
+ TFB_Prim_StampFill (&lpWorkPrim->Object.Stamp, color,
+ mode, origin);
+ break;
+ case LINE_PRIM:
+ color = GetPrimColor (lpWorkPrim);
+ TFB_Prim_Line (&lpWorkPrim->Object.Line, color,
+ mode, origin);
+ break;
+ case TEXT_PRIM:
+ if (!TextRect (&lpWorkPrim->Object.Text, &ClipRect, NULL))
+ continue;
+ // ClipRect is relative to origin
+ _text_blt (&ClipRect, &lpWorkPrim->Object.Text, origin);
+ break;
+ case RECT_PRIM:
+ color = GetPrimColor (lpWorkPrim);
+ TFB_Prim_Rect (&lpWorkPrim->Object.Rect, color,
+ mode, origin);
+ break;
+ case RECTFILL_PRIM:
+ color = GetPrimColor (lpWorkPrim);
+ TFB_Prim_FillRect (&lpWorkPrim->Object.Rect, color,
+ mode, origin);
+ break;
+ }
+ }
+
+ UnbatchGraphics ();
+ }
+}
+
+void
+ClearDrawable (void)
+{
+ RECT ValidRect;
+
+ if (GraphicsSystemActive () && GetContextValidRect (&ValidRect, NULL))
+ {
+ ClearBackGround (&ValidRect);
+ }
+}
+
+void
+DrawPoint (POINT *lpPoint)
+{
+ POINT origin;
+
+ if (GraphicsSystemActive () && GetContextValidRect (NULL, &origin))
+ {
+ Color color = GetPrimColor (&_locPrim);
+ DrawMode mode = _get_context_draw_mode ();
+ TFB_Prim_Point (lpPoint, color, mode, origin);
+ }
+}
+
+void
+DrawRectangle (RECT *lpRect)
+{
+ POINT origin;
+
+ if (GraphicsSystemActive () && GetContextValidRect (NULL, &origin))
+ {
+ Color color = GetPrimColor (&_locPrim);
+ DrawMode mode = _get_context_draw_mode ();
+ TFB_Prim_Rect (lpRect, color, mode, origin);
+ }
+}
+
+void
+DrawFilledRectangle (RECT *lpRect)
+{
+ POINT origin;
+
+ if (GraphicsSystemActive () && GetContextValidRect (NULL, &origin))
+ {
+ Color color = GetPrimColor (&_locPrim);
+ DrawMode mode = _get_context_draw_mode ();
+ TFB_Prim_FillRect (lpRect, color, mode, origin);
+ }
+}
+
+void
+DrawLine (LINE *lpLine)
+{
+ POINT origin;
+
+ if (GraphicsSystemActive () && GetContextValidRect (NULL, &origin))
+ {
+ Color color = GetPrimColor (&_locPrim);
+ DrawMode mode = _get_context_draw_mode ();
+ TFB_Prim_Line (lpLine, color, mode, origin);
+ }
+}
+
+void
+DrawStamp (STAMP *stmp)
+{
+ POINT origin;
+
+ if (GraphicsSystemActive () && GetContextValidRect (NULL, &origin))
+ {
+ DrawMode mode = _get_context_draw_mode ();
+ TFB_Prim_Stamp (stmp, mode, origin);
+ }
+}
+
+void
+DrawFilledStamp (STAMP *stmp)
+{
+ POINT origin;
+
+ if (GraphicsSystemActive () && GetContextValidRect (NULL, &origin))
+ {
+ Color color = GetPrimColor (&_locPrim);
+ DrawMode mode = _get_context_draw_mode ();
+ TFB_Prim_StampFill (stmp, color, mode, origin);
+ }
+}
+