Ejemplo n.º 1
0
void
DrawBatch (PPRIMITIVE lpBasePrim, PRIM_LINKS PrimLinks, 
		BATCH_FLAGS BatchFlags)
{
	RECT ValidRect;
	HOT_SPOT OldHot;

	if (GraphicsSystemActive () && GetFrameValidRect (&ValidRect, &OldHot))
	{
		COUNT CurIndex;
		PRIM_LINKS OldLinks;
		PPRIMITIVE lpPrim;

		BatchFlags &= BATCH_SINGLE
				| BATCH_BUILD_PAGE
				| BATCH_XFORM;

		BatchFlags |= _get_context_flags () & BATCH_CLIP_GRAPHICS;

		BatchGraphics ();

		if (BatchFlags & BATCH_BUILD_PAGE)
		{
			ClearBackGround (&ValidRect);
		}

		CurIndex = GetPredLink (PrimLinks);

		if (BatchFlags & BATCH_SINGLE)
		{
			if (CurIndex == END_OF_LIST)
				BatchFlags &= ~BATCH_SINGLE;
			else
			{
				lpBasePrim += CurIndex;
				OldLinks = GetPrimLinks (lpBasePrim);
				SetPrimLinks (lpBasePrim, END_OF_LIST, END_OF_LIST);
				CurIndex = 0;
			}
		}

		for (; CurIndex != END_OF_LIST; CurIndex = GetSuccLink (GetPrimLinks (lpPrim)))
		{
			GRAPHICS_PRIM PrimType;
			PPRIMITIVE lpWorkPrim;
			RECT ClipRect;
			TFB_Palette color;

			lpPrim = &lpBasePrim[CurIndex];
			PrimType = GetPrimType (lpPrim);
			if (!ValidPrimType (PrimType))
				continue;

			lpWorkPrim = lpPrim;

			switch (PrimType)
			{
				case POINT_PRIM:
					COLORtoPalette (GetPrimColor (lpWorkPrim), &color);
					TFB_Prim_Point (&lpWorkPrim->Object.Point, &color);
					break;
				case STAMP_PRIM:
					TFB_Prim_Stamp (&lpWorkPrim->Object.Stamp);
					break;
				case STAMPFILL_PRIM:
					COLORtoPalette (GetPrimColor (lpWorkPrim), &color);
					TFB_Prim_StampFill (&lpWorkPrim->Object.Stamp, &color);
					break;
				case LINE_PRIM:
					COLORtoPalette (GetPrimColor (lpWorkPrim), &color);
					TFB_Prim_Line (&lpWorkPrim->Object.Line, &color);
					break;
				case TEXT_PRIM:
					if (!TextRect (&lpWorkPrim->Object.Text,
							&ClipRect, NULL_PTR))
						continue;

					_save_stamp.origin = ClipRect.corner;
					
					_text_blt (&ClipRect, lpWorkPrim);
					break;
				case RECT_PRIM:
					COLORtoPalette (GetPrimColor (lpWorkPrim), &color);
					TFB_Prim_Rect (&lpWorkPrim->Object.Rect, &color);
					break;
				case RECTFILL_PRIM:
					COLORtoPalette (GetPrimColor (lpWorkPrim), &color);
					TFB_Prim_FillRect (&lpWorkPrim->Object.Rect, &color);
					break;
			}
		}

		UnbatchGraphics ();

		_CurFramePtr->HotSpot = OldHot;

		if (BatchFlags & BATCH_SINGLE)
			SetPrimLinks (lpBasePrim,
					GetPredLink (OldLinks),
					GetSuccLink (OldLinks));

	}
}
Ejemplo n.º 2
0
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 ();
    }
}