[Scummvm-cvs-logs] CVS: scummvm/backends/wince screen.cpp,1.21,1.22 screen.h,1.6,1.7
Nicolas Bacca
arisme at users.sourceforge.net
Sun Oct 12 06:50:02 CEST 2003
Update of /cvsroot/scummvm/scummvm/backends/wince
In directory sc8-pr-cvs1:/tmp/cvs-serv15369
Modified Files:
screen.cpp screen.h
Log Message:
Smarter partial blitting and better filter for 640x480 games ... hopefully the last update before the rewrite
Index: screen.cpp
===================================================================
RCS file: /cvsroot/scummvm/scummvm/backends/wince/screen.cpp,v
retrieving revision 1.21
retrieving revision 1.22
diff -u -d -r1.21 -r1.22
--- screen.cpp 15 Jul 2003 02:16:32 -0000 1.21
+++ screen.cpp 12 Oct 2003 13:49:08 -0000 1.22
@@ -137,6 +137,8 @@
UBYTE *toolbar = NULL;
+UBYTE *displayCache;
+
#ifndef NEW_GAPI_CODE
UBYTE *noGAPI_video_buffer = NULL;
@@ -155,36 +157,37 @@
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);
+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);
+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);
+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);
+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);
+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);
+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);
@@ -225,6 +228,8 @@
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;
@@ -338,6 +343,14 @@
active = 0;
}
+void GAPIBeginDraw() {
+ displayCache = (UBYTE*)dynamicGXBeginDraw();
+}
+
+void GAPIEndDraw() {
+ dynamicGXEndDraw();
+}
+
void SetScreenGeometry(int w, int h) {
// Complain (loudly) if w > 320 and h > 240 ...
/*
@@ -473,6 +486,8 @@
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;
@@ -485,6 +500,8 @@
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;
@@ -497,6 +514,8 @@
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;
@@ -515,6 +534,8 @@
pBlt = palette_Blt;
pBlt_part = palette_Blt_part;
pSet_565 = palette_Set_565;
+ pBeginDraw = GAPIBeginDraw;
+ pEndDraw = GAPIEndDraw;
toolbar_available = 1;
@@ -795,6 +816,11 @@
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;
@@ -975,6 +1001,17 @@
/* ************************** BLT IMPLEMENTATION **************************** */
+void beginBltPart() {
+ if (pBeginDraw)
+ pBeginDraw();
+}
+
+void endBltPart() {
+ if (pEndDraw)
+ pEndDraw();
+}
+
+
void Blt(UBYTE * scr_ptr)
{
pBlt(scr_ptr);
@@ -996,7 +1033,7 @@
if (y + height > _geometry_h)
height = _geometry_h - y;
- pBlt_part(src_ptr, x, y, width, height, NULL, pitch);
+ pBlt_part(src_ptr, x, y, width, height, NULL, pitch, TRUE);
//if (check && (y > _geometry_h || (y + height) > _geometry_h)) {
// toolbar_drawn = false;
@@ -1100,7 +1137,7 @@
void mono_Blt_part(UBYTE * scr_ptr, int x, int y, int width, int height,
- UBYTE * own_palette, int pitch)
+ UBYTE * own_palette, int pitch, BOOL useCache)
{
// Mono blit routines contain good deal of voodoo
static UBYTE *src;
@@ -1133,7 +1170,10 @@
linestep = geom[useMode].linestep;
skipmask = geom[useMode].xSkipMask;
- scraddr = (UBYTE*)dynamicGXBeginDraw();
+ if (!useCache)
+ scraddr = (UBYTE*)dynamicGXBeginDraw();
+ else
+ scraddr = displayCache;
if(pixelstep)
{
@@ -1580,7 +1620,8 @@
}
}
}
- dynamicGXEndDraw();
+ if (!useCache)
+ dynamicGXEndDraw();
}
/* *************************** PALETTED DISPLAY ********************************* */
@@ -1666,7 +1707,7 @@
}
void palette_Blt_part(UBYTE * scr_ptr,int x, int y, int width, int height,
- UBYTE * own_palette, int pitch)
+ UBYTE * own_palette, int pitch, BOOL useCache)
{
static UBYTE *src;
static UBYTE *dst;
@@ -1698,7 +1739,11 @@
linestep = geom[useMode].linestep;
skipmask = geom[useMode].xSkipMask;
- scraddr = (UBYTE*)dynamicGXBeginDraw();
+ if (!useCache)
+ scraddr = (UBYTE*)dynamicGXBeginDraw();
+ else
+ scraddr = displayCache;
+
if(scraddr)
{
@@ -1827,8 +1872,8 @@
src_limit += (pitch ? pitch : width);
}
}
-
- dynamicGXEndDraw();
+ if (!useCache)
+ dynamicGXEndDraw();
}
}
@@ -1895,7 +1940,7 @@
void hicolor555_Blt_part(UBYTE * scr_ptr,int x, int y, int width, int height,
- UBYTE * own_palette, int pitch)
+ UBYTE * own_palette, int pitch, BOOL useCache)
{
static UBYTE *src;
static UBYTE *dst;
@@ -1923,7 +1968,11 @@
linestep = geom[useMode].linestep;
skipmask = geom[useMode].xSkipMask;
- scraddr = (UBYTE*)dynamicGXBeginDraw();
+ if (!useCache)
+ scraddr = (UBYTE*)dynamicGXBeginDraw();
+ else
+ scraddr = displayCache;
+
if(scraddr)
{
@@ -1961,9 +2010,16 @@
{
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);
@@ -2123,7 +2179,8 @@
}
}
- dynamicGXEndDraw();
+ if (!useCache)
+ dynamicGXEndDraw();
}
}
@@ -2247,7 +2304,7 @@
}
void hicolor565_Blt_part(UBYTE * scr_ptr, int x, int y, int width, int height,
- UBYTE * own_palette, int pitch)
+ UBYTE * own_palette, int pitch, BOOL useCache)
{
static UBYTE *src;
static UBYTE *dst;
@@ -2275,7 +2332,10 @@
linestep = geom[useMode].linestep;
skipmask = geom[useMode].xSkipMask;
- scraddr = (UBYTE*)dynamicGXBeginDraw();
+ if (!useCache)
+ scraddr = (UBYTE*)dynamicGXBeginDraw();
+ else
+ scraddr = displayCache;
if(scraddr)
{
@@ -2313,10 +2373,21 @@
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);
@@ -2419,14 +2490,23 @@
register second = *(src + 1);
register third = *(src + 2);
- r = (3*palRed[first] + palRed[second])>>2;
- g = (3*palGreen[first] + palGreen[second])>>2;
- b = (3*palBlue[first] + palBlue[second])>>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;
@@ -2434,8 +2514,25 @@
*(unsigned short*)dst = COLORCONV565(r,g,b);
dst += pixelstep;
+ */
- src += 3;
+ 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;
@@ -2604,7 +2701,8 @@
}
}
- dynamicGXEndDraw();
+ if (!useCache)
+ dynamicGXEndDraw();
}
}
@@ -2688,7 +2786,7 @@
}
void noGAPI_Blt_part(UBYTE * scr_ptr, int x, int y, int width, int height,
- UBYTE * own_palette, int pitch) {
+ UBYTE * own_palette, int pitch, BOOL useCache) {
HBITMAP old;
RECT rc;
HDC hdc = GetDC(hWndMain);
@@ -2824,7 +2922,7 @@
}
void noGAPI_Blt_part(UBYTE * scr_ptr, int x, int y, int width, int height,
- UBYTE * own_palette, int pitch) {
+ UBYTE * own_palette, int pitch, BOOL useCache) {
HDC hdc = GetDC(hWndMain);
HBITMAP hb;
UBYTE *workBuffer = noGAPI_buffer;
@@ -2921,12 +3019,8 @@
if (wide_screen && high_res) {
if (!g_gui->isActive()) {
- *px = x * 2;
- *py = y * 2;
- }
- else {
- *px = x;
- *py = y;
+ *px = *px * 2;
+ *py = *py * 2;
}
return;
}
@@ -3016,6 +3110,7 @@
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);
Index: screen.h
===================================================================
RCS file: /cvsroot/scummvm/scummvm/backends/wince/screen.h,v
retrieving revision 1.6
retrieving revision 1.7
diff -u -d -r1.6 -r1.7
--- screen.h 26 Jan 2003 21:40:05 -0000 1.6
+++ screen.h 12 Oct 2003 13:49:09 -0000 1.7
@@ -50,6 +50,9 @@
void Blt_part(UBYTE * src_ptr, int x, int y, int width, int height, int pitch, bool check = false);
void checkToolbar();
+void beginBltPart();
+void endBltPart();
+
void Get_565(UBYTE *src, INT16 *buffer, int pitch, int x, int y, int width, int height);
void Set_565(INT16 *buffer, int pitch, int x, int y, int width, int height);
@@ -67,6 +70,7 @@
void drawCommentString(char *);
void drawStandardString(char *, int);
void drawHighlightedString(char *, int);
+void drawWaitSelectKey();
void resetLastHighlighted();
void Translate(int* x, int* y);
More information about the Scummvm-git-logs
mailing list