diff options
Diffstat (limited to 'wince/screen.cpp')
-rw-r--r-- | wince/screen.cpp | 642 |
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; } } |