aboutsummaryrefslogtreecommitdiff
path: root/x11.cpp
diff options
context:
space:
mode:
authorLionel Ulmer2002-04-24 21:19:19 +0000
committerLionel Ulmer2002-04-24 21:19:19 +0000
commitfb5e38d45451f0bbeb556434804fcb5bf70dfea3 (patch)
treed275560a7b6d4a9cfc05c9a5d17403f3d3544d49 /x11.cpp
parent57f40560156da067b1117838bc78e0b7ce58aeea (diff)
downloadscummvm-rg350-fb5e38d45451f0bbeb556434804fcb5bf70dfea3.tar.gz
scummvm-rg350-fb5e38d45451f0bbeb556434804fcb5bf70dfea3.tar.bz2
scummvm-rg350-fb5e38d45451f0bbeb556434804fcb5bf70dfea3.zip
Added beginning of (hacky) hardware scaling for the X11 port of
ScummVM. This is NOT finalized at all (for example mouse 'descaling' is not implemented yet) but is here for the not-faint of heart :-) If you want to try to play with it, replace '65' by the video port supporting a RGB image format (search it with 'xvinfo'). This works with the latest NVIDIA drivers. I have no idea if any other graphic driver exports this feature. svn-id: r4075
Diffstat (limited to 'x11.cpp')
-rw-r--r--x11.cpp51
1 files changed, 41 insertions, 10 deletions
diff --git a/x11.cpp b/x11.cpp
index a537d69df7..a98d923354 100644
--- a/x11.cpp
+++ b/x11.cpp
@@ -35,6 +35,10 @@
#include <X11/Xlib.h>
#include <X11/Xutil.h>
#include <X11/extensions/XShm.h>
+#ifdef USE_XV_SCALING
+#include <X11/extensions/Xv.h>
+#include <X11/extensions/Xvlib.h>
+#endif
#include <linux/soundcard.h>
#include <sched.h>
@@ -127,13 +131,21 @@ private:
int window_width, window_height;
int scumm_x, scumm_y;
+#ifdef USE_XV_SCALING
+ unsigned int palette[256];
+#else
unsigned short palette[256];
+#endif
bool _palette_changed;
Display *display;
int screen;
Window window;
GC black_gc;
+#ifdef USE_XV_SCALING
+ XvImage *image;
+#else
XImage *image;
+#endif
pthread_t sound_thread;
int fake_right_mouse;
@@ -304,8 +316,7 @@ OSystem_X11::OSystem_X11()
window_height = 200;
scumm_x = 0;
scumm_y = 0;
- window = XCreateSimpleWindow(display, XRootWindow(display, screen), 0, 0,
- 320, 200, 0, 0, 0);
+ window = XCreateSimpleWindow(display, XRootWindow(display, screen), 0, 0, 320, 200, 0, 0, 0);
wm_hints = XAllocWMHints();
if (wm_hints == NULL) {
error("Not enough memory to allocate Hints !\n");
@@ -316,17 +327,20 @@ OSystem_X11::OSystem_X11()
wm_hints->initial_state = NormalState;
XStringListToTextProperty(&name, 1, &window_name);
XSetWMProperties(display, window, &window_name, &window_name,
- NULL /* argv */ , 0 /* argc */ , NULL /* size hints */ ,
- wm_hints, NULL /* class hints */ );
+ NULL /* argv */ , 0 /* argc */ , NULL /* size hints */ ,
+ wm_hints, NULL /* class hints */ );
XSelectInput(display, window,
- ExposureMask | KeyPressMask | KeyReleaseMask |
- PointerMotionMask | ButtonPressMask | ButtonReleaseMask |
- StructureNotifyMask);
- image =
- XShmCreateImage(display, DefaultVisual(display, screen), 16, ZPixmap,
- NULL, &shminfo, 320, 200);
+ ExposureMask | KeyPressMask | KeyReleaseMask |
+ PointerMotionMask | ButtonPressMask | ButtonReleaseMask |
+ StructureNotifyMask);
+#ifdef USE_XV_SCALING
+ image = XvShmCreateImage(display, 65, 0x03, 0, 320, 200, &shminfo);
+ shminfo.shmid = shmget(IPC_PRIVATE, image->data_size, IPC_CREAT | 0700);
+#else
+ image = XShmCreateImage(display, DefaultVisual(display, screen), 16, ZPixmap, NULL, &shminfo, 320, 200);
shminfo.shmid = shmget(IPC_PRIVATE, 320 * 200 * 2, IPC_CREAT | 0700);
+#endif
shminfo.shmaddr = (char *)shmat(shminfo.shmid, 0, 0);
image->data = shminfo.shmaddr;
shminfo.readOnly = False;
@@ -392,10 +406,18 @@ bool OSystem_X11::set_sound_proc(void *param, SoundProc *proc, byte format) {
void OSystem_X11::set_palette(const byte *colors, uint start, uint num) {
const byte *data = colors;
+#ifdef USE_XV_SCALING
+ unsigned int *pal = &(palette[start]);
+#else
unsigned short *pal = &(palette[start]);
+#endif
do {
+#ifdef USE_XV_SCALING
+ *pal++ = (data[0] << 16) | (data[1] << 8) | data[2];
+#else
*pal++ = ((data[0] & 0xF8) << 8) | ((data[1] & 0xFC) << 3) | (data[2] >> 3);
+#endif
data += 4;
num--;
} while (num > 0);
@@ -443,7 +465,11 @@ void OSystem_X11::copy_rect(const byte *buf, int pitch, int x, int y, int w, int
void OSystem_X11::update_screen_helper(const dirty_square * d, dirty_square * dout) {
int x, y;
unsigned char *ptr_src = local_fb + (320 * d->y) + d->x;
+#ifdef USE_XV_SCALING
+ unsigned int *ptr_dst = ((unsigned int *)image->data) + (320 * d->y) + d->x;
+#else
unsigned short *ptr_dst = ((unsigned short *)image->data) + (320 * d->y) + d->x;
+#endif
for (y = 0; y < d->h; y++) {
for (x = 0; x < d->w; x++) {
*ptr_dst++ = palette[*ptr_src++];
@@ -490,9 +516,14 @@ void OSystem_X11::update_screen() {
}
}
if (need_redraw == true) {
+#ifdef USE_XV_SCALING
+ XvShmPutImage(display, 65, window, DefaultGC(display, screen), image,
+ 0, 0, 320, 200, 0, 0, window_width, window_height, 0);
+#else
XShmPutImage(display, window, DefaultGC(display, screen), image,
dout.x, dout.y, scumm_x + dout.x, scumm_y + dout.y,
dout.w - dout.x, dout.h - dout.y, 0);
+#endif
XFlush(display);
}
}