Dirty hacks to get MinGW to compile again (hopefully I haven't broken MSVC in the process)

git-svn-id: https://svn.code.sf.net/p/fteqw/code/branches/wip@3686 fc73d0e0-1445-4013-8a0c-d673dee63da5
This commit is contained in:
Lance 2010-12-07 12:23:56 +00:00
parent da1924e583
commit 19207aa590
4 changed files with 168 additions and 79 deletions

View file

@ -659,7 +659,7 @@ qboolean LibPNG_Init(void)
#if defined(MINGW) //hehehe... add annother symbol so the statically linked cygwin libpng can link
#if defined(MING) //hehehe... add annother symbol so the statically linked cygwin libpng can link
#undef setjmp
int setjmp (jmp_buf jb)
{
@ -908,6 +908,7 @@ int Image_WritePNG (char *filename, int compression, qbyte *pixels, int width, i
qjpeg_CreateDecompress((cinfo), JPEG_LIB_VERSION, \
(size_t) sizeof(struct jpeg_decompress_struct))
#ifdef DYNAMIC_LIBJPEG
boolean (VARGS *qjpeg_resync_to_restart) JPP((j_decompress_ptr cinfo, int desired)) JSTATIC(jpeg_resync_to_restart);
boolean (VARGS *qjpeg_finish_decompress) JPP((j_decompress_ptr cinfo)) JSTATIC(jpeg_finish_decompress);
JDIMENSION (VARGS *qjpeg_read_scanlines) JPP((j_decompress_ptr cinfo, JSAMPARRAY scanlines, JDIMENSION max_lines)) JSTATIC(jpeg_read_scanlines);
@ -925,6 +926,7 @@ void (VARGS *qjpeg_set_quality) JPP((j_compress_ptr cinfo, int quality, boolean
void (VARGS *qjpeg_set_defaults) JPP((j_compress_ptr cinfo)) JSTATIC(jpeg_set_defaults);
void (VARGS *qjpeg_CreateCompress) JPP((j_compress_ptr cinfo, int version, size_t structsize)) JSTATIC(jpeg_CreateCompress);
void (VARGS *qjpeg_destroy_compress) JPP((j_compress_ptr cinfo)) JSTATIC(jpeg_destroy_compress);
#endif
qboolean LibJPEG_Init(void)
{
@ -1096,7 +1098,11 @@ ftejpeg_mem_src (j_decompress_ptr cinfo, qbyte * infile, int maxlen)
src->pub.init_source = init_source;
src->pub.fill_input_buffer = fill_input_buffer;
src->pub.skip_input_data = skip_input_data;
src->pub.resync_to_restart = qjpeg_resync_to_restart; /* use default method */
#ifdef DYNAMIC_LIBJPEG
src->pub.resync_to_restart = qjpeg_resync_to_restart; /* use default method */
#else
src->pub.resync_to_restart = jpeg_resync_to_restart; /* use default method */
#endif
src->pub.term_source = term_source;
src->infile = infile;
src->pub.bytes_in_buffer = 0; /* forces fill_input_buffer on first read */
@ -1130,26 +1136,46 @@ qbyte *ReadJPEGFile(qbyte *infile, int length, int *width, int *height)
/* Step 1: allocate and initialize JPEG decompression object */
/* We set up the normal JPEG error routines, then override error_exit. */
cinfo.err = qjpeg_std_error(&jerr.pub);
#ifdef DYNAMIC_LIBJPEG
cinfo.err = qjpeg_std_error(&jerr.pub);
#else
cinfo.err = jpeg_std_error(&jerr.pub);
#endif
jerr.pub.error_exit = my_error_exit;
/* Establish the setjmp return context for my_error_exit to use. */
if (setjmp(jerr.setjmp_buffer))
{
// If we get here, the JPEG code has signaled an error.
badjpeg:
qjpeg_destroy_decompress(&cinfo);
#ifdef DYNAMIC_LIBJPEG
qjpeg_destroy_decompress(&cinfo);
#else
jpeg_destroy_decompress(&cinfo);
#endif
if (mem)
BZ_Free(mem);
return 0;
}
qjpeg_create_decompress(&cinfo);
#ifdef DYNAMIC_LIBJPEG
qjpeg_create_decompress(&cinfo);
#else
jpeg_create_decompress(&cinfo);
#endif
ftejpeg_mem_src(&cinfo, infile, length);
(void) qjpeg_read_header(&cinfo, TRUE);
#ifdef DYNAMIC_LIBJPEG
(void) qjpeg_read_header(&cinfo, TRUE);
#else
(void) jpeg_read_header(&cinfo, TRUE);
#endif
(void) qjpeg_start_decompress(&cinfo);
#ifdef DYNAMIC_LIBJPEG
(void) qjpeg_start_decompress(&cinfo);
#else
(void) jpeg_start_decompress(&cinfo);
#endif
if (cinfo.output_components == 0)
@ -1175,7 +1201,11 @@ badjpeg:
while (cinfo.output_scanline < cinfo.output_height)
{
(void) qjpeg_read_scanlines(&cinfo, buffer, 1);
#ifdef DYNAMIC_LIBJPEG
(void) qjpeg_read_scanlines(&cinfo, buffer, 1);
#else
(void) jpeg_read_scanlines(&cinfo, buffer, 1);
#endif
in = buffer[0];
for (i = 0; i < cinfo.output_width; i++)
@ -1187,9 +1217,17 @@ badjpeg:
}
}
(void) qjpeg_finish_decompress(&cinfo);
#ifdef DYNAMIC_LIBJPEG
(void) qjpeg_finish_decompress(&cinfo);
#else
(void) jpeg_finish_decompress(&cinfo);
#endif
qjpeg_destroy_decompress(&cinfo);
#ifdef DYNAMIC_LIBJPEG
qjpeg_destroy_decompress(&cinfo);
#else
jpeg_destroy_decompress(&cinfo);
#endif
*width = cinfo.output_width;
*height = cinfo.output_height;
@ -1278,7 +1316,7 @@ void screenshotJPEG(char *filename, int compression, qbyte *screendata, int scre
jpeg_error_mgr_wrapper jerr;
struct jpeg_compress_struct cinfo;
JSAMPROW row_pointer[1];
if (!LIBJPEG_LOADED())
return;
@ -1292,17 +1330,29 @@ void screenshotJPEG(char *filename, int compression, qbyte *screendata, int scre
}
}
cinfo.err = qjpeg_std_error(&jerr.pub);
#ifdef DYNAMIC_LIBJPEG
cinfo.err = qjpeg_std_error(&jerr.pub);
#else
cinfo.err = jpeg_std_error(&jerr.pub);
#endif
jerr.pub.error_exit = jpeg_error_exit;
if (setjmp(jerr.setjmp_buffer))
{
qjpeg_destroy_compress(&cinfo);
#ifdef DYNAMIC_LIBJPEG
qjpeg_destroy_compress(&cinfo);
#else
jpeg_destroy_compress(&cinfo);
#endif
VFS_CLOSE(outfile);
FS_Remove(filename, FS_GAME);
Con_Printf("Failed to create jpeg\n");
return;
}
qjpeg_create_compress(&cinfo);
#ifdef DYNAMIC_LIBJPEG
qjpeg_create_compress(&cinfo);
#else
jpeg_create_compress(&cinfo);
#endif
buffer = screendata;
@ -1311,19 +1361,42 @@ void screenshotJPEG(char *filename, int compression, qbyte *screendata, int scre
cinfo.image_height = screenheight;
cinfo.input_components = 3;
cinfo.in_color_space = JCS_RGB;
qjpeg_set_defaults(&cinfo);
qjpeg_set_quality (&cinfo, bound(0, compression, 100), true);
qjpeg_start_compress(&cinfo, true);
#ifdef DYNAMIC_LIBJPEG
qjpeg_set_defaults(&cinfo);
#else
jpeg_set_defaults(&cinfo);
#endif
#ifdef DYNAMIC_LIBJPEG
qjpeg_set_quality (&cinfo, bound(0, compression, 100), true);
#else
jpeg_set_quality (&cinfo, bound(0, compression, 100), true);
#endif
#ifdef DYNAMIC_LIBJPEG
qjpeg_start_compress(&cinfo, true);
#else
jpeg_start_compress(&cinfo, true);
#endif
while (cinfo.next_scanline < cinfo.image_height)
{
*row_pointer = &buffer[(cinfo.image_height - cinfo.next_scanline - 1) * cinfo.image_width * 3];
qjpeg_write_scanlines(&cinfo, row_pointer, 1);
#ifdef DYNAMIC_LIBJPEG
qjpeg_write_scanlines(&cinfo, row_pointer, 1);
#else
jpeg_write_scanlines(&cinfo, row_pointer, 1);
#endif
}
qjpeg_finish_compress(&cinfo);
#ifdef DYNAMIC_LIBJPEG
qjpeg_finish_compress(&cinfo);
#else
jpeg_finish_compress(&cinfo);
#endif
VFS_CLOSE(outfile);
qjpeg_destroy_compress(&cinfo);
#ifdef DYNAMIC_LIBJPEG
qjpeg_destroy_compress(&cinfo);
#else
jpeg_destroy_compress(&cinfo);
#endif
}
#endif

View file

@ -8,7 +8,7 @@ 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.
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
See the GNU General Public License for more details.
@ -120,7 +120,7 @@ char *Sys_GetNameForAddress(dllhandle_t *module, void *address)
datadir = &ntheader->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_EXPORT];
block = (IMAGE_EXPORT_DIRECTORY *)(base + datadir->VirtualAddress);
funclist = (DWORD*)(base+block->AddressOfFunctions);
namelist = (DWORD*)(base+block->AddressOfNames);
@ -250,7 +250,7 @@ void *Sys_GetGameAPI (void *parms)
GetGameAPI = (void *)GetProcAddress (game_library, "GetGameAPI");
if (!GetGameAPI)
{
Sys_UnloadGame ();
Sys_UnloadGame ();
return NULL;
}
@ -283,9 +283,9 @@ void Sys_PushFPCW_SetHigh (void);
int VARGS Sys_DebugLog(char *file, char *fmt, ...)
{
FILE *fd;
va_list argptr;
va_list argptr;
static char data[1024];
va_start(argptr, fmt);
vsnprintf(data, sizeof(data)-1, fmt, argptr);
va_end(argptr);
@ -510,7 +510,7 @@ qboolean Sys_remove (char *path)
int Sys_EnumerateFiles (const char *gpath, const char *match, int (*func)(const char *, int, void *), void *parm)
{
HANDLE r;
WIN32_FIND_DATA fd;
WIN32_FIND_DATA fd;
char apath[MAX_OSPATH];
char apath2[MAX_OSPATH];
char file[MAX_OSPATH];
@ -522,7 +522,7 @@ int Sys_EnumerateFiles (const char *gpath, const char *match, int (*func)(const
Q_snprintfz(apath, sizeof(apath), "%s/%s", gpath, match);
for (s = apath+strlen(apath)-1; s> apath; s--)
{
if (*s == '/')
if (*s == '/')
break;
}
*s = '\0';
@ -535,7 +535,7 @@ int Sys_EnumerateFiles (const char *gpath, const char *match, int (*func)(const
match = s+1;
for (s = apath2+strlen(apath2)-1; s> apath2; s--)
{
if (*s == '/')
if (*s == '/')
break;
}
*s = '\0';
@ -632,18 +632,18 @@ void Sys_Init (void)
// mutex will fail if semephore already exists
qwclsemaphore = CreateMutex(
NULL, // Security attributes
0, // owner
"qwcl"); // Semaphore name
NULL, // Security attributes
0, // owner
"qwcl"); // Semaphore name
// if (!qwclsemaphore)
// Sys_Error ("QWCL is already running on this system");
CloseHandle (qwclsemaphore);
qwclsemaphore = CreateSemaphore(
NULL, // Security attributes
0, // Initial count
1, // Maximum count
"qwcl"); // Semaphore name
NULL, // Security attributes
0, // Initial count
1, // Maximum count
"qwcl"); // Semaphore name
}
#endif
@ -690,7 +690,7 @@ void Sys_Init (void)
{
Sys_Error ("QuakeWorld requires at least Win95 or NT 4.0");
}
if (vinfo.dwPlatformId == VER_PLATFORM_WIN32_NT)
WinNT = true;
else
@ -703,7 +703,7 @@ void VARGS Sys_Error (const char *error, ...)
va_list argptr;
char text[1024];
//, text2[1024];
// DWORD dummy;
// DWORD dummy;
va_start (argptr, error);
vsnprintf (text, sizeof(text), error, argptr);
@ -953,7 +953,7 @@ char *Sys_ConsoleInput (void)
switch (ch)
{
case '\r':
WriteFile(houtput, "\r\n", 2, &dummy, NULL);
WriteFile(houtput, "\r\n", 2, &dummy, NULL);
if (len)
{
@ -972,8 +972,8 @@ char *Sys_ConsoleInput (void)
break;
default:
if (((ch=='V' || ch=='v') && (recs[0].Event.KeyEvent.dwControlKeyState &
(LEFT_CTRL_PRESSED | RIGHT_CTRL_PRESSED))) || ((recs[0].Event.KeyEvent.dwControlKeyState
if (((ch=='V' || ch=='v') && (recs[0].Event.KeyEvent.dwControlKeyState &
(LEFT_CTRL_PRESSED | RIGHT_CTRL_PRESSED))) || ((recs[0].Event.KeyEvent.dwControlKeyState
& SHIFT_PRESSED) && (recs[0].Event.KeyEvent.wVirtualKeyCode
==VK_INSERT))) {
if (OpenClipboard(NULL)) {
@ -1002,7 +1002,7 @@ char *Sys_ConsoleInput (void)
}
} else if (ch >= ' ')
{
WriteFile(houtput, &ch, 1, &dummy, NULL);
WriteFile(houtput, &ch, 1, &dummy, NULL);
text[len] = ch;
len = (len + 1) & 0xff;
}
@ -1021,7 +1021,7 @@ BOOL WINAPI HandlerRoutine (DWORD dwCtrlType)
{
switch (dwCtrlType)
{
case CTRL_C_EVENT:
case CTRL_C_EVENT:
case CTRL_BREAK_EVENT:
case CTRL_CLOSE_EVENT:
case CTRL_LOGOFF_EVENT:
@ -1217,7 +1217,7 @@ void NPQTV_Sys_MainLoop(void)
newtime = Sys_DoubleTime ();
duratrion = newtime - lastlooptime;
lastlooptime = newtime;
SV_Frame ();
#else
Sys_Error("wut?");
@ -1265,12 +1265,15 @@ HWND hwnd_dialog;
#define COBJMACROS
#include <Shobjidl.h>
#ifndef MINGW
#include <shobjidl.h>
#endif
#include <shlguid.h>
#include <Shlobj.h>
#include <shlobj.h>
//#include <Propsys.h>
#ifndef SHARD_APPIDINFOLINK
#ifndef SHARD_APPIDINFOLINK
typedef struct SHARDAPPIDINFOLINK {
IShellLinkW *psl;
PCWSTR pszAppID;
@ -1284,44 +1287,46 @@ typedef struct {
} PROPERTYKEY;
typedef struct IPropertyStore IPropertyStore;
;
#ifndef MINGW
typedef struct IPropertyStore
{
CONST_VTBL struct
{
/*IUnknown*/
HRESULT ( STDMETHODCALLTYPE *QueryInterface )(
HRESULT ( STDMETHODCALLTYPE *QueryInterface )(
IPropertyStore * This,
REFIID riid,
void **ppvObject);
ULONG ( STDMETHODCALLTYPE *AddRef )(
ULONG ( STDMETHODCALLTYPE *AddRef )(
IPropertyStore * This);
ULONG ( STDMETHODCALLTYPE *Release )(
ULONG ( STDMETHODCALLTYPE *Release )(
IPropertyStore * This);
/*property store stuff*/
HRESULT ( STDMETHODCALLTYPE *GetCount)(
HRESULT ( STDMETHODCALLTYPE *GetCount)(
IPropertyStore * This,
ULONG *count);
HRESULT ( STDMETHODCALLTYPE *GetAt)(
HRESULT ( STDMETHODCALLTYPE *GetAt)(
IPropertyStore * This,
DWORD prop,
PROPERTYKEY * key);
HRESULT ( STDMETHODCALLTYPE *GetValue)(
HRESULT ( STDMETHODCALLTYPE *GetValue)(
IPropertyStore * This,
PROPERTYKEY * key,
PROPVARIANT * val);
HRESULT ( STDMETHODCALLTYPE *SetValue)(
HRESULT ( STDMETHODCALLTYPE *SetValue)(
IPropertyStore * This,
PROPERTYKEY * key,
PROPVARIANT * val);
HRESULT ( STDMETHODCALLTYPE *Commit)(
HRESULT ( STDMETHODCALLTYPE *Commit)(
IPropertyStore * This);
} *lpVtbl;
} IPropertyStore;
#endif
static const IID IID_IPropertyStore = {0x886d8eeb, 0x8cf2, 0x4446, {0x8d, 0x02, 0xcd, 0xba, 0x1d, 0xbd, 0xcf, 0x99}};
#endif
@ -1355,8 +1360,10 @@ void Sys_RecentServer(char *command, char *target, char *title, char *desc)
IShellLinkW_SetArguments(link, buf); /*args*/
swprintf(buf, sizeof(buf), L"%S", desc);
IShellLinkW_SetDescription(link, buf); /*tooltip*/
hr = IShellLinkW_QueryInterface(link, &IID_IPropertyStore, &prop_store);
#ifndef MINGW
if(SUCCEEDED(hr))
{
PROPVARIANT pv;
@ -1369,6 +1376,7 @@ void Sys_RecentServer(char *command, char *target, char *title, char *desc)
hr = prop_store->lpVtbl->Commit(prop_store);
prop_store->lpVtbl->Release(prop_store);
}
#endif
appinfo.pszAppID=WIN7_APPNAME;
appinfo.psl=link;
@ -1409,12 +1417,14 @@ int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLin
double time, oldtime, newtime;
char cwd[1024];
const char *qtvfile = NULL;
/* previous instances do not exist in Win32 */
if (hPrevInstance)
return 0;
Win7_Init();
#ifndef MINGW
Win7_Init();
#endif
#ifdef _MSC_VER
#if _M_IX86_FP >= 1
@ -1554,7 +1564,7 @@ int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLin
{
#if !defined(CLIENTONLY)
hwnd_dialog=NULL;
if (!Sys_InitTerminal())
Sys_Error ("Couldn't allocate dedicated server console");
#endif
@ -1598,7 +1608,7 @@ int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLin
{
if (!isDedicated)
Sys_Error("Dedicated was cleared");
NET_Sleep(100, false);
NET_Sleep(100, false);
SV_Frame ();
}
return TRUE;
@ -1630,6 +1640,7 @@ int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLin
//client console should now be initialized.
#ifndef MINGW
switch(M_GameType())
{
case MGT_QUAKE1:
@ -1645,6 +1656,7 @@ int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLin
Sys_RecentServer("+map demo1", "", "Start New Game (Hexen2)", "Begin a new game");
break;
}
#endif
/* main window message loop */
while (1)
@ -1658,7 +1670,7 @@ int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLin
newtime = Sys_DoubleTime ();
time = newtime - oldtime;
oldtime = newtime;
SV_Frame ();
#else
Sys_Error("wut?");
@ -1776,7 +1788,7 @@ DWORD WINAPI threadwrapper(void *args)
tw.args = ((threadwrap_t *)args)->args;
free(args);
tw.func(tw.args);
tw.func(tw.args);
#ifndef WIN32CRTDLL
_endthreadex(0);
@ -1788,7 +1800,7 @@ void *Sys_CreateThread(int (*func)(void *), void *args, int stacksize)
{
threadwrap_t *tw = (threadwrap_t *)malloc(sizeof(threadwrap_t));
HANDLE handle;
if (!tw)
return NULL;
@ -1811,7 +1823,7 @@ void *Sys_CreateThread(int (*func)(void *), void *args, int stacksize)
}
void Sys_WaitOnThread(void *thread)
{
{
while (WaitForSingleObject((HANDLE)thread, 10) == WAIT_TIMEOUT)
{
/*keep responding to window messages*/
@ -1877,8 +1889,8 @@ typedef struct condvar_s
HANDLE wait_done;
} condvar_t;
void *Sys_CreateConditional(void)
{
void *Sys_CreateConditional(void)
{
condvar_t *cv;
cv = (condvar_t *)malloc(sizeof(condvar_t));
@ -1907,16 +1919,16 @@ void *Sys_CreateConditional(void)
return NULL;
}
qboolean Sys_LockConditional(void *condv)
{
qboolean Sys_LockConditional(void *condv)
{
EnterCriticalSection(&((condvar_t *)condv)->mainlock);
return true;
return true;
}
qboolean Sys_UnlockConditional(void *condv)
{
qboolean Sys_UnlockConditional(void *condv)
{
LeaveCriticalSection(&((condvar_t *)condv)->mainlock);
return true;
return true;
}
qboolean Sys_ConditionWait(void *condv)
@ -1936,7 +1948,7 @@ qboolean Sys_ConditionWait(void *condv)
// update waiting count and alert signaling thread that we're done to avoid the deadlock condition
EnterCriticalSection(&cv->countlock);
if (cv->signals > 0)
if (cv->signals > 0)
{
ReleaseSemaphore(cv->wait_done, cv->signals, NULL);
cv->signals = 0;
@ -1949,7 +1961,7 @@ qboolean Sys_ConditionWait(void *condv)
return success;
}
qboolean Sys_ConditionSignal(void *condv)
qboolean Sys_ConditionSignal(void *condv)
{
condvar_t *cv = (condvar_t *)condv;
@ -1968,24 +1980,24 @@ qboolean Sys_ConditionSignal(void *condv)
return true;
}
qboolean Sys_ConditionBroadcast(void *condv)
qboolean Sys_ConditionBroadcast(void *condv)
{
condvar_t *cv = (condvar_t *)condv;
// if there are non-signaled waiting threads, we signal all of them and wait on all the responses back
EnterCriticalSection(&cv->countlock);
if (cv->waiting > cv->signals)
if (cv->waiting > cv->signals)
{
int i, num_waiting;
num_waiting = (cv->waiting - cv->signals);
cv->signals = cv->waiting;
ReleaseSemaphore(cv->wait_sem, num_waiting, NULL);
LeaveCriticalSection(&cv->countlock);
// there's no call to wait for the same object multiple times so we need to loop through
// and burn up the semaphore count
for (i = 0; i < num_waiting; i++)
for (i = 0; i < num_waiting; i++)
WaitForSingleObject(cv->wait_done, INFINITE);
}
else

View file

@ -84,6 +84,10 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
#define ODE_DYNAMIC
#ifdef NO_OPENAL
#undef AVAIL_OPENAL
#endif
#ifdef NO_PNG
#undef AVAIL_PNGLIB
#endif

View file

@ -3113,7 +3113,7 @@ void COM_Version_f (void)
#endif
#ifdef __MINGW64__
Con_Printf("Compiled with MinGW64 version: %i.%i\n",__MINGW64_MAJOR_VERSION, __MINGW64_MINOR_VERSION);
Con_Printf("Compiled with MinGW64 version: %i.%i\n",__MINGW32_MAJOR_VERSION, __MINGW32_MINOR_VERSION);
#endif
#ifdef __CYGWIN__