First phase of remodularizing graphics code
This actually partially *breaks* modularization, at present, but that will change once TFB_Canvas is fully implemented. TFB_ImageStruct is gone, use TFB_Image exclusively instead. git-svn-id: svn://svn.code.sf.net/p/sc2/code/trunk@601 8092fc87-c524-0410-9efc-e669fe64eaf9
This commit is contained in:
@@ -1,4 +1,4 @@
|
|||||||
uqm_SUBDIRS="sdl"
|
uqm_SUBDIRS="sdl"
|
||||||
uqm_CFILES="boxint.c clipline.c cmap.c context.c drawable.c filegfx.c
|
uqm_CFILES="boxint.c clipline.c cmap.c context.c drawable.c filegfx.c
|
||||||
font.c frame.c gfx_common.c intersec.c line.c loaddisp.c makepoly.c
|
font.c frame.c gfx_common.c intersec.c line.c loaddisp.c makepoly.c
|
||||||
map.c pixmap.c poly.c rect.c resgfx.c stamp.c"
|
map.c pixmap.c poly.c rect.c resgfx.c stamp.c tfb_draw.c"
|
||||||
|
|||||||
@@ -16,6 +16,8 @@
|
|||||||
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
#include "tfb_draw.h"
|
||||||
|
|
||||||
#ifndef CMAP_H
|
#ifndef CMAP_H
|
||||||
#define CMAP_H
|
#define CMAP_H
|
||||||
|
|
||||||
|
|||||||
@@ -19,6 +19,8 @@
|
|||||||
#ifndef DRAWCMD_H
|
#ifndef DRAWCMD_H
|
||||||
#define DRAWCMD_H
|
#define DRAWCMD_H
|
||||||
|
|
||||||
|
#include "graphics/tfb_draw.h"
|
||||||
|
|
||||||
enum
|
enum
|
||||||
{
|
{
|
||||||
TFB_DRAWCOMMANDTYPE_LINE,
|
TFB_DRAWCOMMANDTYPE_LINE,
|
||||||
@@ -53,7 +55,7 @@ typedef struct tfb_dc_rect
|
|||||||
|
|
||||||
typedef struct tfb_dc_img
|
typedef struct tfb_dc_img
|
||||||
{
|
{
|
||||||
TFB_ImageStruct *image;
|
TFB_Image *image;
|
||||||
int x, y;
|
int x, y;
|
||||||
int BlendNumerator, BlendDenominator;
|
int BlendNumerator, BlendDenominator;
|
||||||
SCREEN destBuffer;
|
SCREEN destBuffer;
|
||||||
@@ -63,7 +65,7 @@ typedef struct tfb_dc_img
|
|||||||
|
|
||||||
typedef struct tfb_dc_filledimg
|
typedef struct tfb_dc_filledimg
|
||||||
{
|
{
|
||||||
TFB_ImageStruct *image;
|
TFB_Image *image;
|
||||||
int x, y;
|
int x, y;
|
||||||
int r, g, b;
|
int r, g, b;
|
||||||
int BlendNumerator, BlendDenominator;
|
int BlendNumerator, BlendDenominator;
|
||||||
@@ -80,7 +82,7 @@ typedef struct tfb_dc_copy
|
|||||||
|
|
||||||
typedef struct tfb_dc_copyimg
|
typedef struct tfb_dc_copyimg
|
||||||
{
|
{
|
||||||
TFB_ImageStruct *image;
|
TFB_Image *image;
|
||||||
int x, y, w, h;
|
int x, y, w, h;
|
||||||
int BlendNumerator, BlendDenominator;
|
int BlendNumerator, BlendDenominator;
|
||||||
SCREEN srcBuffer;
|
SCREEN srcBuffer;
|
||||||
@@ -99,7 +101,7 @@ typedef struct tfb_dc_setpal
|
|||||||
|
|
||||||
typedef struct tfb_dc_delimg
|
typedef struct tfb_dc_delimg
|
||||||
{
|
{
|
||||||
TFB_ImageStruct *image;
|
TFB_Image *image;
|
||||||
} TFB_DrawCommand_DeleteImage;
|
} TFB_DrawCommand_DeleteImage;
|
||||||
|
|
||||||
typedef struct tfb_dc_signal
|
typedef struct tfb_dc_signal
|
||||||
|
|||||||
@@ -45,220 +45,3 @@ SetGraphicStrength (int numerator, int denominator)
|
|||||||
BlendDenominator = denominator;
|
BlendDenominator = denominator;
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
|
||||||
TFB_Draw_Line (int x1, int y1, int x2, int y2, int r, int g, int b, SCREEN dest)
|
|
||||||
{
|
|
||||||
TFB_DrawCommand DC;
|
|
||||||
|
|
||||||
DC.Type = TFB_DRAWCOMMANDTYPE_LINE;
|
|
||||||
DC.data.line.x1 = x1;
|
|
||||||
DC.data.line.y1 = y1;
|
|
||||||
DC.data.line.x2 = x2;
|
|
||||||
DC.data.line.y2 = y2;
|
|
||||||
DC.data.line.r = r;
|
|
||||||
DC.data.line.g = g;
|
|
||||||
DC.data.line.b = b;
|
|
||||||
DC.data.line.destBuffer = dest;
|
|
||||||
|
|
||||||
TFB_EnqueueDrawCommand (&DC);
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
TFB_Draw_Rect (PRECT rect, int r, int g, int b, SCREEN dest)
|
|
||||||
{
|
|
||||||
RECT locRect;
|
|
||||||
TFB_DrawCommand DC;
|
|
||||||
|
|
||||||
if (!rect)
|
|
||||||
{
|
|
||||||
locRect.corner.x = locRect.corner.y = 0;
|
|
||||||
locRect.extent.width = SCREEN_WIDTH;
|
|
||||||
locRect.extent.height = SCREEN_HEIGHT;
|
|
||||||
rect = &locRect;
|
|
||||||
}
|
|
||||||
|
|
||||||
DC.Type = TFB_DRAWCOMMANDTYPE_RECTANGLE;
|
|
||||||
DC.data.rect.x = rect->corner.x;
|
|
||||||
DC.data.rect.y = rect->corner.y;
|
|
||||||
DC.data.rect.w = rect->extent.width;
|
|
||||||
DC.data.rect.h = rect->extent.height;
|
|
||||||
DC.data.rect.r = r;
|
|
||||||
DC.data.rect.g = g;
|
|
||||||
DC.data.rect.b = b;
|
|
||||||
DC.data.rect.destBuffer = dest;
|
|
||||||
|
|
||||||
TFB_EnqueueDrawCommand (&DC);
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
TFB_Draw_SetPalette (int index, int r, int g, int b)
|
|
||||||
{
|
|
||||||
TFB_DrawCommand DC;
|
|
||||||
|
|
||||||
DC.Type = TFB_DRAWCOMMANDTYPE_SETPALETTE;
|
|
||||||
DC.data.setpalette.r = r;
|
|
||||||
DC.data.setpalette.g = g;
|
|
||||||
DC.data.setpalette.b = b;
|
|
||||||
DC.data.setpalette.index = index;
|
|
||||||
|
|
||||||
TFB_EnqueueDrawCommand (&DC);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* This value is protected by the DCQ's lock. */
|
|
||||||
static int _localpal[256][3];
|
|
||||||
|
|
||||||
void
|
|
||||||
TFB_FlushPaletteCache ()
|
|
||||||
{
|
|
||||||
int i;
|
|
||||||
Lock_DCQ (-1);
|
|
||||||
for (i = 0; i < 256; i++)
|
|
||||||
{
|
|
||||||
_localpal[i][0] = -1;
|
|
||||||
_localpal[i][1] = -1;
|
|
||||||
_localpal[i][2] = -1;
|
|
||||||
}
|
|
||||||
Unlock_DCQ ();
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
TFB_Draw_Image (TFB_ImageStruct *img, int x, int y, BOOLEAN scaled, TFB_Palette *palette, SCREEN dest)
|
|
||||||
{
|
|
||||||
TFB_DrawCommand DC;
|
|
||||||
|
|
||||||
DC.Type = TFB_DRAWCOMMANDTYPE_IMAGE;
|
|
||||||
DC.data.image.image = img;
|
|
||||||
DC.data.image.x = x;
|
|
||||||
DC.data.image.y = y;
|
|
||||||
DC.data.image.UseScaling = scaled;
|
|
||||||
|
|
||||||
if (palette != NULL)
|
|
||||||
{
|
|
||||||
int i, changed;
|
|
||||||
Lock_DCQ(257);
|
|
||||||
changed = 0;
|
|
||||||
for (i = 0; i < 256; i++)
|
|
||||||
{
|
|
||||||
if ((_localpal[i][0] != palette[i].r) ||
|
|
||||||
(_localpal[i][1] != palette[i].g) ||
|
|
||||||
(_localpal[i][2] != palette[i].b))
|
|
||||||
{
|
|
||||||
changed++;
|
|
||||||
_localpal[i][0] = palette[i].r;
|
|
||||||
_localpal[i][1] = palette[i].g;
|
|
||||||
_localpal[i][2] = palette[i].b;
|
|
||||||
TFB_Draw_SetPalette (i, palette[i].r, palette[i].g,
|
|
||||||
palette[i].b);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
// if (changed) { fprintf (stderr, "Actually changing palette! "); }
|
|
||||||
DC.data.image.UsePalette = TRUE;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
Lock_DCQ (1);
|
|
||||||
DC.data.image.UsePalette = FALSE;
|
|
||||||
}
|
|
||||||
|
|
||||||
DC.data.image.destBuffer = dest;
|
|
||||||
DC.data.image.BlendNumerator = BlendNumerator;
|
|
||||||
DC.data.image.BlendDenominator = BlendDenominator;
|
|
||||||
|
|
||||||
TFB_EnqueueDrawCommand (&DC);
|
|
||||||
Unlock_DCQ ();
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
TFB_Draw_FilledImage (TFB_ImageStruct *img, int x, int y, BOOLEAN scaled, int r, int g, int b, SCREEN dest)
|
|
||||||
{
|
|
||||||
TFB_DrawCommand DC;
|
|
||||||
|
|
||||||
DC.Type = TFB_DRAWCOMMANDTYPE_FILLEDIMAGE;
|
|
||||||
DC.data.filledimage.image = img;
|
|
||||||
DC.data.filledimage.x = x;
|
|
||||||
DC.data.filledimage.y = y;
|
|
||||||
DC.data.filledimage.UseScaling = scaled;
|
|
||||||
DC.data.filledimage.r = r;
|
|
||||||
DC.data.filledimage.g = g;
|
|
||||||
DC.data.filledimage.b = b;
|
|
||||||
DC.data.filledimage.destBuffer = dest;
|
|
||||||
DC.data.filledimage.BlendNumerator = BlendNumerator;
|
|
||||||
DC.data.filledimage.BlendDenominator = BlendDenominator;
|
|
||||||
|
|
||||||
TFB_EnqueueDrawCommand (&DC);
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
TFB_Draw_CopyToImage (TFB_ImageStruct *img, PRECT lpRect, SCREEN src)
|
|
||||||
{
|
|
||||||
TFB_DrawCommand DC;
|
|
||||||
|
|
||||||
DC.Type = TFB_DRAWCOMMANDTYPE_COPYTOIMAGE;
|
|
||||||
DC.data.copytoimage.x = lpRect->corner.x;
|
|
||||||
DC.data.copytoimage.y = lpRect->corner.y;
|
|
||||||
DC.data.copytoimage.w = lpRect->extent.width;
|
|
||||||
DC.data.copytoimage.h = lpRect->extent.height;
|
|
||||||
DC.data.copytoimage.image = img;
|
|
||||||
DC.data.copytoimage.srcBuffer = src;
|
|
||||||
|
|
||||||
DC.data.copytoimage.BlendNumerator = BlendNumerator;
|
|
||||||
DC.data.copytoimage.BlendDenominator = BlendDenominator;
|
|
||||||
|
|
||||||
TFB_EnqueueDrawCommand (&DC);
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
TFB_Draw_Copy (PRECT r, SCREEN src, SCREEN dest)
|
|
||||||
{
|
|
||||||
RECT locRect;
|
|
||||||
TFB_DrawCommand DC;
|
|
||||||
|
|
||||||
if (!r)
|
|
||||||
{
|
|
||||||
locRect.corner.x = locRect.corner.y = 0;
|
|
||||||
locRect.extent.width = SCREEN_WIDTH;
|
|
||||||
locRect.extent.height = SCREEN_HEIGHT;
|
|
||||||
r = &locRect;
|
|
||||||
}
|
|
||||||
|
|
||||||
DC.Type = TFB_DRAWCOMMANDTYPE_COPY;
|
|
||||||
DC.data.copy.x = r->corner.x;
|
|
||||||
DC.data.copy.y = r->corner.y;
|
|
||||||
DC.data.copy.w = r->extent.width;
|
|
||||||
DC.data.copy.h = r->extent.height;
|
|
||||||
DC.data.copy.srcBuffer = src;
|
|
||||||
DC.data.copy.destBuffer = dest;
|
|
||||||
|
|
||||||
DC.data.copy.BlendNumerator = BlendNumerator;
|
|
||||||
DC.data.copy.BlendDenominator = BlendDenominator;
|
|
||||||
|
|
||||||
TFB_EnqueueDrawCommand (&DC);
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
TFB_Draw_DeleteImage (TFB_ImageStruct *img)
|
|
||||||
{
|
|
||||||
if (img)
|
|
||||||
{
|
|
||||||
TFB_DrawCommand DC;
|
|
||||||
|
|
||||||
DC.Type = TFB_DRAWCOMMANDTYPE_DELETEIMAGE;
|
|
||||||
DC.data.deleteimage.image = img;
|
|
||||||
|
|
||||||
TFB_EnqueueDrawCommand (&DC);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
TFB_Draw_WaitForSignal (void)
|
|
||||||
{
|
|
||||||
TFB_DrawCommand DrawCommand;
|
|
||||||
DrawCommand.Type = TFB_DRAWCOMMANDTYPE_SENDSIGNAL;
|
|
||||||
// We need to lock the mutex before enqueueing the DC to prevent races
|
|
||||||
LockSignalMutex ();
|
|
||||||
Lock_DCQ (1);
|
|
||||||
TFB_BatchReset ();
|
|
||||||
TFB_EnqueueDrawCommand(&DrawCommand);
|
|
||||||
Unlock_DCQ();
|
|
||||||
WaitForSignal ();
|
|
||||||
}
|
|
||||||
|
|||||||
@@ -44,12 +44,6 @@ enum
|
|||||||
|
|
||||||
#define TFB_GFX_NUMSCREENS 3
|
#define TFB_GFX_NUMSCREENS 3
|
||||||
|
|
||||||
typedef enum {
|
|
||||||
TFB_SCREEN_MAIN,
|
|
||||||
TFB_SCREEN_EXTRA,
|
|
||||||
TFB_SCREEN_TRANSITION
|
|
||||||
} SCREEN;
|
|
||||||
|
|
||||||
int TFB_InitGraphics (int driver, int flags, int width, int height, int bpp);
|
int TFB_InitGraphics (int driver, int flags, int width, int height, int bpp);
|
||||||
void TFB_UninitGraphics (void);
|
void TFB_UninitGraphics (void);
|
||||||
void TFB_ProcessEvents (void);
|
void TFB_ProcessEvents (void);
|
||||||
@@ -68,135 +62,8 @@ void ScreenTransition (int transition, PRECT pRect);
|
|||||||
extern float FrameRate;
|
extern float FrameRate;
|
||||||
extern int FrameRateTickBase;
|
extern int FrameRateTickBase;
|
||||||
|
|
||||||
// Image + Drawing Stuff
|
|
||||||
|
|
||||||
#define TFB_IMAGESTRUCT_SIZE 32
|
|
||||||
|
|
||||||
// TFB_Image (which is module-specific) will be casted to this and vice versa
|
|
||||||
typedef struct tfb_imagestruct
|
|
||||||
{
|
|
||||||
UBYTE data[TFB_IMAGESTRUCT_SIZE];
|
|
||||||
} TFB_ImageStruct;
|
|
||||||
|
|
||||||
|
|
||||||
typedef struct tfb_palette
|
|
||||||
{
|
|
||||||
UBYTE r;
|
|
||||||
UBYTE g;
|
|
||||||
UBYTE b;
|
|
||||||
UBYTE unused;
|
|
||||||
} TFB_Palette;
|
|
||||||
|
|
||||||
// Drawing commands
|
|
||||||
|
|
||||||
void TFB_Draw_Line (int x1, int y1, int x2, int y2, int r, int g, int b, SCREEN dest);
|
|
||||||
void TFB_Draw_Rect (PRECT rect, int r, int g, int b, SCREEN dest);
|
|
||||||
void TFB_Draw_Image (TFB_ImageStruct *img, int x, int y, BOOLEAN scaled, TFB_Palette *palette, SCREEN dest);
|
|
||||||
void TFB_Draw_Copy (PRECT r, SCREEN src, SCREEN dest);
|
|
||||||
void TFB_Draw_FilledImage (TFB_ImageStruct *img, int x, int y, BOOLEAN scaled, int r, int g, int b, SCREEN dest);
|
|
||||||
void TFB_Draw_CopyToImage (TFB_ImageStruct *img, PRECT lpRect, SCREEN src);
|
|
||||||
void TFB_Draw_DeleteImage (TFB_ImageStruct *img);
|
|
||||||
void TFB_Draw_WaitForSignal (void);
|
|
||||||
void TFB_Draw_SetPalette (int index, int r, int g, int b);
|
|
||||||
void TFB_FlushPaletteCache (void);
|
|
||||||
|
|
||||||
|
|
||||||
void TFB_FlushGraphics (void); // Only call from main thread!!
|
void TFB_FlushGraphics (void); // Only call from main thread!!
|
||||||
|
|
||||||
// CCB Stuff
|
|
||||||
|
|
||||||
typedef struct
|
|
||||||
{
|
|
||||||
int ccb_Flags;
|
|
||||||
int ccb_HDX;
|
|
||||||
int ccb_HDY;
|
|
||||||
int ccb_HDDX;
|
|
||||||
int ccb_HDDY;
|
|
||||||
int ccb_VDX;
|
|
||||||
int ccb_VDY;
|
|
||||||
int ccb_PIXC;
|
|
||||||
void* ccb_SourcePtr;
|
|
||||||
unsigned int* ccb_PLUTPtr;
|
|
||||||
int ccb_Width;
|
|
||||||
int ccb_Height;
|
|
||||||
int ccb_PRE0;
|
|
||||||
int ccb_PRE1;
|
|
||||||
void* ccb_NextPtr;
|
|
||||||
int ccb_XPos;
|
|
||||||
int ccb_YPos;
|
|
||||||
} CCB;
|
|
||||||
|
|
||||||
// Geez, I hope these #defines work out...
|
|
||||||
|
|
||||||
#define CCB_SPABS (1 << 0)
|
|
||||||
#define CCB_PPABS (1 << 1)
|
|
||||||
#define CCB_YOXY (1 << 2)
|
|
||||||
#define CCB_ACW (1 << 3)
|
|
||||||
#define CCB_ACCW (1 << 4)
|
|
||||||
#define CCB_LDSIZE (1 << 5)
|
|
||||||
#define CCB_CCBPRE (1 << 6)
|
|
||||||
#define CCB_LDPRS (1 << 7)
|
|
||||||
#define CCB_LDPPMP (1 << 8)
|
|
||||||
#define CCB_ACE (1 << 9)
|
|
||||||
#define CCB_LCE (1 << 10)
|
|
||||||
#define CCB_PLUTPOS (1 << 11)
|
|
||||||
#define CCB_BGND (1 << 12)
|
|
||||||
#define CCB_NPABS (1 << 13)
|
|
||||||
#define CCB_PACKED (1 << 14)
|
|
||||||
#define CCB_LDPLUT (1 << 15)
|
|
||||||
#define CCB_LAST (1 << 16)
|
|
||||||
#define CCB_USEAV (1 << 17)
|
|
||||||
|
|
||||||
#define PPMP_0_SHIFT 0 // ?
|
|
||||||
#define PPMP_1_SHIFT 1 // ?
|
|
||||||
|
|
||||||
#define PPMPC_MS_PIN (1 << 0)
|
|
||||||
#define PPMPC_MS_CCB (1 << 1)
|
|
||||||
#define PPMPC_SF_8 (1 << 2)
|
|
||||||
#define PPMPC_MF_8 (1 << 3)
|
|
||||||
#define PPMPC_MF_SHIFT 3
|
|
||||||
#define PPMPC_1S_PDC (1 << 4)
|
|
||||||
#define PPMPC_2S_CFBD (1 << 5)
|
|
||||||
#define PPMPC_2D_1 (1 << 6)
|
|
||||||
#define PPMPC_MF_6 (1 << 7)
|
|
||||||
#define PPMPC_2S_0 (1 << 8)
|
|
||||||
#define PPMPC_1S_CFBD (1 << 9)
|
|
||||||
#define PPMPC_MF_2 (1 << 10)
|
|
||||||
#define PPMPC_SF_2 (1 << 11)
|
|
||||||
#define PPMPC_2S_PDC (1 << 12)
|
|
||||||
#define PPMPC_MF_1 (1 << 13)
|
|
||||||
#define PPMPC_SF_16 (1 << 14)
|
|
||||||
|
|
||||||
#define PRE0_LITERAL (1 << 0)
|
|
||||||
#define PRE0_VCNT_PREFETCH (1 << 1)
|
|
||||||
#define PRE0_VCNT_SHIFT 1
|
|
||||||
#define PRE0_VCNT_MASK (1 << 1)
|
|
||||||
#define PRE0_BPP_8 (1 << 2)
|
|
||||||
#define PRE0_BPP_SHIFT 2
|
|
||||||
#define PRE0_BPP_16 (1 << 3)
|
|
||||||
#define PRE0_BGND (1 << 4)
|
|
||||||
#define PRE0_LINEAR (1 << 5)
|
|
||||||
#define PRE0_SKIPX_MASK 0
|
|
||||||
#define PRE0_SKIPX_SHIFT 0
|
|
||||||
#define PRE0_BPP_1 (1 << 6)
|
|
||||||
#define PRE1_TLLSB_PDC0 (1 << 7)
|
|
||||||
#define PRE1_TLHPCNT_PREFETCH (1 << 7)
|
|
||||||
#define PRE1_TLHPCNT_SHIFT 7
|
|
||||||
#define PRE1_TLHPCNT_MASK (1 << 7)
|
|
||||||
#define PRE1_WOFFSET_PREFETCH (1 << 8)
|
|
||||||
#define PRE1_WOFFSET10_SHIFT (1 << 9)
|
|
||||||
#define PRE1_WOFFSET8_SHIFT (1 << 10)
|
|
||||||
|
|
||||||
// Cel Stuff
|
|
||||||
|
|
||||||
void add_cel(CCB* cel);
|
|
||||||
void add_cels(CCB* first, CCB* last);
|
|
||||||
void myMapCel(CCB* myCCB, POINT Points[4]);
|
|
||||||
int _ThreeDO_batch_cels(int unknown);
|
|
||||||
CCB *ParseCel(CCB*,unsigned int);
|
|
||||||
|
|
||||||
#define CelData void
|
|
||||||
|
|
||||||
// Unknown Stuff
|
// Unknown Stuff
|
||||||
|
|
||||||
extern int ScreenWidth;
|
extern int ScreenWidth;
|
||||||
|
|||||||
@@ -20,6 +20,7 @@
|
|||||||
|
|
||||||
#include "sdl_common.h"
|
#include "sdl_common.h"
|
||||||
#include "rotozoom.h"
|
#include "rotozoom.h"
|
||||||
|
#include "graphics/tfb_draw.h"
|
||||||
|
|
||||||
static int gscale;
|
static int gscale;
|
||||||
|
|
||||||
@@ -99,7 +100,7 @@ blt (PRECT pClipRect, PRIMITIVEPTR PrimPtr)
|
|||||||
else
|
else
|
||||||
{
|
{
|
||||||
img->ScaledImg = new_surf;
|
img->ScaledImg = new_surf;
|
||||||
SDL_SetColors (img->ScaledImg, img->Palette, 0, 256);
|
SDL_SetColors (img->ScaledImg, (SDL_Color *)img->Palette, 0, 256);
|
||||||
if (img->NormalImg->flags & SDL_SRCCOLORKEY)
|
if (img->NormalImg->flags & SDL_SRCCOLORKEY)
|
||||||
{
|
{
|
||||||
SDL_SetColorKey (img->ScaledImg, SDL_SRCCOLORKEY,
|
SDL_SetColorKey (img->ScaledImg, SDL_SRCCOLORKEY,
|
||||||
@@ -144,14 +145,14 @@ blt (PRECT pClipRect, PRIMITIVEPTR PrimPtr)
|
|||||||
UnlockMutex (img->mutex);
|
UnlockMutex (img->mutex);
|
||||||
if (filled)
|
if (filled)
|
||||||
{
|
{
|
||||||
TFB_Draw_FilledImage ((TFB_ImageStruct *)img, x, y,
|
TFB_DrawScreen_FilledImage (img, x, y,
|
||||||
scaled, palette[0].r,
|
scaled, palette[0].r,
|
||||||
palette[0].g, palette[0].b,
|
palette[0].g, palette[0].b,
|
||||||
TFB_SCREEN_MAIN);
|
TFB_SCREEN_MAIN);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
TFB_Draw_Image ((TFB_ImageStruct *)img, x, y, scaled,
|
TFB_DrawScreen_Image (img, x, y, scaled,
|
||||||
(paletted ? palette : NULL),
|
(paletted ? palette : NULL),
|
||||||
TFB_SCREEN_MAIN);
|
TFB_SCREEN_MAIN);
|
||||||
}
|
}
|
||||||
@@ -212,7 +213,7 @@ fillrect_blt (PRECT pClipRect, PRIMITIVEPTR PrimPtr)
|
|||||||
rect.extent.height) >> 1;
|
rect.extent.height) >> 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
TFB_Draw_Rect (&rect, r, g, b, TFB_SCREEN_MAIN);
|
TFB_DrawScreen_Rect (&rect, r, g, b, TFB_SCREEN_MAIN);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
@@ -262,7 +263,7 @@ line_blt (PRECT pClipRect, PRIMITIVEPTR PrimPtr)
|
|||||||
|
|
||||||
if (TYPE_GET (_CurFramePtr->TypeIndexAndFlags) == SCREEN_DRAWABLE)
|
if (TYPE_GET (_CurFramePtr->TypeIndexAndFlags) == SCREEN_DRAWABLE)
|
||||||
{
|
{
|
||||||
TFB_Draw_Line (x1, y1, x2, y2, r, g, b, TFB_SCREEN_MAIN);
|
TFB_DrawScreen_Line (x1, y1, x2, y2, r, g, b, TFB_SCREEN_MAIN);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
@@ -283,9 +284,9 @@ read_screen (PRECT lpRect, FRAMEPTR DstFramePtr)
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
TFB_ImageStruct *img = (TFB_ImageStruct *) ((BYTE *) DstFramePtr +
|
TFB_Image *img = (TFB_Image *) ((BYTE *) DstFramePtr +
|
||||||
DstFramePtr->DataOffs);
|
DstFramePtr->DataOffs);
|
||||||
TFB_Draw_CopyToImage (img, lpRect, TFB_SCREEN_MAIN);
|
TFB_DrawScreen_CopyToImage (img, lpRect, TFB_SCREEN_MAIN);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -23,6 +23,7 @@
|
|||||||
#include "opengl.h"
|
#include "opengl.h"
|
||||||
#include "primitives.h"
|
#include "primitives.h"
|
||||||
#include "graphics/drawcmd.h"
|
#include "graphics/drawcmd.h"
|
||||||
|
#include "graphics/tfb_draw.h"
|
||||||
|
|
||||||
int batch_depth = 0;
|
int batch_depth = 0;
|
||||||
static const BOOLEAN pausing_transition = TRUE; // change to FALSE for non-pausing version
|
static const BOOLEAN pausing_transition = TRUE; // change to FALSE for non-pausing version
|
||||||
@@ -76,7 +77,7 @@ UnbatchGraphics (void)
|
|||||||
void
|
void
|
||||||
FlushGraphics ()
|
FlushGraphics ()
|
||||||
{
|
{
|
||||||
TFB_Draw_WaitForSignal ();
|
TFB_DrawScreen_WaitForSignal ();
|
||||||
}
|
}
|
||||||
|
|
||||||
// Status: Ignored (only used in fmv.c)
|
// Status: Ignored (only used in fmv.c)
|
||||||
@@ -174,13 +175,13 @@ ScreenTransition (int TransType, PRECT pRect)
|
|||||||
void
|
void
|
||||||
DrawFromExtraScreen (PRECT r) //No scaling?
|
DrawFromExtraScreen (PRECT r) //No scaling?
|
||||||
{
|
{
|
||||||
TFB_Draw_Copy(r, TFB_SCREEN_EXTRA, TFB_SCREEN_MAIN);
|
TFB_DrawScreen_Copy(r, TFB_SCREEN_EXTRA, TFB_SCREEN_MAIN);
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
LoadIntoExtraScreen (PRECT r)
|
LoadIntoExtraScreen (PRECT r)
|
||||||
{
|
{
|
||||||
TFB_Draw_Copy(r, TFB_SCREEN_MAIN, TFB_SCREEN_EXTRA);
|
TFB_DrawScreen_Copy(r, TFB_SCREEN_MAIN, TFB_SCREEN_EXTRA);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Status: Ignored
|
// Status: Ignored
|
||||||
|
|||||||
@@ -524,12 +524,12 @@ _ReleaseCelData (MEM_HANDLE handle)
|
|||||||
{
|
{
|
||||||
if (FramePtr->DataOffs)
|
if (FramePtr->DataOffs)
|
||||||
{
|
{
|
||||||
TFB_ImageStruct *img;
|
TFB_Image *img;
|
||||||
|
|
||||||
img = (TFB_ImageStruct *)((BYTE *)FramePtr + FramePtr->DataOffs);
|
img = (TFB_Image *)((BYTE *)FramePtr + FramePtr->DataOffs);
|
||||||
FramePtr->DataOffs = 0;
|
FramePtr->DataOffs = 0;
|
||||||
|
|
||||||
TFB_Draw_DeleteImage (img);
|
TFB_DrawScreen_DeleteImage (img);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -664,12 +664,12 @@ _ReleaseFontData (MEM_HANDLE handle)
|
|||||||
{
|
{
|
||||||
if (FramePtr->DataOffs)
|
if (FramePtr->DataOffs)
|
||||||
{
|
{
|
||||||
TFB_ImageStruct *img;
|
TFB_Image *img;
|
||||||
|
|
||||||
img = (TFB_ImageStruct *)((BYTE *)FramePtr + FramePtr->DataOffs);
|
img = (TFB_Image *)((BYTE *)FramePtr + FramePtr->DataOffs);
|
||||||
FramePtr->DataOffs = 0;
|
FramePtr->DataOffs = 0;
|
||||||
|
|
||||||
TFB_Draw_DeleteImage (img);
|
TFB_DrawScreen_DeleteImage (img);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -137,7 +137,7 @@ TFB_LoadImage (SDL_Surface *img)
|
|||||||
if (img->format->palette)
|
if (img->format->palette)
|
||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
myImage->Palette = (SDL_Color*) HMalloc (sizeof (SDL_Color) * 256);
|
myImage->Palette = (TFB_Palette*) HMalloc (sizeof (TFB_Palette) * 256);
|
||||||
for (i = 0; i < 256; ++i)
|
for (i = 0; i < 256; ++i)
|
||||||
{
|
{
|
||||||
myImage->Palette[i].r = img->format->palette->colors[i].r;
|
myImage->Palette[i].r = img->format->palette->colors[i].r;
|
||||||
@@ -587,7 +587,7 @@ TFB_FlushGraphics () // Only call from main thread!!
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
SDL_SetColors (surf, DC_image->Palette, 0, 256);
|
SDL_SetColors (surf, (SDL_Color*)DC_image->Palette, 0, 256);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -24,6 +24,7 @@
|
|||||||
#include "SDL_byteorder.h"
|
#include "SDL_byteorder.h"
|
||||||
|
|
||||||
#include "libs/graphics/gfxintrn.h"
|
#include "libs/graphics/gfxintrn.h"
|
||||||
|
#include "libs/graphics/tfb_draw.h"
|
||||||
#include "libs/input/inpintrn.h"
|
#include "libs/input/inpintrn.h"
|
||||||
#include "libs/graphics/gfx_common.h"
|
#include "libs/graphics/gfx_common.h"
|
||||||
#include "libs/input/sdl/input.h"
|
#include "libs/input/sdl/input.h"
|
||||||
@@ -45,19 +46,6 @@ extern int GfxFlags;
|
|||||||
void ScreenOrigin (FRAME Display, COORD sx, COORD sy);
|
void ScreenOrigin (FRAME Display, COORD sx, COORD sy);
|
||||||
void LoadDisplay (PDISPLAY_INTERFACE *pDisplay);
|
void LoadDisplay (PDISPLAY_INTERFACE *pDisplay);
|
||||||
|
|
||||||
// TFB_ImageStruct will be casted to this and vice versa, so sizes must be equal
|
|
||||||
typedef struct tfb_image
|
|
||||||
{
|
|
||||||
SDL_Surface *NormalImg;
|
|
||||||
SDL_Surface *ScaledImg;
|
|
||||||
SDL_Color *Palette;
|
|
||||||
int colormap_index;
|
|
||||||
int scale;
|
|
||||||
Mutex mutex;
|
|
||||||
UBYTE pad[sizeof(TFB_ImageStruct)-sizeof(SDL_Surface*)-sizeof(SDL_Surface*)-
|
|
||||||
sizeof(SDL_Color*)-sizeof(int)-sizeof(int)-sizeof(Mutex)];
|
|
||||||
} TFB_Image;
|
|
||||||
|
|
||||||
TFB_Image *TFB_LoadImage (SDL_Surface *img);
|
TFB_Image *TFB_LoadImage (SDL_Surface *img);
|
||||||
void TFB_FreeImage (TFB_Image *img);
|
void TFB_FreeImage (TFB_Image *img);
|
||||||
|
|
||||||
@@ -66,5 +54,4 @@ SDL_Surface* TFB_DisplayFormatAlpha (SDL_Surface *surface);
|
|||||||
void TFB_BlitSurface (SDL_Surface *src, SDL_Rect *srcrect, SDL_Surface *dst,
|
void TFB_BlitSurface (SDL_Surface *src, SDL_Rect *srcrect, SDL_Surface *dst,
|
||||||
SDL_Rect *dstrect, int blend_numer, int blend_denom);
|
SDL_Rect *dstrect, int blend_numer, int blend_denom);
|
||||||
|
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
@@ -0,0 +1,263 @@
|
|||||||
|
#include "gfx_common.h"
|
||||||
|
#include "tfb_draw.h"
|
||||||
|
#include "drawcmd.h"
|
||||||
|
|
||||||
|
void
|
||||||
|
TFB_DrawScreen_Line (int x1, int y1, int x2, int y2, int r, int g, int b, SCREEN dest)
|
||||||
|
{
|
||||||
|
TFB_DrawCommand DC;
|
||||||
|
|
||||||
|
DC.Type = TFB_DRAWCOMMANDTYPE_LINE;
|
||||||
|
DC.data.line.x1 = x1;
|
||||||
|
DC.data.line.y1 = y1;
|
||||||
|
DC.data.line.x2 = x2;
|
||||||
|
DC.data.line.y2 = y2;
|
||||||
|
DC.data.line.r = r;
|
||||||
|
DC.data.line.g = g;
|
||||||
|
DC.data.line.b = b;
|
||||||
|
DC.data.line.destBuffer = dest;
|
||||||
|
|
||||||
|
TFB_EnqueueDrawCommand (&DC);
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
TFB_DrawScreen_Rect (PRECT rect, int r, int g, int b, SCREEN dest)
|
||||||
|
{
|
||||||
|
RECT locRect;
|
||||||
|
TFB_DrawCommand DC;
|
||||||
|
|
||||||
|
if (!rect)
|
||||||
|
{
|
||||||
|
locRect.corner.x = locRect.corner.y = 0;
|
||||||
|
locRect.extent.width = SCREEN_WIDTH;
|
||||||
|
locRect.extent.height = SCREEN_HEIGHT;
|
||||||
|
rect = &locRect;
|
||||||
|
}
|
||||||
|
|
||||||
|
DC.Type = TFB_DRAWCOMMANDTYPE_RECTANGLE;
|
||||||
|
DC.data.rect.x = rect->corner.x;
|
||||||
|
DC.data.rect.y = rect->corner.y;
|
||||||
|
DC.data.rect.w = rect->extent.width;
|
||||||
|
DC.data.rect.h = rect->extent.height;
|
||||||
|
DC.data.rect.r = r;
|
||||||
|
DC.data.rect.g = g;
|
||||||
|
DC.data.rect.b = b;
|
||||||
|
DC.data.rect.destBuffer = dest;
|
||||||
|
|
||||||
|
TFB_EnqueueDrawCommand (&DC);
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
TFB_DrawScreen_SetPalette (int index, int r, int g, int b)
|
||||||
|
{
|
||||||
|
TFB_DrawCommand DC;
|
||||||
|
|
||||||
|
DC.Type = TFB_DRAWCOMMANDTYPE_SETPALETTE;
|
||||||
|
DC.data.setpalette.r = r;
|
||||||
|
DC.data.setpalette.g = g;
|
||||||
|
DC.data.setpalette.b = b;
|
||||||
|
DC.data.setpalette.index = index;
|
||||||
|
|
||||||
|
TFB_EnqueueDrawCommand (&DC);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* This value is protected by the DCQ's lock. */
|
||||||
|
static int _localpal[256][3];
|
||||||
|
|
||||||
|
void
|
||||||
|
TFB_FlushPaletteCache ()
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
Lock_DCQ (-1);
|
||||||
|
for (i = 0; i < 256; i++)
|
||||||
|
{
|
||||||
|
_localpal[i][0] = -1;
|
||||||
|
_localpal[i][1] = -1;
|
||||||
|
_localpal[i][2] = -1;
|
||||||
|
}
|
||||||
|
Unlock_DCQ ();
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
TFB_DrawScreen_Image (TFB_Image *img, int x, int y, BOOLEAN scaled, TFB_Palette *palette, SCREEN dest)
|
||||||
|
{
|
||||||
|
TFB_DrawCommand DC;
|
||||||
|
|
||||||
|
DC.Type = TFB_DRAWCOMMANDTYPE_IMAGE;
|
||||||
|
DC.data.image.image = img;
|
||||||
|
DC.data.image.x = x;
|
||||||
|
DC.data.image.y = y;
|
||||||
|
DC.data.image.UseScaling = scaled;
|
||||||
|
|
||||||
|
if (palette != NULL)
|
||||||
|
{
|
||||||
|
int i, changed;
|
||||||
|
Lock_DCQ(257);
|
||||||
|
changed = 0;
|
||||||
|
for (i = 0; i < 256; i++)
|
||||||
|
{
|
||||||
|
if ((_localpal[i][0] != palette[i].r) ||
|
||||||
|
(_localpal[i][1] != palette[i].g) ||
|
||||||
|
(_localpal[i][2] != palette[i].b))
|
||||||
|
{
|
||||||
|
changed++;
|
||||||
|
_localpal[i][0] = palette[i].r;
|
||||||
|
_localpal[i][1] = palette[i].g;
|
||||||
|
_localpal[i][2] = palette[i].b;
|
||||||
|
TFB_DrawScreen_SetPalette (i, palette[i].r, palette[i].g,
|
||||||
|
palette[i].b);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// if (changed) { fprintf (stderr, "Actually changing palette! "); }
|
||||||
|
DC.data.image.UsePalette = TRUE;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
Lock_DCQ (1);
|
||||||
|
DC.data.image.UsePalette = FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
DC.data.image.destBuffer = dest;
|
||||||
|
DC.data.image.BlendNumerator = BlendNumerator;
|
||||||
|
DC.data.image.BlendDenominator = BlendDenominator;
|
||||||
|
|
||||||
|
TFB_EnqueueDrawCommand (&DC);
|
||||||
|
Unlock_DCQ ();
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
TFB_DrawScreen_FilledImage (TFB_Image *img, int x, int y, BOOLEAN scaled, int r, int g, int b, SCREEN dest)
|
||||||
|
{
|
||||||
|
TFB_DrawCommand DC;
|
||||||
|
|
||||||
|
DC.Type = TFB_DRAWCOMMANDTYPE_FILLEDIMAGE;
|
||||||
|
DC.data.filledimage.image = img;
|
||||||
|
DC.data.filledimage.x = x;
|
||||||
|
DC.data.filledimage.y = y;
|
||||||
|
DC.data.filledimage.UseScaling = scaled;
|
||||||
|
DC.data.filledimage.r = r;
|
||||||
|
DC.data.filledimage.g = g;
|
||||||
|
DC.data.filledimage.b = b;
|
||||||
|
DC.data.filledimage.destBuffer = dest;
|
||||||
|
DC.data.filledimage.BlendNumerator = BlendNumerator;
|
||||||
|
DC.data.filledimage.BlendDenominator = BlendDenominator;
|
||||||
|
|
||||||
|
TFB_EnqueueDrawCommand (&DC);
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
TFB_DrawScreen_CopyToImage (TFB_Image *img, PRECT lpRect, SCREEN src)
|
||||||
|
{
|
||||||
|
TFB_DrawCommand DC;
|
||||||
|
|
||||||
|
DC.Type = TFB_DRAWCOMMANDTYPE_COPYTOIMAGE;
|
||||||
|
DC.data.copytoimage.x = lpRect->corner.x;
|
||||||
|
DC.data.copytoimage.y = lpRect->corner.y;
|
||||||
|
DC.data.copytoimage.w = lpRect->extent.width;
|
||||||
|
DC.data.copytoimage.h = lpRect->extent.height;
|
||||||
|
DC.data.copytoimage.image = img;
|
||||||
|
DC.data.copytoimage.srcBuffer = src;
|
||||||
|
|
||||||
|
DC.data.copytoimage.BlendNumerator = BlendNumerator;
|
||||||
|
DC.data.copytoimage.BlendDenominator = BlendDenominator;
|
||||||
|
|
||||||
|
TFB_EnqueueDrawCommand (&DC);
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
TFB_DrawScreen_Copy (PRECT r, SCREEN src, SCREEN dest)
|
||||||
|
{
|
||||||
|
RECT locRect;
|
||||||
|
TFB_DrawCommand DC;
|
||||||
|
|
||||||
|
if (!r)
|
||||||
|
{
|
||||||
|
locRect.corner.x = locRect.corner.y = 0;
|
||||||
|
locRect.extent.width = SCREEN_WIDTH;
|
||||||
|
locRect.extent.height = SCREEN_HEIGHT;
|
||||||
|
r = &locRect;
|
||||||
|
}
|
||||||
|
|
||||||
|
DC.Type = TFB_DRAWCOMMANDTYPE_COPY;
|
||||||
|
DC.data.copy.x = r->corner.x;
|
||||||
|
DC.data.copy.y = r->corner.y;
|
||||||
|
DC.data.copy.w = r->extent.width;
|
||||||
|
DC.data.copy.h = r->extent.height;
|
||||||
|
DC.data.copy.srcBuffer = src;
|
||||||
|
DC.data.copy.destBuffer = dest;
|
||||||
|
|
||||||
|
DC.data.copy.BlendNumerator = BlendNumerator;
|
||||||
|
DC.data.copy.BlendDenominator = BlendDenominator;
|
||||||
|
|
||||||
|
TFB_EnqueueDrawCommand (&DC);
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
TFB_DrawScreen_DeleteImage (TFB_Image *img)
|
||||||
|
{
|
||||||
|
if (img)
|
||||||
|
{
|
||||||
|
TFB_DrawCommand DC;
|
||||||
|
|
||||||
|
DC.Type = TFB_DRAWCOMMANDTYPE_DELETEIMAGE;
|
||||||
|
DC.data.deleteimage.image = img;
|
||||||
|
|
||||||
|
TFB_EnqueueDrawCommand (&DC);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
TFB_DrawScreen_WaitForSignal (void)
|
||||||
|
{
|
||||||
|
TFB_DrawCommand DrawCommand;
|
||||||
|
DrawCommand.Type = TFB_DRAWCOMMANDTYPE_SENDSIGNAL;
|
||||||
|
// We need to lock the mutex before enqueueing the DC to prevent races
|
||||||
|
LockSignalMutex ();
|
||||||
|
Lock_DCQ (1);
|
||||||
|
TFB_BatchReset ();
|
||||||
|
TFB_EnqueueDrawCommand(&DrawCommand);
|
||||||
|
Unlock_DCQ();
|
||||||
|
WaitForSignal ();
|
||||||
|
}
|
||||||
|
|
||||||
|
#if 0
|
||||||
|
|
||||||
|
/* These don't compile until I write the DrawCanvas commands. */
|
||||||
|
|
||||||
|
void
|
||||||
|
TFB_DrawImage_Line (int x1, int y1, int x2, int y2, int r, int g, int b, TFB_Image *dest)
|
||||||
|
{
|
||||||
|
LockMutex (dest->mutex);
|
||||||
|
TFB_DrawCanvas_Line (x1, y1, x2, y2, r, g, b, dest->NormalImg);
|
||||||
|
dest->dirty = TRUE;
|
||||||
|
UnlockMutex (dest->mutex);
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
TFB_DrawImage_Rect (PRECT rect, int r, int g, int b, TFB_Image *image)
|
||||||
|
{
|
||||||
|
LockMutex (image->mutex);
|
||||||
|
TFB_DrawCanvas_Rect (rect, r, g, b, image->NormalImg);
|
||||||
|
image->dirty = TRUE;
|
||||||
|
UnlockMutex (image->mutex);
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
TFB_DrawImage_Image (TFB_Image *img, int x, int y, BOOLEAN scaled, TFB_Palette *palette, TFB_Image *target)
|
||||||
|
{
|
||||||
|
LockMutex (target->mutex);
|
||||||
|
TFB_DrawCanvas_Image (img, x, y, scaled, target->NormalImg);
|
||||||
|
target->dirty = TRUE;
|
||||||
|
UnlockMutex (target->mutex);
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
TFB_DrawImage_FilledImage (TFB_Image *img, int x, int y, BOOLEAN scaled, TFB_Palette *palette, TFB_Image *target)
|
||||||
|
{
|
||||||
|
LockMutex (target->mutex);
|
||||||
|
TFB_DrawCanvas_FilledImage (img, x, y, scaled, target->NormalImg);
|
||||||
|
target->dirty = TRUE;
|
||||||
|
UnlockMutex (target->mutex);
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
||||||
@@ -0,0 +1,85 @@
|
|||||||
|
//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 TFB_DRAW_H
|
||||||
|
#define TFB_DRAW_H
|
||||||
|
|
||||||
|
#include "SDL.h"
|
||||||
|
#include "libs/threadlib.h"
|
||||||
|
|
||||||
|
typedef void *TFB_Canvas;
|
||||||
|
|
||||||
|
typedef enum {
|
||||||
|
TFB_SCREEN_MAIN,
|
||||||
|
TFB_SCREEN_EXTRA,
|
||||||
|
TFB_SCREEN_TRANSITION
|
||||||
|
} SCREEN;
|
||||||
|
|
||||||
|
typedef struct tfb_palette
|
||||||
|
{
|
||||||
|
UBYTE r;
|
||||||
|
UBYTE g;
|
||||||
|
UBYTE b;
|
||||||
|
UBYTE unused;
|
||||||
|
} TFB_Palette;
|
||||||
|
|
||||||
|
// This code will be replaced with appropriately modularized stuff
|
||||||
|
// later However, right now the code that uses it in graphics/sdl
|
||||||
|
// assumes these are all SDL_Surface *s. I need to rewrite them to
|
||||||
|
// make them use the DrawCanvas commands. -- Michael
|
||||||
|
|
||||||
|
typedef struct tfb_image
|
||||||
|
{
|
||||||
|
SDL_Surface *NormalImg;
|
||||||
|
SDL_Surface *ScaledImg;
|
||||||
|
TFB_Palette *Palette;
|
||||||
|
int colormap_index;
|
||||||
|
int scale;
|
||||||
|
Mutex mutex;
|
||||||
|
BOOLEAN dirty;
|
||||||
|
} TFB_Image;
|
||||||
|
|
||||||
|
|
||||||
|
// Drawing commands
|
||||||
|
|
||||||
|
void TFB_DrawScreen_Line (int x1, int y1, int x2, int y2, int r, int g, int b, SCREEN dest);
|
||||||
|
void TFB_DrawScreen_Rect (PRECT rect, int r, int g, int b, SCREEN dest);
|
||||||
|
void TFB_DrawScreen_Image (TFB_Image *img, int x, int y, BOOLEAN scaled, TFB_Palette *palette, SCREEN dest);
|
||||||
|
void TFB_DrawScreen_Copy (PRECT r, SCREEN src, SCREEN dest);
|
||||||
|
void TFB_DrawScreen_FilledImage (TFB_Image *img, int x, int y, BOOLEAN scaled, int r, int g, int b, SCREEN dest);
|
||||||
|
void TFB_DrawScreen_CopyToImage (TFB_Image *img, PRECT lpRect, SCREEN src);
|
||||||
|
void TFB_DrawScreen_DeleteImage (TFB_Image *img);
|
||||||
|
void TFB_DrawScreen_WaitForSignal (void);
|
||||||
|
void TFB_DrawScreen_SetPalette (int index, int r, int g, int b);
|
||||||
|
void TFB_FlushPaletteCache (void);
|
||||||
|
|
||||||
|
#if 0
|
||||||
|
// These don't compile until I implement the DrawCanvas commands.
|
||||||
|
void TFB_DrawImage_Line (int x1, int y1, int x2, int y2, int r, int g, int b, TFB_Image *dest);
|
||||||
|
void TFB_DrawImage_Rect (PRECT rect, int r, int g, int b, TFB_Image *image);
|
||||||
|
void TFB_DrawImage_Image (TFB_Image *img, int x, int y, BOOLEAN scaled, TFB_Palette *palette, TFB_Image *target);
|
||||||
|
void TFB_DrawImage_FilledImage (TFB_Image *img, int x, int y, BOOLEAN scaled, TFB_Palette *palette, TFB_Image *target);
|
||||||
|
|
||||||
|
/* These routines are properly defined in the driver-specific libraries. */
|
||||||
|
void TFB_DrawCanvas_Line (int x1, int y1, int x2, int y2, int r, int g, int b, TFB_Canvas dest);
|
||||||
|
void TFB_DrawCanvas_Rect (PRECT rect, int r, int g, int b, TFB_Canvas image);
|
||||||
|
void TFB_DrawCanvas_Image (TFB_Image *img, int x, int y, BOOLEAN scaled, TFB_Palette *palette, TFB_Canvas target);
|
||||||
|
void TFB_DrawCanvas_FilledImage (TFB_Image *img, int x, int y, BOOLEAN scaled, TFB_Palette *palette, TFB_Canvas target);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif
|
||||||
@@ -57,7 +57,12 @@ typedef PINPUT_DESC INPUT_DESCPTR;
|
|||||||
|
|
||||||
#define INPUT_DEVICE_PRIORITY DEFAULT_MEM_PRIORITY
|
#define INPUT_DEVICE_PRIORITY DEFAULT_MEM_PRIORITY
|
||||||
|
|
||||||
|
#ifndef _DISPLIST_H
|
||||||
|
/* This ifndef is temporary to avoid a collision with displist.h
|
||||||
|
This shouldn't be necessary, but SDL_wrappper.h isn't set up correctly
|
||||||
|
at the moment. */
|
||||||
typedef PBYTE BYTEPTR;
|
typedef PBYTE BYTEPTR;
|
||||||
|
#endif
|
||||||
|
|
||||||
#define AllocInputDevice() \
|
#define AllocInputDevice() \
|
||||||
(INPUT_DEVICE)mem_allocate ((MEM_SIZE)sizeof (INPUT_DESC), \
|
(INPUT_DEVICE)mem_allocate ((MEM_SIZE)sizeof (INPUT_DESC), \
|
||||||
|
|||||||
Reference in New Issue
Block a user