Descent3/ddgr_mac/ddgr_mac.cpp
2024-04-16 12:56:40 -06:00

234 lines
6.9 KiB
C++
Raw Blame History

/*
* $Logfile: /Descent3/main/ddgr_mac/ddgr_mac.cpp $
* $Revision: 1.1.1.1 $
* $Date: 2003/08/26 03:56:53 $
* $Author: kevinb $
*
* macintosh implementation of interface to ddgr library
*
* $Log: ddgr_mac.cpp,v $
* Revision 1.1.1.1 2003/08/26 03:56:53 kevinb
* initial 1.5 import
*
*
* 6 5/19/97 2:51 PM Jeremy
* added default values to constructor
*
* 5 5/15/97 1:47 AM Jeremy
* changed mprintf's to be standard (with newline at end)
*
* 4 5/11/97 8:01 PM Jeremy
* implemented call to ddgr_os_surf_GetAspectRatio
*
* 3 5/9/97 7:13 PM Jeremy
* some bug fixes in initialization code
*
* 2 4/15/97 7:02 PM Jeremy
* initial implementation of initialization and closing of ddgr mac
* library. also added c version of scale bitmap16
*
* 1 4/9/97 7:16 PM Jeremy
* initial check in
*
* $NoKeywords: $
*/
// ---------------------------------------------------------------------------
// ANSI Headers
// ---------------------------------------------------------------------------
#include <string.h>
#include <stdlib.h>
// ---------------------------------------------------------------------------
// Macintosh Headers
// ---------------------------------------------------------------------------
#include <DrawSprocket.h>
// ---------------------------------------------------------------------------
// Descent3 Headers
// ---------------------------------------------------------------------------
#include "pserror.h"
#include "gameos.h"
#include "ddgr.h"
#include "ddgr_mac.h"
#include "macOSSurface.h"
#include "bitmap.h"
// ---------------------------------------------------------------------------
// File Level Prototypes
// ---------------------------------------------------------------------------
// Clean up the ddgr library
void ddgr_Close(void);
// ---------------------------------------------------------------------------
// File Level DataTypes
// ---------------------------------------------------------------------------
// ---------------------------------------------------------------------------
// File Level Globals
// ---------------------------------------------------------------------------
#include "ddgr_mac.h"
// ---------------------------------------------------------------------------
// Public Globals
// ---------------------------------------------------------------------------
// ----------------------------------------------------
// This object stores the data for the graphics library
// on the mac.
// If we were really using good OOP, all of the
// functions in this file and this data libaray object
// would be encapulated together, Ah, c'est la vie.
// ----------------------------------------------------
ddgr_mac_lib Mac_DDGR_Lib;
// ---------------------------------------------------------------------------
// Mac data library implementations
// ---------------------------------------------------------------------------
ddgr_mac_lib::ddgr_mac_lib(void) {
m_initted = false;
m_windowed_mode = false;
m_color_key = 0;
}
ddgr_mac_lib::~ddgr_mac_lib(void) { ; }
void ddgr_mac_lib::SetWindowedMode(bool inWindowMode) { m_windowed_mode = inWindowMode; }
bool ddgr_mac_lib::IsWindowed(void) { return m_windowed_mode; }
bool ddgr_mac_lib::IsInitted(void) { return m_initted; }
void ddgr_mac_lib::SetInitted(bool inInitState) { m_initted = inInitState; }
/*void ddgr_mac_lib::SetDefaultColorKey(ddgr_color inColor)
{
m_color_key = inColor;
}
*/
// ------------------------------------------------------------
// ddgr_Init
// info->hwnd = window handle
// info->windowed = are screens windowed or fullscreen.
// info->debug = debug mode
// 0 = no debug
// 1 = full debug
// note;
// this function can be reused. This is, you can call this
// function as many times as you want. You can switch from
// windowed to full screen, debug to nodebug.
// ------------------------------------------------------------
ddgr_error ddgr_Init(ddgr_init_info *info) {
ddgr_error err = DDGRERR_SUCCESS;
OSErr macErr = noErr;
static int firstTime = true;
// If we're reinitializing the graphics system, then close the current graphic driver
if (Mac_DDGR_Lib.IsInitted()) {
ddgr_Close();
}
if (firstTime) {
// first time initialization!
atexit(ddgr_Close);
firstTime = false;
}
// Inititializing mac os video graphics system
if (info->windowed) {
Mac_DDGR_Lib.SetWindowedMode(true);
mprintf((0, "Attempting to initialize ddgr in windowed mode.\n"));
mprintf((0, "Windowed mode currently not implemented.\n"));
err = DDGRERR_DRIVERINIT;
} else {
Mac_DDGR_Lib.SetWindowedMode(false);
mprintf((0, "Attempting to initialize ddgr in full screen mode.\n"));
err = ddgr_os_surf_fullscreen_Init(info);
}
// Success!!
if (!err) {
Mac_DDGR_Lib.SetInitted(true);
mprintf((0, "DDGR Initialized\n"));
}
return err;
}
void ddgr_Close() {
ddgr_error err = DDGRERR_SUCCESS;
if (Mac_DDGR_Lib.IsInitted()) {
// Closing mac os video graphics system
if (Mac_DDGR_Lib.IsWindowed()) {
mprintf((0, "Attempting to close ddgr in windowed mode.\n"));
mprintf((0, "Windowed mode currently not implemented.\n"));
} else {
mprintf((0, "Attempting to close ddgr in fullscreen mode.\n"));
ddgr_os_surf_fullscreen_Close();
}
Mac_DDGR_Lib.SetInitted(false);
mprintf((0, "DDGR is closed.\n"));
} else {
mprintf((0, "Attempted closing *uninitialized* Mac DDGR!\n"));
}
}
// GetAspectRatio
// returns aspect ratio calculated in video screen initialization
float ddgr_GetAspectRatio() { return ddgr_os_surf_GetAspectRatio(); }
// Set's the surface color key in ddgr_color format
void ddgr_SetSurfColorKey(ddgr_color color) { Mac_DDGR_Lib.SetDefaultColorKey(color); }
// A C version of a scaled bitmap blitter
void ddgr_ScaleBitmap16(ushort *dest_data, int dest_width, int x1, int y1, int x2, int y2, int bm, fix u0, fix v0,
fix u1, fix v1)
{
int screen_width = (x2 - x1); // The size of bitmap on the screen
int screen_height = (y2 - y1);
ushort *perm_src_data = bm_data(bm, 0);
ushort *src_data = perm_src_data;
int src_w = bm_w(bm, 0);
// Set up our initial coordinates
if (screen_width == 0 || screen_height == 0)
return;
dest_data += (dest_width * y1 + x1);
fix xstep = (u1 - u0) / (screen_width);
fix ystep = (v1 - v0) / (screen_height);
fix fx_u = u0;
fix fx_v = v0;
fix u;
int y = y1;
int x, t;
for (int i = 0; i < screen_height; i++, y++, fx_v += ystep) {
for (x = x1, t = 0, u = fx_u; t < screen_width; t++, x++, u += xstep) {
ushort pix = src_data[FixToInt(fx_v) * src_w + FixToInt(u)];
if (pix != TRANSPARENT_COLOR)
*dest_data++ = pix;
else
dest_data++;
}
dest_data += (dest_width - screen_width);
}
}
//<2F>======================================================
// MacOS Graphics routines
//<2F>======================================================