First steps in modularization...
git-svn-id: svn://svn.code.sf.net/p/sc2/code/trunk@16 8092fc87-c524-0410-9efc-e669fe64eaf9
This commit is contained in:
@@ -0,0 +1,52 @@
|
|||||||
|
//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.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/******************************************
|
||||||
|
|
||||||
|
Star Control II: 3DO => SDL Port
|
||||||
|
|
||||||
|
Copyright Toys for Bob, 2002
|
||||||
|
|
||||||
|
Programmer: Chris Nelson
|
||||||
|
|
||||||
|
*******************************************/
|
||||||
|
|
||||||
|
|
||||||
|
#include "libs/graphics/gfxintrn.h"
|
||||||
|
#include "libs/input/inpintrn.h"
|
||||||
|
#include "libs/graphics/gfx_common.h"
|
||||||
|
|
||||||
|
|
||||||
|
#define NUMBER_OF_PLUTVALS 32
|
||||||
|
#define NUMBER_OF_PLUT_UINT32s (NUMBER_OF_PLUTVALS >> 1)
|
||||||
|
#define GET_VAR_PLUT(i) (_varPLUTs + (i) * NUMBER_OF_PLUT_UINT32s)
|
||||||
|
DWORD* _varPLUTs; //Not a function
|
||||||
|
PDISPLAY_INTERFACE _pCurDisplay; //Not a function. Probably has to be initialized...
|
||||||
|
|
||||||
|
void (*mask_func_array[])
|
||||||
|
(PRECT pClipRect, PRIMITIVEPTR PrimPtr)
|
||||||
|
= { 0 };
|
||||||
|
|
||||||
|
int ScreenWidth;
|
||||||
|
int ScreenHeight;
|
||||||
|
int ScreenWidthActual;
|
||||||
|
int ScreenHeightActual;
|
||||||
|
int ScreenBPPActual;
|
||||||
|
|
||||||
|
int TFB_DEBUG_HALT;
|
||||||
|
|
||||||
@@ -0,0 +1,228 @@
|
|||||||
|
//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.
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
/****************************************
|
||||||
|
|
||||||
|
Star Control II: 3DO => SDL Port
|
||||||
|
|
||||||
|
Copyright Toys for Bob, 2002
|
||||||
|
|
||||||
|
Programmer: Chris Nelson
|
||||||
|
|
||||||
|
*****************************************/
|
||||||
|
|
||||||
|
|
||||||
|
#ifndef GFX_COMMON_H
|
||||||
|
#define GFX_COMMON_H
|
||||||
|
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <math.h>
|
||||||
|
|
||||||
|
#include "starcon.h"
|
||||||
|
#include "libs/gfxlib.h"
|
||||||
|
#include "libs/vidlib.h"
|
||||||
|
#include "libs/misc.h"
|
||||||
|
|
||||||
|
|
||||||
|
int Main(int argc, char *argv[]);
|
||||||
|
int Starcon2Main (void *);
|
||||||
|
|
||||||
|
// Graphics Stuff
|
||||||
|
|
||||||
|
void LoadIntoExtraScreen (PRECT r);
|
||||||
|
void DrawFromExtraScreen (PRECT r);
|
||||||
|
void SetGraphicStrength (int numer, int denom);
|
||||||
|
void SetGraphicGrabOther (int grab_other);
|
||||||
|
void SetGraphicScale (int scale);
|
||||||
|
void SetGraphicUseOtherExtra (int other);
|
||||||
|
void *GetScreenBitmap ();
|
||||||
|
void ScreenTransition (int transition, PRECT pRect);
|
||||||
|
void ScreenOrigin (FRAME Display, COORD sx, COORD sy);
|
||||||
|
|
||||||
|
extern float FrameRate;
|
||||||
|
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;
|
||||||
|
|
||||||
|
enum
|
||||||
|
{
|
||||||
|
TFB_DRAWCOMMANDTYPE_LINE,
|
||||||
|
TFB_DRAWCOMMANDTYPE_RECTANGLE,
|
||||||
|
TFB_DRAWCOMMANDTYPE_IMAGE,
|
||||||
|
TFB_DRAWCOMMANDTYPE_COPYFROMOTHERBUFFER,
|
||||||
|
|
||||||
|
TFB_DRAWCOMMANDTYPE_SCISSORENABLE,
|
||||||
|
TFB_DRAWCOMMANDTYPE_SCISSORDISABLE,
|
||||||
|
TFB_DRAWCOMMANDTYPE_COPYBACKBUFFERTOOTHERBUFFER,
|
||||||
|
TFB_DRAWCOMMANDTYPE_DELETEIMAGE,
|
||||||
|
};
|
||||||
|
|
||||||
|
typedef struct tfb_drawcommand
|
||||||
|
{
|
||||||
|
int Type;
|
||||||
|
int x;
|
||||||
|
int y;
|
||||||
|
int w;
|
||||||
|
int h;
|
||||||
|
TFB_ImageStruct *image; // only used for image draw type
|
||||||
|
int r; // RGB only used for rect draw types
|
||||||
|
int g;
|
||||||
|
int b;
|
||||||
|
int Qualifier;
|
||||||
|
} TFB_DrawCommand;
|
||||||
|
|
||||||
|
// Queue Stuff
|
||||||
|
|
||||||
|
typedef struct tfb_drawcommandqueue
|
||||||
|
{
|
||||||
|
int Front;
|
||||||
|
int Back;
|
||||||
|
int Size;
|
||||||
|
} TFB_DrawCommandQueue;
|
||||||
|
|
||||||
|
TFB_DrawCommandQueue *TFB_DrawCommandQueue_Create ();
|
||||||
|
|
||||||
|
void TFB_DrawCommandQueue_Push (TFB_DrawCommandQueue* myQueue,
|
||||||
|
TFB_DrawCommand* Command);
|
||||||
|
|
||||||
|
int TFB_DrawCommandQueue_Pop (TFB_DrawCommandQueue* myQueue,
|
||||||
|
TFB_DrawCommand* Command);
|
||||||
|
|
||||||
|
void TFB_DeallocateDrawCommand (TFB_DrawCommand* Command);
|
||||||
|
|
||||||
|
extern TFB_DrawCommandQueue *DrawCommandQueue;
|
||||||
|
|
||||||
|
// The TFB_Enqueue* functions are necessary, because only the
|
||||||
|
// main thread can draw to the window.
|
||||||
|
|
||||||
|
void TFB_EnqueueDrawCommand (TFB_DrawCommand* DrawCommand);
|
||||||
|
void TFB_FlushGraphics (); // 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
|
||||||
|
|
||||||
|
extern int ScreenWidth;
|
||||||
|
extern int ScreenHeight;
|
||||||
|
extern int ScreenWidthActual;
|
||||||
|
extern int ScreenHeightActual;
|
||||||
|
extern int ScreenBPPActual;
|
||||||
|
|
||||||
|
#endif
|
||||||
@@ -0,0 +1,22 @@
|
|||||||
|
|
||||||
|
# Automake template file.
|
||||||
|
# Written by Mudry <mudry@user.sf.net>, protected by GNU GPL.
|
||||||
|
# CVS $ Id: $
|
||||||
|
|
||||||
|
SUBDIRS = opengl pure
|
||||||
|
|
||||||
|
CFLAGS = -Wall
|
||||||
|
|
||||||
|
INCLUDES = @SDL_CFLAGS@ @SMPEG_CFLAGS@ \
|
||||||
|
-I$(top_srcdir)/src \
|
||||||
|
-I$(top_srcdir)/src/sc2code \
|
||||||
|
-I$(top_srcdir)/src/sc2code/libs
|
||||||
|
|
||||||
|
noinst_LTLIBRARIES = libsdl.la
|
||||||
|
|
||||||
|
libsdl_la_SOURCES = sdl_common.c rotozoom.c
|
||||||
|
|
||||||
|
libsdl_la_LIBADD = opengl/libopengl.la pure/libpure.la
|
||||||
|
|
||||||
|
noinst_HEADERS = sdl_common.h rotozoom.h
|
||||||
|
|
||||||
@@ -0,0 +1,938 @@
|
|||||||
|
/*
|
||||||
|
|
||||||
|
rotozoom.c - rotozoomer for 32bit or 8bit surfaces
|
||||||
|
LGPL (c) A. Schiffler
|
||||||
|
|
||||||
|
Note by sc2 developers:
|
||||||
|
Taken from SDL_gfx library and modified, original code can be downloaded
|
||||||
|
from http://www.ferzkopp.net/Software/SDL_gfx-2.0/
|
||||||
|
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <string.h>
|
||||||
|
|
||||||
|
#include "rotozoom.h"
|
||||||
|
|
||||||
|
#define MAX(a,b) (((a) > (b)) ? (a) : (b))
|
||||||
|
|
||||||
|
/*
|
||||||
|
|
||||||
|
32bit Zoomer with optional anti-aliasing by bilinear interpolation.
|
||||||
|
|
||||||
|
Zoomes 32bit RGBA/ABGR 'src' surface to 'dst' surface.
|
||||||
|
|
||||||
|
*/
|
||||||
|
|
||||||
|
int zoomSurfaceRGBA(SDL_Surface * src, SDL_Surface * dst, int smooth)
|
||||||
|
{
|
||||||
|
int x, y, sx, sy, *sax, *say, *csax, *csay, csx, csy, ex, ey, t1, t2, sstep;
|
||||||
|
tColorRGBA *c00, *c01, *c10, *c11;
|
||||||
|
tColorRGBA *sp, *csp, *dp;
|
||||||
|
int sgap, dgap;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Variable setup
|
||||||
|
*/
|
||||||
|
if (smooth) {
|
||||||
|
/*
|
||||||
|
* For interpolation: assume source dimension is one pixel
|
||||||
|
*/
|
||||||
|
/*
|
||||||
|
* smaller to avoid overflow on right and bottom edge.
|
||||||
|
*/
|
||||||
|
sx = (int) (65536.0 * (float) (src->w - 1) / (float) dst->w);
|
||||||
|
sy = (int) (65536.0 * (float) (src->h - 1) / (float) dst->h);
|
||||||
|
} else {
|
||||||
|
sx = (int) (65536.0 * (float) src->w / (float) dst->w);
|
||||||
|
sy = (int) (65536.0 * (float) src->h / (float) dst->h);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Allocate memory for row increments
|
||||||
|
*/
|
||||||
|
if ((sax = (int *) malloc((dst->w + 1) * sizeof(Uint32))) == NULL) {
|
||||||
|
return (-1);
|
||||||
|
}
|
||||||
|
if ((say = (int *) malloc((dst->h + 1) * sizeof(Uint32))) == NULL) {
|
||||||
|
free(sax);
|
||||||
|
return (-1);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Precalculate row increments
|
||||||
|
*/
|
||||||
|
csx = 0;
|
||||||
|
csax = sax;
|
||||||
|
for (x = 0; x <= dst->w; x++) {
|
||||||
|
*csax = csx;
|
||||||
|
csax++;
|
||||||
|
csx &= 0xffff;
|
||||||
|
csx += sx;
|
||||||
|
}
|
||||||
|
csy = 0;
|
||||||
|
csay = say;
|
||||||
|
for (y = 0; y <= dst->h; y++) {
|
||||||
|
*csay = csy;
|
||||||
|
csay++;
|
||||||
|
csy &= 0xffff;
|
||||||
|
csy += sy;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Pointer setup
|
||||||
|
*/
|
||||||
|
sp = csp = (tColorRGBA *) src->pixels;
|
||||||
|
dp = (tColorRGBA *) dst->pixels;
|
||||||
|
sgap = src->pitch - src->w * 4;
|
||||||
|
dgap = dst->pitch - dst->w * 4;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Switch between interpolating and non-interpolating code
|
||||||
|
*/
|
||||||
|
if (smooth) {
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Interpolating Zoom
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Scan destination
|
||||||
|
*/
|
||||||
|
csay = say;
|
||||||
|
for (y = 0; y < dst->h; y++) {
|
||||||
|
/*
|
||||||
|
* Setup color source pointers
|
||||||
|
*/
|
||||||
|
c00 = csp;
|
||||||
|
c01 = csp;
|
||||||
|
c01++;
|
||||||
|
c10 = (tColorRGBA *) ((Uint8 *) csp + src->pitch);
|
||||||
|
c11 = c10;
|
||||||
|
c11++;
|
||||||
|
csax = sax;
|
||||||
|
for (x = 0; x < dst->w; x++) {
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Interpolate colors
|
||||||
|
*/
|
||||||
|
ex = (*csax & 0xffff);
|
||||||
|
ey = (*csay & 0xffff);
|
||||||
|
t1 = ((((c01->r - c00->r) * ex) >> 16) + c00->r) & 0xff;
|
||||||
|
t2 = ((((c11->r - c10->r) * ex) >> 16) + c10->r) & 0xff;
|
||||||
|
dp->r = (((t2 - t1) * ey) >> 16) + t1;
|
||||||
|
t1 = ((((c01->g - c00->g) * ex) >> 16) + c00->g) & 0xff;
|
||||||
|
t2 = ((((c11->g - c10->g) * ex) >> 16) + c10->g) & 0xff;
|
||||||
|
dp->g = (((t2 - t1) * ey) >> 16) + t1;
|
||||||
|
t1 = ((((c01->b - c00->b) * ex) >> 16) + c00->b) & 0xff;
|
||||||
|
t2 = ((((c11->b - c10->b) * ex) >> 16) + c10->b) & 0xff;
|
||||||
|
dp->b = (((t2 - t1) * ey) >> 16) + t1;
|
||||||
|
t1 = ((((c01->a - c00->a) * ex) >> 16) + c00->a) & 0xff;
|
||||||
|
t2 = ((((c11->a - c10->a) * ex) >> 16) + c10->a) & 0xff;
|
||||||
|
dp->a = (((t2 - t1) * ey) >> 16) + t1;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Advance source pointers
|
||||||
|
*/
|
||||||
|
csax++;
|
||||||
|
sstep = (*csax >> 16);
|
||||||
|
c00 += sstep;
|
||||||
|
c01 += sstep;
|
||||||
|
c10 += sstep;
|
||||||
|
c11 += sstep;
|
||||||
|
/*
|
||||||
|
* Advance destination pointer
|
||||||
|
*/
|
||||||
|
dp++;
|
||||||
|
}
|
||||||
|
/*
|
||||||
|
* Advance source pointer
|
||||||
|
*/
|
||||||
|
csay++;
|
||||||
|
csp = (tColorRGBA *) ((Uint8 *) csp + (*csay >> 16) * src->pitch);
|
||||||
|
/*
|
||||||
|
* Advance destination pointers
|
||||||
|
*/
|
||||||
|
dp = (tColorRGBA *) ((Uint8 *) dp + dgap);
|
||||||
|
}
|
||||||
|
|
||||||
|
} else {
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Non-Interpolating Zoom
|
||||||
|
*/
|
||||||
|
|
||||||
|
csay = say;
|
||||||
|
for (y = 0; y < dst->h; y++) {
|
||||||
|
sp = csp;
|
||||||
|
csax = sax;
|
||||||
|
for (x = 0; x < dst->w; x++) {
|
||||||
|
/*
|
||||||
|
* Draw
|
||||||
|
*/
|
||||||
|
*dp = *sp;
|
||||||
|
/*
|
||||||
|
* Advance source pointers
|
||||||
|
*/
|
||||||
|
csax++;
|
||||||
|
sp += (*csax >> 16);
|
||||||
|
/*
|
||||||
|
* Advance destination pointer
|
||||||
|
*/
|
||||||
|
dp++;
|
||||||
|
}
|
||||||
|
/*
|
||||||
|
* Advance source pointer
|
||||||
|
*/
|
||||||
|
csay++;
|
||||||
|
csp = (tColorRGBA *) ((Uint8 *) csp + (*csay >> 16) * src->pitch);
|
||||||
|
/*
|
||||||
|
* Advance destination pointers
|
||||||
|
*/
|
||||||
|
dp = (tColorRGBA *) ((Uint8 *) dp + dgap);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Remove temp arrays
|
||||||
|
*/
|
||||||
|
free(sax);
|
||||||
|
free(say);
|
||||||
|
|
||||||
|
return (0);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
|
||||||
|
8bit Zoomer without smoothing.
|
||||||
|
|
||||||
|
Zoomes 8bit palette/Y 'src' surface to 'dst' surface.
|
||||||
|
|
||||||
|
*/
|
||||||
|
|
||||||
|
int zoomSurfaceY(SDL_Surface * src, SDL_Surface * dst)
|
||||||
|
{
|
||||||
|
Uint32 x, y, sx, sy, *sax, *say, *csax, *csay, csx, csy;
|
||||||
|
Uint8 *sp, *dp, *csp;
|
||||||
|
int dgap;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Variable setup
|
||||||
|
*/
|
||||||
|
sx = (Uint32) (65536.0 * (float) src->w / (float) dst->w);
|
||||||
|
sy = (Uint32) (65536.0 * (float) src->h / (float) dst->h);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Allocate memory for row increments
|
||||||
|
*/
|
||||||
|
if ((sax = (Uint32 *) malloc(dst->w * sizeof(Uint32))) == NULL) {
|
||||||
|
return (-1);
|
||||||
|
}
|
||||||
|
if ((say = (Uint32 *) malloc(dst->h * sizeof(Uint32))) == NULL) {
|
||||||
|
if (sax != NULL) {
|
||||||
|
free(sax);
|
||||||
|
}
|
||||||
|
return (-1);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Precalculate row increments
|
||||||
|
*/
|
||||||
|
csx = 0;
|
||||||
|
csax = sax;
|
||||||
|
for (x = 0; x < dst->w; x++) {
|
||||||
|
csx += sx;
|
||||||
|
*csax = (csx >> 16);
|
||||||
|
csx &= 0xffff;
|
||||||
|
csax++;
|
||||||
|
}
|
||||||
|
csy = 0;
|
||||||
|
csay = say;
|
||||||
|
for (y = 0; y < dst->h; y++) {
|
||||||
|
csy += sy;
|
||||||
|
*csay = (csy >> 16);
|
||||||
|
csy &= 0xffff;
|
||||||
|
csay++;
|
||||||
|
}
|
||||||
|
|
||||||
|
csx = 0;
|
||||||
|
csax = sax;
|
||||||
|
for (x = 0; x < dst->w; x++) {
|
||||||
|
csx += (*csax);
|
||||||
|
csax++;
|
||||||
|
}
|
||||||
|
csy = 0;
|
||||||
|
csay = say;
|
||||||
|
for (y = 0; y < dst->h; y++) {
|
||||||
|
csy += (*csay);
|
||||||
|
csay++;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Pointer setup
|
||||||
|
*/
|
||||||
|
sp = csp = (Uint8 *) src->pixels;
|
||||||
|
dp = (Uint8 *) dst->pixels;
|
||||||
|
dgap = dst->pitch - dst->w;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Draw
|
||||||
|
*/
|
||||||
|
csay = say;
|
||||||
|
for (y = 0; y < dst->h; y++) {
|
||||||
|
csax = sax;
|
||||||
|
sp = csp;
|
||||||
|
for (x = 0; x < dst->w; x++) {
|
||||||
|
/*
|
||||||
|
* Draw
|
||||||
|
*/
|
||||||
|
*dp = *sp;
|
||||||
|
/*
|
||||||
|
* Advance source pointers
|
||||||
|
*/
|
||||||
|
sp += (*csax);
|
||||||
|
csax++;
|
||||||
|
/*
|
||||||
|
* Advance destination pointer
|
||||||
|
*/
|
||||||
|
dp++;
|
||||||
|
}
|
||||||
|
/*
|
||||||
|
* Advance source pointer (for row)
|
||||||
|
*/
|
||||||
|
csp += ((*csay) * src->pitch);
|
||||||
|
csay++;
|
||||||
|
/*
|
||||||
|
* Advance destination pointers
|
||||||
|
*/
|
||||||
|
dp += dgap;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Remove temp arrays
|
||||||
|
*/
|
||||||
|
free(sax);
|
||||||
|
free(say);
|
||||||
|
|
||||||
|
return (0);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
|
||||||
|
32bit Rotozoomer with optional anti-aliasing by bilinear interpolation.
|
||||||
|
|
||||||
|
Rotates and zoomes 32bit RGBA/ABGR 'src' surface to 'dst' surface.
|
||||||
|
|
||||||
|
*/
|
||||||
|
|
||||||
|
void transformSurfaceRGBA(SDL_Surface * src, SDL_Surface * dst, int cx, int cy, int isin, int icos, int smooth)
|
||||||
|
{
|
||||||
|
int x, y, t1, t2, dx, dy, xd, yd, sdx, sdy, ax, ay, ex, ey, sw, sh;
|
||||||
|
tColorRGBA c00, c01, c10, c11;
|
||||||
|
tColorRGBA *pc, *sp, *spb;
|
||||||
|
int gap;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Variable setup
|
||||||
|
*/
|
||||||
|
xd = ((src->w - dst->w) << 15);
|
||||||
|
yd = ((src->h - dst->h) << 15);
|
||||||
|
ax = (cx << 16) - (icos * cx);
|
||||||
|
ay = (cy << 16) - (isin * cx);
|
||||||
|
sw = src->w - 1;
|
||||||
|
sh = src->h - 1;
|
||||||
|
pc = dst->pixels;
|
||||||
|
gap = dst->pitch - dst->w * 4;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Switch between interpolating and non-interpolating code
|
||||||
|
*/
|
||||||
|
if (smooth) {
|
||||||
|
for (y = 0; y < dst->h; y++) {
|
||||||
|
dy = cy - y;
|
||||||
|
sdx = (ax + (isin * dy)) + xd;
|
||||||
|
sdy = (ay - (icos * dy)) + yd;
|
||||||
|
for (x = 0; x < dst->w; x++) {
|
||||||
|
dx = (sdx >> 16);
|
||||||
|
dy = (sdy >> 16);
|
||||||
|
if ((dx >= -1) && (dy >= -1) && (dx < src->w) && (dy < src->h)) {
|
||||||
|
if ((dx >= 0) && (dy >= 0) && (dx < sw) && (dy < sh)) {
|
||||||
|
sp = (tColorRGBA *) ((Uint8 *) src->pixels + src->pitch * dy);
|
||||||
|
sp += dx;
|
||||||
|
c00 = *sp;
|
||||||
|
sp += 1;
|
||||||
|
c01 = *sp;
|
||||||
|
sp = (tColorRGBA *) ((Uint8 *) sp + src->pitch);
|
||||||
|
sp -= 1;
|
||||||
|
c10 = *sp;
|
||||||
|
sp += 1;
|
||||||
|
c11 = *sp;
|
||||||
|
} else if ((dx == sw) && (dy == sh)) {
|
||||||
|
sp = (tColorRGBA *) ((Uint8 *) src->pixels + src->pitch * dy);
|
||||||
|
sp += dx;
|
||||||
|
c00 = *sp;
|
||||||
|
c01 = *sp;
|
||||||
|
c10 = *sp;
|
||||||
|
c11 = *sp;
|
||||||
|
} else if ((dx == -1) && (dy == -1)) {
|
||||||
|
sp = (tColorRGBA *) (src->pixels);
|
||||||
|
c00 = *sp;
|
||||||
|
c01 = *sp;
|
||||||
|
c10 = *sp;
|
||||||
|
c11 = *sp;
|
||||||
|
} else if ((dx == -1) && (dy == sh)) {
|
||||||
|
sp = (tColorRGBA *) (src->pixels);
|
||||||
|
sp = (tColorRGBA *) ((Uint8 *) src->pixels + src->pitch * dy);
|
||||||
|
c00 = *sp;
|
||||||
|
c01 = *sp;
|
||||||
|
c10 = *sp;
|
||||||
|
c11 = *sp;
|
||||||
|
} else if ((dx == sw) && (dy == -1)) {
|
||||||
|
sp = (tColorRGBA *) (src->pixels);
|
||||||
|
sp += dx;
|
||||||
|
c00 = *sp;
|
||||||
|
c01 = *sp;
|
||||||
|
c10 = *sp;
|
||||||
|
c11 = *sp;
|
||||||
|
} else if (dx == -1) {
|
||||||
|
sp = (tColorRGBA *) ((Uint8 *) src->pixels + src->pitch * dy);
|
||||||
|
c00 = *sp;
|
||||||
|
c01 = *sp;
|
||||||
|
c10 = *sp;
|
||||||
|
sp = (tColorRGBA *) ((Uint8 *) sp + src->pitch);
|
||||||
|
c11 = *sp;
|
||||||
|
} else if (dy == -1) {
|
||||||
|
sp = (tColorRGBA *) (src->pixels);
|
||||||
|
sp += dx;
|
||||||
|
c00 = *sp;
|
||||||
|
c01 = *sp;
|
||||||
|
c10 = *sp;
|
||||||
|
sp += 1;
|
||||||
|
c11 = *sp;
|
||||||
|
} else if (dx == sw) {
|
||||||
|
sp = (tColorRGBA *) ((Uint8 *) src->pixels + src->pitch * dy);
|
||||||
|
sp += dx;
|
||||||
|
c00 = *sp;
|
||||||
|
c01 = *sp;
|
||||||
|
sp = (tColorRGBA *) ((Uint8 *) sp + src->pitch);
|
||||||
|
c10 = *sp;
|
||||||
|
c11 = *sp;
|
||||||
|
} else if (dy == sh) {
|
||||||
|
sp = (tColorRGBA *) ((Uint8 *) src->pixels + src->pitch * dy);
|
||||||
|
sp += dx;
|
||||||
|
c00 = *sp;
|
||||||
|
sp += 1;
|
||||||
|
c01 = *sp;
|
||||||
|
c10 = *sp;
|
||||||
|
c11 = *sp;
|
||||||
|
}
|
||||||
|
/*
|
||||||
|
* Interpolate colors
|
||||||
|
*/
|
||||||
|
ex = (sdx & 0xffff);
|
||||||
|
ey = (sdy & 0xffff);
|
||||||
|
t1 = ((((c01.r - c00.r) * ex) >> 16) + c00.r) & 0xff;
|
||||||
|
t2 = ((((c11.r - c10.r) * ex) >> 16) + c10.r) & 0xff;
|
||||||
|
pc->r = (((t2 - t1) * ey) >> 16) + t1;
|
||||||
|
t1 = ((((c01.g - c00.g) * ex) >> 16) + c00.g) & 0xff;
|
||||||
|
t2 = ((((c11.g - c10.g) * ex) >> 16) + c10.g) & 0xff;
|
||||||
|
pc->g = (((t2 - t1) * ey) >> 16) + t1;
|
||||||
|
t1 = ((((c01.b - c00.b) * ex) >> 16) + c00.b) & 0xff;
|
||||||
|
t2 = ((((c11.b - c10.b) * ex) >> 16) + c10.b) & 0xff;
|
||||||
|
pc->b = (((t2 - t1) * ey) >> 16) + t1;
|
||||||
|
t1 = ((((c01.a - c00.a) * ex) >> 16) + c00.a) & 0xff;
|
||||||
|
t2 = ((((c11.a - c10.a) * ex) >> 16) + c10.a) & 0xff;
|
||||||
|
pc->a = (((t2 - t1) * ey) >> 16) + t1;
|
||||||
|
}
|
||||||
|
sdx += icos;
|
||||||
|
sdy += isin;
|
||||||
|
pc++;
|
||||||
|
}
|
||||||
|
pc = (tColorRGBA *) ((Uint8 *) pc + gap);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
for (y = 0; y < dst->h; y++) {
|
||||||
|
dy = cy - y;
|
||||||
|
sdx = (ax + (isin * dy)) + xd;
|
||||||
|
sdy = (ay - (icos * dy)) + yd;
|
||||||
|
for (x = 0; x < dst->w; x++) {
|
||||||
|
dx = (short) (sdx >> 16);
|
||||||
|
dy = (short) (sdy >> 16);
|
||||||
|
if ((dx >= 0) && (dy >= 0) && (dx < src->w) && (dy < src->h)) {
|
||||||
|
sp = (tColorRGBA *) ((Uint8 *) src->pixels + src->pitch * dy);
|
||||||
|
sp += dx;
|
||||||
|
*pc = *sp;
|
||||||
|
}
|
||||||
|
sdx += icos;
|
||||||
|
sdy += isin;
|
||||||
|
pc++;
|
||||||
|
}
|
||||||
|
pc = (tColorRGBA *) ((Uint8 *) pc + gap);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
|
||||||
|
8bit Rotozoomer without smoothing
|
||||||
|
|
||||||
|
Rotates and zoomes 8bit palette/Y 'src' surface to 'dst' surface.
|
||||||
|
|
||||||
|
*/
|
||||||
|
|
||||||
|
void transformSurfaceY(SDL_Surface * src, SDL_Surface * dst, int cx, int cy, int isin, int icos)
|
||||||
|
{
|
||||||
|
int x, y, dx, dy, xd, yd, sdx, sdy, ax, ay, sw, sh;
|
||||||
|
tColorY *pc, *sp;
|
||||||
|
int gap;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Variable setup
|
||||||
|
*/
|
||||||
|
xd = ((src->w - dst->w) << 15);
|
||||||
|
yd = ((src->h - dst->h) << 15);
|
||||||
|
ax = (cx << 16) - (icos * cx);
|
||||||
|
ay = (cy << 16) - (isin * cx);
|
||||||
|
sw = src->w - 1;
|
||||||
|
sh = src->h - 1;
|
||||||
|
pc = dst->pixels;
|
||||||
|
gap = dst->pitch - dst->w;
|
||||||
|
/*
|
||||||
|
* Clear surface to colorkey
|
||||||
|
*/
|
||||||
|
memset(pc, (unsigned char) (src->format->colorkey & 0xff), dst->pitch * dst->h);
|
||||||
|
/*
|
||||||
|
* Iterate through destination surface
|
||||||
|
*/
|
||||||
|
for (y = 0; y < dst->h; y++) {
|
||||||
|
dy = cy - y;
|
||||||
|
sdx = (ax + (isin * dy)) + xd;
|
||||||
|
sdy = (ay - (icos * dy)) + yd;
|
||||||
|
for (x = 0; x < dst->w; x++) {
|
||||||
|
dx = (short) (sdx >> 16);
|
||||||
|
dy = (short) (sdy >> 16);
|
||||||
|
if ((dx >= 0) && (dy >= 0) && (dx < src->w) && (dy < src->h)) {
|
||||||
|
sp = (tColorY *) (src->pixels);
|
||||||
|
sp += (src->pitch * dy + dx);
|
||||||
|
*pc = *sp;
|
||||||
|
}
|
||||||
|
sdx += icos;
|
||||||
|
sdy += isin;
|
||||||
|
pc++;
|
||||||
|
}
|
||||||
|
pc += gap;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
|
||||||
|
rotozoomSurface()
|
||||||
|
|
||||||
|
Rotates and zoomes a 32bit or 8bit 'src' surface to newly created 'dst' surface.
|
||||||
|
'angle' is the rotation in degrees. 'zoom' a scaling factor. If 'smooth' is 1
|
||||||
|
then the destination 32bit surface is anti-aliased. If the surface is not 8bit
|
||||||
|
or 32bit RGBA/ABGR it will be converted into a 32bit RGBA format on the fly.
|
||||||
|
|
||||||
|
*/
|
||||||
|
|
||||||
|
#define VALUE_LIMIT 0.001
|
||||||
|
|
||||||
|
|
||||||
|
/* Local rotozoom-size function with trig result return */
|
||||||
|
|
||||||
|
void rotozoomSurfaceSizeTrig(int width, int height, double angle, double zoom, int *dstwidth, int *dstheight,
|
||||||
|
double *canglezoom, double *sanglezoom)
|
||||||
|
{
|
||||||
|
double x, y, cx, cy, sx, sy;
|
||||||
|
double radangle;
|
||||||
|
int dstwidthhalf, dstheighthalf;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Determine destination width and height by rotating a centered source box
|
||||||
|
*/
|
||||||
|
radangle = angle * (M_PI / 180.0);
|
||||||
|
*sanglezoom = sin(radangle);
|
||||||
|
*canglezoom = cos(radangle);
|
||||||
|
*sanglezoom *= zoom;
|
||||||
|
*canglezoom *= zoom;
|
||||||
|
x = width / 2;
|
||||||
|
y = height / 2;
|
||||||
|
cx = *canglezoom * x;
|
||||||
|
cy = *canglezoom * y;
|
||||||
|
sx = *sanglezoom * x;
|
||||||
|
sy = *sanglezoom * y;
|
||||||
|
dstwidthhalf = MAX((int)
|
||||||
|
ceil(MAX(MAX(MAX(fabs(cx + sy), fabs(cx - sy)), fabs(-cx + sy)), fabs(-cx - sy))), 1);
|
||||||
|
dstheighthalf = MAX((int)
|
||||||
|
ceil(MAX(MAX(MAX(fabs(sx + cy), fabs(sx - cy)), fabs(-sx + cy)), fabs(-sx - cy))), 1);
|
||||||
|
*dstwidth = 2 * dstwidthhalf;
|
||||||
|
*dstheight = 2 * dstheighthalf;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/* Publically available rotozoom-size function */
|
||||||
|
|
||||||
|
void rotozoomSurfaceSize(int width, int height, double angle, double zoom, int *dstwidth, int *dstheight)
|
||||||
|
{
|
||||||
|
double dummy_sanglezoom, dummy_canglezoom;
|
||||||
|
|
||||||
|
rotozoomSurfaceSizeTrig(width, height, angle, zoom, dstwidth, dstheight, &dummy_sanglezoom, &dummy_canglezoom);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/* Publically available rotozoom function */
|
||||||
|
|
||||||
|
SDL_Surface *rotozoomSurface(SDL_Surface * src, double angle, double zoom, int smooth)
|
||||||
|
{
|
||||||
|
SDL_Surface *rz_src;
|
||||||
|
SDL_Surface *rz_dst;
|
||||||
|
double zoominv;
|
||||||
|
double sanglezoom, canglezoom, sanglezoominv, canglezoominv;
|
||||||
|
int dstwidthhalf, dstwidth, dstheighthalf, dstheight;
|
||||||
|
double x, y, cx, cy, sx, sy;
|
||||||
|
int is32bit;
|
||||||
|
int i, src_converted;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Sanity check
|
||||||
|
*/
|
||||||
|
if (src == NULL)
|
||||||
|
return (NULL);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Determine if source surface is 32bit or 8bit
|
||||||
|
*/
|
||||||
|
is32bit = (src->format->BitsPerPixel == 32);
|
||||||
|
if ((is32bit) || (src->format->BitsPerPixel == 8)) {
|
||||||
|
/*
|
||||||
|
* Use source surface 'as is'
|
||||||
|
*/
|
||||||
|
rz_src = src;
|
||||||
|
src_converted = 0;
|
||||||
|
} else {
|
||||||
|
/*
|
||||||
|
* New source surface is 32bit with a defined RGBA ordering
|
||||||
|
*/
|
||||||
|
rz_src =
|
||||||
|
SDL_CreateRGBSurface(SDL_SWSURFACE, src->w, src->h, 32, 0x000000ff, 0x0000ff00, 0x00ff0000, 0xff000000);
|
||||||
|
SDL_BlitSurface(src, NULL, rz_src, NULL);
|
||||||
|
src_converted = 1;
|
||||||
|
is32bit = 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Sanity check zoom factor
|
||||||
|
*/
|
||||||
|
if (zoom < VALUE_LIMIT) {
|
||||||
|
zoom = VALUE_LIMIT;
|
||||||
|
}
|
||||||
|
zoominv = 65536.0 / (zoom * zoom);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Check if we have a rotozoom or just a zoom
|
||||||
|
*/
|
||||||
|
if (fabs(angle) > VALUE_LIMIT) {
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Angle!=0: full rotozoom
|
||||||
|
*/
|
||||||
|
/*
|
||||||
|
* -----------------------
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* Determine target size */
|
||||||
|
rotozoomSurfaceSizeTrig(rz_src->w, rz_src->h, angle, zoom, &dstwidth, &dstheight, &canglezoom, &sanglezoom);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Calculate target factors from sin/cos and zoom
|
||||||
|
*/
|
||||||
|
sanglezoominv = sanglezoom;
|
||||||
|
canglezoominv = canglezoom;
|
||||||
|
sanglezoominv *= zoominv;
|
||||||
|
canglezoominv *= zoominv;
|
||||||
|
|
||||||
|
/* Calculate half size */
|
||||||
|
dstwidthhalf = dstwidth / 2;
|
||||||
|
dstheighthalf = dstheight / 2;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Alloc space to completely contain the rotated surface
|
||||||
|
*/
|
||||||
|
rz_dst = NULL;
|
||||||
|
if (is32bit) {
|
||||||
|
/*
|
||||||
|
* Target surface is 32bit with source RGBA/ABGR ordering
|
||||||
|
*/
|
||||||
|
rz_dst =
|
||||||
|
SDL_CreateRGBSurface(SDL_SWSURFACE, dstwidth, dstheight, 32,
|
||||||
|
rz_src->format->Rmask, rz_src->format->Gmask,
|
||||||
|
rz_src->format->Bmask, rz_src->format->Amask);
|
||||||
|
} else {
|
||||||
|
/*
|
||||||
|
* Target surface is 8bit
|
||||||
|
*/
|
||||||
|
rz_dst = SDL_CreateRGBSurface(SDL_SWSURFACE, dstwidth, dstheight, 8, 0, 0, 0, 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Lock source surface
|
||||||
|
*/
|
||||||
|
SDL_LockSurface(rz_src);
|
||||||
|
/*
|
||||||
|
* Check which kind of surface we have
|
||||||
|
*/
|
||||||
|
if (is32bit) {
|
||||||
|
/*
|
||||||
|
* Call the 32bit transformation routine to do the rotation (using alpha)
|
||||||
|
*/
|
||||||
|
transformSurfaceRGBA(rz_src, rz_dst, dstwidthhalf, dstheighthalf,
|
||||||
|
(int) (sanglezoominv), (int) (canglezoominv), smooth);
|
||||||
|
/*
|
||||||
|
* Turn on source-alpha support
|
||||||
|
*/
|
||||||
|
SDL_SetAlpha(rz_dst, SDL_SRCALPHA, 255);
|
||||||
|
} else {
|
||||||
|
/*
|
||||||
|
* Copy palette and colorkey info
|
||||||
|
*/
|
||||||
|
for (i = 0; i < rz_src->format->palette->ncolors; i++) {
|
||||||
|
rz_dst->format->palette->colors[i] = rz_src->format->palette->colors[i];
|
||||||
|
}
|
||||||
|
rz_dst->format->palette->ncolors = rz_src->format->palette->ncolors;
|
||||||
|
/*
|
||||||
|
* Call the 8bit transformation routine to do the rotation
|
||||||
|
*/
|
||||||
|
transformSurfaceY(rz_src, rz_dst, dstwidthhalf, dstheighthalf,
|
||||||
|
(int) (sanglezoominv), (int) (canglezoominv));
|
||||||
|
SDL_SetColorKey(rz_dst, SDL_SRCCOLORKEY | SDL_RLEACCEL, rz_src->format->colorkey);
|
||||||
|
}
|
||||||
|
/*
|
||||||
|
* Unlock source surface
|
||||||
|
*/
|
||||||
|
SDL_UnlockSurface(rz_src);
|
||||||
|
|
||||||
|
} else {
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Angle=0: Just a zoom
|
||||||
|
*/
|
||||||
|
/*
|
||||||
|
* --------------------
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Calculate target size
|
||||||
|
*/
|
||||||
|
zoomSurfaceSize(rz_src->w, rz_src->h, zoom, zoom, &dstwidth, &dstheight);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Alloc space to completely contain the zoomed surface
|
||||||
|
*/
|
||||||
|
rz_dst = NULL;
|
||||||
|
if (is32bit) {
|
||||||
|
/*
|
||||||
|
* Target surface is 32bit with source RGBA/ABGR ordering
|
||||||
|
*/
|
||||||
|
rz_dst =
|
||||||
|
SDL_CreateRGBSurface(SDL_SWSURFACE, dstwidth, dstheight, 32,
|
||||||
|
rz_src->format->Rmask, rz_src->format->Gmask,
|
||||||
|
rz_src->format->Bmask, rz_src->format->Amask);
|
||||||
|
} else {
|
||||||
|
/*
|
||||||
|
* Target surface is 8bit
|
||||||
|
*/
|
||||||
|
rz_dst = SDL_CreateRGBSurface(SDL_SWSURFACE, dstwidth, dstheight, 8, 0, 0, 0, 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Lock source surface
|
||||||
|
*/
|
||||||
|
SDL_LockSurface(rz_src);
|
||||||
|
/*
|
||||||
|
* Check which kind of surface we have
|
||||||
|
*/
|
||||||
|
if (is32bit) {
|
||||||
|
/*
|
||||||
|
* Call the 32bit transformation routine to do the zooming (using alpha)
|
||||||
|
*/
|
||||||
|
zoomSurfaceRGBA(rz_src, rz_dst, smooth);
|
||||||
|
/*
|
||||||
|
* Turn on source-alpha support
|
||||||
|
*/
|
||||||
|
SDL_SetAlpha(rz_dst, SDL_SRCALPHA, 255);
|
||||||
|
} else {
|
||||||
|
/*
|
||||||
|
* Copy palette and colorkey info
|
||||||
|
*/
|
||||||
|
for (i = 0; i < rz_src->format->palette->ncolors; i++) {
|
||||||
|
rz_dst->format->palette->colors[i] = rz_src->format->palette->colors[i];
|
||||||
|
}
|
||||||
|
rz_dst->format->palette->ncolors = rz_src->format->palette->ncolors;
|
||||||
|
/*
|
||||||
|
* Call the 8bit transformation routine to do the zooming
|
||||||
|
*/
|
||||||
|
zoomSurfaceY(rz_src, rz_dst);
|
||||||
|
SDL_SetColorKey(rz_dst, SDL_SRCCOLORKEY | SDL_RLEACCEL, rz_src->format->colorkey);
|
||||||
|
}
|
||||||
|
/*
|
||||||
|
* Unlock source surface
|
||||||
|
*/
|
||||||
|
SDL_UnlockSurface(rz_src);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Cleanup temp surface
|
||||||
|
*/
|
||||||
|
if (src_converted) {
|
||||||
|
SDL_FreeSurface(rz_src);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Return destination surface
|
||||||
|
*/
|
||||||
|
return (rz_dst);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
|
||||||
|
zoomSurface()
|
||||||
|
|
||||||
|
Zoomes a 32bit or 8bit 'src' surface to newly created 'dst' surface.
|
||||||
|
'zoomx' and 'zoomy' are scaling factors for width and height. If 'smooth' is 1
|
||||||
|
then the destination 32bit surface is anti-aliased. If the surface is not 8bit
|
||||||
|
or 32bit RGBA/ABGR it will be converted into a 32bit RGBA format on the fly.
|
||||||
|
|
||||||
|
*/
|
||||||
|
|
||||||
|
#define VALUE_LIMIT 0.001
|
||||||
|
|
||||||
|
void zoomSurfaceSize(int width, int height, double zoomx, double zoomy, int *dstwidth, int *dstheight)
|
||||||
|
{
|
||||||
|
/*
|
||||||
|
* Sanity check zoom factors
|
||||||
|
*/
|
||||||
|
if (zoomx < VALUE_LIMIT) {
|
||||||
|
zoomx = VALUE_LIMIT;
|
||||||
|
}
|
||||||
|
if (zoomy < VALUE_LIMIT) {
|
||||||
|
zoomy = VALUE_LIMIT;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Calculate target size
|
||||||
|
*/
|
||||||
|
*dstwidth = (int) ((double) width * zoomx);
|
||||||
|
*dstheight = (int) ((double) height * zoomy);
|
||||||
|
if (*dstwidth < 1) {
|
||||||
|
*dstwidth = 1;
|
||||||
|
}
|
||||||
|
if (*dstheight < 1) {
|
||||||
|
*dstheight = 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
SDL_Surface *zoomSurface(SDL_Surface * src, double zoomx, double zoomy, int smooth)
|
||||||
|
{
|
||||||
|
SDL_Surface *rz_src;
|
||||||
|
SDL_Surface *rz_dst;
|
||||||
|
int dstwidth, dstheight;
|
||||||
|
int is32bit;
|
||||||
|
int i, src_converted;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Sanity check
|
||||||
|
*/
|
||||||
|
if (src == NULL)
|
||||||
|
return (NULL);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Determine if source surface is 32bit or 8bit
|
||||||
|
*/
|
||||||
|
is32bit = (src->format->BitsPerPixel == 32);
|
||||||
|
if ((is32bit) || (src->format->BitsPerPixel == 8)) {
|
||||||
|
/*
|
||||||
|
* Use source surface 'as is'
|
||||||
|
*/
|
||||||
|
rz_src = src;
|
||||||
|
src_converted = 0;
|
||||||
|
} else {
|
||||||
|
/*
|
||||||
|
* New source surface is 32bit with a defined RGBA ordering
|
||||||
|
*/
|
||||||
|
rz_src =
|
||||||
|
SDL_CreateRGBSurface(SDL_SWSURFACE, src->w, src->h, 32, 0x000000ff, 0x0000ff00, 0x00ff0000, 0xff000000);
|
||||||
|
SDL_BlitSurface(src, NULL, rz_src, NULL);
|
||||||
|
src_converted = 1;
|
||||||
|
is32bit = 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Get size if target */
|
||||||
|
zoomSurfaceSize(rz_src->w, rz_src->h, zoomx, zoomy, &dstwidth, &dstheight);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Alloc space to completely contain the zoomed surface
|
||||||
|
*/
|
||||||
|
rz_dst = NULL;
|
||||||
|
if (is32bit) {
|
||||||
|
/*
|
||||||
|
* Target surface is 32bit with source RGBA/ABGR ordering
|
||||||
|
*/
|
||||||
|
rz_dst =
|
||||||
|
SDL_CreateRGBSurface(SDL_SWSURFACE, dstwidth, dstheight, 32,
|
||||||
|
rz_src->format->Rmask, rz_src->format->Gmask,
|
||||||
|
rz_src->format->Bmask, rz_src->format->Amask);
|
||||||
|
} else {
|
||||||
|
/*
|
||||||
|
* Target surface is 8bit
|
||||||
|
*/
|
||||||
|
rz_dst = SDL_CreateRGBSurface(SDL_SWSURFACE, dstwidth, dstheight, 8, 0, 0, 0, 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Lock source surface
|
||||||
|
*/
|
||||||
|
SDL_LockSurface(rz_src);
|
||||||
|
/*
|
||||||
|
* Check which kind of surface we have
|
||||||
|
*/
|
||||||
|
if (is32bit) {
|
||||||
|
/*
|
||||||
|
* Call the 32bit transformation routine to do the zooming (using alpha)
|
||||||
|
*/
|
||||||
|
zoomSurfaceRGBA(rz_src, rz_dst, smooth);
|
||||||
|
/*
|
||||||
|
* Turn on source-alpha support
|
||||||
|
*/
|
||||||
|
SDL_SetAlpha(rz_dst, SDL_SRCALPHA, 255);
|
||||||
|
} else {
|
||||||
|
/*
|
||||||
|
* Copy palette and colorkey info
|
||||||
|
*/
|
||||||
|
for (i = 0; i < rz_src->format->palette->ncolors; i++) {
|
||||||
|
rz_dst->format->palette->colors[i] = rz_src->format->palette->colors[i];
|
||||||
|
}
|
||||||
|
rz_dst->format->palette->ncolors = rz_src->format->palette->ncolors;
|
||||||
|
/*
|
||||||
|
* Call the 8bit transformation routine to do the zooming
|
||||||
|
*/
|
||||||
|
zoomSurfaceY(rz_src, rz_dst);
|
||||||
|
SDL_SetColorKey(rz_dst, SDL_SRCCOLORKEY | SDL_RLEACCEL, rz_src->format->colorkey);
|
||||||
|
}
|
||||||
|
/*
|
||||||
|
* Unlock source surface
|
||||||
|
*/
|
||||||
|
SDL_UnlockSurface(rz_src);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Cleanup temp surface
|
||||||
|
*/
|
||||||
|
if (src_converted) {
|
||||||
|
SDL_FreeSurface(rz_src);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Return destination surface
|
||||||
|
*/
|
||||||
|
return (rz_dst);
|
||||||
|
}
|
||||||
@@ -0,0 +1,84 @@
|
|||||||
|
/*
|
||||||
|
|
||||||
|
rotozoom.h - rotozoomer for 32bit or 8bit surfaces
|
||||||
|
LGPL (c) A. Schiffler
|
||||||
|
|
||||||
|
Note by sc2 developers:
|
||||||
|
Taken from SDL_gfx library and modified, original code can be downloaded
|
||||||
|
from http://www.ferzkopp.net/Software/SDL_gfx-2.0/
|
||||||
|
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
#ifndef ROTOZOOM_H
|
||||||
|
#define ROTOZOOM_H
|
||||||
|
|
||||||
|
#include <math.h>
|
||||||
|
#ifndef M_PI
|
||||||
|
#define M_PI 3.141592654
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include "SDL.h"
|
||||||
|
|
||||||
|
|
||||||
|
/* ---- Defines */
|
||||||
|
|
||||||
|
#define SMOOTHING_OFF 0
|
||||||
|
#define SMOOTHING_ON 1
|
||||||
|
|
||||||
|
/* ---- Structures */
|
||||||
|
|
||||||
|
typedef struct tColorRGBA {
|
||||||
|
Uint8 r;
|
||||||
|
Uint8 g;
|
||||||
|
Uint8 b;
|
||||||
|
Uint8 a;
|
||||||
|
} tColorRGBA;
|
||||||
|
|
||||||
|
typedef struct tColorY {
|
||||||
|
Uint8 y;
|
||||||
|
} tColorY;
|
||||||
|
|
||||||
|
|
||||||
|
/* ---- Prototypes */
|
||||||
|
|
||||||
|
/*
|
||||||
|
|
||||||
|
rotozoomSurface()
|
||||||
|
|
||||||
|
Rotates and zoomes a 32bit or 8bit 'src' surface to newly created 'dst' surface.
|
||||||
|
'angle' is the rotation in degrees. 'zoom' a scaling factor. If 'smooth' is 1
|
||||||
|
then the destination 32bit surface is anti-aliased. If the surface is not 8bit
|
||||||
|
or 32bit RGBA/ABGR it will be converted into a 32bit RGBA format on the fly.
|
||||||
|
|
||||||
|
*/
|
||||||
|
|
||||||
|
SDL_Surface *rotozoomSurface(SDL_Surface * src, double angle, double zoom,
|
||||||
|
int smooth);
|
||||||
|
|
||||||
|
|
||||||
|
/* Returns the size of the target surface for a rotozoomSurface() call */
|
||||||
|
|
||||||
|
void rotozoomSurfaceSize(int width, int height, double angle, double zoom,
|
||||||
|
int *dstwidth, int *dstheight);
|
||||||
|
|
||||||
|
/*
|
||||||
|
|
||||||
|
zoomSurface()
|
||||||
|
|
||||||
|
Zoomes a 32bit or 8bit 'src' surface to newly created 'dst' surface.
|
||||||
|
'zoomx' and 'zoomy' are scaling factors for width and height. If 'smooth' is 1
|
||||||
|
then the destination 32bit surface is anti-aliased. If the surface is not 8bit
|
||||||
|
or 32bit RGBA/ABGR it will be converted into a 32bit RGBA format on the fly.
|
||||||
|
|
||||||
|
*/
|
||||||
|
|
||||||
|
SDL_Surface *zoomSurface(SDL_Surface * src, double zoomx, double zoomy,
|
||||||
|
int smooth);
|
||||||
|
|
||||||
|
/* Returns the size of the target surface for a zoomSurface() call */
|
||||||
|
|
||||||
|
void zoomSurfaceSize(int width, int height, double zoomx, double zoomy,
|
||||||
|
int *dstwidth, int *dstheight);
|
||||||
|
|
||||||
|
#endif
|
||||||
@@ -0,0 +1,547 @@
|
|||||||
|
//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.
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
/****************************************
|
||||||
|
|
||||||
|
Star Control II: 3DO => SDL Port
|
||||||
|
|
||||||
|
Copyright Toys for Bob, 2002
|
||||||
|
|
||||||
|
Programmer: Chris Nelson
|
||||||
|
|
||||||
|
*****************************************/
|
||||||
|
|
||||||
|
#if defined (GFXMODULE_SDL_OPENGL) || defined (GFXMODULE_SDL_PURE)
|
||||||
|
|
||||||
|
#include "sdl_common.h"
|
||||||
|
|
||||||
|
#ifdef WIN32
|
||||||
|
#include <io.h>
|
||||||
|
#endif
|
||||||
|
#include <fcntl.h>
|
||||||
|
|
||||||
|
|
||||||
|
//Status: Implemented!
|
||||||
|
DWORD
|
||||||
|
GetTimeCounter () //I wonder if it's ms, ticks, or seconds...
|
||||||
|
{
|
||||||
|
DWORD ret;
|
||||||
|
|
||||||
|
ret = (DWORD) (SDL_GetTicks () * ONE_SECOND / 1000.0);
|
||||||
|
return (ret);
|
||||||
|
}
|
||||||
|
|
||||||
|
DWORD
|
||||||
|
SetSemaphore (SEMAPHORE *sem)
|
||||||
|
{
|
||||||
|
SDL_SemWait (*sem);
|
||||||
|
return (GetTimeCounter ());
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
ClearSemaphore (SEMAPHORE *sem)
|
||||||
|
{
|
||||||
|
SDL_SemPost (*sem);
|
||||||
|
}
|
||||||
|
|
||||||
|
TASK
|
||||||
|
AddTask (TASK_FUNC arg1, COUNT arg2)
|
||||||
|
{
|
||||||
|
return (SDL_CreateThread ((int (*)(void *)) arg1, NULL));
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
DeleteTask (TASK T)
|
||||||
|
{
|
||||||
|
SDL_KillThread (T);
|
||||||
|
}
|
||||||
|
|
||||||
|
DWORD
|
||||||
|
SleepTask (DWORD wake_time)
|
||||||
|
{
|
||||||
|
DWORD t;
|
||||||
|
|
||||||
|
t = GetTimeCounter ();
|
||||||
|
if (wake_time <= t)
|
||||||
|
SDL_Delay (0);
|
||||||
|
else
|
||||||
|
SDL_Delay ((wake_time - t) * 1000 / ONE_SECOND);
|
||||||
|
|
||||||
|
return (GetTimeCounter ());
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// following stuff was in getbody.c before modularization
|
||||||
|
|
||||||
|
extern char *_cur_resfile_name;
|
||||||
|
|
||||||
|
static void
|
||||||
|
process_image (FRAMEPTR FramePtr, SDL_Surface *img[], int cel_ct)
|
||||||
|
{
|
||||||
|
int hx, hy, h;
|
||||||
|
|
||||||
|
TYPE_SET (FramePtr->TypeIndexAndFlags, WANT_PIXMAP << FTYPE_SHIFT);
|
||||||
|
INDEX_SET (FramePtr->TypeIndexAndFlags, cel_ct);
|
||||||
|
|
||||||
|
hx = hy = 0;
|
||||||
|
|
||||||
|
SDL_LockSurface (img[cel_ct]);
|
||||||
|
if (img[cel_ct]->w >= 3 && (h = img[cel_ct]->h))
|
||||||
|
{
|
||||||
|
if (img[cel_ct]->format->palette)
|
||||||
|
{
|
||||||
|
int w;
|
||||||
|
BYTE *pixel, *p, Cknockout, Chotx, Choty;
|
||||||
|
|
||||||
|
img[cel_ct]->clip_rect.x = img[cel_ct]->w;
|
||||||
|
img[cel_ct]->clip_rect.y = img[cel_ct]->h;
|
||||||
|
img[cel_ct]->clip_rect.w = img[cel_ct]->clip_rect.h = 0;
|
||||||
|
p = pixel = img[cel_ct]->pixels;
|
||||||
|
Cknockout = *p++;
|
||||||
|
Chotx = *p;
|
||||||
|
*p++ = Cknockout;
|
||||||
|
Choty = *p;
|
||||||
|
*p++ = Cknockout;
|
||||||
|
SDL_SetColorKey
|
||||||
|
(
|
||||||
|
img[cel_ct], SDL_SRCCOLORKEY,
|
||||||
|
SDL_MapRGB
|
||||||
|
(
|
||||||
|
img[cel_ct]->format,
|
||||||
|
img[cel_ct]->format->palette->colors[Cknockout].r,
|
||||||
|
img[cel_ct]->format->palette->colors[Cknockout].g,
|
||||||
|
img[cel_ct]->format->palette->colors[Cknockout].b
|
||||||
|
)
|
||||||
|
);
|
||||||
|
do
|
||||||
|
{
|
||||||
|
w = img[cel_ct]->w - (p - pixel);
|
||||||
|
if (w)
|
||||||
|
{
|
||||||
|
int x, y;
|
||||||
|
BYTE opval;
|
||||||
|
|
||||||
|
opval = Cknockout;
|
||||||
|
do
|
||||||
|
{
|
||||||
|
BYTE pval;
|
||||||
|
|
||||||
|
pval = *p;
|
||||||
|
if (pval == Chotx)
|
||||||
|
{
|
||||||
|
*p = Cknockout;
|
||||||
|
hx = img[cel_ct]->w - w;
|
||||||
|
}
|
||||||
|
if (pval == Choty)
|
||||||
|
{
|
||||||
|
*p = Cknockout;
|
||||||
|
hy = img[cel_ct]->h - h;
|
||||||
|
}
|
||||||
|
|
||||||
|
pval = *p;
|
||||||
|
if (pval == Cknockout)
|
||||||
|
{
|
||||||
|
if (opval != Cknockout)
|
||||||
|
{
|
||||||
|
x = img[cel_ct]->w - w;
|
||||||
|
if (x > img[cel_ct]->clip_rect.x + img[cel_ct]->clip_rect.w)
|
||||||
|
img[cel_ct]->clip_rect.w = x - img[cel_ct]->clip_rect.x;
|
||||||
|
y = img[cel_ct]->h - h;
|
||||||
|
if (y >= img[cel_ct]->clip_rect.y + img[cel_ct]->clip_rect.h)
|
||||||
|
img[cel_ct]->clip_rect.h = y - img[cel_ct]->clip_rect.y + 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if (opval == Cknockout)
|
||||||
|
{
|
||||||
|
x = img[cel_ct]->w - w;
|
||||||
|
if (x < img[cel_ct]->clip_rect.x)
|
||||||
|
{
|
||||||
|
if (img[cel_ct]->clip_rect.w == 0)
|
||||||
|
img[cel_ct]->clip_rect.w = 1;
|
||||||
|
else
|
||||||
|
img[cel_ct]->clip_rect.w += img[cel_ct]->clip_rect.x - x;
|
||||||
|
img[cel_ct]->clip_rect.x = x;
|
||||||
|
}
|
||||||
|
y = img[cel_ct]->h - h;
|
||||||
|
if (y < img[cel_ct]->clip_rect.y)
|
||||||
|
{
|
||||||
|
if (img[cel_ct]->clip_rect.h == 0)
|
||||||
|
img[cel_ct]->clip_rect.h = 1;
|
||||||
|
else
|
||||||
|
img[cel_ct]->clip_rect.h += img[cel_ct]->clip_rect.y - y;
|
||||||
|
img[cel_ct]->clip_rect.y = y;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
opval = pval;
|
||||||
|
} while (++p, --w);
|
||||||
|
if (opval != Cknockout)
|
||||||
|
{
|
||||||
|
x = img[cel_ct]->w - w;
|
||||||
|
if (x > img[cel_ct]->clip_rect.x + img[cel_ct]->clip_rect.w)
|
||||||
|
img[cel_ct]->clip_rect.w = x - img[cel_ct]->clip_rect.x;
|
||||||
|
y = img[cel_ct]->h - h;
|
||||||
|
if (y >= img[cel_ct]->clip_rect.y + img[cel_ct]->clip_rect.h)
|
||||||
|
img[cel_ct]->clip_rect.h = y - img[cel_ct]->clip_rect.y + 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
p = (pixel += img[cel_ct]->pitch);
|
||||||
|
} while (--h);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
}
|
||||||
|
}
|
||||||
|
SDL_UnlockSurface (img[cel_ct]);
|
||||||
|
|
||||||
|
hx -= img[cel_ct]->clip_rect.x;
|
||||||
|
hy -= img[cel_ct]->clip_rect.y;
|
||||||
|
FramePtr->DataOffs = (BYTE *)TFB_LoadImage (img[cel_ct]) - (BYTE *)FramePtr;
|
||||||
|
img[cel_ct] = ((TFB_Image *)((BYTE *)FramePtr + FramePtr->DataOffs))->SurfaceSDL;
|
||||||
|
hx += img[cel_ct]->clip_rect.x;
|
||||||
|
hy += img[cel_ct]->clip_rect.y;
|
||||||
|
SetFrameHotSpot (FramePtr, MAKE_HOT_SPOT (hx, hy));
|
||||||
|
SetFrameBounds (FramePtr, img[cel_ct]->clip_rect.w, img[cel_ct]->clip_rect.h);
|
||||||
|
#if 0
|
||||||
|
printf ("\thot[%d, %d], rect[%d, %d, %d, %d]\n",
|
||||||
|
hx, hy,
|
||||||
|
img[cel_ct]->clip_rect.x,
|
||||||
|
img[cel_ct]->clip_rect.y,
|
||||||
|
img[cel_ct]->clip_rect.w,
|
||||||
|
img[cel_ct]->clip_rect.h);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
MEM_HANDLE
|
||||||
|
_GetCelData (FILE *fp, DWORD length)
|
||||||
|
{
|
||||||
|
#ifdef WIN32
|
||||||
|
int omode;
|
||||||
|
#endif
|
||||||
|
int cel_ct, n;
|
||||||
|
DWORD opos;
|
||||||
|
char CurrentLine[1024], filename[1024];
|
||||||
|
#define MAX_CELS 256
|
||||||
|
SDL_Surface *img[MAX_CELS];
|
||||||
|
DRAWABLE Drawable;
|
||||||
|
|
||||||
|
opos = ftell (fp);
|
||||||
|
|
||||||
|
{
|
||||||
|
char *s1, *s2;
|
||||||
|
|
||||||
|
if (_cur_resfile_name == 0
|
||||||
|
|| (((s2 = 0), (s1 = strrchr (_cur_resfile_name, '/')) == 0)
|
||||||
|
&& (s2 = strrchr (_cur_resfile_name, '\\')) == 0))
|
||||||
|
n = 0;
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if (s2 > s1)
|
||||||
|
s1 = s2;
|
||||||
|
n = s1 - _cur_resfile_name + 1;
|
||||||
|
strncpy (filename, _cur_resfile_name, n);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#ifdef WIN32
|
||||||
|
omode = _setmode (fileno (fp), O_TEXT);
|
||||||
|
#endif
|
||||||
|
cel_ct = 0;
|
||||||
|
while (fgets (CurrentLine, sizeof (CurrentLine), fp) && cel_ct < MAX_CELS)
|
||||||
|
{
|
||||||
|
if
|
||||||
|
(
|
||||||
|
sscanf(CurrentLine, "%s", &filename[n]) == 1
|
||||||
|
&& (img[cel_ct] = IMG_Load (filename))
|
||||||
|
&& img[cel_ct]->w > 0
|
||||||
|
&& img[cel_ct]->h > 0
|
||||||
|
&& img[cel_ct]->format->BitsPerPixel >= 8
|
||||||
|
)
|
||||||
|
++cel_ct;
|
||||||
|
else if (img[cel_ct])
|
||||||
|
printf("_GetCelData: Bad file!\n"),
|
||||||
|
SDL_FreeSurface (img[cel_ct]);
|
||||||
|
|
||||||
|
if ((int)ftell (fp) - (int)opos >= (int)length)
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
#ifdef WIN32
|
||||||
|
_setmode (fileno (fp), omode);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
Drawable = 0;
|
||||||
|
if (cel_ct && (Drawable = AllocDrawable (cel_ct, 0)))
|
||||||
|
{
|
||||||
|
DRAWABLEPTR DrawablePtr;
|
||||||
|
|
||||||
|
if ((DrawablePtr = LockDrawable (Drawable)) == 0)
|
||||||
|
{
|
||||||
|
while (cel_ct--)
|
||||||
|
SDL_FreeSurface (img[cel_ct]);
|
||||||
|
|
||||||
|
mem_release (Drawable);
|
||||||
|
Drawable = 0;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
FRAMEPTR FramePtr;
|
||||||
|
|
||||||
|
DrawablePtr->hDrawable = GetDrawableHandle (Drawable);
|
||||||
|
TYPE_SET (DrawablePtr->FlagsAndIndex,
|
||||||
|
(DRAWABLE_TYPE)ROM_DRAWABLE << FTYPE_SHIFT);
|
||||||
|
INDEX_SET (DrawablePtr->FlagsAndIndex, cel_ct - 1);
|
||||||
|
|
||||||
|
FramePtr = &DrawablePtr->Frame[cel_ct];
|
||||||
|
while (--FramePtr, cel_ct--)
|
||||||
|
process_image (FramePtr, img, cel_ct);
|
||||||
|
|
||||||
|
UnlockDrawable (Drawable);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (Drawable == 0)
|
||||||
|
printf ("Couldn't get cel data for '%s'\n", _cur_resfile_name);
|
||||||
|
return (GetDrawableHandle (Drawable));
|
||||||
|
}
|
||||||
|
|
||||||
|
BOOLEAN
|
||||||
|
_ReleaseCelData (MEM_HANDLE handle)
|
||||||
|
{
|
||||||
|
DRAWABLEPTR DrawablePtr;
|
||||||
|
|
||||||
|
if ((DrawablePtr = LockDrawable (handle)) == 0)
|
||||||
|
return (FALSE);
|
||||||
|
|
||||||
|
if (TYPE_GET (DrawablePtr->FlagsAndIndex) != SCREEN_DRAWABLE)
|
||||||
|
{
|
||||||
|
int cel_ct;
|
||||||
|
FRAMEPTR FramePtr;
|
||||||
|
|
||||||
|
cel_ct = INDEX_GET (DrawablePtr->FlagsAndIndex);
|
||||||
|
|
||||||
|
FramePtr = &DrawablePtr->Frame[cel_ct];
|
||||||
|
while (--FramePtr, cel_ct--)
|
||||||
|
{
|
||||||
|
if (FramePtr->DataOffs)
|
||||||
|
{
|
||||||
|
TFB_Image *img;
|
||||||
|
|
||||||
|
img = (TFB_Image *)((BYTE *)FramePtr + FramePtr->DataOffs);
|
||||||
|
FramePtr->DataOffs = 0;
|
||||||
|
|
||||||
|
TFB_FreeImage (img);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
UnlockDrawable (handle);
|
||||||
|
mem_release (handle);
|
||||||
|
|
||||||
|
return (TRUE);
|
||||||
|
}
|
||||||
|
|
||||||
|
MEM_HANDLE
|
||||||
|
_GetFontData (FILE *fp, DWORD length)
|
||||||
|
{
|
||||||
|
DWORD cel_ct;
|
||||||
|
COUNT num_entries;
|
||||||
|
FONT_REF FontRef;
|
||||||
|
DIRENTRY FontDir;
|
||||||
|
BOOLEAN found_chars;
|
||||||
|
#define MAX_CELS 256
|
||||||
|
SDL_Surface *img[MAX_CELS] = { 0 };
|
||||||
|
char pattern[1024];
|
||||||
|
|
||||||
|
if (_cur_resfile_name == 0)
|
||||||
|
return (0);
|
||||||
|
sprintf (pattern, "%s/*.*", _cur_resfile_name);
|
||||||
|
|
||||||
|
found_chars = FALSE;
|
||||||
|
FontDir = CaptureDirEntryTable (LoadDirEntryTable (pattern, &num_entries));
|
||||||
|
while (num_entries--)
|
||||||
|
{
|
||||||
|
char *char_name;
|
||||||
|
|
||||||
|
char_name = GetDirEntryAddress (SetAbsDirEntryTableIndex (FontDir, num_entries));
|
||||||
|
if (sscanf (char_name, "%u.", (unsigned int) &cel_ct) == 1
|
||||||
|
&& cel_ct >= FIRST_CHAR
|
||||||
|
&& img[cel_ct -= FIRST_CHAR] == 0
|
||||||
|
&& sprintf (pattern, "%s/%s", _cur_resfile_name, char_name)
|
||||||
|
&& (img[cel_ct] = IMG_Load (pattern)))
|
||||||
|
{
|
||||||
|
if (img[cel_ct]->w > 0
|
||||||
|
&& img[cel_ct]->h > 0
|
||||||
|
&& img[cel_ct]->format->BitsPerPixel >= 8)
|
||||||
|
found_chars = TRUE;
|
||||||
|
else
|
||||||
|
{
|
||||||
|
SDL_FreeSurface (img[cel_ct]);
|
||||||
|
img[cel_ct] = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
DestroyDirEntryTable (ReleaseDirEntryTable (FontDir));
|
||||||
|
|
||||||
|
FontRef = 0;
|
||||||
|
if (found_chars && (FontRef = AllocFont (0)))
|
||||||
|
{
|
||||||
|
FONTPTR FontPtr;
|
||||||
|
|
||||||
|
cel_ct = MAX_CELS; // MAX_CHARS;
|
||||||
|
if ((FontPtr = LockFont (FontRef)) == 0)
|
||||||
|
{
|
||||||
|
while (cel_ct--)
|
||||||
|
{
|
||||||
|
if (img[cel_ct])
|
||||||
|
SDL_FreeSurface (img[cel_ct]);
|
||||||
|
}
|
||||||
|
|
||||||
|
mem_release (FontRef);
|
||||||
|
FontRef = 0;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
FRAMEPTR FramePtr;
|
||||||
|
|
||||||
|
FontPtr->FontRef = FontRef;
|
||||||
|
FontPtr->Leading = 0;
|
||||||
|
FramePtr = &FontPtr->CharDesc[cel_ct];
|
||||||
|
while (--FramePtr, cel_ct--)
|
||||||
|
{
|
||||||
|
if (img[cel_ct])
|
||||||
|
{
|
||||||
|
process_image (FramePtr, img, cel_ct);
|
||||||
|
SetFrameBounds (FramePtr, GetFrameWidth (FramePtr) + 1, GetFrameHeight (FramePtr));
|
||||||
|
if (img[0])
|
||||||
|
SetFrameHotSpot (FramePtr, MAKE_HOT_SPOT (0, img[0]->clip_rect.h));
|
||||||
|
if (GetFrameHeight (FramePtr) > FontPtr->Leading)
|
||||||
|
FontPtr->Leading = GetFrameHeight (FramePtr);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
++FontPtr->Leading;
|
||||||
|
|
||||||
|
UnlockFont (FontRef);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
(void) fp; /* Satisfying compiler (unused parameter) */
|
||||||
|
(void) length; /* Satisfying compiler (unused parameter) */
|
||||||
|
return (FontRef);
|
||||||
|
}
|
||||||
|
|
||||||
|
BOOLEAN
|
||||||
|
_ReleaseFontData (MEM_HANDLE handle)
|
||||||
|
{
|
||||||
|
FONTPTR FontPtr;
|
||||||
|
|
||||||
|
if ((FontPtr = LockFont (handle)) == 0)
|
||||||
|
return (FALSE);
|
||||||
|
|
||||||
|
{
|
||||||
|
int cel_ct;
|
||||||
|
FRAMEPTR FramePtr;
|
||||||
|
|
||||||
|
cel_ct = MAX_CHARS;
|
||||||
|
|
||||||
|
FramePtr = &FontPtr->CharDesc[cel_ct];
|
||||||
|
while (--FramePtr, cel_ct--)
|
||||||
|
{
|
||||||
|
if (FramePtr->DataOffs)
|
||||||
|
{
|
||||||
|
TFB_Image *img;
|
||||||
|
|
||||||
|
img = (TFB_Image *)((BYTE *)FramePtr + FramePtr->DataOffs);
|
||||||
|
FramePtr->DataOffs = 0;
|
||||||
|
|
||||||
|
TFB_FreeImage (img);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
UnlockFont (handle);
|
||||||
|
mem_release (handle);
|
||||||
|
|
||||||
|
return (TRUE);
|
||||||
|
}
|
||||||
|
|
||||||
|
// _request_drawable was in drawable.c before modularization
|
||||||
|
|
||||||
|
DRAWABLE
|
||||||
|
_request_drawable (COUNT NumFrames, DRAWABLE_TYPE DrawableType,
|
||||||
|
CREATE_FLAGS flags, SIZE width, SIZE height)
|
||||||
|
{
|
||||||
|
DRAWABLE Drawable;
|
||||||
|
|
||||||
|
Drawable = AllocDrawableImage (
|
||||||
|
NumFrames, DrawableType, flags, width, height
|
||||||
|
);
|
||||||
|
if (Drawable)
|
||||||
|
{
|
||||||
|
DRAWABLEPTR DrawablePtr;
|
||||||
|
|
||||||
|
if ((DrawablePtr = LockDrawable (Drawable)) == 0)
|
||||||
|
{
|
||||||
|
FreeDrawable (Drawable);
|
||||||
|
Drawable = 0;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
int imgw, imgh;
|
||||||
|
FRAMEPTR FramePtr;
|
||||||
|
|
||||||
|
DrawablePtr->hDrawable = GetDrawableHandle (Drawable);
|
||||||
|
TYPE_SET (DrawablePtr->FlagsAndIndex, flags << FTYPE_SHIFT);
|
||||||
|
INDEX_SET (DrawablePtr->FlagsAndIndex, NumFrames - 1);
|
||||||
|
|
||||||
|
imgw = (flags & MAPPED_TO_DISPLAY) ? width * ScreenWidthActual / ScreenWidth : width;
|
||||||
|
imgh = (flags & MAPPED_TO_DISPLAY) ? height * ScreenHeightActual / ScreenHeight : height;
|
||||||
|
FramePtr = &DrawablePtr->Frame[NumFrames - 1];
|
||||||
|
while (NumFrames--)
|
||||||
|
{
|
||||||
|
TFB_Image *Image;
|
||||||
|
|
||||||
|
|
||||||
|
if (DrawableType == RAM_DRAWABLE
|
||||||
|
&& (Image = TFB_LoadImage (SDL_CreateRGBSurface (
|
||||||
|
SDL_HWSURFACE,
|
||||||
|
imgw,
|
||||||
|
imgh,
|
||||||
|
24,
|
||||||
|
0x00FF0000,
|
||||||
|
0x0000FF00,
|
||||||
|
0x000000FF,
|
||||||
|
0x00000000
|
||||||
|
))))
|
||||||
|
FramePtr->DataOffs = (BYTE *)Image - (BYTE *)FramePtr;
|
||||||
|
|
||||||
|
TYPE_SET (FramePtr->TypeIndexAndFlags, DrawableType);
|
||||||
|
INDEX_SET (FramePtr->TypeIndexAndFlags, NumFrames);
|
||||||
|
SetFrameBounds (FramePtr, width, height);
|
||||||
|
--FramePtr;
|
||||||
|
}
|
||||||
|
UnlockDrawable (Drawable);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return (Drawable);
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
||||||
@@ -0,0 +1,50 @@
|
|||||||
|
//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.
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
/****************************************
|
||||||
|
|
||||||
|
Star Control II: 3DO => SDL Port
|
||||||
|
|
||||||
|
Copyright Toys for Bob, 2002
|
||||||
|
|
||||||
|
Programmer: Chris Nelson
|
||||||
|
|
||||||
|
*****************************************/
|
||||||
|
|
||||||
|
#ifndef SDL_COMMON_H
|
||||||
|
#define SDL_COMMON_H
|
||||||
|
|
||||||
|
#include "SDL.h"
|
||||||
|
#include "SDL_thread.h"
|
||||||
|
#include "SDL_image.h"
|
||||||
|
#include "SDL_mixer.h"
|
||||||
|
|
||||||
|
#include "libs/graphics/gfxintrn.h"
|
||||||
|
#include "libs/input/inpintrn.h"
|
||||||
|
#include "libs/graphics/gfx_common.h"
|
||||||
|
|
||||||
|
#if defined (GFXMODULE_SDL_OPENGL)
|
||||||
|
#include "libs/graphics/sdl/opengl/opengl.h"
|
||||||
|
#elif defined (GFXMODULE_SDL_PURE)
|
||||||
|
#include "libs/graphics/sdl/pure/pure.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include "libs/input/sdl/input.h"
|
||||||
|
|
||||||
|
#endif
|
||||||
@@ -0,0 +1,184 @@
|
|||||||
|
//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 "inpintrn.h"
|
||||||
|
|
||||||
|
INPUT_DEVICE
|
||||||
|
CreateSerialKeyboardDevice (void)
|
||||||
|
{
|
||||||
|
INPUT_DEVICE InputDevice;
|
||||||
|
|
||||||
|
if ((InputDevice = AllocInputDevice ()) != (INPUT_DEVICE)NULL_PTR)
|
||||||
|
{
|
||||||
|
INPUT_DESCPTR InputPtr;
|
||||||
|
|
||||||
|
if ((InputPtr =
|
||||||
|
LockInputDevice (InputDevice)) == (INPUT_DESCPTR)NULL_PTR)
|
||||||
|
{
|
||||||
|
FreeInputDevice (InputDevice);
|
||||||
|
InputDevice = (INPUT_DEVICE)NULL_PTR;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
SetInputDeviceHandle (InputPtr, InputDevice);
|
||||||
|
SetInputDeviceInputFunc (InputPtr, _get_serial_keyboard_state);
|
||||||
|
|
||||||
|
UnlockInputDevice (InputDevice);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return (InputDevice);
|
||||||
|
}
|
||||||
|
|
||||||
|
INPUT_DEVICE
|
||||||
|
CreateJoystickKeyboardDevice (UNICODE lfkey, UNICODE rtkey, UNICODE
|
||||||
|
topkey, UNICODE botkey, UNICODE but1key, UNICODE but2key, UNICODE
|
||||||
|
but3key, UNICODE shift1key, UNICODE shift2key)
|
||||||
|
{
|
||||||
|
INPUT_DEVICE InputDevice;
|
||||||
|
|
||||||
|
if ((InputDevice = AllocInputDevice ()) != (INPUT_DEVICE)NULL_PTR)
|
||||||
|
{
|
||||||
|
INPUT_DESCPTR InputPtr;
|
||||||
|
|
||||||
|
if ((InputPtr =
|
||||||
|
LockInputDevice (InputDevice)) == (INPUT_DESCPTR)NULL_PTR)
|
||||||
|
{
|
||||||
|
FreeInputDevice (InputDevice);
|
||||||
|
InputDevice = (INPUT_DEVICE)NULL_PTR;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
SetInputDeviceHandle (InputPtr, InputDevice);
|
||||||
|
SetInputDeviceInputFunc (InputPtr, _get_joystick_keyboard_state);
|
||||||
|
SetInputDeviceKeyEquivalents (InputPtr,
|
||||||
|
lfkey, rtkey, topkey, botkey,
|
||||||
|
but1key, but2key, but3key,
|
||||||
|
shift1key, shift2key);
|
||||||
|
|
||||||
|
UnlockInputDevice (InputDevice);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return (InputDevice);
|
||||||
|
}
|
||||||
|
|
||||||
|
INPUT_DEVICE
|
||||||
|
CreateJoystickDevice (COUNT port)
|
||||||
|
{
|
||||||
|
INPUT_DEVICE InputDevice;
|
||||||
|
|
||||||
|
if (!_joystick_port_active (port))
|
||||||
|
InputDevice = (INPUT_DEVICE)NULL_PTR;
|
||||||
|
else if ((InputDevice = AllocInputDevice ()) != (INPUT_DEVICE)NULL_PTR)
|
||||||
|
{
|
||||||
|
INPUT_DESCPTR InputPtr;
|
||||||
|
|
||||||
|
if ((InputPtr =
|
||||||
|
LockInputDevice (InputDevice)) == (INPUT_DESCPTR)NULL_PTR)
|
||||||
|
{
|
||||||
|
FreeInputDevice (InputDevice);
|
||||||
|
InputDevice = (INPUT_DEVICE)NULL_PTR;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
SetInputDeviceHandle (InputPtr, InputDevice);
|
||||||
|
SetInputDeviceInputFunc (InputPtr, _get_joystick_state);
|
||||||
|
SetInputDeviceJoystickPort (InputPtr, port);
|
||||||
|
|
||||||
|
UnlockInputDevice (InputDevice);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return (InputDevice);
|
||||||
|
}
|
||||||
|
|
||||||
|
INPUT_DEVICE
|
||||||
|
CreateInternalDevice (INPUT_STATE (*input_func) (INPUT_REF InputRef,
|
||||||
|
INPUT_STATE InputState))
|
||||||
|
{
|
||||||
|
INPUT_DEVICE InputDevice;
|
||||||
|
|
||||||
|
if (input_func == NULL_PTR)
|
||||||
|
InputDevice = (INPUT_DEVICE)NULL_PTR;
|
||||||
|
else if ((InputDevice = AllocInputDevice ()) != (INPUT_DEVICE)NULL_PTR)
|
||||||
|
{
|
||||||
|
INPUT_DESCPTR InputPtr;
|
||||||
|
|
||||||
|
if ((InputPtr =
|
||||||
|
LockInputDevice (InputDevice)) == (INPUT_DESCPTR)NULL_PTR)
|
||||||
|
{
|
||||||
|
FreeInputDevice (InputDevice);
|
||||||
|
InputDevice = (INPUT_DEVICE)NULL_PTR;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
SetInputDeviceHandle (InputPtr, InputDevice);
|
||||||
|
SetInputDeviceInputFunc (InputPtr, input_func);
|
||||||
|
|
||||||
|
UnlockInputDevice (InputDevice);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return (InputDevice);
|
||||||
|
}
|
||||||
|
|
||||||
|
INPUT_REF
|
||||||
|
CaptureInputDevice (INPUT_DEVICE InputDevice)
|
||||||
|
{
|
||||||
|
if (InputDevice != (INPUT_DEVICE)NULL_PTR)
|
||||||
|
return ((INPUT_REF)LockInputDevice (InputDevice));
|
||||||
|
|
||||||
|
return ((INPUT_REF)NULL_PTR);
|
||||||
|
}
|
||||||
|
|
||||||
|
INPUT_DEVICE
|
||||||
|
ReleaseInputDevice (INPUT_REF InputRef)
|
||||||
|
{
|
||||||
|
INPUT_DEVICE InputDevice;
|
||||||
|
|
||||||
|
if (InputRef == (INPUT_REF)NULL_PTR)
|
||||||
|
InputDevice = (INPUT_DEVICE)NULL_PTR;
|
||||||
|
else
|
||||||
|
{
|
||||||
|
InputDevice = GetInputDeviceHandle (InputRef);
|
||||||
|
UnlockInputDevice (InputDevice);
|
||||||
|
}
|
||||||
|
|
||||||
|
return (InputDevice);
|
||||||
|
}
|
||||||
|
|
||||||
|
BOOLEAN
|
||||||
|
DestroyInputDevice (INPUT_DEVICE InputDevice)
|
||||||
|
{
|
||||||
|
if (InputDevice != (INPUT_DEVICE)NULL_PTR)
|
||||||
|
return (FreeInputDevice (InputDevice));
|
||||||
|
|
||||||
|
return (FALSE);
|
||||||
|
}
|
||||||
|
|
||||||
|
INPUT_STATE
|
||||||
|
GetInputState (INPUT_REF InputRef)
|
||||||
|
{
|
||||||
|
if (InputRef == 0)
|
||||||
|
return (_get_pause_exit_state ());
|
||||||
|
else
|
||||||
|
return ((*GetInputDeviceInputFunc (InputRef))
|
||||||
|
(InputRef, _get_pause_exit_state ()));
|
||||||
|
}
|
||||||
|
|
||||||
@@ -0,0 +1,14 @@
|
|||||||
|
|
||||||
|
# Automake template file.
|
||||||
|
# Written by Mudry <mudry@user.sf.net>, protected by GNU GPL.
|
||||||
|
# CVS $ Id: $
|
||||||
|
|
||||||
|
INCLUDES = @SDL_CFLAGS@ @SMPEG_CFLAGS@ \
|
||||||
|
-I$(top_srcdir)/src \
|
||||||
|
-I$(top_srcdir)/src/sc2code \
|
||||||
|
-I$(top_srcdir)/src/sc2code/libs
|
||||||
|
|
||||||
|
noinst_LTLIBRARIES = libsdlinput.la
|
||||||
|
libsdlinput_la_SOURCES = input.c
|
||||||
|
noinst_HEADERS = input.h
|
||||||
|
|
||||||
@@ -0,0 +1,759 @@
|
|||||||
|
//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.
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
/****************************************
|
||||||
|
|
||||||
|
Star Control II: 3DO => SDL Port
|
||||||
|
|
||||||
|
Copyright Toys for Bob, 2002
|
||||||
|
|
||||||
|
Programmer: Chris Nelson
|
||||||
|
|
||||||
|
*****************************************/
|
||||||
|
|
||||||
|
#if defined (GFXMODULE_SDL_OPENGL) || defined (GFXMODULE_SDL_PURE)
|
||||||
|
|
||||||
|
#include "libs/graphics/sdl/sdl_common.h"
|
||||||
|
|
||||||
|
|
||||||
|
Uint8 KeyboardDown[512];
|
||||||
|
#define KBDBUFSIZE (1 << 8)
|
||||||
|
int kbdhead, kbdtail;
|
||||||
|
Uint16 kbdbuf[KBDBUFSIZE];
|
||||||
|
|
||||||
|
UBYTE ControlA;
|
||||||
|
UBYTE ControlB;
|
||||||
|
UBYTE ControlC;
|
||||||
|
UBYTE ControlX;
|
||||||
|
UBYTE ControlStart;
|
||||||
|
UBYTE ControlLeftShift;
|
||||||
|
UBYTE ControlRightShift;
|
||||||
|
|
||||||
|
|
||||||
|
static UNICODE PauseKey;
|
||||||
|
static UNICODE ExitKey;
|
||||||
|
static UNICODE OtherKey;
|
||||||
|
|
||||||
|
static BOOLEAN (* PauseFunc) (void);
|
||||||
|
|
||||||
|
// Status: Unimplemented
|
||||||
|
extern BOOLEAN
|
||||||
|
InitInput (UNICODE Pause, UNICODE Exit, BOOLEAN (*PFunc) (void))
|
||||||
|
//Be careful with this one.
|
||||||
|
{
|
||||||
|
PauseKey = Pause;
|
||||||
|
ExitKey = Exit;
|
||||||
|
|
||||||
|
// Find a unique byte ID not equal to PauseKey, ExitKey, or 0.
|
||||||
|
OtherKey = 1;
|
||||||
|
while (OtherKey == PauseKey || OtherKey == ExitKey)
|
||||||
|
OtherKey++;
|
||||||
|
|
||||||
|
PauseFunc = PFunc;
|
||||||
|
|
||||||
|
return (TRUE);
|
||||||
|
}
|
||||||
|
|
||||||
|
INPUT_STATE
|
||||||
|
AnyButtonPress (BOOLEAN DetectSpecial)
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
|
||||||
|
if (DetectSpecial)
|
||||||
|
{
|
||||||
|
if (KeyDown (PauseKey) && PauseFunc && (*PauseFunc) ())
|
||||||
|
;
|
||||||
|
}
|
||||||
|
|
||||||
|
for (i = 0; i < sizeof (KeyboardDown) / sizeof (KeyboardDown[0]); ++i)
|
||||||
|
{
|
||||||
|
if (KeyboardDown[i])
|
||||||
|
return (DEVICE_BUTTON1);
|
||||||
|
}
|
||||||
|
#if 0
|
||||||
|
for (i = 0; i < JOYSTICKS_AVAIL; i++)
|
||||||
|
if (read_joystick (i))
|
||||||
|
return (DEVICE_BUTTON1);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
return (0);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Status: Ignored - The keyboard will serve as the joystick, thus a port is always open.
|
||||||
|
BOOLEAN
|
||||||
|
_joystick_port_active(COUNT port) //SDL handles this nicely.
|
||||||
|
{
|
||||||
|
printf ("Unimplemented function activated: _joystick_port_active()\n");
|
||||||
|
return (0);
|
||||||
|
}
|
||||||
|
|
||||||
|
INPUT_STATE
|
||||||
|
_get_pause_exit_state (void)
|
||||||
|
{
|
||||||
|
INPUT_STATE InputState;
|
||||||
|
|
||||||
|
InputState = 0;
|
||||||
|
if (KeyDown (PauseKey))
|
||||||
|
{
|
||||||
|
if (PauseFunc && (*PauseFunc) ())
|
||||||
|
;
|
||||||
|
}
|
||||||
|
else if (KeyDown (ExitKey))
|
||||||
|
{
|
||||||
|
InputState = DEVICE_EXIT;
|
||||||
|
}
|
||||||
|
#if 0
|
||||||
|
for (i = 0; i < JOYSTICKS_AVAIL; i++)
|
||||||
|
{
|
||||||
|
DWORD joy;
|
||||||
|
|
||||||
|
joy = read_joystick (i);
|
||||||
|
if (joy & ControlStart) // pause
|
||||||
|
{
|
||||||
|
if (PauseFunc && (*PauseFunc) ())
|
||||||
|
// while (KeyDown (PauseKey))
|
||||||
|
;
|
||||||
|
}
|
||||||
|
else if (joy & ControlX) // exit
|
||||||
|
{
|
||||||
|
// while (KeyDown (ExitKey))
|
||||||
|
// TaskSwitch ();
|
||||||
|
|
||||||
|
InputState = DEVICE_EXIT;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
return (InputState);
|
||||||
|
}
|
||||||
|
|
||||||
|
Uint16
|
||||||
|
GetUNICODEKey ()
|
||||||
|
{
|
||||||
|
if (kbdtail != kbdhead)
|
||||||
|
{
|
||||||
|
Uint16 ch;
|
||||||
|
|
||||||
|
ch = kbdbuf[kbdhead];
|
||||||
|
kbdhead = (kbdhead + 1) & (KBDBUFSIZE - 1);
|
||||||
|
return (ch);
|
||||||
|
}
|
||||||
|
|
||||||
|
return (0);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Status: Unimplemented
|
||||||
|
INPUT_STATE
|
||||||
|
_get_serial_keyboard_state (INPUT_REF ref, INPUT_STATE InputState)
|
||||||
|
// I hope these are defined somewhere...
|
||||||
|
{
|
||||||
|
Uint16 key;
|
||||||
|
extern Uint16 GetUNICODEKey (void);
|
||||||
|
|
||||||
|
if ((key = GetUNICODEKey ()) == '\r')
|
||||||
|
key = '\n';
|
||||||
|
SetInputUNICODE (&InputState, key);
|
||||||
|
SetInputDevType (&InputState, KEYBOARD_DEVICE);
|
||||||
|
|
||||||
|
return (InputState);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Status: Unimplemented
|
||||||
|
INPUT_STATE
|
||||||
|
_get_joystick_keyboard_state (INPUT_REF InputRef, INPUT_STATE InputState)
|
||||||
|
// see line above.
|
||||||
|
{
|
||||||
|
SBYTE dx, dy;
|
||||||
|
BYTEPTR KeyEquivalentPtr;
|
||||||
|
|
||||||
|
KeyEquivalentPtr = GetInputDeviceKeyEquivalentPtr (InputRef);
|
||||||
|
dx = (SBYTE)(KeyDown (KeyEquivalentPtr[1]) -
|
||||||
|
KeyDown (KeyEquivalentPtr[0]));
|
||||||
|
SetInputXComponent (&InputState, dx);
|
||||||
|
|
||||||
|
KeyEquivalentPtr += 2;
|
||||||
|
dy = (SBYTE)(KeyDown (KeyEquivalentPtr[1]) -
|
||||||
|
KeyDown (KeyEquivalentPtr[0]));
|
||||||
|
SetInputYComponent (&InputState, dy);
|
||||||
|
|
||||||
|
KeyEquivalentPtr += 2;
|
||||||
|
if (KeyDown (*KeyEquivalentPtr++))
|
||||||
|
InputState |= DEVICE_BUTTON1;
|
||||||
|
if (KeyDown (*KeyEquivalentPtr++))
|
||||||
|
InputState |= DEVICE_BUTTON2;
|
||||||
|
if (KeyDown (*KeyEquivalentPtr++))
|
||||||
|
InputState |= DEVICE_BUTTON3;
|
||||||
|
|
||||||
|
if (KeyDown (*KeyEquivalentPtr++))
|
||||||
|
InputState |= DEVICE_LEFTSHIFT;
|
||||||
|
if (KeyDown (*KeyEquivalentPtr++))
|
||||||
|
InputState |= DEVICE_RIGHTSHIFT;
|
||||||
|
|
||||||
|
if (InputState)
|
||||||
|
SetInputDevType (&InputState, JOYSTICK_DEVICE);
|
||||||
|
|
||||||
|
return (InputState);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
// Status: Implemented
|
||||||
|
INPUT_STATE
|
||||||
|
_get_joystick_state (INPUT_REF ref, INPUT_STATE InputState)
|
||||||
|
// consistant, at least.
|
||||||
|
{
|
||||||
|
// printf ("Half-implemented function activated: _get_joystick_state()\n");
|
||||||
|
|
||||||
|
if (KeyboardStroke[SDLK_LEFT])
|
||||||
|
{
|
||||||
|
SetInputXComponent (&InputState, -1);
|
||||||
|
// printf ("LEFT!\n");
|
||||||
|
KeyboardStroke[SDLK_LEFT] = FALSE;
|
||||||
|
}
|
||||||
|
if (KeyboardStroke[SDLK_RIGHT])
|
||||||
|
{
|
||||||
|
SetInputXComponent (&InputState, 1);
|
||||||
|
// printf ("RIGHT!\n");
|
||||||
|
KeyboardStroke[SDLK_RIGHT] = FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (KeyboardStroke[SDLK_UP])
|
||||||
|
{
|
||||||
|
SetInputYComponent (&InputState, -1);
|
||||||
|
// printf ("UP!\n");
|
||||||
|
KeyboardStroke[SDLK_UP] = FALSE;
|
||||||
|
}
|
||||||
|
if (KeyboardStroke[SDLK_DOWN])
|
||||||
|
{
|
||||||
|
SetInputYComponent (&InputState, 1);
|
||||||
|
// printf ("DOWN!\n");
|
||||||
|
KeyboardStroke[SDLK_DOWN] = FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (KeyboardStroke[ControlA])
|
||||||
|
{
|
||||||
|
InputState |= DEVICE_BUTTON1;
|
||||||
|
// printf("BUTTON1!\n");
|
||||||
|
KeyboardStroke[ControlA]=FALSE;
|
||||||
|
}
|
||||||
|
if (KeyboardStroke[ControlB])
|
||||||
|
{
|
||||||
|
InputState |= DEVICE_BUTTON2;
|
||||||
|
// printf ("BUTTON2!\n");
|
||||||
|
KeyboardStroke[ControlB] = FALSE;
|
||||||
|
}
|
||||||
|
if (KeyboardStroke[ControlC])
|
||||||
|
{
|
||||||
|
InputState |= DEVICE_BUTTON3;
|
||||||
|
// printf ("BUTTON3!\n");
|
||||||
|
KeyboardStroke[ControlC] = FALSE;
|
||||||
|
}
|
||||||
|
if (KeyboardStroke[ControlX])
|
||||||
|
{
|
||||||
|
InputState |= DEVICE_EXIT;
|
||||||
|
// printf ("BUTTONX!\n");
|
||||||
|
KeyboardStroke[ControlX] = FALSE;
|
||||||
|
}
|
||||||
|
if (KeyboardStroke[ControlStart])
|
||||||
|
{
|
||||||
|
InputState |= DEVICE_PAUSE;
|
||||||
|
// printf ("CONTROLSTART!\n");
|
||||||
|
KeyboardStroke[ControlStart] = FALSE;
|
||||||
|
}
|
||||||
|
if (KeyboardStroke[ControlLeftShift])
|
||||||
|
{
|
||||||
|
InputState |= DEVICE_LEFTSHIFT;
|
||||||
|
// printf ("LEFTSHIFT!\n");
|
||||||
|
KeyboardStroke[ControlLeftShift] = FALSE;
|
||||||
|
}
|
||||||
|
if (KeyboardStroke[ControlRightShift])
|
||||||
|
{
|
||||||
|
InputState |= DEVICE_RIGHTSHIFT;
|
||||||
|
// printf ("RIGHTSHIFT!\n");
|
||||||
|
KeyboardStroke[ControlRightShift] = FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
return (InputState);
|
||||||
|
}
|
||||||
|
*/
|
||||||
|
|
||||||
|
INPUT_STATE
|
||||||
|
_get_joystick_state (INPUT_REF ref, INPUT_STATE InputState)
|
||||||
|
// consistant, at least.
|
||||||
|
{
|
||||||
|
#if 0
|
||||||
|
if (ref == JoystickInput[1] && 0)
|
||||||
|
{
|
||||||
|
//printf ("ref\n");
|
||||||
|
|
||||||
|
return(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
// printf ("Half-implemented function activated: _get_joystick_state()\n");
|
||||||
|
|
||||||
|
if (KeyboardDown[SDLK_LEFT])
|
||||||
|
{
|
||||||
|
SetInputXComponent (&InputState, -1);
|
||||||
|
//printf ("LEFT!\n");
|
||||||
|
}
|
||||||
|
if (KeyboardDown[SDLK_RIGHT])
|
||||||
|
{
|
||||||
|
SetInputXComponent (&InputState, 1);
|
||||||
|
//printf ("RIGHT!\n");
|
||||||
|
}
|
||||||
|
|
||||||
|
if (KeyboardDown[SDLK_UP])
|
||||||
|
{
|
||||||
|
SetInputYComponent (&InputState, -1);
|
||||||
|
//printf ("UP!\n");
|
||||||
|
}
|
||||||
|
if (KeyboardDown[SDLK_DOWN])
|
||||||
|
{
|
||||||
|
SetInputYComponent (&InputState, 1);
|
||||||
|
//printf ("DOWN!\n");
|
||||||
|
}
|
||||||
|
|
||||||
|
if (KeyboardDown[ControlA])
|
||||||
|
{
|
||||||
|
InputState |= DEVICE_BUTTON1;
|
||||||
|
//printf ("BUTTON1!\n");
|
||||||
|
}
|
||||||
|
if (KeyboardDown[ControlB])
|
||||||
|
{
|
||||||
|
InputState |= DEVICE_BUTTON2;
|
||||||
|
//printf ("BUTTON2!\n");
|
||||||
|
}
|
||||||
|
if (KeyboardDown[ControlC])
|
||||||
|
{
|
||||||
|
InputState |= DEVICE_BUTTON3;
|
||||||
|
//printf ("BUTTON3!\n");
|
||||||
|
}
|
||||||
|
if (KeyboardDown[ControlX])
|
||||||
|
{
|
||||||
|
InputState |= DEVICE_EXIT;
|
||||||
|
//printf ("BUTTONX!\n");
|
||||||
|
}
|
||||||
|
if (KeyboardDown[ControlStart])
|
||||||
|
{
|
||||||
|
InputState |= DEVICE_PAUSE;
|
||||||
|
//printf ("CONTROLSTART!\n");
|
||||||
|
}
|
||||||
|
if (KeyboardDown[ControlLeftShift])
|
||||||
|
{
|
||||||
|
InputState |= DEVICE_LEFTSHIFT;
|
||||||
|
//printf ("LEFTSHIFT!\n");
|
||||||
|
}
|
||||||
|
if (KeyboardDown[ControlRightShift])
|
||||||
|
{
|
||||||
|
InputState |= DEVICE_RIGHTSHIFT;
|
||||||
|
//printf ("RIGHTSHIFT!\n");
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
return (InputState);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void
|
||||||
|
FlushInput ()
|
||||||
|
{
|
||||||
|
kbdtail = kbdhead = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
ProcessKeyboardEvent(const SDL_Event *Event)
|
||||||
|
{
|
||||||
|
if(Event->key.keysym.sym == SDLK_BACKQUOTE)
|
||||||
|
{
|
||||||
|
exit(0);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if (Event->type == SDL_KEYDOWN)
|
||||||
|
{
|
||||||
|
if ((kbdbuf[kbdtail] = Event->key.keysym.unicode)
|
||||||
|
|| (kbdbuf[kbdtail] = Event->key.keysym.sym) <= 0x7F)
|
||||||
|
{
|
||||||
|
kbdtail = (kbdtail + 1) & (KBDBUFSIZE - 1);
|
||||||
|
if (kbdtail == kbdhead)
|
||||||
|
kbdhead = (kbdhead + 1) & (KBDBUFSIZE - 1);
|
||||||
|
}
|
||||||
|
KeyboardDown[Event->key.keysym.sym]=TRUE;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
KeyboardDown[Event->key.keysym.sym]=FALSE;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
ProcessJoystickEvent (const SDL_Event* Event)
|
||||||
|
{
|
||||||
|
SDL_Event PseudoEvent;
|
||||||
|
|
||||||
|
return;
|
||||||
|
|
||||||
|
if (Event->type == SDL_JOYAXISMOTION)
|
||||||
|
{
|
||||||
|
if (Event->jaxis.axis == 0)
|
||||||
|
{
|
||||||
|
//x-axis
|
||||||
|
|
||||||
|
if (Event->jaxis.value <= -5) //Left
|
||||||
|
{
|
||||||
|
PseudoEvent.type = SDL_KEYDOWN;
|
||||||
|
PseudoEvent.key.keysym.sym = SDLK_LEFT;
|
||||||
|
ProcessKeyboardEvent (&PseudoEvent);
|
||||||
|
|
||||||
|
PseudoEvent.type = SDL_KEYUP;
|
||||||
|
PseudoEvent.key.keysym.sym = SDLK_RIGHT;
|
||||||
|
ProcessKeyboardEvent (&PseudoEvent);
|
||||||
|
}
|
||||||
|
if (Event->jaxis.value >= 5) //Right
|
||||||
|
{
|
||||||
|
PseudoEvent.type = SDL_KEYUP;
|
||||||
|
PseudoEvent.key.keysym.sym = SDLK_LEFT;
|
||||||
|
ProcessKeyboardEvent (&PseudoEvent);
|
||||||
|
|
||||||
|
PseudoEvent.type = SDL_KEYDOWN;
|
||||||
|
PseudoEvent.key.keysym.sym = SDLK_RIGHT;
|
||||||
|
ProcessKeyboardEvent (&PseudoEvent);
|
||||||
|
}
|
||||||
|
if (Event->jaxis.value > -5 && Event->jaxis.value < 5)
|
||||||
|
//Neither Left nor Right
|
||||||
|
{
|
||||||
|
PseudoEvent.type = SDL_KEYUP;
|
||||||
|
PseudoEvent.key.keysym.sym = SDLK_LEFT;
|
||||||
|
ProcessKeyboardEvent (&PseudoEvent);
|
||||||
|
|
||||||
|
PseudoEvent.type = SDL_KEYUP;
|
||||||
|
PseudoEvent.key.keysym.sym = SDLK_RIGHT;
|
||||||
|
ProcessKeyboardEvent (&PseudoEvent);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (Event->jaxis.axis == 1)
|
||||||
|
{
|
||||||
|
//y-axis
|
||||||
|
|
||||||
|
if (Event->jaxis.value <= -5) //Down
|
||||||
|
{
|
||||||
|
PseudoEvent.type = SDL_KEYDOWN;
|
||||||
|
PseudoEvent.key.keysym.sym = SDLK_DOWN;
|
||||||
|
ProcessKeyboardEvent (&PseudoEvent);
|
||||||
|
|
||||||
|
PseudoEvent.type = SDL_KEYUP;
|
||||||
|
PseudoEvent.key.keysym.sym = SDLK_UP;
|
||||||
|
ProcessKeyboardEvent (&PseudoEvent);
|
||||||
|
}
|
||||||
|
if (Event->jaxis.value >= 5) //Up
|
||||||
|
{
|
||||||
|
PseudoEvent.type = SDL_KEYUP;
|
||||||
|
PseudoEvent.key.keysym.sym = SDLK_DOWN;
|
||||||
|
ProcessKeyboardEvent (&PseudoEvent);
|
||||||
|
|
||||||
|
PseudoEvent.type = SDL_KEYDOWN;
|
||||||
|
PseudoEvent.key.keysym.sym = SDLK_UP;
|
||||||
|
ProcessKeyboardEvent (&PseudoEvent);
|
||||||
|
}
|
||||||
|
if (Event->jaxis.value >-5 && Event->jaxis.value < 5)
|
||||||
|
//Neither Down nor Up
|
||||||
|
{
|
||||||
|
PseudoEvent.type = SDL_KEYUP;
|
||||||
|
PseudoEvent.key.keysym.sym = SDLK_DOWN;
|
||||||
|
ProcessKeyboardEvent (&PseudoEvent);
|
||||||
|
|
||||||
|
PseudoEvent.type = SDL_KEYUP;
|
||||||
|
PseudoEvent.key.keysym.sym = SDLK_UP;
|
||||||
|
ProcessKeyboardEvent (&PseudoEvent);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (Event->type == SDL_JOYBUTTONDOWN)
|
||||||
|
{
|
||||||
|
printf("Joystick %i down\n", Event->jbutton.button);
|
||||||
|
|
||||||
|
if (Event->jbutton.button % 3 == 0)
|
||||||
|
{
|
||||||
|
//Mimic the Primary key
|
||||||
|
|
||||||
|
PseudoEvent.type=SDL_KEYDOWN;
|
||||||
|
PseudoEvent.key.keysym.sym = ControlA;
|
||||||
|
ProcessKeyboardEvent (&PseudoEvent);
|
||||||
|
}
|
||||||
|
if (Event->jbutton.button % 3 == 1)
|
||||||
|
{
|
||||||
|
//Mimic the Secondary key
|
||||||
|
|
||||||
|
PseudoEvent.type = SDL_KEYDOWN;
|
||||||
|
PseudoEvent.key.keysym.sym = ControlB;
|
||||||
|
ProcessKeyboardEvent (&PseudoEvent);
|
||||||
|
}
|
||||||
|
if (Event->jbutton.button % 3 == 2)
|
||||||
|
{
|
||||||
|
//Mimic the Tertiary key
|
||||||
|
|
||||||
|
PseudoEvent.type = SDL_KEYDOWN;
|
||||||
|
PseudoEvent.key.keysym.sym = ControlC;
|
||||||
|
ProcessKeyboardEvent (&PseudoEvent);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (Event->type == SDL_JOYBUTTONUP)
|
||||||
|
{
|
||||||
|
if (Event->jbutton.button % 3 == 0)
|
||||||
|
{
|
||||||
|
//Mimic the Primary key
|
||||||
|
|
||||||
|
PseudoEvent.type = SDL_KEYUP;
|
||||||
|
PseudoEvent.key.keysym.sym = ControlA;
|
||||||
|
ProcessKeyboardEvent (&PseudoEvent);
|
||||||
|
}
|
||||||
|
if (Event->jbutton.button % 3 == 1)
|
||||||
|
{
|
||||||
|
//Mimic the Secondary key
|
||||||
|
|
||||||
|
PseudoEvent.type = SDL_KEYUP;
|
||||||
|
PseudoEvent.key.keysym.sym = ControlB;
|
||||||
|
ProcessKeyboardEvent (&PseudoEvent);
|
||||||
|
}
|
||||||
|
if (Event->jbutton.button % 3 == 2)
|
||||||
|
{
|
||||||
|
//Mimic the Tertiary key
|
||||||
|
|
||||||
|
PseudoEvent.type = SDL_KEYUP;
|
||||||
|
PseudoEvent.key.keysym.sym = ControlC;
|
||||||
|
ProcessKeyboardEvent (&PseudoEvent);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//Status: Unimplemented
|
||||||
|
UNICODE
|
||||||
|
KBDToUNICODE (UNICODE SK_in)
|
||||||
|
//This one'll probably require a big table. Arg.
|
||||||
|
{
|
||||||
|
return (SK_in);
|
||||||
|
}
|
||||||
|
|
||||||
|
//Status: Ignored
|
||||||
|
BOOLEAN
|
||||||
|
UninitInput () // Looks like it'll be empty
|
||||||
|
{
|
||||||
|
BOOLEAN ret;
|
||||||
|
|
||||||
|
// printf("Unimplemented function activated: UninitInput()\n");
|
||||||
|
ret = TRUE;
|
||||||
|
return (ret);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Status: Unimplemented
|
||||||
|
UNICODE
|
||||||
|
KeyHit () // Does this clear the top of a queue, or just read it?
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
|
||||||
|
for (i = 0; i < sizeof (KeyboardDown) / sizeof (KeyboardDown[0]); ++i)
|
||||||
|
{
|
||||||
|
if (KeyboardDown[i])
|
||||||
|
{
|
||||||
|
if (i == SDLK_RETURN)
|
||||||
|
return ('\n');
|
||||||
|
else if (i >= 256)
|
||||||
|
{
|
||||||
|
switch (i)
|
||||||
|
{
|
||||||
|
case SDLK_KP_ENTER:
|
||||||
|
return ('\n');
|
||||||
|
case SDLK_KP4:
|
||||||
|
case SDLK_LEFT:
|
||||||
|
return (SK_LF_ARROW);
|
||||||
|
case SDLK_KP6:
|
||||||
|
case SDLK_RIGHT:
|
||||||
|
return (SK_RT_ARROW);
|
||||||
|
case SDLK_KP8:
|
||||||
|
case SDLK_UP:
|
||||||
|
return (SK_UP_ARROW);
|
||||||
|
case SDLK_KP2:
|
||||||
|
case SDLK_DOWN:
|
||||||
|
return (SK_DN_ARROW);
|
||||||
|
case SDLK_KP7:
|
||||||
|
case SDLK_HOME:
|
||||||
|
return (SK_HOME);
|
||||||
|
case SDLK_KP9:
|
||||||
|
case SDLK_PAGEUP:
|
||||||
|
return (SK_PAGE_UP);
|
||||||
|
case SDLK_KP1:
|
||||||
|
case SDLK_END:
|
||||||
|
return (SK_END);
|
||||||
|
case SDLK_KP3:
|
||||||
|
case SDLK_PAGEDOWN:
|
||||||
|
return (SK_PAGE_DOWN);
|
||||||
|
case SDLK_KP0:
|
||||||
|
case SDLK_INSERT:
|
||||||
|
return (SK_INSERT);
|
||||||
|
case SDLK_KP_PERIOD:
|
||||||
|
case SDLK_DELETE:
|
||||||
|
return (SK_DELETE);
|
||||||
|
case SDLK_KP_PLUS:
|
||||||
|
return (SK_KEYPAD_PLUS);
|
||||||
|
case SDLK_KP_MINUS:
|
||||||
|
return (SK_KEYPAD_MINUS);
|
||||||
|
case SDLK_LSHIFT:
|
||||||
|
return (SK_LF_SHIFT);
|
||||||
|
case SDLK_RSHIFT:
|
||||||
|
return (SK_RT_SHIFT);
|
||||||
|
case SDLK_LCTRL:
|
||||||
|
case SDLK_RCTRL:
|
||||||
|
return (SK_CTL);
|
||||||
|
case SDLK_LALT:
|
||||||
|
case SDLK_RALT:
|
||||||
|
return (SK_ALT);
|
||||||
|
case SDLK_F1:
|
||||||
|
case SDLK_F2:
|
||||||
|
case SDLK_F3:
|
||||||
|
case SDLK_F4:
|
||||||
|
case SDLK_F5:
|
||||||
|
case SDLK_F6:
|
||||||
|
case SDLK_F7:
|
||||||
|
case SDLK_F8:
|
||||||
|
case SDLK_F9:
|
||||||
|
case SDLK_F10:
|
||||||
|
case SDLK_F11:
|
||||||
|
case SDLK_F12:
|
||||||
|
return ((UNICODE) ((i - SDLK_F1) + SK_F1));
|
||||||
|
}
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
return ((UNICODE) i);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return (0);
|
||||||
|
}
|
||||||
|
|
||||||
|
//Status: Unimplemented
|
||||||
|
int
|
||||||
|
KeyDown (UNICODE which_scan)
|
||||||
|
// This might use SK_* stuff, of just plain old chars
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
|
||||||
|
i = which_scan;
|
||||||
|
if (i == '\n')
|
||||||
|
{
|
||||||
|
if (KeyboardDown[SDLK_KP_ENTER])
|
||||||
|
return (1);
|
||||||
|
i = SDLK_RETURN;
|
||||||
|
}
|
||||||
|
else if (i >= 128)
|
||||||
|
{
|
||||||
|
switch (i)
|
||||||
|
{
|
||||||
|
case SK_LF_ARROW:
|
||||||
|
if (KeyboardDown[SDLK_KP4])
|
||||||
|
return (1);
|
||||||
|
i = SDLK_LEFT;
|
||||||
|
break;
|
||||||
|
case SK_RT_ARROW:
|
||||||
|
if (KeyboardDown[SDLK_KP6])
|
||||||
|
return (1);
|
||||||
|
i = SDLK_RIGHT;
|
||||||
|
break;
|
||||||
|
case SK_UP_ARROW:
|
||||||
|
if (KeyboardDown[SDLK_KP8])
|
||||||
|
return (1);
|
||||||
|
i = SDLK_UP;
|
||||||
|
break;
|
||||||
|
case SK_DN_ARROW:
|
||||||
|
if (KeyboardDown[SDLK_KP2])
|
||||||
|
return (1);
|
||||||
|
i = SDLK_DOWN;
|
||||||
|
break;
|
||||||
|
case SK_HOME:
|
||||||
|
if (KeyboardDown[SDLK_KP7])
|
||||||
|
return (1);
|
||||||
|
i = SDLK_HOME;
|
||||||
|
break;
|
||||||
|
case SK_PAGE_UP:
|
||||||
|
if (KeyboardDown[SDLK_KP9])
|
||||||
|
return (1);
|
||||||
|
i = SDLK_PAGEUP;
|
||||||
|
break;
|
||||||
|
case SK_END:
|
||||||
|
if (KeyboardDown[SDLK_KP1])
|
||||||
|
return (1);
|
||||||
|
i = SDLK_END;
|
||||||
|
break;
|
||||||
|
case SK_PAGE_DOWN:
|
||||||
|
if (KeyboardDown[SDLK_KP3])
|
||||||
|
return (1);
|
||||||
|
i = SDLK_PAGEDOWN;
|
||||||
|
break;
|
||||||
|
case SK_INSERT:
|
||||||
|
if (KeyboardDown[SDLK_KP0])
|
||||||
|
return (1);
|
||||||
|
i = SDLK_INSERT;
|
||||||
|
break;
|
||||||
|
case SK_DELETE:
|
||||||
|
if (KeyboardDown[SDLK_KP_PERIOD])
|
||||||
|
return (1);
|
||||||
|
i = SDLK_DELETE;
|
||||||
|
break;
|
||||||
|
case SK_KEYPAD_PLUS:
|
||||||
|
i = SDLK_KP_PLUS;
|
||||||
|
break;
|
||||||
|
case SK_KEYPAD_MINUS:
|
||||||
|
i = SDLK_KP_MINUS;
|
||||||
|
break;
|
||||||
|
case SK_LF_SHIFT:
|
||||||
|
i = SDLK_LSHIFT;
|
||||||
|
break;
|
||||||
|
case SK_RT_SHIFT:
|
||||||
|
i = SDLK_RSHIFT;
|
||||||
|
break;
|
||||||
|
case SK_CTL:
|
||||||
|
if (KeyboardDown[SDLK_LCTRL])
|
||||||
|
return (1);
|
||||||
|
i = SDLK_RCTRL;
|
||||||
|
break;
|
||||||
|
case SK_ALT:
|
||||||
|
if (KeyboardDown[SDLK_LALT])
|
||||||
|
return (1);
|
||||||
|
i = SDLK_RALT;
|
||||||
|
break;
|
||||||
|
case SK_F1:
|
||||||
|
case SK_F2:
|
||||||
|
case SK_F3:
|
||||||
|
case SK_F4:
|
||||||
|
case SK_F5:
|
||||||
|
case SK_F6:
|
||||||
|
case SK_F7:
|
||||||
|
case SK_F8:
|
||||||
|
case SK_F9:
|
||||||
|
case SK_F10:
|
||||||
|
case SK_F11:
|
||||||
|
case SK_F12:
|
||||||
|
i = (i - SK_F1) + SDLK_F1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return (KeyboardDown[i]);
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
||||||
@@ -0,0 +1,49 @@
|
|||||||
|
//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.
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
/****************************************
|
||||||
|
|
||||||
|
Star Control II: 3DO => SDL Port
|
||||||
|
|
||||||
|
Copyright Toys for Bob, 2002
|
||||||
|
|
||||||
|
Programmer: Chris Nelson
|
||||||
|
|
||||||
|
*****************************************/
|
||||||
|
|
||||||
|
|
||||||
|
#ifndef INPUT_H
|
||||||
|
#define INPUT_H
|
||||||
|
|
||||||
|
extern Uint8 KeyboardDown[512];
|
||||||
|
|
||||||
|
extern UBYTE ControlA;
|
||||||
|
extern UBYTE ControlB;
|
||||||
|
extern UBYTE ControlC;
|
||||||
|
extern UBYTE ControlX;
|
||||||
|
extern UBYTE ControlStart;
|
||||||
|
extern UBYTE ControlLeftShift;
|
||||||
|
extern UBYTE ControlRightShift;
|
||||||
|
|
||||||
|
Uint16 GetUNICODEKey ();
|
||||||
|
void FlushInput ();
|
||||||
|
void ProcessKeyboardEvent (const SDL_Event *Event);
|
||||||
|
void ProcessJoystickEvent (const SDL_Event *Event);
|
||||||
|
|
||||||
|
#endif
|
||||||
@@ -0,0 +1,47 @@
|
|||||||
|
//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.
|
||||||
|
*/
|
||||||
|
|
||||||
|
// This file includes some misc things, previously in SDL_wrapper.h
|
||||||
|
// before modularization. -Mika
|
||||||
|
|
||||||
|
#ifndef MISC_H
|
||||||
|
#define MISC_H
|
||||||
|
|
||||||
|
#define Stream FILE
|
||||||
|
#define MEMTYPE_ANY 1
|
||||||
|
|
||||||
|
extern SEMAPHORE _MemorySem;
|
||||||
|
|
||||||
|
#define SqrtF16 sqrt
|
||||||
|
#define Atan2F16 atan2
|
||||||
|
#define CosF16 cos
|
||||||
|
#define SinF16 sin
|
||||||
|
|
||||||
|
int CD_get_drive(); // Returns 0
|
||||||
|
unsigned int CD_get_volsize(); // Returns 0
|
||||||
|
|
||||||
|
void OpenMathFolio();
|
||||||
|
|
||||||
|
extern void *HMalloc (int size);
|
||||||
|
extern void HFree (void *p);
|
||||||
|
extern void *HCalloc (int size);
|
||||||
|
extern void *HRealloc (void *p, int size);
|
||||||
|
|
||||||
|
extern int TFB_DEBUG_HALT;
|
||||||
|
|
||||||
|
#endif
|
||||||
@@ -0,0 +1,13 @@
|
|||||||
|
|
||||||
|
# Automake template file.
|
||||||
|
# Written by Mudry <mudry@user.sf.net>, protected by GNU GPL.
|
||||||
|
# CVS $ Id: $
|
||||||
|
|
||||||
|
INCLUDES = @SDL_CFLAGS@ @SMPEG_CFLAGS@ \
|
||||||
|
-I$(top_srcdir)/src \
|
||||||
|
-I$(top_srcdir)/src/sc2code \
|
||||||
|
-I$(top_srcdir)/src/sc2code/libs
|
||||||
|
|
||||||
|
noinst_LTLIBRARIES = libsdlsound.la
|
||||||
|
libsdlsound_la_SOURCES = modfuncs.c play.c sound.c trackplayer.c
|
||||||
|
|
||||||
@@ -0,0 +1,206 @@
|
|||||||
|
//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.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#if defined (GFXMODULE_SDL_OPENGL) || defined (GFXMODULE_SDL_PURE)
|
||||||
|
|
||||||
|
#include "libs/strings/strintrn.h"
|
||||||
|
#include "libs/sound/sndintrn.h"
|
||||||
|
#ifdef WIN32
|
||||||
|
#include <io.h>
|
||||||
|
#endif
|
||||||
|
#include <fcntl.h>
|
||||||
|
|
||||||
|
#include "libs/graphics/sdl/sdl_common.h"
|
||||||
|
|
||||||
|
MEM_HANDLE
|
||||||
|
_GetSoundBankData (FILE *fp, DWORD length)
|
||||||
|
{
|
||||||
|
#ifdef WIN32
|
||||||
|
int omode;
|
||||||
|
#endif
|
||||||
|
int snd_ct, n;
|
||||||
|
DWORD opos;
|
||||||
|
char CurrentLine[1024], filename[1024];
|
||||||
|
#define MAX_FX 256
|
||||||
|
Mix_Chunk *sndfx[MAX_FX];
|
||||||
|
STRING_TABLE Snd;
|
||||||
|
|
||||||
|
opos = ftell (fp);
|
||||||
|
|
||||||
|
{
|
||||||
|
char *s1, *s2;
|
||||||
|
extern char *_cur_resfile_name;
|
||||||
|
|
||||||
|
if (_cur_resfile_name == 0
|
||||||
|
|| (((s2 = 0), (s1 = strrchr (_cur_resfile_name, '/')) == 0)
|
||||||
|
&& (s2 = strrchr (_cur_resfile_name, '\\')) == 0))
|
||||||
|
n = 0;
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if (s2 > s1)
|
||||||
|
s1 = s2;
|
||||||
|
n = s1 - _cur_resfile_name + 1;
|
||||||
|
strncpy (filename, _cur_resfile_name, n);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#ifdef WIN32
|
||||||
|
omode = _setmode (fileno (fp), O_TEXT);
|
||||||
|
#endif
|
||||||
|
snd_ct = 0;
|
||||||
|
while (fgets (CurrentLine, sizeof (CurrentLine), fp) && snd_ct < MAX_FX)
|
||||||
|
{
|
||||||
|
if
|
||||||
|
(
|
||||||
|
sscanf(CurrentLine, "%s", &filename[n]) == 1 &&
|
||||||
|
(sndfx[snd_ct] = Mix_LoadWAV (filename))
|
||||||
|
)
|
||||||
|
{
|
||||||
|
++snd_ct;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
printf("_GetSoundBankData: Bad file!\n");
|
||||||
|
}
|
||||||
|
|
||||||
|
if (ftell (fp) - opos >= length)
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
#ifdef WIN32
|
||||||
|
_setmode (fileno (fp), omode);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
Snd = 0;
|
||||||
|
if (snd_ct && (Snd = AllocStringTable (
|
||||||
|
sizeof (STRING_TABLE_DESC)
|
||||||
|
+ (sizeof (DWORD) * snd_ct)
|
||||||
|
+ (sizeof (sndfx[0]) * snd_ct)
|
||||||
|
)))
|
||||||
|
{
|
||||||
|
STRING_TABLEPTR fxTab;
|
||||||
|
|
||||||
|
LockStringTable (Snd, &fxTab);
|
||||||
|
if (fxTab == 0)
|
||||||
|
{
|
||||||
|
while (snd_ct--)
|
||||||
|
Mix_FreeChunk (sndfx[snd_ct]);
|
||||||
|
FreeStringTable (Snd);
|
||||||
|
Snd = 0;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
DWORD *offs, StringOffs;
|
||||||
|
|
||||||
|
fxTab->StringCount = snd_ct;
|
||||||
|
fxTab->flags = 0;
|
||||||
|
offs = fxTab->StringOffsets;
|
||||||
|
StringOffs = sizeof (STRING_TABLE_DESC) + (sizeof (DWORD) * snd_ct);
|
||||||
|
memcpy ((BYTE *)fxTab + StringOffs, sndfx, sizeof (sndfx[0]) * snd_ct);
|
||||||
|
do
|
||||||
|
{
|
||||||
|
*offs++ = StringOffs;
|
||||||
|
StringOffs += sizeof (sndfx[0]);
|
||||||
|
} while (snd_ct--);
|
||||||
|
UnlockStringTable (Snd);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return ((MEM_HANDLE)Snd);
|
||||||
|
}
|
||||||
|
|
||||||
|
BOOLEAN
|
||||||
|
_ReleaseSoundBankData (MEM_HANDLE Snd)
|
||||||
|
{
|
||||||
|
STRING_TABLEPTR fxTab;
|
||||||
|
|
||||||
|
LockStringTable (Snd, &fxTab);
|
||||||
|
if (fxTab)
|
||||||
|
{
|
||||||
|
int snd_ct;
|
||||||
|
Mix_Chunk **sptr;
|
||||||
|
|
||||||
|
snd_ct = fxTab->StringCount;
|
||||||
|
sptr = (Mix_Chunk **)((BYTE *)fxTab + fxTab->StringOffsets[0]);
|
||||||
|
while (snd_ct--)
|
||||||
|
{
|
||||||
|
Mix_FreeChunk (*sptr);
|
||||||
|
*sptr++ = 0;
|
||||||
|
}
|
||||||
|
UnlockStringTable (Snd);
|
||||||
|
FreeStringTable (Snd);
|
||||||
|
|
||||||
|
return (TRUE);
|
||||||
|
}
|
||||||
|
|
||||||
|
return (FALSE);
|
||||||
|
}
|
||||||
|
|
||||||
|
MEM_HANDLE
|
||||||
|
_GetMusicData (FILE *fp, DWORD length)
|
||||||
|
{
|
||||||
|
MEM_HANDLE h;
|
||||||
|
extern char *_cur_resfile_name;
|
||||||
|
|
||||||
|
h = 0;
|
||||||
|
if (_cur_resfile_name && (h = AllocMusicData (sizeof (void *))))
|
||||||
|
{
|
||||||
|
Mix_Music **pmus;
|
||||||
|
|
||||||
|
LockMusicData (h, &pmus);
|
||||||
|
if (pmus == 0 || (*pmus = Mix_LoadMUS (_cur_resfile_name)) == 0)
|
||||||
|
{
|
||||||
|
UnlockMusicData (h);
|
||||||
|
mem_release (h);
|
||||||
|
h = 0;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
//
|
||||||
|
}
|
||||||
|
UnlockMusicData (h);
|
||||||
|
}
|
||||||
|
|
||||||
|
(void) fp; /* satisfy compiler (unused parameter) */
|
||||||
|
(void) length; /* satisfy compiler (unused parameter) */
|
||||||
|
return (h);
|
||||||
|
}
|
||||||
|
|
||||||
|
BOOLEAN
|
||||||
|
_ReleaseMusicData (MEM_HANDLE handle)
|
||||||
|
{
|
||||||
|
Mix_Music **pmus;
|
||||||
|
|
||||||
|
LockMusicData (handle, &pmus);
|
||||||
|
if (pmus == 0)
|
||||||
|
return (FALSE);
|
||||||
|
|
||||||
|
Mix_FreeMusic (*pmus);
|
||||||
|
|
||||||
|
UnlockMusicData (handle);
|
||||||
|
mem_release (handle);
|
||||||
|
|
||||||
|
return (TRUE);
|
||||||
|
}
|
||||||
|
|
||||||
|
BOOLEAN
|
||||||
|
DestroySound(SOUND_REF target)
|
||||||
|
{
|
||||||
|
return (_ReleaseSoundBankData (target));
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
||||||
@@ -0,0 +1,95 @@
|
|||||||
|
//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.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#if defined (GFXMODULE_SDL_OPENGL) || defined (GFXMODULE_SDL_PURE)
|
||||||
|
|
||||||
|
#include "libs/sound/sndintrn.h"
|
||||||
|
#include "timlib.h"
|
||||||
|
|
||||||
|
#include "libs/graphics/sdl/sdl_common.h"
|
||||||
|
|
||||||
|
static MUSIC_REF curMusicRef;
|
||||||
|
|
||||||
|
void
|
||||||
|
PLRPlaySong (MUSIC_REF MusicRef, BOOLEAN Continuous, BYTE Priority)
|
||||||
|
{
|
||||||
|
Mix_Music **pmus;
|
||||||
|
|
||||||
|
LockMusicData (MusicRef, &pmus);
|
||||||
|
if (pmus)
|
||||||
|
{
|
||||||
|
PLRStop (curMusicRef);
|
||||||
|
|
||||||
|
curMusicRef = MusicRef;
|
||||||
|
Mix_PlayMusic (*pmus, Continuous ? -1 : 1);
|
||||||
|
}
|
||||||
|
(void) Priority; /* Satisfy compiler because of unused variable */
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
PLRStop (MUSIC_REF MusicRef)
|
||||||
|
{
|
||||||
|
if (MusicRef == curMusicRef || MusicRef == (MUSIC_REF)~0)
|
||||||
|
{
|
||||||
|
Mix_HaltMusic ();
|
||||||
|
|
||||||
|
UnlockMusicData (curMusicRef);
|
||||||
|
curMusicRef = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
BOOLEAN
|
||||||
|
PLRPlaying (MUSIC_REF MusicRef)
|
||||||
|
{
|
||||||
|
if (curMusicRef && (MusicRef == curMusicRef || MusicRef == (MUSIC_REF)~0))
|
||||||
|
{
|
||||||
|
if (Mix_PlayingMusic ())
|
||||||
|
return (TRUE);
|
||||||
|
PLRStop (curMusicRef);
|
||||||
|
}
|
||||||
|
|
||||||
|
return (FALSE);
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
PLRPause (MUSIC_REF MusicRef)
|
||||||
|
{
|
||||||
|
if (MusicRef == curMusicRef || MusicRef == (MUSIC_REF)~0)
|
||||||
|
{
|
||||||
|
// Mix_FadeOutMusic (1 * 1000);
|
||||||
|
Mix_PauseMusic ();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
PLRResume (MUSIC_REF MusicRef)
|
||||||
|
{
|
||||||
|
if (MusicRef == curMusicRef || MusicRef == (MUSIC_REF)~0)
|
||||||
|
{
|
||||||
|
// Mix_FadeInMusic (1 * 1000);
|
||||||
|
Mix_ResumeMusic ();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
BOOLEAN
|
||||||
|
DestroyMusic (MUSIC_REF MusicRef)
|
||||||
|
{
|
||||||
|
return (FreeMusicData (MusicRef));
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
||||||
@@ -0,0 +1,187 @@
|
|||||||
|
//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.
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
/****************************************
|
||||||
|
|
||||||
|
Star Control II: 3DO => SDL Port
|
||||||
|
|
||||||
|
Copyright Toys for Bob, 2002
|
||||||
|
|
||||||
|
Programmer: Chris Nelson
|
||||||
|
|
||||||
|
*****************************************/
|
||||||
|
|
||||||
|
#if defined (GFXMODULE_SDL_OPENGL) || defined (GFXMODULE_SDL_PURE)
|
||||||
|
|
||||||
|
#include "libs/graphics/sdl/sdl_common.h"
|
||||||
|
|
||||||
|
//Status: Unimplemented
|
||||||
|
void
|
||||||
|
StopSound()
|
||||||
|
// So does this stop ALL sound? How about music?
|
||||||
|
{
|
||||||
|
Mix_HaltChannel (-1);
|
||||||
|
}
|
||||||
|
|
||||||
|
int _music_volume = (MAX_VOLUME + 1) >> 1;
|
||||||
|
|
||||||
|
// Status: Unimplemented
|
||||||
|
void
|
||||||
|
SetMusicVolume(COUNT Volume) //Volume calibration... [0,255]?
|
||||||
|
{
|
||||||
|
Mix_VolumeMusic ((_music_volume = Volume) * SDL_MIX_MAXVOLUME /
|
||||||
|
MAX_VOLUME);
|
||||||
|
}
|
||||||
|
|
||||||
|
//Status: Unimplemented
|
||||||
|
BOOLEAN
|
||||||
|
SoundPlaying()
|
||||||
|
{
|
||||||
|
return (Mix_Playing (-1) != 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
int
|
||||||
|
GetSoundData(char* data) //Returns the data size.
|
||||||
|
{
|
||||||
|
int ret;
|
||||||
|
|
||||||
|
printf("Unimplemented function activated: GetSoundData()\n");
|
||||||
|
ret = 0;
|
||||||
|
return (ret);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Status: Unimplemented
|
||||||
|
int
|
||||||
|
GetSoundInfo(int* length, int* offset)
|
||||||
|
// Umm... How does it know which sound?
|
||||||
|
{
|
||||||
|
int ret;
|
||||||
|
|
||||||
|
printf ("Unimplemented function activated: GetSoundInfo()\n");
|
||||||
|
ret = 0;
|
||||||
|
return (ret);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Status: Unimplemented
|
||||||
|
BOOLEAN
|
||||||
|
ChannelPlaying(COUNT WhichChannel)
|
||||||
|
// SDL will have a nice interface for this, I hope.
|
||||||
|
{
|
||||||
|
// printf("Unimplemented function activated: ChannelPlaying()\n");
|
||||||
|
return ((BOOLEAN) Mix_Playing (WhichChannel));
|
||||||
|
}
|
||||||
|
|
||||||
|
// Status: Unimplemented
|
||||||
|
void
|
||||||
|
PlayChannel(
|
||||||
|
COUNT channel,
|
||||||
|
PVOID sample,
|
||||||
|
COUNT sample_length,
|
||||||
|
COUNT loop_begin,
|
||||||
|
COUNT loop_length,
|
||||||
|
unsigned char priority
|
||||||
|
) // This one's important.
|
||||||
|
{
|
||||||
|
Mix_Chunk* Chunk;
|
||||||
|
|
||||||
|
Chunk=*(Mix_Chunk**)sample;
|
||||||
|
Mix_PlayChannel (
|
||||||
|
channel, //-1 would be easiest
|
||||||
|
Chunk,
|
||||||
|
0
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
//Status: Unimplemented
|
||||||
|
void
|
||||||
|
StopChannel(COUNT channel, unsigned char Priority) // Easy w/ SDL.
|
||||||
|
{
|
||||||
|
Mix_HaltChannel (channel);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Status: Maybe Implemented
|
||||||
|
PBYTE
|
||||||
|
GetSampleAddress (SOUND sound)
|
||||||
|
// I might be prototyping this wrong, type-wise.
|
||||||
|
{
|
||||||
|
return ((PBYTE)GetSoundAddress (sound));
|
||||||
|
}
|
||||||
|
|
||||||
|
// Status: Unimplemented
|
||||||
|
COUNT
|
||||||
|
GetSampleLength (SOUND sound)
|
||||||
|
{
|
||||||
|
COUNT ret;
|
||||||
|
Mix_Chunk *Chunk;
|
||||||
|
|
||||||
|
Chunk = (Mix_Chunk *) sound;
|
||||||
|
ret = 0; // Chunk->alen;
|
||||||
|
|
||||||
|
// printf ("Maybe Implemented function activated: GetSampleLength()\n");
|
||||||
|
return(ret);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Status: Unimplemented
|
||||||
|
void
|
||||||
|
SetChannelRate (COUNT channel, DWORD rate_hz, unsigned char priority)
|
||||||
|
// in hz
|
||||||
|
{
|
||||||
|
// printf ("Unimplemented function activated: SetChannelRate()\n");
|
||||||
|
}
|
||||||
|
|
||||||
|
// Status: Unimplemented
|
||||||
|
COUNT
|
||||||
|
GetSampleRate (SOUND sound)
|
||||||
|
{
|
||||||
|
COUNT ret;
|
||||||
|
|
||||||
|
// printf("Unimplemented function activated: GetSampleRate()\n");
|
||||||
|
ret=0;
|
||||||
|
return(ret);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Status: Unimplemented
|
||||||
|
void
|
||||||
|
SetChannelVolume (COUNT channel, COUNT volume, BYTE priority)
|
||||||
|
// I wonder what this whole priority business is...
|
||||||
|
// I can probably ignore it.
|
||||||
|
{
|
||||||
|
// printf ("Unimplemented function activated: SetChannelVolume()\n");
|
||||||
|
}
|
||||||
|
|
||||||
|
//Status: Ignored
|
||||||
|
BOOLEAN
|
||||||
|
InitSound (int argc, char* argv[])
|
||||||
|
// Odd things to pass the InitSound function...
|
||||||
|
{
|
||||||
|
BOOLEAN ret;
|
||||||
|
|
||||||
|
// printf("Unimplemented function activated: InitSound()\n");
|
||||||
|
ret = TRUE;
|
||||||
|
return (ret);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Status: Unimplemented
|
||||||
|
void
|
||||||
|
UninitSound () //Maybe I should call StopSound() first?
|
||||||
|
{
|
||||||
|
//printf("Unimplemented function activated: UninitSound()\n");
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
||||||
@@ -0,0 +1,199 @@
|
|||||||
|
//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.
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/****************************************
|
||||||
|
|
||||||
|
Star Control II: 3DO => SDL Port
|
||||||
|
|
||||||
|
Copyright Toys for Bob, 2002
|
||||||
|
|
||||||
|
Programmer: Chris Nelson
|
||||||
|
|
||||||
|
*****************************************/
|
||||||
|
|
||||||
|
#if defined (GFXMODULE_SDL_OPENGL) || defined (GFXMODULE_SDL_PURE)
|
||||||
|
|
||||||
|
#include "libs/graphics/sdl/sdl_common.h"
|
||||||
|
#include "libs/sound/trackplayer.h"
|
||||||
|
|
||||||
|
#define VOICE_CHANNEL 0
|
||||||
|
|
||||||
|
extern int do_subtitles (UNICODE *pStr);
|
||||||
|
|
||||||
|
static int tct, tcur, no_voice;
|
||||||
|
#define MAX_CLIPS 50
|
||||||
|
static struct
|
||||||
|
{
|
||||||
|
int text_spliced;
|
||||||
|
Mix_Chunk *chunk;
|
||||||
|
UNICODE *text;
|
||||||
|
} track_clip[MAX_CLIPS];
|
||||||
|
|
||||||
|
void
|
||||||
|
JumpTrack (int abort)
|
||||||
|
{
|
||||||
|
Mix_ChannelFinished (0);
|
||||||
|
|
||||||
|
if (track_clip[tcur].chunk)
|
||||||
|
Mix_HaltChannel (VOICE_CHANNEL);
|
||||||
|
|
||||||
|
no_voice = 1;
|
||||||
|
do_subtitles ((void *)~0);
|
||||||
|
|
||||||
|
if (abort)
|
||||||
|
tcur = tct;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
advance_track (int channel_finished)
|
||||||
|
{
|
||||||
|
if (channel_finished <= VOICE_CHANNEL)
|
||||||
|
{
|
||||||
|
if (channel_finished == VOICE_CHANNEL)
|
||||||
|
++tcur;
|
||||||
|
if (tcur < tct)
|
||||||
|
{
|
||||||
|
Mix_PlayChannel (VOICE_CHANNEL, track_clip[tcur].chunk, 0);
|
||||||
|
do_subtitles (0);
|
||||||
|
}
|
||||||
|
else if (channel_finished == VOICE_CHANNEL)
|
||||||
|
{
|
||||||
|
--tcur;
|
||||||
|
no_voice = 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
ResumeTrack ()
|
||||||
|
{
|
||||||
|
if (tcur < tct)
|
||||||
|
{
|
||||||
|
if (Mix_Playing /* Mix_Paused */ (VOICE_CHANNEL))
|
||||||
|
Mix_Resume (VOICE_CHANNEL);
|
||||||
|
else if (!no_voice)
|
||||||
|
{
|
||||||
|
if (tcur == 0)
|
||||||
|
Mix_ChannelFinished (advance_track);
|
||||||
|
advance_track (-1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
COUNT
|
||||||
|
PlayingTrack ()
|
||||||
|
{
|
||||||
|
if (tcur < tct)
|
||||||
|
{
|
||||||
|
if (do_subtitles (track_clip[tcur].text)
|
||||||
|
|| (no_voice && ++tcur < tct && do_subtitles (0)))
|
||||||
|
return (tcur + 1);
|
||||||
|
else if (track_clip[tcur].chunk)
|
||||||
|
return (Mix_Playing (VOICE_CHANNEL) ? (COUNT)(tcur + 1) : 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
return (0);
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
StopTrack ()
|
||||||
|
{
|
||||||
|
Mix_ChannelFinished (0);
|
||||||
|
Mix_HaltChannel (VOICE_CHANNEL);
|
||||||
|
|
||||||
|
while (tct--)
|
||||||
|
{
|
||||||
|
if (track_clip[tct].text_spliced)
|
||||||
|
{
|
||||||
|
track_clip[tct].text_spliced = 0;
|
||||||
|
HFree (track_clip[tct].text);
|
||||||
|
track_clip[tct].text = 0;
|
||||||
|
}
|
||||||
|
if (track_clip[tct].chunk)
|
||||||
|
{
|
||||||
|
Mix_FreeChunk (track_clip[tct].chunk);
|
||||||
|
track_clip[tct].chunk = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
tct = tcur = 0;
|
||||||
|
no_voice = 0;
|
||||||
|
do_subtitles (0);
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
SpliceTrack (UNICODE *TrackName, UNICODE *TrackText)
|
||||||
|
{
|
||||||
|
if (TrackText)
|
||||||
|
{
|
||||||
|
if (TrackName == 0)
|
||||||
|
{
|
||||||
|
if (tct)
|
||||||
|
{
|
||||||
|
int slen1, slen2;
|
||||||
|
UNICODE *oTT;
|
||||||
|
|
||||||
|
oTT = track_clip[tct - 1].text;
|
||||||
|
slen1 = wstrlen (oTT);
|
||||||
|
slen2 = wstrlen (TrackText);
|
||||||
|
if (track_clip[tct - 1].text_spliced)
|
||||||
|
track_clip[tct - 1].text = HRealloc (oTT, slen1 + slen2 + 1);
|
||||||
|
else
|
||||||
|
{
|
||||||
|
track_clip[tct - 1].text = HMalloc (slen1 + slen2 + 1);
|
||||||
|
wstrcpy (track_clip[tct - 1].text, oTT);
|
||||||
|
track_clip[tct - 1].text_spliced = 1;
|
||||||
|
}
|
||||||
|
wstrcpy (&track_clip[tct - 1].text[slen1], TrackText);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if (tct < MAX_CLIPS)
|
||||||
|
{
|
||||||
|
track_clip[tct].text = TrackText;
|
||||||
|
track_clip[tct].chunk = Mix_LoadWAV (TrackName);
|
||||||
|
track_clip[tct].text_spliced = 0;
|
||||||
|
++tct;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
PauseTrack ()
|
||||||
|
{
|
||||||
|
if (tcur < tct && track_clip[tcur].chunk)
|
||||||
|
Mix_Pause (VOICE_CHANNEL);
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
FastReverse ()
|
||||||
|
{
|
||||||
|
JumpTrack (0);
|
||||||
|
no_voice = 0;
|
||||||
|
tcur = 0;
|
||||||
|
ResumeTrack ();
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
FastForward ()
|
||||||
|
{
|
||||||
|
JumpTrack (0);
|
||||||
|
// no_voice = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
||||||
@@ -0,0 +1,79 @@
|
|||||||
|
//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 "libs/graphics/gfx_common.h"
|
||||||
|
|
||||||
|
extern int _music_volume;
|
||||||
|
|
||||||
|
static TASK FadeTask;
|
||||||
|
static SIZE TTotal;
|
||||||
|
static SIZE volume_end;
|
||||||
|
|
||||||
|
static int
|
||||||
|
fade_task (void *data)
|
||||||
|
{
|
||||||
|
SIZE TDelta, volume_beg;
|
||||||
|
DWORD StartTime, CurTime;
|
||||||
|
|
||||||
|
volume_beg = _music_volume;
|
||||||
|
StartTime = CurTime = GetTimeCounter ();
|
||||||
|
do
|
||||||
|
{
|
||||||
|
CurTime = SleepTask (CurTime + 1);
|
||||||
|
if ((TDelta = (SIZE) (CurTime - StartTime)) > TTotal)
|
||||||
|
TDelta = TTotal;
|
||||||
|
|
||||||
|
SetMusicVolume ((COUNT) (volume_beg + (SIZE)
|
||||||
|
((long) (volume_end - volume_beg) * TDelta / TTotal)));
|
||||||
|
} while (TDelta < TTotal);
|
||||||
|
|
||||||
|
FadeTask = 0;
|
||||||
|
return (1);
|
||||||
|
}
|
||||||
|
|
||||||
|
DWORD
|
||||||
|
FadeMusic (BYTE end_vol, SIZE TimeInterval)
|
||||||
|
{
|
||||||
|
DWORD TimeOut;
|
||||||
|
|
||||||
|
if (FadeTask)
|
||||||
|
{
|
||||||
|
volume_end = _music_volume;
|
||||||
|
TTotal = 1;
|
||||||
|
do
|
||||||
|
TaskSwitch ();
|
||||||
|
while (FadeTask);
|
||||||
|
TaskSwitch ();
|
||||||
|
}
|
||||||
|
|
||||||
|
if ((TTotal = TimeInterval) <= 0)
|
||||||
|
TTotal = 1; /* prevent divide by zero and negative fade */
|
||||||
|
volume_end = end_vol;
|
||||||
|
|
||||||
|
if (TTotal > 1 && (FadeTask = AddTask (fade_task, 0)))
|
||||||
|
{
|
||||||
|
TimeOut = GetTimeCounter () + TTotal + 1;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
SetMusicVolume (end_vol);
|
||||||
|
TimeOut = GetTimeCounter ();
|
||||||
|
}
|
||||||
|
|
||||||
|
return (TimeOut);
|
||||||
|
}
|
||||||
@@ -0,0 +1,33 @@
|
|||||||
|
//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 TRACKPLAYER_H
|
||||||
|
#define TRACKPLAYER_H
|
||||||
|
|
||||||
|
void ResumeTrack();
|
||||||
|
void PauseTrack();
|
||||||
|
COUNT PlayingTrack();
|
||||||
|
void JumpTrack(int abort);
|
||||||
|
void FastForward();
|
||||||
|
void FastReverse();
|
||||||
|
void StopTrack();
|
||||||
|
void SpliceTrack(UNICODE *filespec, UNICODE *textspec);
|
||||||
|
int GetSoundData(char *data);
|
||||||
|
int GetSoundInfo (int *len, int *offs);
|
||||||
|
|
||||||
|
#endif
|
||||||
Reference in New Issue
Block a user