diff options
Diffstat (limited to 'src/libs/graphics/frame.c')
-rw-r--r-- | src/libs/graphics/frame.c | 266 |
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); + } +} + |