mirror of
https://github.com/libretro/scummvm.git
synced 2025-01-24 19:45:07 +00:00
Added shaking + 'pixel hunting' and 'right click emulation' modes. Still only working with the 'pre_freeze' label.
svn-id: r3804
This commit is contained in:
parent
e63a818d21
commit
3f53daa8a1
95
x11.cpp
95
x11.cpp
@ -70,6 +70,7 @@ static bool has_mouse, hide_mouse;
|
||||
static unsigned int scale;
|
||||
static int fake_right_mouse = 0;
|
||||
static int report_presses = 1;
|
||||
static int current_shake_pos = 0;
|
||||
|
||||
#define MAX_NUMBER_OF_DIRTY_SQUARES 32
|
||||
typedef struct {
|
||||
@ -290,8 +291,82 @@ void setWindowName(Scumm *s) {
|
||||
NULL /* argv */, 0 /* argc */, NULL /* size hints */, NULL /* WM hints */, NULL /* class hints */ );
|
||||
}
|
||||
|
||||
/* This simply shifts up or down the screen by 'shake pos' */
|
||||
void setShakePos(Scumm *s, int shake_pos) {
|
||||
warning("Unimplemented shaking !");
|
||||
if (shake_pos != current_shake_pos) {
|
||||
int dirty_top = 0, dirty_height = 0;
|
||||
int line;
|
||||
|
||||
/* This is to provoke a full redraw */
|
||||
num_of_dirty_square = MAX_NUMBER_OF_DIRTY_SQUARES;
|
||||
|
||||
/* Update the mouse to prevent 'mouse droppings' */
|
||||
old_mouse_y += shake_pos - current_shake_pos;
|
||||
|
||||
/* Handle the 'dirty part' of the screen */
|
||||
if (shake_pos > current_shake_pos) {
|
||||
for (line = 199 + shake_pos; line >= -shake_pos; line--) {
|
||||
int cur_pos, new_pos;
|
||||
int cur_OK, new_OK;
|
||||
|
||||
cur_pos = line + current_shake_pos;
|
||||
new_pos = line + shake_pos;
|
||||
|
||||
cur_OK = (cur_pos >= 0) && (cur_pos < 200);
|
||||
new_OK = (new_pos >= 0) && (new_pos < 200);
|
||||
if (cur_OK && new_OK)
|
||||
memcpy(local_fb + new_pos * 320, local_fb + cur_pos * 320, 320);
|
||||
else if (cur_OK)
|
||||
memset(local_fb + cur_pos * 320, 0, 320);
|
||||
else if (new_OK)
|
||||
memset(local_fb + new_pos * 320, 0, 320);
|
||||
}
|
||||
|
||||
if (current_shake_pos < 0) {
|
||||
dirty_top = -shake_pos;
|
||||
dirty_height = shake_pos - current_shake_pos;
|
||||
if (dirty_top < 0) {
|
||||
dirty_height += dirty_top;
|
||||
dirty_top = 0;
|
||||
}
|
||||
if ((dirty_height + dirty_top) > 200)
|
||||
dirty_height = 200 - dirty_top;
|
||||
} else {
|
||||
dirty_height = 0;
|
||||
}
|
||||
} else {
|
||||
for (line = -current_shake_pos; line < 200 + current_shake_pos; line++) {
|
||||
int cur_pos, new_pos;
|
||||
int cur_OK, new_OK;
|
||||
|
||||
cur_pos = line + current_shake_pos;
|
||||
new_pos = line + shake_pos;
|
||||
cur_OK = (cur_pos >= 0) && (cur_pos < 200);
|
||||
new_OK = (new_pos >= 0) && (new_pos < 200);
|
||||
|
||||
if (cur_OK && new_OK)
|
||||
memcpy(local_fb + new_pos * 320, local_fb + cur_pos * 320, 320);
|
||||
else if (cur_OK)
|
||||
memset(local_fb + cur_pos * 320, 0, 320);
|
||||
else if (new_OK)
|
||||
memset(local_fb + new_pos * 320, 0, 320);
|
||||
}
|
||||
|
||||
if (current_shake_pos <= 0) {
|
||||
dirty_height = 0;
|
||||
} else {
|
||||
dirty_top = 200 - current_shake_pos;
|
||||
dirty_height = current_shake_pos - shake_pos;
|
||||
if ((dirty_height + dirty_top) > 200)
|
||||
dirty_height = 200 - dirty_top;
|
||||
}
|
||||
}
|
||||
|
||||
/* And save the new shake position */
|
||||
current_shake_pos = shake_pos;
|
||||
if (dirty_height > 0)
|
||||
s->redrawLines(dirty_top, dirty_top + dirty_height);
|
||||
}
|
||||
}
|
||||
|
||||
#define AddDirtyRec(xi,yi,wi,hi) \
|
||||
@ -303,7 +378,19 @@ void setShakePos(Scumm *s, int shake_pos) {
|
||||
num_of_dirty_square++; \
|
||||
}
|
||||
void blitToScreen(Scumm *s, byte *src, int x, int y, int w, int h) {
|
||||
unsigned char *dst = local_fb + 320 * y + x;
|
||||
unsigned char *dst;
|
||||
|
||||
y += current_shake_pos;
|
||||
if (y < 0) {
|
||||
h += y;
|
||||
src -= y * 320;
|
||||
y = 0;
|
||||
}
|
||||
if (h > (200 - y)) {
|
||||
h = 200 - y;
|
||||
}
|
||||
|
||||
dst = local_fb + 320 * y + x;
|
||||
|
||||
if (h<=0) return;
|
||||
|
||||
@ -327,6 +414,8 @@ unsigned char old_backup[BAK_WIDTH * BAK_HEIGHT];
|
||||
void drawMouse(Scumm *s, int xdraw, int ydraw, int w, int h, byte *buf, bool visible) {
|
||||
unsigned char *dst,*bak;
|
||||
|
||||
ydraw += current_shake_pos;
|
||||
|
||||
if ((xdraw >= 320) || ((xdraw + w) <= 0) ||
|
||||
(ydraw >= 200) || ((ydraw + h) <= 0)) {
|
||||
if (hide_mouse) visible = false;
|
||||
@ -466,7 +555,7 @@ void updateScreen(Scumm *s) {
|
||||
update_palette(s);
|
||||
full_redraw = true;
|
||||
num_of_dirty_square = 0;
|
||||
} else if (num_of_dirty_square > MAX_NUMBER_OF_DIRTY_SQUARES) {
|
||||
} else if (num_of_dirty_square >= MAX_NUMBER_OF_DIRTY_SQUARES) {
|
||||
full_redraw = true;
|
||||
num_of_dirty_square = 0;
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user