aboutsummaryrefslogtreecommitdiff
path: root/backends/wince/screen.cpp
diff options
context:
space:
mode:
authorNicolas Bacca2004-01-26 07:47:32 +0000
committerNicolas Bacca2004-01-26 07:47:32 +0000
commitd5e2c21f562d23b8ef4c37b21e9d8fee90a03a3f (patch)
tree9a4027942fba4eb9cdbb2797c45db9d32e7367f4 /backends/wince/screen.cpp
parent9b09669143a2fef7fca7b655348b58bc7610ebaa (diff)
downloadscummvm-rg350-d5e2c21f562d23b8ef4c37b21e9d8fee90a03a3f.tar.gz
scummvm-rg350-d5e2c21f562d23b8ef4c37b21e9d8fee90a03a3f.tar.bz2
scummvm-rg350-d5e2c21f562d23b8ef4c37b21e9d8fee90a03a3f.zip
Early spring cleanup
svn-id: r12610
Diffstat (limited to 'backends/wince/screen.cpp')
-rw-r--r--backends/wince/screen.cpp3170
1 files changed, 0 insertions, 3170 deletions
diff --git a/backends/wince/screen.cpp b/backends/wince/screen.cpp
deleted file mode 100644
index f5a2ed1cd7..0000000000
--- a/backends/wince/screen.cpp
+++ /dev/null
@@ -1,3170 +0,0 @@
-/* ScummVM - Scumm Interpreter
- * Copyright (C) 2001/2002 The ScummVM project
- *
- * 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.
- *
- * $Header$
- *
- */
-
-#ifdef _WIN32_WCE
-
-/* Original GFX code by Vasyl Tsvirkunov */
-
-#include "wince.h"
-#include "gui/newgui.h"
-
-//#include <windows.h>
-//#include <Aygshell.h>
-//#include "gx.h"
-//#include "screen.h"
-//#include "resource.h"
-//#include "dynamic_imports.h"
-
-#include <tlhelp32.h>
-
-using namespace GUI;
-
-#define COLORCONV565(r,g,b) \
-(((r&0xf8)<<(11-3))|((g&0xfc)<<(5-2))|((b&0xf8)>>3))
-#define COLORCONV555(r,g,b) \
-(((r&0xf8)<<(10-3))|((g&0xf8)<<(5-2))|((b&0xf8)>>3))
-#define COLORCONVMONO(r,g,b) ((((3*r>>3)+(g>>1)+(b>>3))>>colorscale)^invert)
-#define RED_FROM_565(x) ((((x)>>11)&0x1F) << 3)
-#define GREEN_FROM_565(x) ((((x)>>5)&0x3F) << 2)
-#define BLUE_FROM_565(x) (((x)&0x1F) << 3)
-
-#define MAX_CLR 0x100
-static UBYTE palRed[MAX_CLR];
-static UBYTE palGreen[MAX_CLR];
-static UBYTE palBlue[MAX_CLR];
-static unsigned short pal[MAX_CLR];
- /* First 10 and last 10 colors on palettized devices require special treatment */
-static UBYTE staticTranslate[20];
-static UBYTE invert = 0;
-static int colorscale = 0;
-unsigned char color_match[500]; // used for paletted issues
-
-extern const char *getBuildDate();
-
-extern UBYTE item_toolbar[];
-extern UBYTE item_toolbar_colors[];
-extern UBYTE item_toolbarPortrait[];
-extern UBYTE item_toolbarPortrait_colors[];
-extern UBYTE item_disk[];
-extern UBYTE item_disk_colors[];
-extern UBYTE item_skip[];
-extern UBYTE item_skip_colors[];
-extern UBYTE item_soundOff[];
-extern UBYTE item_soundOff_colors[];
-extern UBYTE item_soundOn[];
-extern UBYTE item_soundOn_colors[];
-extern UBYTE item_monkeyPortrait[];
-extern UBYTE item_monkeyPortrait_colors[];
-extern UBYTE item_monkeyLandscape[];
-extern UBYTE item_monkeyLandscape_colors[];
-extern UBYTE item_keyboard[];
-extern UBYTE item_keyboard_colors[];
-extern UBYTE item_keyboardPortrait[];
-extern UBYTE item_keyboardPortrait_colors[];
-extern UBYTE item_loading[];
-extern UBYTE item_loading_colors[];
-extern UBYTE item_startup[];
-extern UBYTE item_startup_colors[];
-extern int item_startup_colors_size;
-extern UBYTE item_bomb[];
-extern UBYTE item_bomb_colors[];
-
-
-extern bool sound_activated;
-extern bool hide_toolbar;
-extern bool is_simon;
-extern bool smartphone;
-extern bool high_res;
-//extern NewGui *g_gui;
-bool toolbar_drawn;
-bool draw_keyboard;
-bool wide_screen;
-bool extra_wide_screen;
-
-GXDisplayProperties gxdp;
-int active;
-
-UBYTE decomp[320 * 240];
-UBYTE comment_zone[8 * 220];
-UBYTE highlighted_zone[8 * 220];
-int _highlighted_index = -1;
-
-
-bool _gfx_mode_switch;
-int _game_selection_X_offset;
-int _game_selection_Y_offset;
-
-float _screen_factor;
-
-struct tScreenGeometry
-{
- long width;
- long height;
- long startoffset;
- long sourceoffset;
- long linestep;
- long pixelstep;
- long xSkipMask;
- long xLimit;
- long lineLimit;
-};
-
-
-tScreenGeometry geom[3];
-tScreenGeometry portrait_geometry;
-
-int currentScreenMode = 0;
-int useMode = 0;
-int maxMode = 2;
-int filter_available;
-int smooth_filter;
-int toolbar_available;
-
-UBYTE *toolbar = NULL;
-
-UBYTE *displayCache;
-
-#ifndef NEW_GAPI_CODE
-
-UBYTE *noGAPI_video_buffer = NULL;
-HDC noGAPI_compat;
-
-#else
-
-
-UBYTE *noGAPI_buffer;
-HBITMAP noGAPI_bitmap;
-BITMAPINFOHEADER noGAPI_bitmap_header;
-HDC noGAPI_compat;
-
-#endif
-
-char noGAPI = 0;
-
-/* Using vectorized function to save on branches */
-typedef void (*tScreenOp)();
-typedef void (*tCls)();
-typedef void (*tBlt)(UBYTE*);
-typedef void (*tBlt_part)(UBYTE*,int, int, int, int, UBYTE*, int, BOOL = FALSE);
-typedef void (*tSet_565)(INT16 *buffer, int pitch, int x, int y, int width, int height);
-
-void mono_Cls();
-void mono_Blt(UBYTE*);
-void mono_Blt_part(UBYTE*, int, int, int, int, UBYTE*, int, BOOL = FALSE);
-void mono_Set_565(INT16*, int, int, int, int, int);
-
-
-void palette_Cls();
-void palette_Blt(UBYTE*);
-void palette_Blt_part(UBYTE*, int, int, int, int, UBYTE*, int, BOOL = FALSE);
-void palette_Set_565(INT16*, int, int, int, int, int);
-
-
-void hicolor_Cls();
-void hicolor555_Blt(UBYTE*);
-void hicolor555_Blt_part(UBYTE*, int, int, int, int, UBYTE*, int, BOOL = FALSE);
-void hicolor555_Set_565(INT16*, int, int, int, int, int);
-
-void hicolor565_Blt(UBYTE*);
-void hicolor565_Blt_part(UBYTE*, int, int, int, int, UBYTE*, int, BOOL = FALSE);
-//void hicolor565_Get_565(INT16*, int, int, int, int, int);
-void hicolor565_Set_565(INT16*, int, int, int, int, int);
-
-void noGAPI_Cls();
-void noGAPI_Blt(UBYTE*);
-void noGAPI_Blt_part(UBYTE*, int, int, int, int, UBYTE*, int, BOOL = FALSE);
-void noGAPI_Set_565(INT16*, int, int, int, int, int);
-
-//void NULL_Get_565(INT16*, int, int, int, int, int);
-void NULL_Set_565(INT16*, int, int, int, int, int);
-
-void palette_update();
-
-void printString(const char *, int, int, int, int = -1, int = 220);
-int drawString(const char *, int, int, int, int = -1);
-static byte textfont[] = {0,0,99,1,226,8,4,8,6,8,6,0,0,0,0,0,0,0,0,0,0,0,8,2,1,8,0,0,0,0,0,0,0,0,0,0,0,0,4,3,7,8,7,7,8,4,5,5,8,7,4,7,3,8,7,7,7,7,8,7,7,7,7,7,3,4,7,5,7,7,8,7,7,7,7,7,7,7,7,5,7,7,
-7,8,7,7,7,7,7,7,7,7,7,8,7,7,7,5,8,5,8,8,7,7,7,6,7,7,7,7,7,5,6,7,5,8,7,7,7,7,7,7,7,7,7,8,7,7,7,5,3,5,0,8,7,7,7,7,7,7,0,6,7,7,7,5,5,5,7,0,6,8,8,7,7,7,7,7,0,7,7,0,0,
-0,0,0,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,0,0,0,0,0,0,0,0,1,3,6,12,
-24,62,3,0,128,192,96,48,24,124,192,0,0,3,62,24,12,6,3,1,0,192,124,24,48,96,192,128,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
-0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,237,74,72,0,0,0,0,0,128,128,128,0,0,0,0,0,0,0,0,0,0,0,0,0,60,66,153,161,161,153,66,60,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
-0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
-0,0,0,0,0,0,0,0,0,96,96,96,96,0,0,96,0,102,102,102,0,0,0,0,0,102,102,255,102,255,102,102,0,24,62,96,60,6,124,24,0,98,102,12,24,48,102,70,0,60,102,60,56,103,102,63,0,96,48,16,0,0,0,0,0,24,48,96,96,96,48,24,0,96,48,24,24,24,48,96,0,
-0,102,60,255,60,102,0,0,0,24,24,126,24,24,0,0,0,0,0,0,0,48,48,96,0,0,0,126,0,0,0,0,0,0,0,0,0,96,96,0,0,3,6,12,24,48,96,0,60,102,102,102,102,102,60,0,24,24,56,24,24,24,126,0,60,102,6,12,48,96,126,0,60,102,6,28,6,102,60,0,6,
-14,30,102,127,6,6,0,126,96,124,6,6,102,60,0,60,102,96,124,102,102,60,0,126,102,12,24,24,24,24,0,60,102,102,60,102,102,60,0,60,102,102,62,6,102,60,0,0,0,96,0,0,96,0,0,0,0,48,0,0,48,48,96,14,24,48,96,48,24,14,0,0,0,120,0,120,0,0,0,112,24,
-12,6,12,24,112,0,60,102,6,12,24,0,24,0,0,0,0,255,255,0,0,0,24,60,102,126,102,102,102,0,124,102,102,124,102,102,124,0,60,102,96,96,96,102,60,0,120,108,102,102,102,108,120,0,126,96,96,120,96,96,126,0,126,96,96,120,96,96,96,0,60,102,96,110,102,102,60,0,102,102,102,
-126,102,102,102,0,120,48,48,48,48,48,120,0,30,12,12,12,12,108,56,0,102,108,120,112,120,108,102,0,96,96,96,96,96,96,126,0,99,119,127,107,99,99,99,0,102,118,126,126,110,102,102,0,60,102,102,102,102,102,60,0,124,102,102,124,96,96,96,0,60,102,102,102,102,60,14,0,124,102,102,124,
-120,108,102,0,60,102,96,60,6,102,60,0,126,24,24,24,24,24,24,0,102,102,102,102,102,102,60,0,102,102,102,102,102,60,24,0,99,99,99,107,127,119,99,0,102,102,60,24,60,102,102,0,102,102,102,60,24,24,24,0,126,6,12,24,48,96,126,0,120,96,96,96,96,96,120,0,3,6,12,24,48,
-96,192,0,120,24,24,24,24,24,120,0,0,0,0,0,0,219,219,0,0,0,0,0,0,0,0,255,102,102,102,0,0,0,0,0,0,0,60,6,62,102,62,0,0,96,96,124,102,102,124,0,0,0,60,96,96,96,60,0,0,6,6,62,102,102,62,0,0,0,60,102,126,96,60,0,0,14,24,62,24,24,
-24,0,0,0,62,102,102,62,6,124,0,96,96,124,102,102,102,0,0,48,0,112,48,48,120,0,0,12,0,12,12,12,12,120,0,96,96,108,120,108,102,0,0,112,48,48,48,48,120,0,0,0,102,127,127,107,99,0,0,0,124,102,102,102,102,0,0,0,60,102,102,102,60,0,0,0,124,102,102,124,96,
-96,0,0,62,102,102,62,6,6,0,0,124,102,96,96,96,0,0,0,62,96,60,6,124,0,0,24,126,24,24,24,14,0,0,0,102,102,102,102,62,0,0,0,102,102,102,60,24,0,0,0,99,107,127,62,54,0,0,0,102,60,24,60,102,0,0,0,102,102,102,62,12,120,0,0,126,12,24,48,126,0,
-24,48,48,96,48,48,24,0,96,96,96,0,96,96,96,0,96,48,48,24,48,48,96,0,0,0,0,0,0,0,0,0,8,12,14,255,255,14,12,8,60,102,96,96,102,60,24,56,102,0,102,102,102,102,62,0,12,24,60,102,126,96,60,0,24,36,60,6,62,102,62,0,102,0,60,6,62,102,62,0,48,
-24,60,6,62,102,62,0,0,0,0,0,0,0,0,0,0,60,96,96,96,60,24,56,24,36,60,102,126,96,60,0,102,0,60,102,126,96,60,0,48,24,60,102,126,96,60,0,0,216,0,112,48,48,120,0,48,72,0,112,48,48,120,0,96,48,0,112,48,48,120,0,102,24,60,102,126,102,102,0,0,0,
-0,0,0,0,0,0,24,48,124,96,120,96,124,0,0,0,108,26,126,216,110,0,30,40,40,126,72,136,142,0,24,36,60,102,102,102,60,0,102,0,60,102,102,102,60,0,48,24,60,102,102,102,60,0,24,36,0,102,102,102,62,0,48,24,102,102,102,102,62,0,0,0,0,0,0,0,0,0,102,60,102,
-102,102,102,60,0,102,0,102,102,102,102,60,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,24,60,6,62,102,62,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
-0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
-0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
-0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
-0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
-0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
-0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
-0,0,0,0,0,0,28,54,54,124,102,102,124,64,0,0,0};
-
-static tCls pCls = NULL;
-static tBlt pBlt = NULL;
-static tBlt_part pBlt_part = NULL;
-static tSet_565 pSet_565 = NULL;
-static tScreenOp pBeginDraw = NULL;
-static tScreenOp pEndDraw = NULL;
-
-static int _geometry_w;
-static int _geometry_h;
-static int _saved_geometry_h;
-
-HWND hWndMain;
-
-typedef enum {
- DEVICE_HPC = 0,
- DEVICE_PPC,
- DEVICE_SMARTPHONE
-} pdaDevice;
-
-
-typedef enum {
- DEVICE_GAPI = 0,
- DEVICE_VIDEO,
- DEVICE_GDI
-} gfxDevice;
-
-typedef enum {
- VIDEO_565 = 0,
- VIDEO_555,
- VIDEO_PALETTED,
- VIDEO_MONO,
- VIDEO_DONT_CARE
-} gfxOption;
-
-
-unsigned char* pda_device_name[] = {
- (unsigned char*)"HPC",
- (unsigned char*)"PPC",
- (unsigned char*)"Smartphone"
-};
-
-unsigned char* gfx_device_name[] = {
- (unsigned char*)"GAPI",
- (unsigned char*)"Direct Video",
- (unsigned char*)"GDI"
-};
-
-unsigned char* gfx_device_options_name[] = {
- (unsigned char*)"565",
- (unsigned char*)"555",
- (unsigned char*)"paletted",
- (unsigned char*)"mono",
- (unsigned char*)"",
-};
-
-pdaDevice _pda_device;
-gfxDevice _gfx_device;
-gfxOption _gfx_option;
-
-
-unsigned char *image_expand(unsigned char *src) {
- int i = 0;
- int j;
- int expanded = 0;
-
- for (;;) {
- if (!src[i]) {
- if (!src[i + 1])
- break;
- for (j=0; j<src[i + 1]; j++)
- decomp[expanded++] = src[i+2];
- i += 3;
- }
- else
- decomp[expanded++] = src[i++];
- }
-
- return decomp;
-}
-
-
-void SetScreenMode(int mode)
-{
- currentScreenMode = mode;
- if(currentScreenMode > maxMode)
- currentScreenMode = 0;
-}
-
-int GetScreenMode()
-{
- return currentScreenMode;
-}
-
-void GraphicsSuspend()
-{
- if(active)
- {
- active = 0;
- dynamicGXSuspend();
- }
-}
-
-void GraphicsResume()
-{
- if(!active)
- {
- active = 1;
- dynamicGXResume();
- }
-
- palette_update();
-}
-
-void GraphicsOff(void)
-{
- dynamicGXCloseDisplay();
- active = 0;
-}
-
-void GAPIBeginDraw() {
- displayCache = (UBYTE*)dynamicGXBeginDraw();
-}
-
-void GAPIEndDraw() {
- dynamicGXEndDraw();
-}
-
-void SetScreenGeometry(int w, int h) {
- // Complain (loudly) if w > 320 and h > 240 ...
- /*
- if (w != 320 || h > 240) {
- char tempo[100];
- sprintf(tempo, "Unsupported screen geometry %dx%d", w, h);
- drawError(tempo);
- exit(1);
- }
- */
-
- _geometry_w = w;
- _geometry_h = h;
- _saved_geometry_h = h;
- RestoreScreenGeometry();
-}
-
-void LimitScreenGeometry() {
- int limit;
-
- if (high_res) {
- if (wide_screen)
- limit = 440;
- else
- limit = 400;
- }
- else
- limit = 200;
-
- if (_geometry_h > limit) {
- geom[0].lineLimit = _geometry_w*limit;
- geom[1].lineLimit = _geometry_w*limit;
- geom[2].lineLimit = _geometry_w*limit;
- _geometry_h = limit;
- }
-}
-
-void RestoreScreenGeometry() {
- _geometry_h = _saved_geometry_h;
- geom[0].lineLimit = _geometry_w * _geometry_h;
- geom[1].lineLimit = _geometry_w * _geometry_h;
- geom[2].lineLimit = _geometry_w * _geometry_h;
-}
-
-int GraphicsOn(HWND hWndMain_param, bool gfx_mode_switch)
-{
- hWndMain = hWndMain_param;
-
- _gfx_device = DEVICE_GAPI;
-
- if (!noGAPI && dynamicGXOpenDisplay(hWndMain, GX_FULLSCREEN) == GAPI_SIMU)
- _gfx_device = DEVICE_VIDEO;
-
- _gfx_mode_switch = gfx_mode_switch;
-
- if (_gfx_mode_switch) {
- _game_selection_X_offset = GAME_SELECTION_X_OFFSET;
- _game_selection_Y_offset = GAME_SELECTION_Y_OFFSET;
- }
- else {
- _game_selection_X_offset = 0;
- _game_selection_Y_offset = 0;
- }
-
- memset(&gxdp, 0, sizeof(gxdp));
-
- if (!noGAPI)
- gxdp = dynamicGXGetDisplayProperties();
- else {
- gxdp.cxWidth = GetSystemMetrics(SM_CXSCREEN);
- gxdp.cyHeight = GetSystemMetrics(SM_CYSCREEN);
- gxdp.ffFormat = 0xA8;
- }
-
- // Possible Aero problem
-
- if (gxdp.cbxPitch == 61440 &&
- gxdp.cbyPitch == -2 &&
- gxdp.ffFormat == 0x18
- ) {
- gxdp.cbxPitch = 640;
- gxdp.cbyPitch = -2;
- gxdp.ffFormat = kfDirect | kfDirect565;
- }
-
- if(noGAPI)
- {
- HDC hdc;
- int width = (!high_res ? 320 : 640);
- int height = (!high_res ? 240 : 480);
-
- pCls = noGAPI_Cls;
- pBlt = noGAPI_Blt;
- pBlt_part = noGAPI_Blt_part;
- pSet_565 = noGAPI_Set_565;
-
- toolbar_available = 1;
-
- hdc = GetDC(hWndMain);
- noGAPI_compat = CreateCompatibleDC(hdc);
- ReleaseDC(hWndMain, hdc);
-
-
-#ifndef NEW_GAPI_CODE
- // Init GDI
- noGAPI_video_buffer = (UBYTE*)malloc(320 * 240 * 2);
-#else
-
- memset(&noGAPI_bitmap_header, 0, sizeof(BITMAPINFOHEADER));
- noGAPI_bitmap_header.biSize = sizeof(BITMAPINFOHEADER);
-
- noGAPI_bitmap_header.biWidth = GetSystemMetrics(SM_CXSCREEN);
- noGAPI_bitmap_header.biHeight = -GetSystemMetrics(SM_CYSCREEN); /* origin = top */
-
- noGAPI_bitmap_header.biPlanes = 1;
- noGAPI_bitmap_header.biBitCount = 24;
- noGAPI_bitmap_header.biCompression = BI_RGB; /* paletted fixme Jornada 820 ? */
-
-
- noGAPI_bitmap = CreateDIBSection(noGAPI_compat, (BITMAPINFO*)&noGAPI_bitmap_header, DIB_RGB_COLORS, (void**)&noGAPI_buffer, NULL, 0);
- if (!noGAPI_bitmap)
- exit(1);
-
- SelectObject(noGAPI_compat, noGAPI_bitmap);
-#endif
-
- _gfx_device = DEVICE_GDI;
- _gfx_option = VIDEO_DONT_CARE;
- }
- else if(gxdp.ffFormat & kfDirect565)
- {
- pCls = hicolor_Cls;
- pBlt = hicolor565_Blt;
- pBlt_part = hicolor565_Blt_part;
- pSet_565 = hicolor565_Set_565;
- pBeginDraw = GAPIBeginDraw;
- pEndDraw = GAPIEndDraw;
- filter_available = 1;
- smooth_filter = 1;
- toolbar_available = 1;
-
- _gfx_option = VIDEO_565;
- }
- else if(gxdp.ffFormat & kfDirect555)
- {
- pCls = hicolor_Cls;
- pBlt = hicolor555_Blt;
- pBlt_part = hicolor555_Blt_part;
- pSet_565 = hicolor555_Set_565;
- pBeginDraw = GAPIBeginDraw;
- pEndDraw = GAPIEndDraw;
- filter_available = 1;
- smooth_filter = 1;
- toolbar_available = 1;
-
- _gfx_option = VIDEO_555;
- }
- else if((gxdp.ffFormat & kfDirect) && (gxdp.cBPP <= 8))
- {
- pCls = mono_Cls;
- pBlt = mono_Blt;
- pBlt_part = mono_Blt_part;
- pSet_565 = mono_Set_565;
- pBeginDraw = GAPIBeginDraw;
- pEndDraw = GAPIEndDraw;
-
- if(gxdp.ffFormat & kfDirectInverted)
- invert = (1<<gxdp.cBPP)-1;
- colorscale = gxdp.cBPP < 8 ? 8-gxdp.cBPP : 0;
-
- if(gxdp.cBPP >= 4)
- filter_available = 1;
-
- toolbar_available = 1;
-
- _gfx_option = VIDEO_MONO;
- }
- else if(gxdp.ffFormat & kfPalette)
- {
- pCls = palette_Cls;
- pBlt = palette_Blt;
- pBlt_part = palette_Blt_part;
- pSet_565 = palette_Set_565;
- pBeginDraw = GAPIBeginDraw;
- pEndDraw = GAPIEndDraw;
-
- toolbar_available = 1;
-
- _gfx_option = VIDEO_PALETTED;
- }
-
-
- if(!pCls || !pBlt || (!smartphone && (gxdp.cxWidth < 240 || gxdp.cyHeight < 240))
- )
- {
- // I don't believe there are devices that end up here
- GraphicsOff();
- return 1;
- }
-
- if (smartphone)
- toolbar_available = 0;
-
-
- // compute geometries
-
- // portrait
- portrait_geometry.width = gxdp.cxWidth; // 240
- portrait_geometry.height = gxdp.cyHeight; // 320
- portrait_geometry.startoffset = 0;
- portrait_geometry.sourceoffset = 0;
- portrait_geometry.linestep = gxdp.cbyPitch;
- portrait_geometry.pixelstep = gxdp.cbxPitch;
- portrait_geometry.xSkipMask = gxdp.cxWidth < 320 ? 0x00000003 : 0xffffffff;
- portrait_geometry.xLimit = 320; // skip 1/4
- portrait_geometry.lineLimit = 320*200;
- geom[0].width = gxdp.cxWidth;
- geom[0].height = gxdp.cyHeight;
- geom[0].startoffset = 0;
- geom[0].sourceoffset = 0;
- geom[0].linestep = gxdp.cbyPitch;
- geom[0].pixelstep = gxdp.cbxPitch;
- geom[0].xSkipMask = 0xffffffff;
- geom[0].xLimit = 240;
- geom[0].lineLimit = 320*240;
-
- _screen_factor = 1/2;
-
- // This will be overridden for the Smartphone implementation
-
- // left handed landscape
- geom[1].width = gxdp.cyHeight; // 320
- geom[1].height = gxdp.cxWidth; // 240
- geom[1].startoffset = gxdp.cbyPitch*(gxdp.cyHeight-1);
- geom[1].sourceoffset = 0;
- geom[1].linestep = gxdp.cbxPitch;
- geom[1].pixelstep = -gxdp.cbyPitch;
- geom[1].xSkipMask = 0xffffffff;
- geom[1].xLimit = 320; // no skip
- geom[1].lineLimit = 320*200;
-
- // right handed landscape
- geom[2].width = gxdp.cyHeight; // 320
- geom[2].height = gxdp.cxWidth; // 240
- geom[2].startoffset = gxdp.cbxPitch*(gxdp.cxWidth-1);
- geom[2].sourceoffset = 0;
- geom[2].linestep = -gxdp.cbxPitch;
- geom[2].pixelstep = gxdp.cbyPitch;
- geom[2].xSkipMask = 0xffffffff;
- geom[2].xLimit = 320; // no skip
- geom[2].lineLimit = 320*200;
-
-
- if(gxdp.cyHeight < 320 && !smartphone)
- maxMode = 0; // portrait only!
-
- active = 1;
-
- wide_screen = GetSystemMetrics(SM_CXSCREEN) >= 320;
- extra_wide_screen = GetSystemMetrics(SM_CYSCREEN) >= 480;
-
- if (wide_screen)
- _pda_device = DEVICE_HPC;
- else {
- if (smartphone)
- _pda_device = DEVICE_SMARTPHONE;
- else
- _pda_device = DEVICE_PPC;
- }
-
- return 0;
-}
-
-/* Find the best color match in the palette (limited to 'limit' entries) */
- UBYTE best_match(UBYTE r, UBYTE g, UBYTE b, int limit)
- {
- UBYTE best = 0;
- int distance = 768;
- int i, d;
- for(i=0; i<limit; i++)
- {
- /* Manhattan distance for now. Not the best but rather fast */
- d = abs(r-palRed[i])+abs(g-palGreen[i])+abs(b-palBlue[i]);
- if(d < distance)
- {
- distance = d;
- best = i;
- }
- }
-
- return (UBYTE)best;
- }
-
-
-void palette_update()
-{
- if(gxdp.ffFormat & kfPalette)
- {
- LOGPALETTE* ple =
-(LOGPALETTE*)malloc(sizeof(LOGPALETTE)+sizeof(PALETTEENTRY)*255);
- ple->palVersion = 0x300;
- ple->palNumEntries = 256;
- for(int i=0; i<236; i++) // first 10 and last ten belong to the system!
- {
- ple->palPalEntry[i+10].peBlue = palBlue[i];
- ple->palPalEntry[i+10].peGreen = palGreen[i];
- ple->palPalEntry[i+10].peRed = palRed[i];
- ple->palPalEntry[i+10].peFlags = PC_RESERVED;
- }
- HDC hDC = GetDC(hWndMain);
- GetSystemPaletteEntries(hDC, 0, 10, &(ple->palPalEntry[0]));
- GetSystemPaletteEntries(hDC, 246, 10, &(ple->palPalEntry[246]));
- HPALETTE hpal = CreatePalette(ple);
- SelectPalette(hDC, hpal, FALSE);
- RealizePalette(hDC);
- DeleteObject((HGDIOBJ)hpal);
- ReleaseDC(hWndMain, hDC);
- free((void*)ple);
-
- for(i=0; i<20; i++)
- staticTranslate[i] = best_match(palRed[i+236], palGreen[i+236], palBlue[i+236], 236)+10;
-
- memset(color_match, 255, sizeof(color_match));
-
- }
-}
-
-void SetPalEntry(int ent, UBYTE r, UBYTE g, UBYTE b)
-{
- int i;
-
- if (ent >= MAX_CLR)
- return;
-
- palRed[ent] = r;
- palGreen[ent] = g;
- palBlue[ent] = b;
-
- if(gxdp.ffFormat & kfDirect565)
- pal[ent] = COLORCONV565(r,g,b);
- else if(gxdp.ffFormat & kfDirect555)
- pal[ent] = COLORCONV555(r,g,b);
- else if(gxdp.ffFormat & kfDirect)
- pal[ent] = COLORCONVMONO(r,g,b);
-
-}
-
-/* *************** CLS IMPLEMENTATIONS ****************** */
-
-void mono_Cls()
-{
- int x, y;
- UBYTE* dst;
- UBYTE *scraddr;
- int linestep, pixelstep;
- UBYTE fillcolor;
-
- fillcolor = (gxdp.ffFormat & kfDirectInverted) ? 0xff : 0x00;
-
- pixelstep = geom[0].pixelstep;
- if(pixelstep == 0)
- return;
- linestep = (pixelstep > 0) ? -1 : 1;
-
- scraddr = (UBYTE*)dynamicGXBeginDraw();
- if(scraddr)
- {
- for(y=0; y<geom[0].height*gxdp.cBPP/8; y++)
- {
- dst = scraddr+geom[0].startoffset;
- for(x=0; x<geom[0].width; x++)
- {
- *dst = fillcolor;
- dst += pixelstep;
- }
- scraddr += linestep;
- }
- dynamicGXEndDraw();
- }
-}
-
-void palette_Cls()
-{
- int x, y;
- UBYTE* dst;
- UBYTE *scraddr;
- scraddr = (UBYTE*)dynamicGXBeginDraw();
- if(scraddr)
- {
- for(y=0; y<geom[useMode].height; y++)
- {
- dst = scraddr+geom[useMode].startoffset;
- for(x=0; x<geom[useMode].width; x++)
- {
- *dst = 0;
- dst += geom[useMode].pixelstep;
- }
- scraddr += geom[useMode].linestep;
- }
- dynamicGXEndDraw();
- }
-}
-
-void hicolor_Cls()
-{
- int x, y;
- UBYTE* dst;
- UBYTE *scraddr;
- scraddr = (UBYTE*)dynamicGXBeginDraw();
- if(scraddr)
- {
- for(y=0; y<geom[useMode].height; y++)
- {
- dst = scraddr+geom[useMode].startoffset;
- for(x=0; x<geom[useMode].width; x++)
- {
- *(unsigned short*)dst = 0;
- dst += geom[useMode].pixelstep;
- }
- scraddr += geom[useMode].linestep;
- }
- dynamicGXEndDraw();
- }
-}
-
-
-void Cls()
-{
- pCls();
-}
-int counter = 0;
-
-void drawSoundItem(int x, int y) {
- if (!sound_activated)
- pBlt_part(image_expand(item_soundOn), x, y, 32, 32, item_soundOn_colors, 0);
- else
- pBlt_part(image_expand(item_soundOff), x, y, 32, 32, item_soundOff_colors, 0);
-}
-
-void drawError(char *error) {
- FILE *file_error;
-
- file_error=fopen("scummvm_error.txt", "w");
- if (file_error) {
- fprintf(file_error, "%s\n", error);
- fclose(file_error);
- }
- int current_y = 80;
- Cls();
- pBlt_part(image_expand(item_toolbar), 0, 0, 320, 40, item_toolbar_colors, 0);
- pBlt_part(image_expand(item_bomb), 0, 0, 64, 67, item_bomb_colors, 0);
- memset(decomp, 0, sizeof(decomp));
- current_y = drawString("SCUMMVM ERROR !", 10, current_y, 2, 1);
- current_y += 10;
- current_y = drawString(error, 10, current_y, 8, 1);
- current_y += 10;
- current_y = drawString("Exiting in 10 seconds", 10, current_y, 8, 1);
- Sleep(10 * 1000);
-}
-
-void drawWait() {
- pBlt_part(image_expand(item_toolbar), 0, 0, 320, 40, item_toolbar_colors, 0);
- pBlt_part(image_expand(item_loading), 28, 10, 100, 25, item_loading_colors, 0);
-}
-
-void drawWaitSelectKey() {
- drawWait();
- drawString("Press key for RIGHT CLICK", 10, 100, 2, 1);
-}
-
-void setGameSelectionPalette() {
- int i;
-
- if (_gfx_option != VIDEO_PALETTED)
- return;
-
- for (i=0; i<item_startup_colors_size; i++)
- SetPalEntry(i, item_startup_colors[3 * i], item_startup_colors[(3 * i) + 1],
- item_startup_colors[(3 * i) + 2]);
-
- palette_update();
-}
-
-void drawBlankGameSelection() {
- //int i;
- image_expand(item_startup);
- /* Store empty comment */
- memcpy(comment_zone, decomp + (206 * 220), 8 * 220);
- pBlt_part(decomp, _game_selection_X_offset, _game_selection_Y_offset, 220, 250, item_startup_colors, 0);
-}
-
-void drawVideoDevice() {
- char info[100];
-
- sprintf(info, "Video device : %s %s - CVS %s PPC %s", gfx_device_name[_gfx_device], gfx_device_options_name[_gfx_option], gScummVMVersion, getBuildDate());
- drawString(info, 10, 0, 2, 1);
- /*
- printString(video_device, 10, 270, 2, 0);
- pBlt_part(decomp + (270 * 220), 0, 5, 220, 8, item_startup_colors, 1);
- */
-
-}
-
-void drawCommentString(char *comment) {
- /* Erase old comment */
- memcpy(decomp + (206 * 220), comment_zone, 8 * 220);
- /* Draw new comment */
- printString(comment, 24, 206, 2);
- pBlt_part(decomp + (206 * 220), _game_selection_X_offset, _game_selection_Y_offset + 206, 220, 8, item_startup_colors, 0);
-}
-
-void drawStandardString(char *game, int index) {
- printString(game, 24, 70 + (15 * index), 2);
- //pBlt_part(decomp, GAME_SELECTION_X_OFFSET + 24, GAME_SELECTION_Y_OFFSET + 70 + (12 * index), 220, 8, item_startup_colors);
- pBlt_part(decomp + ((70 + (15 * index)) * 220), _game_selection_X_offset, _game_selection_Y_offset + 70 + (15 * index), 220, 8, item_startup_colors, 0);
-}
-
-void drawHighlightedString(char *game, int index) {
- /* Replace former highlighted string */
- if (_highlighted_index != -1) {
- memcpy(decomp + ((70 + (15 * _highlighted_index)) * 220), highlighted_zone, 8 * 220);
- pBlt_part(decomp + ((70 + (15 * _highlighted_index)) * 220), _game_selection_X_offset, _game_selection_Y_offset + 70 + (15 * _highlighted_index), 220, 8, item_startup_colors, 0);
- }
- /* Save non highlighted string */
- _highlighted_index = index;
- memcpy(highlighted_zone, decomp + ((70 + (15 * index)) * 220), 8 * 220);
- /* Draw new highlighted string */
- printString(game, 24, 70 + (15 * index), 2, 3);
- pBlt_part(decomp + ((70 + (15 * index)) * 220), _game_selection_X_offset, _game_selection_Y_offset + 70 + (15 * index), 220, 8, item_startup_colors, 0);
-}
-
-void resetLastHighlighted() {
- _highlighted_index = -1;
-}
-
-void reducePortraitGeometry() {
- if (_gfx_mode_switch)
- memcpy(&geom[0], &portrait_geometry, sizeof(tScreenGeometry));
-}
-
-void drawAllToolbar() {
- int x,y;
- int start_offset;
-
- if (high_res && wide_screen)
- start_offset = 440;
- else
- start_offset = 200;
-
- if (currentScreenMode || wide_screen) {
-
- if (draw_keyboard) {
- pBlt_part(image_expand(item_keyboard), 0, start_offset, 320, 40, item_keyboard_colors, 0);
- }
- else {
- pBlt_part(image_expand(item_toolbar), 0, start_offset, 320, 40, item_toolbar_colors, 0);
- x = 10;
- y = start_offset + 4;
- if (!is_simon)
- pBlt_part(image_expand(item_disk), x, y, 32, 32, item_disk_colors, 0);
- x += 40;
- pBlt_part(image_expand(item_skip), x, y, 32, 32, item_skip_colors, 0);
- x += 40;
- drawSoundItem(x, y);
- if (_gfx_mode_switch && !high_res) {
- x += 40;
- pBlt_part(image_expand(item_monkeyPortrait), x, y, 32, 32,
- item_monkeyPortrait_colors, 0);
- }
- }
- }
- else {
- if (draw_keyboard) {
- pBlt_part(image_expand(item_keyboardPortrait), 0, 240, 320, 80,
- item_keyboardPortrait_colors, 0);
- }
- else {
- pBlt_part(image_expand(item_toolbarPortrait), 0, 240, 320, 80,
- item_toolbarPortrait_colors, 0);
- /*drawToolbarItem(item_toolbarPortrait_colors, item_toolbarPortrait,
- 0, 240, 240, 80);*/
- x = 10;
- y = 240;
- pBlt_part(image_expand(item_disk), x, y, 32, 32, item_disk_colors, 0);
- x += 40;
- pBlt_part(image_expand(item_skip), x, y, 32, 32, item_skip_colors, 0);
- x += 40;
- drawSoundItem(x, y);
- if (_gfx_mode_switch && !high_res) {
- x += 40;
- pBlt_part(image_expand(item_monkeyLandscape), x, y, 32, 32,
- item_monkeyLandscape_colors, 0);
- }
- }
- }
-
- toolbar_drawn = true;
-}
-
-void redrawSoundItem() {
- drawSoundItem(10 + 40 + 40, (currentScreenMode || wide_screen ? 204 : 240));
-}
-
-bool isInBox(int x, int y, int x1, int y1, int x2, int y2) {
- return ((x >= x1 && y >= y1) && (x <= x2 && y <= y2));
-}
-
-ToolbarSelected getToolbarSelection (int x, int y) {
- int test_x, test_y;
- int offset = 1;
-
- /*
- if (!currentScreenMode)
- return ToolbarNone;
- */
-
- if (!high_res && !(x >= 10 && y >= 204))
- return ToolbarNone;
-
- if (high_res && !(x >= 10 && y >= 444))
- return ToolbarNone;
-
- if (!high_res)
- test_y = (currentScreenMode || wide_screen ? 204 : 240);
- else
- test_y = 444;
-
- if (high_res && !wide_screen)
- offset = 2;
-
- test_x = (10 * offset);
-
- if (isInBox(x, y, test_x, test_y, test_x + (32 * offset), test_y + (32 * offset)))
- return ToolbarSaveLoad;
- test_x += (40 * offset);
- if (isInBox(x, y, test_x, test_y, test_x + (32 * offset), test_y + (32 * offset)))
- return ToolbarSkip;
- test_x += (40 * offset);
- if (isInBox(x, y, test_x, test_y, test_x + (32 * offset), test_y + (32 * offset)))
- return ToolbarSound;
- if (_gfx_mode_switch && !high_res) {
- test_x += (40 * offset);
- if (isInBox(x, y, test_x, test_y, test_x + (32 * offset), test_y + (32 * offset)))
- return ToolbarMode;
- }
- return ToolbarNone;
-}
-
-/* ************************** BLT IMPLEMENTATION **************************** */
-
-void beginBltPart() {
- if (pBeginDraw)
- pBeginDraw();
-}
-
-void endBltPart() {
- if (pEndDraw)
- pEndDraw();
-}
-
-
-void Blt(UBYTE * scr_ptr)
-{
- pBlt(scr_ptr);
-
- //if (toolbar_available && currentScreenMode && !toolbar_drawn)
- if (toolbar_available && !toolbar_drawn && !hide_toolbar)
- drawAllToolbar();
-
-}
-
-void Blt_part(UBYTE * src_ptr, int x, int y, int width, int height, int pitch, bool check) {
-
- if (toolbar_available && !toolbar_drawn && !hide_toolbar)
- drawAllToolbar();
-
- if (y > _geometry_h)
- return;
-
- if (y + height > _geometry_h)
- height = _geometry_h - y;
-
- pBlt_part(src_ptr, x, y, width, height, NULL, pitch, TRUE);
-
- //if (check && (y > _geometry_h || (y + height) > _geometry_h)) {
- // toolbar_drawn = false;
- //}
-
-}
-
-void checkToolbar() {
- if (toolbar_available && !toolbar_drawn && !hide_toolbar)
- drawAllToolbar();
-}
-
-/* *************************** MONO DISPLAY ********************************* */
-
-#define ADVANCE_PARTIAL(address, step) \
- bitshift += gxdp.cBPP; \
- if(bitshift >= 8) \
- { \
- bitshift = 0; \
- bitmask = (1<<gxdp.cBPP)-1; \
- address += step; \
- } \
- else \
- bitmask <<= gxdp.cBPP;
-
-#define ADVANCE_REV_PARTIAL(address, step) \
- bitshift -= gxdp.cBPP; \
- if(bitshift < 0) \
- { \
- bitshift = 8-gxdp.cBPP; \
- bitmask = ((1<<gxdp.cBPP)-1)<<bitshift; \
- address += step; \
- } \
- else \
- bitmask >>= gxdp.cBPP;
-
-
-void mono_Set_565(INT16 *buffer, int pitch, int x, int y, int width, int height) {
-
- static UBYTE *scraddr;
- static UBYTE *dst;
- static long pixelstep;
- static long linestep;
- static UBYTE bitmask;
- static int bitshift;
- static long skipmask;
-
- scraddr = (UBYTE*)dynamicGXBeginDraw();
- pixelstep = geom[useMode].pixelstep;
- linestep = (pixelstep > 0) ? -1 : 1;
- skipmask = geom[useMode].xSkipMask;
- bitshift = 0;
- bitmask = (1<<gxdp.cBPP)-1;
-
- if(scraddr)
- {
- int lines = 0;
- int current = 0;
-
- scraddr += geom[useMode].startoffset;
- scraddr += y * linestep;
-
- while(lines != height)
- {
- int i;
- current = 0;
-
- dst = scraddr;
-
- /* skip non updated pixels for this line */
- for (i=0; i < x; i++)
- dst += pixelstep;
-
- /* Turtle warning !!! */
-
- for (i=0; i<width; i++) {
- if (skipmask == 0xffffffff || (long)i & skipmask) {
- *dst = ((*dst)&~bitmask)|(COLORCONVMONO(
- RED_FROM_565(*(buffer + i)),
- GREEN_FROM_565(*(buffer + i)),
- BLUE_FROM_565(*(buffer + i))) << bitshift);
-
- dst += pixelstep;
- }
- }
-
- ADVANCE_PARTIAL(scraddr, linestep);
-
- buffer += pitch;
- lines++;
- }
- }
-
- dynamicGXEndDraw();
-}
-
-
-void mono_Blt(UBYTE *src_ptr) {
- mono_Blt_part(src_ptr, 0, 0, _geometry_w, _geometry_h, NULL, 0);
-}
-
-
-void mono_Blt_part(UBYTE * scr_ptr, int x, int y, int width, int height,
- UBYTE * own_palette, int pitch, BOOL useCache)
-{
-// Mono blit routines contain good deal of voodoo
- static UBYTE *src;
- static UBYTE *dst;
- static UBYTE *scraddr;
- static UBYTE *scr_ptr_limit;
- static UBYTE *src_limit;
- static long pixelstep;
- static long linestep;
- static long skipmask;
-
-// Special code is used to deal with packed pixels in monochrome mode
- static UBYTE bitmask;
- static int bitshift;
-
- if(!active)
- {
- Sleep(100);
- return;
- }
-
- /* Update screen mode, also thread protection by doing this */
- if(useMode != currentScreenMode)
- {
- useMode = currentScreenMode;
- pCls();
- }
-
- pixelstep = geom[useMode].pixelstep;
- linestep = geom[useMode].linestep;
- skipmask = geom[useMode].xSkipMask;
-
- if (!useCache)
- scraddr = (UBYTE*)dynamicGXBeginDraw();
- else
- scraddr = displayCache;
-
- if(pixelstep)
- {
- // this will work on mono iPAQ and @migo, don't know about any others
- linestep = (pixelstep > 0) ? -1 : 1;
-
- bitshift = 0;
- bitmask = (1<<gxdp.cBPP)-1;
-
- if(scraddr)
- {
- scraddr += geom[useMode].startoffset;
- scr_ptr += geom[useMode].sourceoffset;
- //scr_ptr_limit = scr_ptr + geom[useMode].lineLimit;
- //src_limit = scr_ptr + geom[useMode].xLimit;
-
- /* Update offsets to the current line */
- scraddr += y * linestep;
- scr_ptr_limit = scr_ptr + (pitch ? pitch : width) * height;
- src_limit = scr_ptr + width;
-
- /*
- if (scr_ptr_limit > scr_ptr + geom[useMode].lineLimit)
- scr_ptr_limit = scr_ptr + geom[useMode].lineLimit;
- */
-
- /* CMI rendering */
- if (high_res && !own_palette && !extra_wide_screen) {
- while(scr_ptr < scr_ptr_limit)
- {
- int i;
-
- src = scr_ptr;
- dst = scraddr;
-
- /* skip non updated pixels for this line */
- for (i=0; i < x; i++)
- dst += pixelstep;
-
- while(src < src_limit)
- {
-
- *dst = ((*dst)&~bitmask)|(pal[*src]<<bitshift);
- dst += pixelstep;
- src +=2;
- }
-
- ADVANCE_PARTIAL(scraddr, linestep);
-
- scr_ptr += (pitch ? 2 * pitch : 2 * width);
- src_limit += (pitch ? 2 * pitch : 2 * width);
- }
- }
- else
- /* Internal pixel loops */
- if(skipmask == 3 && (smooth_filter) && gxdp.cBPP >= 4)
- {
- while(scr_ptr < scr_ptr_limit)
- {
- int i;
-
- src = scr_ptr;
- dst = scraddr;
-
- /* skip non updated pixels for this line */
- for (i=0; i < x; i++)
- dst += pixelstep;
-
- while(src < src_limit)
- {
- UBYTE r, g, b;
-
- if (!own_palette) {
- r = (3*palRed[*(src+0)] + palRed[*(src+1)])>>2;
- g = (3*palGreen[*(src+0)] + palGreen[*(src+1)])>>2;
- b = (3*palBlue[*(src+0)] + palBlue[*(src+1)])>>2;
- } else {
- r = (3 * own_palette[3 * *(src + 0)] +
- own_palette[3 * *(src + 1)]) >> 2;
- g = (3 * own_palette[3 * *(src + 0) + 1] +
- own_palette[3 * *(src + 1) + 1]) >> 2;
- b = (3 * own_palette[3 * *(src + 0) + 2] +
- own_palette[3 * *(src + 1) + 2]) >> 2;
- }
-
-
- *dst = (*dst & ~bitmask) | (COLORCONVMONO(r,g,b)<<bitshift);
-
- dst += pixelstep;
-
- if (!own_palette) {
- r = (palRed[*(src+1)] + palRed[*(src+2)])>>1;
- g = (palGreen[*(src+1)] + palGreen[*(src+2)])>>1;
- b = (palBlue[*(src+1)] + palBlue[*(src+2)])>>1;
- }
- else {
- r = (own_palette[3 * *(src + 1)] +
- own_palette[3 * *(src + 2)]) >> 2;
- g = (own_palette[3 * *(src + 1) + 1] +
- own_palette[3 * *(src + 2) + 1]) >> 2;
- b = (own_palette[3 * *(src + 1) + 2] +
- own_palette[3 * *(src + 2) + 2]) >> 2;
- }
-
- *dst = (*dst & ~bitmask) | (COLORCONVMONO(r,g,b)<<bitshift);
-
- dst += pixelstep;
-
- if (!own_palette) {
- r = (palRed[*(src+2)] + 3*palRed[*(src+3)])>>2;
- g = (palGreen[*(src+2)] + 3*palGreen[*(src+3)])>>2;
- b = (palBlue[*(src+2)] + 3*palBlue[*(src+3)])>>2;
- }
- else {
- r = (own_palette[3 * *(src + 2)] +
- 3 * own_palette[3 * *(src + 3)]) >> 2;
- g = (own_palette[3 * *(src + 2) + 1] +
- 3 * own_palette[3 * *(src + 3) + 1]) >> 2;
- b = (own_palette[3 * *(src + 2) + 2] +
- 3 * own_palette[3 * *(src + 3) + 2]) >> 2;
-
- }
-
- *dst = (*dst & ~bitmask) | (COLORCONVMONO(r,g,b)<<bitshift);
-
- dst += pixelstep;
-
- src += 4;
- }
-
- ADVANCE_PARTIAL(scraddr, linestep);
-
- scr_ptr += (pitch ? pitch : width);
- src_limit += (pitch ? pitch : width);
- }
- }
- else if(skipmask != 0xffffffff)
- {
- while(scr_ptr < scr_ptr_limit)
- {
- int i;
-
- src = scr_ptr;
- dst = scraddr;
-
- /* skip non updated pixels for this line */
- for (i=0; i < x; i++)
- dst += pixelstep;
-
- while(src < src_limit)
- {
- if((long)src & skipmask)
- {
- if (!own_palette)
- *dst = ((*dst)&~bitmask)|(pal[*src]<<bitshift);
- else
- *dst = ((*dst)&~bitmask)|(COLORCONVMONO(
- own_palette[3 * *src],
- own_palette[(3 * *src) + 1],
- own_palette[(3 * *src) + 2]) << bitshift);
- dst += pixelstep;
- }
- src ++;
- }
-
- ADVANCE_PARTIAL(scraddr, linestep);
-
- scr_ptr += (pitch ? pitch : width);
- src_limit += (pitch ? pitch : width);
- }
- }
- else
- {
- while(scr_ptr < scr_ptr_limit)
- {
- int i;
-
- src = scr_ptr;
- dst = scraddr;
-
- /* skip non updated pixels for this line */
- for (i=0; i < x; i++)
- dst += pixelstep;
-
- while(src < src_limit)
- {
- if (!own_palette)
- *dst = ((*dst)&~bitmask)|(pal[*src]<<bitshift);
- else
- *dst = ((*dst)&~bitmask)|(COLORCONVMONO(
- own_palette[3 * *src],
- own_palette[(3 * *src) + 1],
- own_palette[(3 * *src) + 2]) << bitshift);
- dst += pixelstep;
- src ++;
- }
-
- ADVANCE_PARTIAL(scraddr, linestep);
-
- scr_ptr += (pitch ? pitch : width);
- src_limit += (pitch ? pitch : width);
- }
- }
- }
- }
- else
- {
- // Filtering is not implemented in this mode. Not needed by current devices anyway
- pixelstep = (linestep > 0) ? 1 : -1;
-
- if(scraddr)
- {
-
- scraddr += geom[useMode].startoffset;
- scr_ptr += geom[useMode].sourceoffset;
- //scr_ptr_limit = scr_ptr + geom[useMode].lineLimit;
- //src_limit = scr_ptr + geom[useMode].xLimit;
-
- /* Update offsets to the current line */
- scraddr += y * linestep;
- scr_ptr_limit = scr_ptr + (pitch ? pitch : width) * height;
- src_limit = scr_ptr + width;
-
- if (scr_ptr_limit > scr_ptr + geom[useMode].lineLimit)
- scr_ptr_limit = scr_ptr + geom[useMode].lineLimit;
-
- /* CMI rendering */
- if (high_res && !own_palette && !extra_wide_screen) {
- if(pixelstep > 0)
- {
- bitshift = 8-gxdp.cBPP;
- bitmask = ((1<<gxdp.cBPP)-1)<<bitshift;
-
- while(scr_ptr < scr_ptr_limit)
- {
- int i;
-
- src = scr_ptr;
- dst = scraddr;
- dst -= (linestep-pixelstep);
-
- /* skip non updated pixels for this line */
- for (i=0; i < x; i++)
- ADVANCE_REV_PARTIAL(dst, pixelstep);
-
- while(src < src_limit)
- {
- *dst = ((*dst)&~bitmask)|(pal[*src]<<bitshift);
- ADVANCE_REV_PARTIAL(dst, pixelstep);
- src += 2;
- }
-
- scraddr += linestep;
-
- scr_ptr += (pitch ? 2 * pitch : 2 * width);
- src_limit += (pitch ? 2 * pitch : 2 * width);
- }
- }
- else {
- bitshift = 0;
- bitmask = (1<<gxdp.cBPP)-1;
-
- while(scr_ptr < scr_ptr_limit)
- {
- int i;
-
- src = scr_ptr;
- dst = scraddr;
-
- /* skip non updated pixels for this line */
- for (i=0; i < x; i++)
- ADVANCE_PARTIAL(dst, pixelstep);
-
- while(src < src_limit)
- {
- *dst = ((*dst)&~bitmask)|(pal[*src]<<bitshift);
- ADVANCE_PARTIAL(dst, pixelstep);
- src += 2;
- }
-
- scraddr += linestep;
-
- scr_ptr += (pitch ? 2 * pitch : 2 * width);
- src_limit += (pitch ? 2 * pitch : 2 * width);
- }
- }
- }
- else
-
- if(skipmask != 0xffffffff)
- {
- if(pixelstep > 0)
- {
- bitshift = 8-gxdp.cBPP;
- bitmask = ((1<<gxdp.cBPP)-1)<<bitshift;
-
- while(scr_ptr < scr_ptr_limit)
- {
- int i;
-
- src = scr_ptr;
- dst = scraddr;
- dst -= (linestep-pixelstep);
-
- /* skip non updated pixels for this line */
- for (i=0; i < x; i++)
- ADVANCE_REV_PARTIAL(dst, pixelstep);
-
- while(src < src_limit)
- {
- if((long)src & skipmask)
- {
- if (!own_palette)
- *dst = ((*dst)&~bitmask)|(pal[*src]<<bitshift);
- else
- *dst = ((*dst)&~bitmask)|(COLORCONVMONO(
- own_palette[3 * *src],
- own_palette[(3 * *src) + 1],
- own_palette[(3 * *src) + 2]) << bitshift);
- ADVANCE_REV_PARTIAL(dst, pixelstep);
- }
- src ++;
- }
-
- scraddr += linestep;
-
- scr_ptr += (pitch ? pitch : width);
- src_limit += (pitch ? pitch : width);
- }
- }
- else
- {
- bitshift = 0;
- bitmask = (1<<gxdp.cBPP)-1;
-
- while(scr_ptr < scr_ptr_limit)
- {
- int i;
-
- src = scr_ptr;
- dst = scraddr;
-
- /* skip non updated pixels for this line */
- for (i=0; i < x; i++)
- ADVANCE_PARTIAL(dst, pixelstep);
-
- while(src < src_limit)
- {
- if((long)src & skipmask)
- {
- if (!own_palette)
- *dst = ((*dst)&~bitmask)|(pal[*src]<<bitshift);
- else
- *dst = ((*dst)&~bitmask)|(COLORCONVMONO(
- own_palette[3 * *src],
- own_palette[(3 * *src) + 1],
- own_palette[(3 * *src) + 2]) << bitshift);
- ADVANCE_PARTIAL(dst, pixelstep);
- }
- src ++;
- }
-
- scraddr += linestep;
-
- scr_ptr += (pitch ? pitch : width);
- src_limit += (pitch ? pitch : width);
- }
- }
- }
- else
- {
- if(pixelstep > 0)
- {
- bitshift = 8-gxdp.cBPP;
- bitmask = ((1<<gxdp.cBPP)-1)<<bitshift;
-
- while(scr_ptr < scr_ptr_limit)
- {
- int i;
-
- src = scr_ptr;
- dst = scraddr;
- dst -= (linestep-pixelstep);
-
- /* skip non updated pixels for this line */
- for (i=0; i < x; i++)
- ADVANCE_REV_PARTIAL(dst, pixelstep);
-
- while(src < src_limit)
- {
- if (!own_palette)
- *dst = ((*dst)&~bitmask)|(pal[*src]<<bitshift);
- else
- *dst = ((*dst)&~bitmask)|(COLORCONVMONO(
- own_palette[3 * *src],
- own_palette[(3 * *src) + 1],
- own_palette[(3 * *src) + 2]) << bitshift);
- ADVANCE_REV_PARTIAL(dst, pixelstep);
- src ++;
- }
-
- scraddr += linestep;
-
- scr_ptr += (pitch ? pitch : width);
- src_limit += (pitch ? pitch : width);
- }
- }
- else
- {
- bitshift = 0;
- bitmask = (1<<gxdp.cBPP)-1;
-
- while(scr_ptr < scr_ptr_limit)
- {
- int i;
-
- src = scr_ptr;
- dst = scraddr;
-
- /* skip non updated pixels for this line */
- for (i=0; i < x; i++)
- ADVANCE_PARTIAL(dst, pixelstep);
-
-
- while(src < src_limit)
- {
- if (!own_palette)
- *dst = ((*dst)&~bitmask)|(pal[*src]<<bitshift);
- else
- *dst = ((*dst)&~bitmask)|(COLORCONVMONO(
- own_palette[3 * *src],
- own_palette[(3 * *src) + 1],
- own_palette[(3 * *src) + 2]) << bitshift);
- ADVANCE_PARTIAL(dst, pixelstep);
- src ++;
- }
-
- scraddr += linestep;
-
- scr_ptr += (pitch ? pitch : width);
- src_limit += (pitch ? pitch : width);
- }
- }
- }
- }
- }
- if (!useCache)
- dynamicGXEndDraw();
-}
-
-/* *************************** PALETTED DISPLAY ********************************* */
-
-void palette_Set_565(INT16 *buffer_param, int pitch, int x, int y, int width, int height) {
-
- static UBYTE *scraddr;
- static UBYTE *dst;
- static long pixelstep;
- static long linestep;
- static long skipmask;
- static unsigned char *color_match_2;
- static UINT16 *buffer;
-
- buffer = (UINT16*)buffer_param;
-
- scraddr = (UBYTE*)dynamicGXBeginDraw();
-
- pixelstep = geom[useMode].pixelstep;
- linestep = geom[useMode].linestep;
- skipmask = geom[useMode].xSkipMask;
-
- color_match_2 = (unsigned char*)malloc(0xffff);
- if (color_match_2)
- memset(color_match_2, 0xff, 0xffff);
-
-
- if(scraddr)
- {
- int lines = 0;
- int current = 0;
-
- scraddr += geom[useMode].startoffset;
- scraddr += y * linestep;
-
- while(lines != height)
- {
- int i;
- current = 0;
-
- dst = scraddr;
-
- /* skip non updated pixels for this line */
- for (i=0; i < x; i++)
- dst += pixelstep;
-
- /* Turtle warning !!! */
-
- for (i=0; i<width; i++) {
- if (skipmask == 0xffffffff || (long)i & skipmask) {
- if (color_match_2) {
- if (color_match_2[*(buffer + i)] == 255)
- color_match_2[*(buffer + i)] = best_match(
- RED_FROM_565(*(buffer + i)),
- GREEN_FROM_565(*(buffer + i)),
- BLUE_FROM_565(*(buffer + i)), 236) + 10;
- *dst = color_match_2[*(buffer + i)];
- }
- else {
- *dst = best_match(
- RED_FROM_565(*(buffer + i)),
- GREEN_FROM_565(*(buffer + i)),
- BLUE_FROM_565(*(buffer + i)), 236) + 10;
- }
- dst += pixelstep;
- }
- }
-
- buffer += pitch;
- scraddr += linestep;
- lines++;
- }
- }
-
- if (color_match_2)
- free(color_match_2);
- dynamicGXEndDraw();
-}
-
-
-void palette_Blt(UBYTE *src_ptr) {
- palette_Blt_part(src_ptr, 0, 0, _geometry_w, _geometry_h, NULL, 0);
-}
-
-void palette_Blt_part(UBYTE * scr_ptr,int x, int y, int width, int height,
- UBYTE * own_palette, int pitch, BOOL useCache)
-{
- static UBYTE *src;
- static UBYTE *dst;
- static UBYTE *scraddr;
- static UBYTE *scr_ptr_limit;
- static UBYTE *src_limit;
- static long pixelstep;
- static long linestep;
- static long skipmask;
-
-// Special code is used to deal with packed pixels in monochrome mode
- static UBYTE bitmask;
- static int bitshift;
-
- if(!active)
- {
- Sleep(100);
- return;
- }
-
- /* Update screen mode, also thread protection by doing this */
- if(useMode != currentScreenMode)
- {
- useMode = currentScreenMode;
- pCls();
- }
-
- pixelstep = geom[useMode].pixelstep;
- linestep = geom[useMode].linestep;
- skipmask = geom[useMode].xSkipMask;
-
- if (!useCache)
- scraddr = (UBYTE*)dynamicGXBeginDraw();
- else
- scraddr = displayCache;
-
- if(scraddr)
- {
-
- scraddr += geom[useMode].startoffset;
- scr_ptr += geom[useMode].sourceoffset;
- //scr_ptr_limit = scr_ptr + geom[useMode].lineLimit;
- //src_limit = scr_ptr + geom[useMode].xLimit;
-
- /* Update offsets to the current line */
- scraddr += y * linestep;
- scr_ptr_limit = scr_ptr + (pitch ? pitch : width) * height;
- src_limit = scr_ptr + width;
-
- /*
- if (scr_ptr_limit > scr_ptr + geom[useMode].lineLimit)
- scr_ptr_limit = scr_ptr + geom[useMode].lineLimit;
- */
-
- /* CMI rendering */
- if (high_res && !own_palette && !extra_wide_screen) {
- while(scr_ptr < scr_ptr_limit)
- {
- int i;
-
- src = scr_ptr;
- dst = scraddr;
-
- /* skip non updated pixels for this line */
- for (i=0; i < x; i++)
- dst += pixelstep;
-
- while(src < src_limit)
- {
- if (*src < 236)
- *dst = *src + 10;
- else
- *dst = staticTranslate[*src-236];
-
- dst += pixelstep;
-
- src += 2;
- }
- scraddr += linestep;
- scr_ptr += (pitch ? 2 * pitch : 2 * width);
- src_limit += (pitch ? 2 * pitch : 2 * width);
- }
- }
- else
- /* Internal pixel loops */
- if(skipmask != 0xffffffff)
- {
- while(scr_ptr < scr_ptr_limit)
- {
- int i;
-
- src = scr_ptr;
- dst = scraddr;
-
- /* skip non updated pixels for this line */
- for (i=0; i < x; i++)
- dst += pixelstep;
-
- while(src < src_limit)
- {
- if((long)src & skipmask)
- {
- if (!own_palette) {
- if (*src < 236)
- *dst = *src + 10;
- else
- *dst = staticTranslate[*src-236];
- } else {
- // Turtle warning !!!
- if (color_match[*src] == 255)
- color_match[*src] =
- best_match(own_palette[(3 * *src)],
- own_palette[(3 * *src) + 1],
- own_palette[(3 * *src) + 2], 236) + 10;
- *dst = color_match[*src];
- }
- dst += pixelstep;
- }
- src ++;
- }
- scraddr += linestep;
- scr_ptr += (pitch ? pitch : width);
- src_limit += (pitch ? pitch : width);
- }
- }
- else
- {
- while(scr_ptr < scr_ptr_limit)
- {
- int i;
-
- src = scr_ptr;
- dst = scraddr;
-
- /* skip non updated pixels for this line */
- for (i=0; i < x; i++)
- dst += pixelstep;
-
-
- while(src < src_limit)
- {
- if (!own_palette) {
- if (*src < 236)
- *dst = *src + 10;
- else
- *dst = staticTranslate[*src-236];
- }
- else {
- // Turtle warning !!!
- if (color_match[*src] == 255)
- color_match[*src] =
- best_match(own_palette[(3 * *src)],
- own_palette[(3 * *src) + 1],
- own_palette[(3 * *src) + 2], 236) + 10;
- *dst = color_match[*src];
- }
- dst += pixelstep;
- src ++;
- }
- scraddr += linestep;
- scr_ptr += (pitch ? pitch : width);
- src_limit += (pitch ? pitch : width);
- }
- }
- if (!useCache)
- dynamicGXEndDraw();
- }
-}
-
-/* ********************************* 555 DISPLAY ********************************* */
-
-void hicolor555_Set_565(INT16 *buffer, int pitch, int x, int y, int width, int height) {
-
- static UBYTE *scraddr;
- static UBYTE *dst;
- static long pixelstep;
- static long linestep;
- static long skipmask;
-
- scraddr = (UBYTE*)dynamicGXBeginDraw();
-
- pixelstep = geom[useMode].pixelstep;
- linestep = geom[useMode].linestep;
- skipmask = geom[useMode].xSkipMask;
-
- if(scraddr)
- {
- int lines = 0;
- int current = 0;
-
- scraddr += geom[useMode].startoffset;
- scraddr += y * linestep;
-
- while(lines != height)
- {
- int i;
- current = 0;
-
- dst = scraddr;
-
- /* skip non updated pixels for this line */
- for (i=0; i < x; i++)
- dst += pixelstep;
-
- /* Turtle warning !!! */
-
- for (i=0; i<width; i++) {
- if (skipmask == 0xffffffff || (long)i & skipmask) {
-
- *(unsigned short*)dst = COLORCONV555(
- RED_FROM_565(*(buffer + i)), GREEN_FROM_565(*(buffer + i)), BLUE_FROM_565(*(buffer + i))
- );
- dst += pixelstep;
- }
- }
-
- buffer += pitch;
- scraddr += linestep;
- lines++;
- }
- }
-
- dynamicGXEndDraw();
-}
-
-
-void hicolor555_Blt(UBYTE *src_ptr) {
- hicolor555_Blt_part(src_ptr, 0, 0, _geometry_w, _geometry_h, NULL, 0);
-}
-
-
-void hicolor555_Blt_part(UBYTE * scr_ptr,int x, int y, int width, int height,
- UBYTE * own_palette, int pitch, BOOL useCache)
-{
- static UBYTE *src;
- static UBYTE *dst;
- static UBYTE *scraddr;
- static UBYTE *scr_ptr_limit;
- static UBYTE *src_limit;
- static long pixelstep;
- static long linestep;
- static long skipmask;
-
- if(!active)
- {
- Sleep(100);
- return;
- }
-
- /* Update screen mode, also thread protection by doing this */
- if(useMode != currentScreenMode)
- {
- useMode = currentScreenMode;
- pCls();
- }
-
- pixelstep = geom[useMode].pixelstep;
- linestep = geom[useMode].linestep;
- skipmask = geom[useMode].xSkipMask;
-
- if (!useCache)
- scraddr = (UBYTE*)dynamicGXBeginDraw();
- else
- scraddr = displayCache;
-
- if(scraddr)
- {
-
- scraddr += geom[useMode].startoffset;
- scr_ptr += geom[useMode].sourceoffset;
- //scr_ptr_limit = scr_ptr + geom[useMode].lineLimit;
- //src_limit = scr_ptr + geom[useMode].xLimit;
-
- /* Update offsets to the current line */
- scraddr += y * linestep;
- scr_ptr_limit = scr_ptr + (pitch ? pitch : width) * height;
-
- /*
- if (scr_ptr_limit > scr_ptr + geom[useMode].lineLimit)
- scr_ptr_limit = scr_ptr + geom[useMode].lineLimit;
- */
-
- src_limit = scr_ptr + width;
-
- /* CMI rendering */
- if (high_res && !own_palette && !extra_wide_screen) {
-
- while(scr_ptr < scr_ptr_limit)
- {
- int i;
-
- src = scr_ptr;
- dst = scraddr;
-
- /* skip non updated pixels for this line */
- for (i=0; i < x; i++)
- dst += pixelstep;
-
- while(src < src_limit)
- {
- UBYTE r, g, b;
-
- /*
- r = (3*palRed[*(src+0)] + palRed[*(src+1)])>>2;
- g = (3*palGreen[*(src+0)] + palGreen[*(src+1)])>>2;
- b = (3*palBlue[*(src+0)] + palBlue[*(src+1)])>>2;
- */
-
- r = (2*palRed[*(src + 0)] + palRed[*(src + (pitch ? pitch : width) + 0)] + palRed[*(src + 1)]) >> 2;
- g = (2*palGreen[*(src + 0)] + palGreen[*(src + (pitch ? pitch : width) + 0)] + palGreen[*(src + 1)]) >> 2;
- b = (2*palBlue[*(src + 0)] + palBlue[*(src + (pitch ? pitch : width) + 0)] + palBlue[*(src + 1)]) >> 2;
-
-
- *(unsigned short*)dst = COLORCONV555(r,g,b);
-
- dst += pixelstep;
-
- src += 2;
- }
-
- scraddr += linestep;
- scr_ptr += (pitch ? 2 * pitch : 2 * width);
- src_limit += (pitch ? 2 * pitch : 2 * width);
- }
- }
- else
- /* Internal pixel loops */
- if(skipmask == 3 && smooth_filter)
- {
- while(scr_ptr < scr_ptr_limit)
- {
- int i;
-
- src = scr_ptr;
- dst = scraddr;
-
- /* skip non updated pixels for this line */
- for (i=0; i < x; i++)
- dst += pixelstep;
-
- while(src < src_limit)
- {
- UBYTE r, g, b;
- if (!own_palette) {
- r = (3*palRed[*(src+0)] + palRed[*(src+1)])>>2;
- g = (3*palGreen[*(src+0)] + palGreen[*(src+1)])>>2;
- b = (3*palBlue[*(src+0)] + palBlue[*(src+1)])>>2;
- } else {
- r = (3 * own_palette[3 * *(src + 0)] +
- own_palette[3 * *(src + 1)]) >> 2;
- g = (3 * own_palette[3 * *(src + 0) + 1] +
- own_palette[3 * *(src + 1) + 1]) >> 2;
- b = (3 * own_palette[3 * *(src + 0) + 2] +
- own_palette[3 * *(src + 1) + 2]) >> 2;
- }
-
- *(unsigned short*)dst = COLORCONV555(r,g,b);
-
- dst += pixelstep;
-
- if (!own_palette) {
- r = (palRed[*(src+1)] + palRed[*(src+2)])>>1;
- g = (palGreen[*(src+1)] + palGreen[*(src+2)])>>1;
- b = (palBlue[*(src+1)] + palBlue[*(src+2)])>>1;
- }
- else {
- r = (own_palette[3 * *(src + 1)] +
- own_palette[3 * *(src + 2)]) >> 2;
- g = (own_palette[3 * *(src + 1) + 1] +
- own_palette[3 * *(src + 2) + 1]) >> 2;
- b = (own_palette[3 * *(src + 1) + 2] +
- own_palette[3 * *(src + 2) + 2]) >> 2;
- }
-
- *(unsigned short*)dst = COLORCONV555(r,g,b);
-
- dst += pixelstep;
-
- if (!own_palette) {
- r = (palRed[*(src+2)] + 3*palRed[*(src+3)])>>2;
- g = (palGreen[*(src+2)] + 3*palGreen[*(src+3)])>>2;
- b = (palBlue[*(src+2)] + 3*palBlue[*(src+3)])>>2;
- }
- else {
- r = (own_palette[3 * *(src + 2)] +
- 3 * own_palette[3 * *(src + 3)]) >> 2;
- g = (own_palette[3 * *(src + 2) + 1] +
- 3 * own_palette[3 * *(src + 3) + 1]) >> 2;
- b = (own_palette[3 * *(src + 2) + 2] +
- 3 * own_palette[3 * *(src + 3) + 2]) >> 2;
-
- }
-
- *(unsigned short*)dst = COLORCONV555(r,g,b);
-
- dst += pixelstep;
-
- src += 4;
- }
- scraddr += linestep;
- scr_ptr += (pitch ? pitch : width);
- src_limit += (pitch ? pitch : width);
- }
- }
- else if(skipmask != 0xffffffff)
- {
- while(scr_ptr < scr_ptr_limit)
- {
- int i;
-
- src = scr_ptr;
- dst = scraddr;
-
- /* skip non updated pixels for this line */
- for (i=0; i < x; i++)
- dst += pixelstep;
-
-
- while(src < src_limit)
- {
- if((long)src & skipmask)
- {
- if (!own_palette)
- *(unsigned short*)dst = pal[*src];
- else
- *(unsigned short*)dst =
- COLORCONV555(own_palette[3 * *src],
- own_palette[(3 * *src) + 1],
- own_palette[(3 * *src) + 2]);
- dst += pixelstep;
- }
- src ++;
- }
- scraddr += linestep;
- scr_ptr += (pitch ? pitch : width);
- src_limit += (pitch ? pitch : width);
- }
- }
- else
- {
- while(scr_ptr < scr_ptr_limit)
- {
- int i;
-
- src = scr_ptr;
- dst = scraddr;
-
- /* skip non updated pixels for this line */
- for (i=0; i < x; i++)
- dst += pixelstep;
-
-
- while(src < src_limit)
- {
- if (!own_palette)
- *(unsigned short*)dst = pal[*src];
- else
- *(unsigned short*)dst =
- COLORCONV555(own_palette[3 * *src],
- own_palette[(3 * *src) + 1],
- own_palette[(3 * *src) + 2]);
- dst += pixelstep;
- src ++;
- }
-
- scraddr += linestep;
- scr_ptr += (pitch ? pitch : width);
- src_limit += (pitch ? pitch : width);
- }
- }
-
- if (!useCache)
- dynamicGXEndDraw();
- }
-}
-
-/* ********************************* 565 DISPLAY ********************************* */
-
-
-void hicolor565_Blt(UBYTE *src_ptr) {
- hicolor565_Blt_part(src_ptr, 0, 0, _geometry_w, _geometry_h, NULL, 0);
-}
-
-
-void hicolor565_Set_565(INT16 *buffer, int pitch, int x, int y, int width, int height) {
-
- static UBYTE *scraddr;
- static UBYTE *dst;
- static long pixelstep;
- static long linestep;
- static long skipmask;
-
- scraddr = (UBYTE*)dynamicGXBeginDraw();
-
- pixelstep = geom[useMode].pixelstep;
- linestep = geom[useMode].linestep;
- skipmask = geom[useMode].xSkipMask;
-
- if(scraddr)
- {
- int lines = 0;
- int current = 0;
-
- scraddr += geom[useMode].startoffset;
- scraddr += y * linestep;
-
- if (smartphone) {
- while(lines != height)
- {
- int i;
- current = 0;
-
- dst = scraddr;
-
- /* skip non updated pixels for this line */
-
- dst += x * pixelstep;
-
- for (i=0; i<width; i+=3) {
-
- register UBYTE r,g,b;
-
- register currentRed = RED_FROM_565(buffer[i]);
- register currentGreen = GREEN_FROM_565(buffer[i]);
- register currentBlue = BLUE_FROM_565(buffer[i]);
- register currentRed1 = RED_FROM_565(buffer[i+1]);
- register currentGreen1 = GREEN_FROM_565(buffer[i+1]);
- register currentBlue1 = BLUE_FROM_565(buffer[i+1]);
- register currentRed2 = RED_FROM_565(buffer[i+2]);
- register currentGreen2 = GREEN_FROM_565(buffer[i+2]);
- register currentBlue2 = BLUE_FROM_565(buffer[i+2]);
-
-
- r = (3 * currentRed + currentRed1)>>2;
- g = (3 * currentGreen + currentGreen1)>>2;
- b = (3 * currentBlue + currentBlue1)>>2;
-
- *(unsigned short*)dst = COLORCONV565(r, g, b);
- dst += pixelstep;
-
- r = (currentRed1 + currentRed2)>>1;
- g = (currentGreen1 + currentGreen2)>>1;
- b = (currentBlue1 + currentBlue2)>>1;
-
- *(unsigned short*)dst = COLORCONV565(r, g, b);
- dst += pixelstep;
- }
-
- buffer += pitch;
- scraddr += linestep;
- lines++;
- if (lines != 0 && !(lines % 7)) {
- lines++;
- buffer += pitch;
- }
- }
-
- }
- else {
-
- while(lines != height)
- {
- int i;
- current = 0;
-
- dst = scraddr;
-
-
- /* skip non updated pixels for this line */
-
- dst += x * pixelstep;
-
- for (i=0; i<width; i++) {
- if (skipmask == 0xffffffff || (long)i & skipmask) {
- *(unsigned short*)dst = buffer[i];
- dst += pixelstep;
- }
- }
- //memcpy(dst, buffer, width * 2);
-
- buffer += pitch;
- scraddr += linestep;
- lines++;
- }
- }
-
- }
-
- dynamicGXEndDraw();
-}
-
-int getColor565 (int color) {
- return COLORCONV565(palRed[color], palGreen[color], palBlue[color]);
-}
-
-void hicolor565_Blt_part(UBYTE * scr_ptr, int x, int y, int width, int height,
- UBYTE * own_palette, int pitch, BOOL useCache)
-{
- static UBYTE *src;
- static UBYTE *dst;
- static UBYTE *scraddr;
- static UBYTE *scr_ptr_limit;
- static UBYTE *src_limit;
- static long pixelstep;
- static long linestep;
- static long skipmask;
-
- if(!active)
- {
- Sleep(100);
- return;
- }
-
- /* Update screen mode, also thread protection by doing this */
- if(useMode != currentScreenMode)
- {
- useMode = currentScreenMode;
- pCls();
- }
-
- pixelstep = geom[useMode].pixelstep;
- linestep = geom[useMode].linestep;
- skipmask = geom[useMode].xSkipMask;
-
- if (!useCache)
- scraddr = (UBYTE*)dynamicGXBeginDraw();
- else
- scraddr = displayCache;
-
- if(scraddr)
- {
-
- scraddr += geom[useMode].startoffset;
- scr_ptr += geom[useMode].sourceoffset;
- //scr_ptr_limit = scr_ptr + geom[useMode].lineLimit;
- //src_limit = scr_ptr + geom[useMode].xLimit;
-
- /* Update offsets to the current line */
- scraddr += y * linestep;
- scr_ptr_limit = scr_ptr + (pitch ? pitch : width) * height;
-
- /*
- if (scr_ptr_limit > scr_ptr + geom[useMode].lineLimit)
- scr_ptr_limit = scr_ptr + geom[useMode].lineLimit;
- */
-
- src_limit = scr_ptr + width;
-
- /* CMI rendering */
- if (high_res && !own_palette && !extra_wide_screen) {
-
- while(scr_ptr < scr_ptr_limit)
- {
- int i;
-
- src = scr_ptr;
- dst = scraddr;
-
- /* skip non updated pixels for this line */
- for (i=0; i < x; i++)
- dst += pixelstep;
-
- while(src < src_limit)
- {
- UBYTE r, g, b;
-
- UBYTE *index1;
- UBYTE *index2;
- UBYTE *index3;
- UBYTE *index4;
-
- /*
- r = (3*palRed[*(src+0)] + palRed[*(src+1)])>>2;
- g = (3*palGreen[*(src+0)] + palGreen[*(src+1)])>>2;
- b = (3*palBlue[*(src+0)] + palBlue[*(src+1)])>>2;
- */
-
- r = (2*palRed[*(src + 0)] + palRed[*(src + (pitch ? pitch : width) + 0)] + palRed[*(src + 1)]) >> 2;
- g = (2*palGreen[*(src + 0)] + palGreen[*(src + (pitch ? pitch : width) + 0)] + palGreen[*(src + 1)]) >> 2;
- b = (2*palBlue[*(src + 0)] + palBlue[*(src + (pitch ? pitch : width) + 0)] + palBlue[*(src + 1)]) >> 2;
-
- *(unsigned short*)dst = COLORCONV565(r,g,b);
-
- dst += pixelstep;
-
- src += 2;
- }
-
- scraddr += linestep;
- scr_ptr += (pitch ? 2 * pitch : 2 * width);
- src_limit += (pitch ? 2 * pitch : 2 * width);
- }
-
- }
- else
- /* Special Smartphone implementation */
- /* Landscape mode, 2/3 X, 7/8 Y */
- if (smartphone && own_palette) {
- int line = 0;
- int toskip = 0;
-
- while(scr_ptr < scr_ptr_limit)
- {
- //int i;
-
- src = scr_ptr;
- dst = scraddr;
-
- /* skip non updated pixels for this line */
- //for (i=0; i < x; i++)
- dst += x * pixelstep;
-
-
- while(src < src_limit)
- {
- UBYTE r, g, b;
- register first = 3 * *(src + 0);
- register second = 3 * *(src + 1);
- register third = 3 * *(src + 2);
-
- r = (3 * own_palette[first] +
- own_palette[second]) >> 2;
- g = (3 * own_palette[first + 1] +
- own_palette[second + 1]) >> 2;
- b = (3 * own_palette[first + 2] +
- own_palette[second + 2]) >> 2;
-
- *(unsigned short*)dst = COLORCONV565(r,g,b);
-
- dst += pixelstep;
-
- r = (own_palette[second] +
- own_palette[third]) >> 1;
- g = (own_palette[second + 1] +
- own_palette[third + 1]) >> 1;
- b = (own_palette[second + 2] +
- own_palette[third + 2]) >> 1;
-
- *(unsigned short*)dst = COLORCONV565(r,g,b);
-
- dst += pixelstep;
-
- src += 3;
- }
-
- scraddr += linestep;
- scr_ptr += (pitch ? pitch : width);
- src_limit += (pitch ? pitch : width);
-
-
- line++;
- if (line == 7) {
- scr_ptr += (pitch ? pitch : width);
- src_limit += (pitch ? pitch : width);
- line = 0;
- }
- }
- }
- else
- if (smartphone && !own_palette) {
- int line = 0;
- int toskip = 0;
-
- while(scr_ptr < scr_ptr_limit)
- {
- //int i;
-
- src = scr_ptr;
- dst = scraddr;
-
- /* skip non updated pixels for this line */
- //for (i=0; i < x; i++)
- dst += x * pixelstep;
-
-
- while(src < src_limit)
- {
- UBYTE r, g, b;
- register first = *(src + 0);
- register second = *(src + 1);
- register third = *(src + 2);
-
- if (line != 6) {
- r = (3*palRed[first] + palRed[second])>>2;
- g = (3*palGreen[first] + palGreen[second])>>2;
- b = (3*palBlue[first] + palBlue[second])>>2;
- }
- else {
- r = (2*palRed[first] + palRed[*(src + (pitch ? pitch : width) + 0)] + palRed[second]) >> 2;
- g = (2*palGreen[first] + palGreen[*(src + (pitch ? pitch : width) + 0)] + palGreen[second]) >> 2;
- b = (2*palBlue[first] + palBlue[*(src + (pitch ? pitch : width) + 0)] + palBlue[second]) >> 2;
- }
-
- *(unsigned short*)dst = COLORCONV565(r,g,b);
-
-
- dst += pixelstep;
-
- /*
- r = (palRed[second] + palRed[third])>>1;
- g = (palGreen[second] + palGreen[third])>>1;
- b = (palBlue[second] + palBlue[third])>>1;
-
- *(unsigned short*)dst = COLORCONV565(r,g,b);
-
- dst += pixelstep;
- */
-
- if (line != 6) {
- r = (3*palRed[second] + palRed[third])>>2;
- g = (3*palGreen[second] + palGreen[third])>>2;
- b = (3*palBlue[second] + palBlue[third])>>2;
- }
- else {
- r = (2*palRed[second] + palRed[*(src + 1 + (pitch ? pitch : width) + 0)] + palRed[third]) >> 2;
- g = (2*palGreen[second] + palGreen[*(src + 1 + (pitch ? pitch : width) + 0)] + palGreen[third]) >> 2;
- b = (2*palBlue[second] + palBlue[*(src + 1 + (pitch ? pitch : width) + 0)] + palBlue[third]) >> 2;
- }
-
- *(unsigned short*)dst = COLORCONV565(r,g,b);
-
- dst += pixelstep;
-
-
- src += 3;
- }
-
- scraddr += linestep;
- scr_ptr += (pitch ? pitch : width);
- src_limit += (pitch ? pitch : width);
-
-
- line++;
- if (line == 7) {
- scr_ptr += (pitch ? pitch : width);
- src_limit += (pitch ? pitch : width);
- line = 0;
- }
- }
- }
- else
- /* Internal pixel loops */
- if(skipmask == 3 && smooth_filter)
- {
- while(scr_ptr < scr_ptr_limit)
- {
- int i;
-
- src = scr_ptr;
- dst = scraddr;
-
- /* skip non updated pixels for this line */
- for (i=0; i < x; i++)
- dst += pixelstep;
-
- while(src < src_limit)
- {
- UBYTE r, g, b;
- if (!own_palette) {
- r = (3*palRed[*(src+0)] + palRed[*(src+1)])>>2;
- g = (3*palGreen[*(src+0)] + palGreen[*(src+1)])>>2;
- b = (3*palBlue[*(src+0)] + palBlue[*(src+1)])>>2;
- } else {
- r = (3 * own_palette[3 * *(src + 0)] +
- own_palette[3 * *(src + 1)]) >> 2;
- g = (3 * own_palette[3 * *(src + 0) + 1] +
- own_palette[3 * *(src + 1) + 1]) >> 2;
- b = (3 * own_palette[3 * *(src + 0) + 2] +
- own_palette[3 * *(src + 1) + 2]) >> 2;
- }
-
- *(unsigned short*)dst = COLORCONV565(r,g,b);
-
- dst += pixelstep;
-
- if (!own_palette) {
- r = (palRed[*(src+1)] + palRed[*(src+2)])>>1;
- g = (palGreen[*(src+1)] + palGreen[*(src+2)])>>1;
- b = (palBlue[*(src+1)] + palBlue[*(src+2)])>>1;
- }
- else {
- r = (own_palette[3 * *(src + 1)] +
- own_palette[3 * *(src + 2)]) >> 1;
- g = (own_palette[3 * *(src + 1) + 1] +
- own_palette[3 * *(src + 2) + 1]) >> 1;
- b = (own_palette[3 * *(src + 1) + 2] +
- own_palette[3 * *(src + 2) + 2]) >> 1;
- }
-
- *(unsigned short*)dst = COLORCONV565(r,g,b);
-
- dst += pixelstep;
-
- if (!own_palette) {
- r = (palRed[*(src+2)] + 3*palRed[*(src+3)])>>2;
- g = (palGreen[*(src+2)] + 3*palGreen[*(src+3)])>>2;
- b = (palBlue[*(src+2)] + 3*palBlue[*(src+3)])>>2;
- }
- else {
- r = (own_palette[3 * *(src + 2)] +
- 3 * own_palette[3 * *(src + 3)]) >> 2;
- g = (own_palette[3 * *(src + 2) + 1] +
- 3 * own_palette[3 * *(src + 3) + 1]) >> 2;
- b = (own_palette[3 * *(src + 2) + 2] +
- 3 * own_palette[3 * *(src + 3) + 2]) >> 2;
-
- }
-
- *(unsigned short*)dst = COLORCONV565(r,g,b);
-
- dst += pixelstep;
-
- src += 4;
- }
-
- scraddr += linestep;
- scr_ptr += (pitch ? pitch : width);
- src_limit += (pitch ? pitch : width);
- }
- }
- else if(skipmask != 0xffffffff)
- {
-
- int line = 0;
- int toskip = 0;
-
- while(scr_ptr < scr_ptr_limit)
- {
- int i;
-
- src = scr_ptr;
- dst = scraddr;
-
- /* skip non updated pixels for this line */
- for (i=0; i < x; i++)
- dst += pixelstep;
-
- while(src < src_limit)
- {
-
- if((long)src & skipmask)
- {
- if (!own_palette)
- *(unsigned short*)dst = pal[*src];
- else
- *(unsigned short*)dst =
- COLORCONV565(own_palette[3 * *src],
- own_palette[(3 * *src) + 1],
- own_palette[(3 * *src) + 2]);
- dst += pixelstep;
- }
-
- src ++;
- }
-
-
- scraddr += linestep;
- scr_ptr += (pitch ? pitch : width);
- src_limit += (pitch ? pitch : width);
- }
- }
- else
- {
- while(scr_ptr < scr_ptr_limit)
- {
- int i;
-
- src = scr_ptr;
- dst = scraddr;
-
- /* skip non updated pixels for this line */
- for (i=0; i < x; i++)
- dst += pixelstep;
-
- while(src < src_limit)
- {
- if (!own_palette)
- *(unsigned short*)dst = pal[*src];
- else
- *(unsigned short*)dst =
- COLORCONV565(own_palette[3 * *src],
- own_palette[(3 * *src) + 1],
- own_palette[(3 * *src) + 2]);
- dst += pixelstep;
- src ++;
- }
-
- scraddr += linestep;
- scr_ptr += (pitch ? pitch : width);
- src_limit += (pitch ? pitch : width);
- }
- }
-
- if (!useCache)
- dynamicGXEndDraw();
- }
-}
-
-/* ********************************* NO GAPI DISPLAY ********************************* */
-
-#ifndef NEW_GAPI_CODE
-
-void noGAPI_Cls() {
- HBITMAP old;
- RECT rc;
- HDC hdc = GetDC(hWndMain);
- HBITMAP hb;
-
- GetWindowRect(hWndMain, &rc);
- memset(noGAPI_video_buffer, 0x00, sizeof(noGAPI_video_buffer));
- if (currentScreenMode || wide_screen)
- hb = CreateBitmap(320, 240, 1, 16, noGAPI_video_buffer);
- else
- hb = CreateBitmap(240, 320, 1, 16, noGAPI_video_buffer);
- old = (HBITMAP)SelectObject(noGAPI_compat, hb);
- if (currentScreenMode || wide_screen)
- BitBlt(hdc, 0, 0, 320, 240, noGAPI_compat, 0, 0, SRCCOPY);
- else
- BitBlt(hdc, 0, 0, 240, 320, noGAPI_compat, 0, 0, SRCCOPY);
- SelectObject(noGAPI_compat, old);
- ReleaseDC(hWndMain, hdc);
- DeleteObject(hb);
-}
-
-void noGAPI_Blt(UBYTE *src_ptr) {
- noGAPI_Blt_part(src_ptr, 0, 0, _geometry_w, _geometry_h, NULL, 0);
-}
-
-void noGAPI_Set_565(INT16 *buffer, int pitch, int x, int y, int width, int height) {
- HBITMAP old;
- RECT rc;
- HDC hdc = GetDC(hWndMain);
- HBITMAP hb;
- UBYTE *work_buffer;
- int i;
- int j;
- //long skipmask;
-
- //skipmask = geom[useMode].xSkipMask;
-
-
- GetWindowRect(hWndMain, &rc);
-
- work_buffer = noGAPI_video_buffer;
- unsigned short *work_buffer_2 = (unsigned short*)work_buffer;
- if (currentScreenMode && !wide_screen) {
-
- for (i=0; i<width; i++) {
- for (j=0; j<height; j++) {
- work_buffer_2[i * height + j] =
- buffer[(pitch ? pitch : width) * j + (width - i)];
- }
- }
- }
- else {
- for (i=0; i<height; i++) {
- for (j=0; j<width; j++) {
- *(unsigned short*)work_buffer = buffer[(pitch ? pitch : width) * i + j];
- work_buffer += 2;
- }
- }
- }
-
- if (currentScreenMode && !wide_screen)
- hb = CreateBitmap(height, width, 1, 16, noGAPI_video_buffer);
- else
- hb = CreateBitmap(width, height, 1, 16, noGAPI_video_buffer);
- old = (HBITMAP)SelectObject(noGAPI_compat, hb);
- if (currentScreenMode && !wide_screen)
- BitBlt(hdc, y , 320 - (x + width), height, width, noGAPI_compat, 0, 0, SRCCOPY);
- else
- BitBlt(hdc, x, y, width, height, noGAPI_compat, 0, 0, SRCCOPY);
- SelectObject(noGAPI_compat, old);
- ReleaseDC(hWndMain, hdc);
- DeleteObject(hb);
-}
-
-void noGAPI_Blt_part(UBYTE * scr_ptr, int x, int y, int width, int height,
- UBYTE * own_palette, int pitch, BOOL useCache) {
- HBITMAP old;
- RECT rc;
- HDC hdc = GetDC(hWndMain);
- HBITMAP hb;
- UBYTE *work_buffer;
- int i;
- int j;
- //long skipmask;
-
- //skipmask = geom[useMode].xSkipMask;
-
-
- GetWindowRect(hWndMain, &rc);
-
- work_buffer = noGAPI_video_buffer;
- if (currentScreenMode && !wide_screen) {
- unsigned short *work_buffer_2 = (unsigned short*)work_buffer;
- for (i=0; i<width; i++)
- for (j=0; j<height; j++)
- if (!own_palette)
- work_buffer_2[i * height + j] =
- pal[scr_ptr[(pitch ? pitch : width) * j + (width - i)]];
- else
- work_buffer_2[i * height + j] =
- COLORCONV565(own_palette[3 * scr_ptr[(pitch ? pitch : width) * j + (width - i)]],
- own_palette[(3 * scr_ptr[(pitch ? pitch : width) * j + (width - i)]) + 1],
- own_palette[(3 * scr_ptr[(pitch ? pitch : width) * j + (width - i)]) + 2]);
- }
- else {
- for (i=0; i<height; i++) {
- for (j=0; j<width; j++) {
- if (!own_palette)
- *(unsigned short*)work_buffer =
- pal[scr_ptr[(pitch ? pitch : width) * i + j]];
- else
- *(unsigned short*)work_buffer =
- COLORCONV565(own_palette[3 * scr_ptr[(pitch ? pitch : width) * i + j]],
- own_palette[(3 * scr_ptr[(pitch ? pitch : width) * i + j]) + 1],
- own_palette[(3 * scr_ptr[(pitch ? pitch : width) * i + j]) + 2]);
-
- work_buffer += 2;
- }
- }
- }
-
- if (currentScreenMode && !wide_screen)
- hb = CreateBitmap(height, width, 1, 16, noGAPI_video_buffer);
- else
- hb = CreateBitmap(width, height, 1, 16, noGAPI_video_buffer);
- old = (HBITMAP)SelectObject(noGAPI_compat, hb);
- if (currentScreenMode && !wide_screen)
- BitBlt(hdc, y , 320 - (x + width), height, width, noGAPI_compat, 0, 0, SRCCOPY);
- else
- BitBlt(hdc, x, y, width, height, noGAPI_compat, 0, 0, SRCCOPY);
- SelectObject(noGAPI_compat, old);
- ReleaseDC(hWndMain, hdc);
- DeleteObject(hb);
-}
-
-#else
-
-void noGAPI_Cls() {
- HBITMAP old;
- RECT rc;
- HDC hdc = GetDC(hWndMain);
- HBITMAP hb;
-
- memset(noGAPI_buffer, 0x00, GetSystemMetrics(SM_CXSCREEN) * GetSystemMetrics(SM_CYSCREEN) * 3);
- BitBlt(hdc, 0, 0, GetSystemMetrics(SM_CXSCREEN), GetSystemMetrics(SM_CYSCREEN), noGAPI_compat, 0, 0, SRCCOPY);
- ReleaseDC(hWndMain, hdc);
-}
-
-void noGAPI_Blt(UBYTE *src_ptr) {
- noGAPI_Blt_part(src_ptr, 0, 0, _geometry_w, _geometry_h, NULL, 0);
-}
-
-void noGAPI_Set_565(INT16 *buffer, int pitch, int x, int y, int width, int height) {
- HBITMAP old;
- RECT rc;
- HDC hdc = GetDC(hWndMain);
- HBITMAP hb;
- UBYTE *workBuffer = noGAPI_buffer;
- INT16 *srcBuffer = buffer;
- UBYTE *tempBuffer;
- INT16 *tempSrcBuffer;
- int i;
- int j;
-
- int startOffset;
- int lineStep;
- int pixelStep;
-
- if (currentScreenMode && !wide_screen) {
- startOffset = (GetSystemMetrics(SM_CXSCREEN) * (GetSystemMetrics(SM_CYSCREEN) - 1)) * 3;
- lineStep = 3;
- pixelStep = -(GetSystemMetrics(SM_CXSCREEN) * 3);
- }
- else {
- startOffset = 0;
- lineStep = GetSystemMetrics(SM_CXSCREEN) * 3;
- pixelStep = 3;
- }
-
- workBuffer += startOffset;
- workBuffer += y * lineStep;
-
- for (i=0; i<height; i++) {
-
- tempBuffer = workBuffer;
- tempSrcBuffer = srcBuffer;
-
- tempBuffer += x * pixelStep;
-
- for (j=0; j<width; j++) {
- *tempBuffer = BLUE_FROM_565(*tempSrcBuffer);
- *(tempBuffer + 1) = GREEN_FROM_565(*tempSrcBuffer);
- *(tempBuffer + 2) = RED_FROM_565(*tempSrcBuffer);
- tempBuffer += pixelStep;
- tempSrcBuffer++;
- }
-
- workBuffer += lineStep;
- srcBuffer += (pitch ? pitch : width);
- }
-
-
- if (currentScreenMode && !wide_screen)
- BitBlt(hdc, y , 320 - (x + width), height, width, noGAPI_compat, y, 320 - (x + width), SRCCOPY);
- else
- BitBlt(hdc, x, y, width, height, noGAPI_compat, x, y, SRCCOPY);
-
- ReleaseDC(hWndMain, hdc);
-}
-
-void noGAPI_Blt_part(UBYTE * scr_ptr, int x, int y, int width, int height,
- UBYTE * own_palette, int pitch, BOOL useCache) {
- HDC hdc = GetDC(hWndMain);
- HBITMAP hb;
- UBYTE *workBuffer = noGAPI_buffer;
- UBYTE *srcBuffer = scr_ptr;
- UBYTE *tempBuffer;
- UBYTE *tempSrcBuffer;
- int i;
- int j;
- //long skipmask;
-
- int startOffset;
- int lineStep;
- int pixelStep;
-
- if (currentScreenMode && !wide_screen) {
- startOffset = (GetSystemMetrics(SM_CXSCREEN) * (GetSystemMetrics(SM_CYSCREEN) - 1)) * 3;
- lineStep = 3;
- pixelStep = -(GetSystemMetrics(SM_CXSCREEN) * 3);
- }
- else {
- startOffset = 0;
- lineStep = GetSystemMetrics(SM_CXSCREEN) * 3;
- pixelStep = 3;
- }
-
- if (high_res && !extra_wide_screen) {
- height /= 2;
- width /= 2;
- }
-
- workBuffer += startOffset;
- workBuffer += y * lineStep;
-
- for (i=0; i<height; i++) {
-
- tempBuffer = workBuffer;
- tempSrcBuffer = srcBuffer;
-
- tempBuffer += x * pixelStep;
-
- for (j=0; j<width; j++) {
- if (!own_palette) {
- if (high_res && !extra_wide_screen) {
- *tempBuffer = (3*palBlue[*tempSrcBuffer] + palBlue[*(tempSrcBuffer + 1)]) >> 2;
- *(tempBuffer + 1) = (3 * palGreen[*tempSrcBuffer] + palGreen[(*tempSrcBuffer + 1)]) >> 2;
- *(tempBuffer + 2) = (3 * palRed[*tempSrcBuffer] + palRed[*(tempSrcBuffer + 1)]) >> 2;
- tempBuffer += pixelStep;
- tempSrcBuffer += 2;
- }
- else {
- *tempBuffer = palBlue[*tempSrcBuffer];
- *(tempBuffer + 1) = palGreen[*tempSrcBuffer];
- *(tempBuffer + 2) = palRed[*tempSrcBuffer];
- tempBuffer += pixelStep;
- tempSrcBuffer++;
- }
-
- }
- else {
- *tempBuffer = own_palette[3 * *tempSrcBuffer + 2];
- *(tempBuffer + 1) = own_palette[3 * *tempSrcBuffer + 1];
- *(tempBuffer + 2) = own_palette[3 * *tempSrcBuffer];
- tempBuffer += pixelStep;
- tempSrcBuffer++;
- }
- }
-
- workBuffer += lineStep;
- if (high_res && !extra_wide_screen)
- srcBuffer += (pitch ? 2 * pitch : 2 * width);
- else
- srcBuffer += (pitch ? pitch : width);
- }
-
- if (currentScreenMode && !wide_screen)
- BitBlt(hdc, y , 320 - (x + width), height, width, noGAPI_compat, y, 320 - (x + width), SRCCOPY);
- else
- BitBlt(hdc, x, y, width, height, noGAPI_compat, x, y, SRCCOPY);
-
- ReleaseDC(hWndMain, hdc);
-}
-
-#endif
-
-/* ************************** STYLUS TRANSLATION ************************* */
-
-
-void Translate(int* px, int* py)
-{
- int x, y;
-
- if ((wide_screen && !high_res) || (wide_screen && extra_wide_screen && high_res))
- return;
-
- if (wide_screen && high_res) {
- if (!g_gui.isActive()) {
- *px = *px * 2;
- *py = *py * 2;
- }
- return;
- }
-
- if (high_res) {
- x = 320 - *py;
- y = *px;
- if (!g_gui.isActive()) {
- *px = x * 2;
- *py = y * 2;
- }
- else {
- *px = x;
- *py = y;
- }
- return;
- }
-
- switch(currentScreenMode)
- {
- case 0: /* portrait */
- *px = *px*4/3;
- break;
- case 1: /* landscape left */
- x = 320 - *py;
- y = *px;
- *px = x;
- *py = y;
- break;
- case 2: /* landscape right */
- x = *py;
- y = 240 - *px;
- *px = x;
- *py = y;
- break;
- }
-}
-
-/* ************************** LAUNCHER FONT STUFF ************************* */
-
-void printChar(const char str, int xx, int yy, int textcolor, int highlight, int width)
-{
- unsigned int buffer = 0, mask = 0, x, y;
- byte *tmp;
- byte *ptr;
-
- tmp = &textfont[0];
- tmp += 224 + (str + 1) * 8;
-
- ptr = decomp + (yy * width) + xx;
-
- for (y = 0; y < 8; y++) {
- for (x = 0; x < 8; x++) {
- unsigned char color;
- if ((mask >>= 1) == 0) {
- buffer = *tmp++;
- mask = 0x80;
- }
- color = ((buffer & mask) != 0);
- if (color)
- ptr[x] = textcolor;
- else if (highlight > 0)
- ptr[x] = highlight;
- }
- if (highlight > 0) {
- int i;
- for (i=9; i<width; i++)
- ptr[x] = highlight;
- }
- ptr += width;
- }
-
-}
-void printString(const char *str, int x, int y, int textcolor, int highlight, int width)
-{
- for (uint letter = 0; letter < strlen(str); letter++)
- printChar(str[letter], x + (letter * 8), y, textcolor, highlight, width);
-}
-
-#define MAX_CHARS_PER_LINE 29
-
-int drawString(const char *str, int x, int y, int textcolor, int highlight) {
- int current_y;
- unsigned int current_pos = 0;
- char substring[MAX_CHARS_PER_LINE + 1];
-
- current_y = y;
-
- while(current_pos < strlen(str)) {
- memset(decomp + (current_y * 320), 0, 320 * 8);
- memset(substring, 0, sizeof(substring));
- if (strlen(str + current_pos) > MAX_CHARS_PER_LINE)
- memcpy(substring, str + current_pos, MAX_CHARS_PER_LINE);
- else
- strcpy(substring, str + current_pos);
- printString(substring, x, current_y, textcolor, highlight, 320);
- pBlt_part(decomp + (current_y * 320), 0, current_y, 320, 8, item_startup_colors, 0);
- current_pos += MAX_CHARS_PER_LINE;
- current_y += 10;
- }
-
- return current_y;
-}
-
-/* ************************** DIRECT BLT IMPLEMENTATION ************************* */
-
-
-void Get_565(UBYTE *src, INT16 *buffer, int pitch, int x, int y, int width, int height) {
- int i,j;
- UBYTE *tempo = (UBYTE*)buffer;
-
- // Dumb conversion to 565
-
- if (!(high_res && !wide_screen)) {
- for (i=0; i<height; i++) {
- for (j=0; j<width; j++) {
- *buffer++ = COLORCONV565(palRed[*src], palGreen[*src], palBlue[*src]);
- src++;
- }
- }
- }
- else {
- UBYTE *current;
-
- for (i=0; i<height; i++) {
- current = src;
- for (j=0; j<width; j++) {
- *buffer++ = COLORCONV565(palRed[*current], palGreen[*current], palBlue[*current]);
- current += 2;
- }
- src += 2 * 640;
- }
- }
-}
-
-void Set_565(INT16 *buffer, int pitch, int x, int y, int width, int height) {
- pSet_565(buffer, pitch, x, y, width, height);
-}
-
-void NULL_Set_565(INT16 *buffer, int pitch, int x, int y, int width, int height) {
-}
-
-
-#endif