aboutsummaryrefslogtreecommitdiff
path: root/sdl.cpp
diff options
context:
space:
mode:
authorLudvig Strigeus2001-10-09 14:30:12 +0000
committerLudvig Strigeus2001-10-09 14:30:12 +0000
commitc30932afbe1af874e3a2aeb95fa4ee5de4d6e38e (patch)
tree192b56f3908880c5a513a366f616341bcb47056e /sdl.cpp
downloadscummvm-rg350-c30932afbe1af874e3a2aeb95fa4ee5de4d6e38e.tar.gz
scummvm-rg350-c30932afbe1af874e3a2aeb95fa4ee5de4d6e38e.tar.bz2
scummvm-rg350-c30932afbe1af874e3a2aeb95fa4ee5de4d6e38e.zip
Initial revision
svn-id: r3408
Diffstat (limited to 'sdl.cpp')
-rw-r--r--sdl.cpp213
1 files changed, 213 insertions, 0 deletions
diff --git a/sdl.cpp b/sdl.cpp
new file mode 100644
index 0000000000..9d2d6db5ac
--- /dev/null
+++ b/sdl.cpp
@@ -0,0 +1,213 @@
+/* ScummVM - Scumm Interpreter
+ * Copyright (C) 2001 Ludvig Strigeus
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ *
+ * Change Log:
+ * $Log$
+ * Revision 1.1 2001/10/09 14:30:13 strigeus
+ * Initial revision
+ *
+ *
+ */
+
+#include "stdafx.h"
+#include "scumm.h"
+
+#define SCALEUP_2x2
+
+Scumm scumm;
+
+static SDL_Surface *screen;
+
+void updatePalette(Scumm *s) {
+ SDL_Color colors[256];
+ int first = s->_palDirtyMin;
+ int num = s->_palDirtyMax - first + 1;
+ int i;
+ byte *data = s->_currentPalette;
+
+ data += first*3;
+ for (i=0; i<num; i++,data+=3) {
+ colors[i].r = data[0]<<2;
+ colors[i].g = data[1]<<2;
+ colors[i].b = data[2]<<2;
+ colors[i].unused = 0;
+ }
+
+ SDL_SetColors(screen, colors, first, num);
+
+ s->_palDirtyMax = -1;
+ s->_palDirtyMin = 0x3E8;
+}
+
+void waitForTimer(Scumm *s) {
+ SDL_Event event;
+ byte dontPause = true;
+
+ do {
+ while (SDL_PollEvent(&event)) {
+ switch(event.type) {
+ case SDL_KEYDOWN:
+ s->_keyPressed = event.key.keysym.sym;
+ break;
+ case SDL_MOUSEMOTION:
+#if !defined(SCALEUP_2x2)
+ s->mouse.x = event.motion.x;
+ s->mouse.y = event.motion.y;
+#else
+ s->mouse.x = event.motion.x>>1;
+ s->mouse.y = event.motion.y>>1;
+#endif
+ break;
+ case SDL_MOUSEBUTTONDOWN:
+ if (event.button.button==SDL_BUTTON_LEFT)
+ s->_leftBtnPressed |= 1;
+ else if (event.button.button==SDL_BUTTON_RIGHT)
+ s->_rightBtnPressed |= 1;
+ break;
+#if 0
+ case SDL_ACTIVEEVENT:
+ if (event.active.state & SDL_APPINPUTFOCUS) {
+ dontPause = event.active.gain;
+ }
+ break;
+#endif
+ case SDL_QUIT:
+ exit(1);
+ break;
+ }
+ }
+ SDL_Delay(dontPause ? 10 : 100);
+ } while (!dontPause);
+
+ s->_scummTimer+=3;
+}
+
+#define MAX_DIRTY_RECTS 40
+SDL_Rect dirtyRects[MAX_DIRTY_RECTS];
+int numDirtyRects;
+bool fullRedraw;
+
+/* Copy part of bitmap */
+void blitToScreen(Scumm *s, byte *src,int x, int y, int w, int h) {
+ byte *dst;
+ SDL_Rect *r;
+ int i;
+
+ if (SDL_LockSurface(screen)==-1)
+ error("SDL_LockSurface failed: %s.\n", SDL_GetError());
+
+#if !defined(SCALEUP_2x2)
+ dst = (byte*)screen->pixels + y*320 + x;
+
+ if (numDirtyRects==MAX_DIRTY_RECTS)
+ fullRedraw = true;
+ else if (!fullRedraw) {
+ r = &dirtyRects[numDirtyRects++];
+ r->x = x;
+ r->y = y;
+ r->w = w;
+ r->h = h;
+ }
+
+ do {
+ memcpy(dst, src, w);
+ dst += 640;
+ src += 320;
+ } while (--h);
+#else
+ dst = (byte*)screen->pixels + y*640*2 + x*2;
+
+ if (numDirtyRects==MAX_DIRTY_RECTS)
+ fullRedraw = true;
+ else if (!fullRedraw) {
+ r = &dirtyRects[numDirtyRects++];
+ r->x = x*2;
+ r->y = y*2;
+ r->w = w*2;
+ r->h = h*2;
+ }
+
+ do {
+ i=0;
+ do {
+ dst[i*2] = dst[i*2+1] = src[i];
+ } while (++i!=w);
+ memcpy(dst+640, dst, w*2);
+ dst += 640*2;
+ src += 320;
+ } while (--h);
+
+#endif
+
+ SDL_UnlockSurface(screen);
+}
+
+void updateScreen(Scumm *s) {
+
+ if(s->_palDirtyMax != -1) {
+ updatePalette(s);
+ }
+
+ if (fullRedraw) {
+ SDL_UpdateRect(screen, 0,0,0,0);
+#if defined(SHOW_AREA)
+ debug(2,"update area 100 %%");
+#endif
+ } else if (numDirtyRects) {
+#if defined(SHOW_AREA)
+ int area = 0,i;
+ for (i=0; i<numDirtyRects; i++)
+ area += (dirtyRects[i].w * dirtyRects[i].h);
+ debug(2,"update area %f %%", (float)area/640);
+#endif
+ SDL_UpdateRects(screen, numDirtyRects, dirtyRects);
+ }
+
+
+ numDirtyRects = 0;
+}
+
+#undef main
+int main(int argc, char* argv[]) {
+ if (SDL_Init(SDL_INIT_VIDEO)==-1) {
+ printf("Could not initialize SDL: %s.\n", SDL_GetError());
+ return -1;
+ }
+
+ printf("%d %d, %d %d, %d %d %d, %d %d %d %d %d\n",
+ sizeof(int8), sizeof(uint8),
+ sizeof(int16), sizeof(uint16),
+ sizeof(int32), sizeof(uint32),
+ sizeof(void*),
+ sizeof(Box), sizeof(MouseCursor),sizeof(CodeHeader),
+ sizeof(ImageHeader),
+ &((CodeHeader*)0)->unk4
+ );
+
+ /* Clean up on exit */
+ atexit(SDL_Quit);
+
+#if !defined(SCALEUP_2x2)
+ screen = SDL_SetVideoMode(320, 200, 8, SDL_SWSURFACE);
+#else
+ screen = SDL_SetVideoMode(640, 400, 8, SDL_SWSURFACE);
+#endif
+ scumm._videoMode = 0x13;
+ scumm.scummMain();
+
+ return 0;
+}