aboutsummaryrefslogtreecommitdiff
path: root/wince/screen.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'wince/screen.cpp')
-rw-r--r--wince/screen.cpp642
1 files changed, 521 insertions, 121 deletions
diff --git a/wince/screen.cpp b/wince/screen.cpp
index f7e88507e3..716fa848d0 100644
--- a/wince/screen.cpp
+++ b/wince/screen.cpp
@@ -28,12 +28,25 @@ static UBYTE invert = 0;
static int colorscale = 0;
extern UBYTE item_toolbar[];
+extern UBYTE item_toolbar_colors[];
+extern UBYTE item_toolbarPortrait[];
+extern UBYTE item_toolbarPortrait_colors[];
extern UBYTE item_keyboard[];
+extern UBYTE item_keyboard_colors[];
+extern UBYTE item_keyboardPortrait[];
+extern UBYTE item_keyboardPortrait_colors[];
extern UBYTE item_disk[];
+extern UBYTE item_disk_colors[];
extern UBYTE item_skip[];
-extern UBYTE item_set_sound_on[];
-extern UBYTE item_set_sound_off[];
-extern UBYTE item_options[];
+extern UBYTE item_skip_colors[];
+extern UBYTE item_soundOn[];
+extern UBYTE item_soundOn_colors[];
+extern UBYTE item_soundOff[];
+extern UBYTE item_soundOff_colors[];
+extern UBYTE item_monkeyLandscape[];
+extern UBYTE item_monkeyLandscape_colors[];
+extern UBYTE item_monkeyPortrait[];
+extern UBYTE item_monkeyPortrait_colors[];
extern bool sound_activated;
bool toolbar_drawn;
@@ -70,21 +83,27 @@ UBYTE *toolbar = NULL;
/* Using vectorized function to save on branches */
typedef void (*tCls)();
typedef void (*tBlt)(UBYTE*);
+typedef void (*tBlt_part)(UBYTE*,int, int, int, int, UBYTE*);
void mono_Cls();
void mono_Blt(UBYTE*);
+void mono_Blt_part(UBYTE*, int, int, int, int, UBYTE*);
void palette_Cls();
void palette_Blt(UBYTE*);
+void palette_Blt_part(UBYTE*, int, int, int, int, UBYTE*);
void hicolor_Cls();
void hicolor555_Blt(UBYTE*);
+void hicolor555_Blt_part(UBYTE*, int, int, int, int, UBYTE*);
void hicolor565_Blt(UBYTE*);
+void hicolor565_Blt_part(UBYTE*, int, int, int, int, UBYTE*);
void palette_update();
static tCls pCls = NULL;
static tBlt pBlt = NULL;
+static tBlt_part pBlt_part = NULL;
static int _geometry_w;
static int _geometry_h;
@@ -168,6 +187,7 @@ int GraphicsOn(HWND hWndMain_param)
{
pCls = hicolor_Cls;
pBlt = hicolor565_Blt;
+ pBlt_part = hicolor565_Blt_part;
filter_available = 1;
smooth_filter = 1;
toolbar_available = 1;
@@ -176,6 +196,7 @@ int GraphicsOn(HWND hWndMain_param)
{
pCls = hicolor_Cls;
pBlt = hicolor555_Blt;
+ pBlt_part = hicolor555_Blt_part;
filter_available = 1;
smooth_filter = 1;
toolbar_available = 1;
@@ -184,6 +205,7 @@ int GraphicsOn(HWND hWndMain_param)
{
pCls = mono_Cls;
pBlt = mono_Blt;
+ pBlt_part = mono_Blt_part;
if(gxdp.ffFormat & kfDirectInverted)
invert = (1<<gxdp.cBPP)-1;
@@ -192,14 +214,15 @@ int GraphicsOn(HWND hWndMain_param)
if(gxdp.cBPP >= 4)
filter_available = 1;
- toolbar_available = 0;
+ toolbar_available = 1;
}
else if(gxdp.ffFormat & kfPalette)
{
pCls = palette_Cls;
pBlt = palette_Blt;
+ pBlt_part = palette_Blt_part;
- toolbar_available = 0;
+ toolbar_available = 1;
}
@@ -416,7 +439,9 @@ void Cls()
}
int counter = 0;
-void drawToolbarItem(UBYTE* item, int dest_x, int dest_y, int width_item, int height_item) {
+/*
+void drawToolbarItem(UBYTE* palette, UBYTE* item, int dest_x, int dest_y, int width_item, int height_item) {
+
int x,y,z;
UBYTE* dst;
UBYTE *scraddr;
@@ -433,52 +458,88 @@ void drawToolbarItem(UBYTE* item, int dest_x, int dest_y, int width_item, int he
for (x=dest_x; x<dest_x + width_item; x++) {
if(gxdp.ffFormat & kfDirect565)
*(unsigned short*)dst =
- ((item[z]&0xf8)<<(11-3))|((item[z+1]&0xfc)<<(5-2))|((item[z+2]&0xf8)>>3);
- else if(gxdp.ffFormat & kfDirect555)
+ COLORCONV565(palette[item[z] * 3], palette[item[z] * 3 + 1], palette[item[z] * 3 + 2]);
+ else if(gxdp.ffFormat & kfDirect555)
+ *(unsigned short*)dst =
+ COLORCONV555(palette[item[z] * 3], palette[item[z] * 3 + 1], palette[item[z] * 3 + 2]);
+ else if((gxdp.ffFormat & kfDirect) && (gxdp.cBPP <= 8))
*(unsigned short*)dst =
- ((item[z]&0xf8)<<(10-3))|((item[z+1]&0xf8)<<(5-2))|((item[z+2]&0xf8)>>3);
+ COLORCONVMONO(palette[item[z] * 3], palette[item[z] * 3 + 1], palette[item[z] * 3 + 2]);
+
+
dst += geom[useMode].pixelstep;
- z += 3;
+ //z += 3;
+ z += 1;
}
scraddr += geom[useMode].linestep;
}
}
GXEndDraw();
}
+*/
void drawSoundItem(int x, int y) {
if (sound_activated)
- drawToolbarItem(item_set_sound_off, x, y, 32, 32);
+ pBlt_part(item_soundOn, x, y, 32, 32, item_soundOn_colors);
else
- drawToolbarItem(item_set_sound_on, x, y, 32, 32);
+ pBlt_part(item_soundOff, x, y, 32, 32, item_soundOff_colors);
}
+void drawWait() {
+ pBlt_part(item_toolbar, 0, 0, 320, 40, item_toolbar_colors);
+}
void drawAllToolbar() {
int x,y;
- if (draw_keyboard) {
- drawToolbarItem(item_keyboard, 0, 200, 320, 40);
+ if (currentScreenMode) {
+
+ if (draw_keyboard) {
+ pBlt_part(item_keyboard, 0, 200, 320, 40, item_keyboard_colors);
+ }
+ else {
+ pBlt_part(item_toolbar, 0, 200, 320, 40, item_toolbar_colors);
+ x = 10;
+ y = 204;
+ pBlt_part(item_disk, x, y, 32, 32, item_disk_colors);
+ x += 40;
+ pBlt_part(item_skip, x, y, 32, 32, item_skip_colors);
+ x += 40;
+ drawSoundItem(x, y);
+ x += 40;
+ pBlt_part(item_monkeyPortrait, x, y, 32, 32,
+ item_monkeyPortrait_colors);
+ }
}
else {
- drawToolbarItem(item_toolbar, 0, 200, 320, 40);
- x = 10;
- y = 204;
- drawToolbarItem(item_disk, x, y, 32, 32);
- x += 40;
- drawToolbarItem(item_skip, x, y, 32, 32);
- x += 40;
- drawSoundItem(x, y);
- x += 40;
- drawToolbarItem(item_options, x, y, 32, 32);
+ if (draw_keyboard) {
+ pBlt_part(item_keyboardPortrait, 0, 240, 320, 80,
+ item_keyboardPortrait_colors);
+ }
+ else {
+ pBlt_part(item_toolbarPortrait, 0, 240, 320, 80,
+ item_toolbarPortrait_colors);
+ /*drawToolbarItem(item_toolbarPortrait_colors, item_toolbarPortrait,
+ 0, 240, 240, 80);*/
+ x = 10;
+ y = 240;
+ pBlt_part(item_disk, x, y, 32, 32, item_disk_colors);
+ x += 40;
+ pBlt_part(item_skip, x, y, 32, 32, item_skip_colors);
+ x += 40;
+ drawSoundItem(x, y);
+ x += 40;
+ pBlt_part(item_monkeyLandscape, x, y, 32, 32,
+ item_monkeyLandscape_colors);
+ }
}
toolbar_drawn = true;
}
void redrawSoundItem() {
- drawSoundItem(10 + 40 + 40, 204);
+ drawSoundItem(10 + 40 + 40, (currentScreenMode ? 204 : 240));
}
bool isInBox(int x, int y, int x1, int y1, int x2, int y2) {
@@ -488,14 +549,16 @@ bool isInBox(int x, int y, int x1, int y1, int x2, int y2) {
ToolbarSelected getToolbarSelection (int x, int y) {
int test_x, test_y;
+ /*
if (!currentScreenMode)
return ToolbarNone;
+ */
if (!(x >= 10 && y >= 204))
return ToolbarNone;
test_x = 10;
- test_y = 204;
+ test_y = (currentScreenMode ? 204 : 240);
if (isInBox(x, y, test_x, test_y, test_x + 32, test_y + 32))
return ToolbarSaveLoad;
test_x += 40;
@@ -506,7 +569,7 @@ ToolbarSelected getToolbarSelection (int x, int y) {
return ToolbarSound;
test_x += 40;
if (isInBox(x, y, test_x, test_y, test_x + 32, test_y + 32))
- return ToolbarExit;
+ return ToolbarMode;
return ToolbarNone;
}
@@ -516,7 +579,8 @@ void Blt(UBYTE * scr_ptr)
{
pBlt(scr_ptr);
- if (toolbar_available && currentScreenMode && !toolbar_drawn)
+ //if (toolbar_available && currentScreenMode && !toolbar_drawn)
+ if (toolbar_available && !toolbar_drawn)
drawAllToolbar();
}
@@ -545,7 +609,13 @@ void Blt(UBYTE * scr_ptr)
bitmask >>= gxdp.cBPP;
-void mono_Blt(UBYTE * scr_ptr)
+void mono_Blt(UBYTE *src_ptr) {
+ mono_Blt_part(src_ptr, 0, 0, 320, 200, NULL);
+}
+
+
+void mono_Blt_part(UBYTE * scr_ptr, int x, int y, int width, int height,
+ UBYTE * own_palette)
{
// Mono blit routines contain good deal of voodoo
static UBYTE *src;
@@ -592,38 +662,83 @@ void mono_Blt(UBYTE * scr_ptr)
{
scraddr += geom[useMode].startoffset;
scr_ptr += geom[useMode].sourceoffset;
- scr_ptr_limit = scr_ptr + geom[useMode].lineLimit;
- src_limit = scr_ptr + geom[useMode].xLimit;
+ //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 + width * height;
+ src_limit = scr_ptr + width;
+
/* 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;
- 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;
+ 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;
- r = (palRed[*(src+1)] + palRed[*(src+2)])>>1;
- g = (palGreen[*(src+1)] + palGreen[*(src+2)])>>1;
- b = (palBlue[*(src+1)] + palBlue[*(src+2)])>>1;
+ 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;
- 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;
+ 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);
@@ -634,21 +749,34 @@ void mono_Blt(UBYTE * scr_ptr)
ADVANCE_PARTIAL(scraddr, linestep);
- scr_ptr += 320;
- src_limit += 320;
+ scr_ptr += width;
+ src_limit += 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)
{
- *dst = ((*dst)&~bitmask)|(pal[*src]<<bitshift);
+ 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 ++;
@@ -656,27 +784,40 @@ void mono_Blt(UBYTE * scr_ptr)
ADVANCE_PARTIAL(scraddr, linestep);
- scr_ptr += 320;
- src_limit += 320;
+ scr_ptr += width;
+ src_limit += 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)
{
- *dst = ((*dst)&~bitmask)|(pal[*src]<<bitshift);
+ 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 += 320;
- src_limit += 320;
+ scr_ptr += width;
+ src_limit += width;
}
}
}
@@ -691,8 +832,13 @@ void mono_Blt(UBYTE * scr_ptr)
scraddr += geom[useMode].startoffset;
scr_ptr += geom[useMode].sourceoffset;
- scr_ptr_limit = scr_ptr + geom[useMode].lineLimit;
- src_limit = scr_ptr + geom[useMode].xLimit;
+ //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 + width * height;
+ src_limit = scr_ptr + width;
if(skipmask != 0xffffffff)
{
@@ -703,14 +849,27 @@ void mono_Blt(UBYTE * scr_ptr)
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)
{
- *dst = ((*dst)&~bitmask)|(pal[*src]<<bitshift);
+ 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 ++;
@@ -718,8 +877,8 @@ void mono_Blt(UBYTE * scr_ptr)
scraddr += linestep;
- scr_ptr += 320;
- src_limit += 320;
+ scr_ptr += width;
+ src_limit += width;
}
}
else
@@ -729,13 +888,26 @@ void mono_Blt(UBYTE * scr_ptr)
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)
{
- *dst = ((*dst)&~bitmask)|(pal[*src]<<bitshift);
+ 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 ++;
@@ -743,8 +915,8 @@ void mono_Blt(UBYTE * scr_ptr)
scraddr += linestep;
- scr_ptr += 320;
- src_limit += 320;
+ scr_ptr += width;
+ src_limit += width;
}
}
}
@@ -757,20 +929,33 @@ void mono_Blt(UBYTE * scr_ptr)
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);
+ 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 += 320;
- src_limit += 320;
+ scr_ptr += width;
+ src_limit += width;
}
}
else
@@ -780,19 +965,33 @@ void mono_Blt(UBYTE * scr_ptr)
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);
+ 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 += 320;
- src_limit += 320;
+ scr_ptr += width;
+ src_limit += width;
}
}
}
@@ -801,7 +1000,12 @@ void mono_Blt(UBYTE * scr_ptr)
GXEndDraw();
}
-void palette_Blt(UBYTE * scr_ptr)
+void palette_Blt(UBYTE *src_ptr) {
+ palette_Blt_part(src_ptr, 0, 0, 320, 200, NULL);
+}
+
+void palette_Blt_part(UBYTE * scr_ptr,int x, int y, int width, int height,
+ UBYTE * own_palette)
{
static UBYTE *src;
static UBYTE *dst;
@@ -839,51 +1043,96 @@ void palette_Blt(UBYTE * scr_ptr)
scraddr += geom[useMode].startoffset;
scr_ptr += geom[useMode].sourceoffset;
- scr_ptr_limit = scr_ptr + geom[useMode].lineLimit;
- src_limit = scr_ptr + geom[useMode].xLimit;
+ //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 + width * height;
+ src_limit = scr_ptr + width;
/* 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 (*src < 236)
- *dst = *src + 10;
- else
- *dst = staticTranslate[*src-236];
+ if (!own_palette) {
+ if (*src < 236)
+ *dst = *src + 10;
+ else
+ *dst = staticTranslate[*src-236];
+ } else {
+ unsigned char color_match[500];
+ // Turtle warning !!!
+ memset(color_match, 255, sizeof(color_match));
+ 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 += 320;
- src_limit += 320;
+ scr_ptr += width;
+ src_limit += 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 (*src < 236)
- *dst = *src + 10;
- else
- *dst = staticTranslate[*src-236];
+ if (!own_palette) {
+ if (*src < 236)
+ *dst = *src + 10;
+ else
+ *dst = staticTranslate[*src-236];
+ }
+ else {
+ unsigned char color_match[500];
+ // Turtle warning !!!
+ memset(color_match, 255, sizeof(color_match));
+ 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 += 320;
- src_limit += 320;
+ scr_ptr += width;
+ src_limit += width;
}
}
@@ -891,7 +1140,13 @@ void palette_Blt(UBYTE * scr_ptr)
}
}
-void hicolor555_Blt(UBYTE * scr_ptr)
+void hicolor555_Blt(UBYTE *src_ptr) {
+ hicolor555_Blt_part(src_ptr, 0, 0, 320, 200, NULL);
+}
+
+
+void hicolor555_Blt_part(UBYTE * scr_ptr,int x, int y, int width, int height,
+ UBYTE * own_palette)
{
static UBYTE *src;
static UBYTE *dst;
@@ -925,38 +1180,80 @@ void hicolor555_Blt(UBYTE * scr_ptr)
scraddr += geom[useMode].startoffset;
scr_ptr += geom[useMode].sourceoffset;
- scr_ptr_limit = scr_ptr + geom[useMode].lineLimit;
- src_limit = scr_ptr + geom[useMode].xLimit;
+ //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 + width * height;
+ src_limit = scr_ptr + width;
/* 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;
- 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;
+ 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;
- r = (palRed[*(src+1)] + palRed[*(src+2)])>>1;
- g = (palGreen[*(src+1)] + palGreen[*(src+2)])>>1;
- b = (palBlue[*(src+1)] + palBlue[*(src+2)])>>1;
+ 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;
- 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;
+ 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);
@@ -965,46 +1262,74 @@ void hicolor555_Blt(UBYTE * scr_ptr)
src += 4;
}
scraddr += linestep;
- scr_ptr += 320;
- src_limit += 320;
+ scr_ptr += width;
+ src_limit += 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)
{
- *(unsigned short*)dst = pal[*src];
+ 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 += 320;
- src_limit += 320;
+ scr_ptr += width;
+ src_limit += 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)
{
- *(unsigned short*)dst = pal[*src];
- dst += pixelstep;
- src ++;
+ 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 += 320;
- src_limit += 320;
+ scr_ptr += width;
+ src_limit += width;
}
}
@@ -1012,7 +1337,12 @@ void hicolor555_Blt(UBYTE * scr_ptr)
}
}
-void hicolor565_Blt(UBYTE * scr_ptr)
+void hicolor565_Blt(UBYTE *src_ptr) {
+ hicolor565_Blt_part(src_ptr, 0, 0, 320, 200, NULL);
+}
+
+void hicolor565_Blt_part(UBYTE * scr_ptr, int x, int y, int width, int height,
+ UBYTE * own_palette)
{
static UBYTE *src;
static UBYTE *dst;
@@ -1046,38 +1376,80 @@ void hicolor565_Blt(UBYTE * scr_ptr)
scraddr += geom[useMode].startoffset;
scr_ptr += geom[useMode].sourceoffset;
- scr_ptr_limit = scr_ptr + geom[useMode].lineLimit;
- src_limit = scr_ptr + geom[useMode].xLimit;
+ //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 + width * height;
+ src_limit = scr_ptr + width;
/* 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;
- 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;
+ 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;
- r = (palRed[*(src+1)] + palRed[*(src+2)])>>1;
- g = (palGreen[*(src+1)] + palGreen[*(src+2)])>>1;
- b = (palBlue[*(src+1)] + palBlue[*(src+2)])>>1;
+ 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;
- 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;
+ 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);
@@ -1085,47 +1457,75 @@ void hicolor565_Blt(UBYTE * scr_ptr)
src += 4;
}
+
scraddr += linestep;
- scr_ptr += 320;
- src_limit += 320;
+ scr_ptr += width;
+ src_limit += 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)
{
- *(unsigned short*)dst = pal[*src];
+ 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 += 320;
- src_limit += 320;
- }
+ scr_ptr += width;
+ src_limit += 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)
{
- *(unsigned short*)dst = pal[*src];
+ 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 += 320;
- src_limit += 320;
+ scr_ptr += width;
+ src_limit += width;
}
}