You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
166 lines
5.8 KiB
C
166 lines
5.8 KiB
C
//
|
|
// G A M E.O.N.E - LOW LEVEL LIB V1.0
|
|
// Copyright (C) 2001 LEVEL ONE ENTERTAINMENT,
|
|
// Licensed under the terms of LGPL.
|
|
//:---------------------------------------------------------------------------
|
|
//:Description
|
|
//
|
|
// LLGFX-BLITTER Funktionen
|
|
//
|
|
// SourceRect: Falls die SrcGrafik Frames besitzt, gibt rect die Framenummer ab #0 an
|
|
// ansonsten einen Zeiger auf ein SrcRect übergeben.
|
|
// Frames werden mit llgfx_SetFrameCount() gesetzt.
|
|
//:---------------------------------------------------------------------------
|
|
|
|
#if !defined(LLGFX_BLIT_INCLUDED)
|
|
#define LLGFX_BLIT_INCLUDED
|
|
|
|
#if !defined(LLGFX_INCLUDED)
|
|
#include "llgfx.h"
|
|
#endif
|
|
//:Custom
|
|
|
|
/*
|
|
* Blit FLAGS
|
|
*/
|
|
#define BLIT_COPY (1<<0) // Plain copy
|
|
#define BLIT_STRETCH (1<<1) // Stretchfactor in sBLITFX.scale angeben
|
|
#define BLIT_ROTATE (1<<2) // Grad 0-360 in sBLITFX.angle angeben
|
|
#define BLIT_RASTER (1<<3) // 50% copy "*.*.*"
|
|
#define BLIT_SRCALPHA (1<<5) // SrcGfx Alphachannel, Grafik muss mit LLGFX_CACHE Flag geladen sein!
|
|
#define BLIT_FIXALPHA (1<<6) // Blendet SrcGfx mit 0.0f - 1.0f Alpha Wert
|
|
#define BLIT_VD (1<<7) // Flag für Versatz und Clipping zum Virtuellen Display
|
|
#define BLIT_SRC_CENTERED (1<<8) // um den Mittelpunkt der Sourcegrafik versetzt.
|
|
#define BLIT_DST_CENTERED (1<<9) // SrcGfx wird genau in die Mitte der DstGrafik gesetzt. X/Y ist zusätzlicher Versatz
|
|
#define BLIT_SRC_COLORKEY (1<<10) // SRC Colorkey flag für drv_blit_BLITFast()
|
|
#define BLIT_MIRROR_X (1<<11) // flag für blitstretch ( negativ scale ergibt spiegeld)
|
|
#define BLIT_MIRROR_Y (1<<11) // flag für blitstretch ( negativ scale ergibt spiegeld)
|
|
#define BLIT_SCANLINES (1<<12) // jede 2te zeile wird ausgelassen
|
|
#define BLIT_FXADD (1<<13) // Addiert SrcGfx multipliziert mit Alphawert 0.0f - 1.0f
|
|
#define BLIT_FXSUB (1<<14) // Subtrahiert SrcGfx multipliziert mit Alphawert 0.0f - 1.0f
|
|
#define BLIT_FXMUL (1<<16) // Multipliziert SrcGfx multipliziert mit Alphawert 0.0f - 1.0f
|
|
#define BLIT_FXINVMUL (1<<17) // Multipliziert Inv SrcGfx multipliziert mit Alphawert 0.0f - 1.0f
|
|
#define BLIT_FXCOLOR (1<<18) // Color Overlay mit Alphawert 0.0f - 1.0f
|
|
#define BLIT_FXDIFF (1<<19) // Difference Src/Dst, Ergebnis multipliziert mit Alphawert 0.0f - 1.0f
|
|
#define BLIT_FXDARKEN (1<<20) // Min von Src und Dst multipliziert mit Alphawret 0.0f - 1.0f
|
|
#define BLIT_FXLIGHTEN (1<<21) // Max von Src und Dst multipliziert mit Alphawret 0.0f - 1.0f
|
|
#define BLIT_SPRITE (1<<22) // Blittet RandPixel mit BlendFunktion
|
|
|
|
typedef struct {
|
|
float angle; // 0-360 degrees
|
|
float scale_x; // 0.0f - x.f ( 1.0f = 1:1 copy )
|
|
float scale_y; // 0.0f - x.f ( 1.0f = 1:1 copy )
|
|
float fixalpha; // 0.0f(transparent) - 1.0f(opaque)
|
|
float sine; // rotation sin value by angle
|
|
float cosine; // rotation cosine value by angle
|
|
TxU32 color; // Farbwert
|
|
} llgfx_sBLITFX;
|
|
|
|
typedef struct {
|
|
void *gfxObjDst;
|
|
void *gfxObjSrc;
|
|
int x, y; // target x,y koords (topleft)
|
|
s_rect src_rect;
|
|
int blitflags;
|
|
llgfx_sBLITFX blitfx;
|
|
bool clipped; // true if clipped
|
|
s_rect *cliprect; // cliprect
|
|
s_rect dstrect; // dst clipped
|
|
s_rect dstrect_uc; // dst unclipped
|
|
s_rect srcrect; // src clipped
|
|
s_rect srcrect_uc; // src unclipped
|
|
} s_blitter;
|
|
|
|
//:> +------------------------------------+
|
|
//:>-------------------| Global Function Declarations |-------------------
|
|
//:> +------------------------------------+
|
|
|
|
int llgfx_BLIT(llgfx_id dest, // Destinantion GFX
|
|
llgfx_id src, // Source GFX
|
|
int x=0, // Dest POS
|
|
int y=0, // *
|
|
llgfx_sRECT *rect=0, // Sourcerect(Srcgfx), 0 = ganze Src-grafik
|
|
int blitflags=0, // Copy,stippeld,srcalpha,fixalpha
|
|
llgfx_sBLITFX *blitfx=0 // FixAlpha,Scale,etc
|
|
);
|
|
|
|
int llgfx_BLIT_DIRTY(
|
|
llgfx_id destgfx,
|
|
llgfx_id u_gfxnum);
|
|
|
|
int llgfx_VD_BLIT_DIRTY(llgfx_id srcgfx);
|
|
|
|
|
|
|
|
inline int llgfx_VD_BLIT(llgfx_id srcgfx,
|
|
int x=0,
|
|
int y=0,
|
|
llgfx_sRECT *srcrect=0,
|
|
int blitflags=0,
|
|
llgfx_sBLITFX *blitfx=0)
|
|
{
|
|
return llgfx_BLIT(0,srcgfx,x,y,srcrect,blitflags|BLIT_VD,blitfx);
|
|
}
|
|
|
|
inline int llgfx_VD_BLIT(llgfx_id dstgfx,
|
|
llgfx_id srcgfx,
|
|
int x=0,
|
|
int y=0,
|
|
llgfx_sRECT *srcrect=0,
|
|
int blitflags=0,
|
|
llgfx_sBLITFX *blitfx=0)
|
|
{
|
|
return llgfx_BLIT(dstgfx,srcgfx,x,y,srcrect,blitflags|BLIT_VD,blitfx);
|
|
}
|
|
|
|
|
|
int llgfx_BLITFast(
|
|
llgfx_id dest, // Zielgrafik
|
|
llgfx_id src,
|
|
int x=0, // xposition in der Zielgrafik
|
|
int y=0);
|
|
|
|
int llgfx_BLITFast(
|
|
llgfx_id dest, // Zielgrafik
|
|
llgfx_id src,
|
|
int x, // xposition in der Zielgrafik
|
|
int y, // yposition in der Zielgrafik
|
|
llgfx_sRECT *rect=0 // source rect
|
|
);
|
|
// +---------------------+
|
|
// | llgfx_TILE_BLIT() |
|
|
// +---------------------+
|
|
|
|
int llgfx_TILE_BLIT(
|
|
llgfx_id dstgfx,
|
|
llgfx_id srcgfx,
|
|
int start_offsetx=0,
|
|
int start_offsety=0,
|
|
llgfx_sRECT *srect=0,
|
|
int blitflags=0,
|
|
llgfx_sBLITFX *blitfx=0);
|
|
|
|
//::22
|
|
// +----------------------+
|
|
// | llgfx_SCALE_BLIT() |
|
|
// +----------------------+
|
|
int llgfx_SCALE_BLIT(
|
|
llgfx_id dstgfx,
|
|
llgfx_id srcgfx);
|
|
|
|
|
|
/*
|
|
* Erstellt eine rotierte Grafik vom srcgfx.
|
|
* Wenn srect==NULL, dann wird die ganze Grafik routiert,
|
|
* Wenn srect = (int)frame_number oder llgfx_sRECT* dann wird nur ein Teil rotiert
|
|
* Die zurückgeliefert Grafik ist immer ein wenig grösser als die Srcgrafik.
|
|
* Nach Gebrauch mit llgfx_ReleaseGFX freigeben.
|
|
* x_zoom und y_zoom können während dem rotieren noch strecken
|
|
*/
|
|
llgfx_id llgfx_ROTATE_BLIT(
|
|
llgfx_id src,
|
|
llgfx_sRECT * rect,
|
|
float angle, float x_zoom = 1.0f, float y_zoom = 1.0f );
|
|
|
|
#endif // LLGFX_BLIT_INCLUDED
|