[Scummvm-cvs-logs] SF.net SVN: scummvm:[43549] scummvm/trunk/engines/sci

waltervn at users.sourceforge.net waltervn at users.sourceforge.net
Wed Aug 19 23:10:24 CEST 2009


Revision: 43549
          http://scummvm.svn.sourceforge.net/scummvm/?rev=43549&view=rev
Author:   waltervn
Date:     2009-08-19 21:10:24 +0000 (Wed, 19 Aug 2009)

Log Message:
-----------
SCI: Add partial support for Amiga SCI1 games.

Modified Paths:
--------------
    scummvm/trunk/engines/sci/engine/game.cpp
    scummvm/trunk/engines/sci/gfx/gfx_resmgr.cpp
    scummvm/trunk/engines/sci/gfx/gfx_resource.h
    scummvm/trunk/engines/sci/gfx/res_pic.cpp
    scummvm/trunk/engines/sci/gfx/res_view.cpp

Modified: scummvm/trunk/engines/sci/engine/game.cpp
===================================================================
--- scummvm/trunk/engines/sci/engine/game.cpp	2009-08-19 21:09:10 UTC (rev 43548)
+++ scummvm/trunk/engines/sci/engine/game.cpp	2009-08-19 21:10:24 UTC (rev 43549)
@@ -43,7 +43,7 @@
 	gfx_color_t transparent = { PaletteEntry(), 0, -1, -1, 0 };
 	debug(2, "Initializing graphics");
 
-	if (!s->resmgr->isVGA()) {
+	if (s->resmgr->getViewType() == kViewEga) {
 		for (int i = 0; i < 16; i++) {
 			if (gfxop_set_color(s->gfx_state, &(s->ega_colors[i]), gfx_sci0_image_colors[sci0_palette][i].r,
 					gfx_sci0_image_colors[sci0_palette][i].g, gfx_sci0_image_colors[sci0_palette][i].b, 0, -1, -1)) {

Modified: scummvm/trunk/engines/sci/gfx/gfx_resmgr.cpp
===================================================================
--- scummvm/trunk/engines/sci/gfx/gfx_resmgr.cpp	2009-08-19 21:09:10 UTC (rev 43548)
+++ scummvm/trunk/engines/sci/gfx/gfx_resmgr.cpp	2009-08-19 21:10:24 UTC (rev 43549)
@@ -100,7 +100,7 @@
 		if (_version == SCI_VERSION_1_1)
 			gfxr_draw_pic11(unscaled_pic, flags, default_palette, res->size, res->data, &basic_style, res->id.number, _staticPalette, _portBounds);
 		else
-			gfxr_draw_pic01(unscaled_pic, flags, default_palette, res->size, res->data, &basic_style, res->id.number, _resManager->isVGA(), _staticPalette, _portBounds);
+			gfxr_draw_pic01(unscaled_pic, flags, default_palette, res->size, res->data, &basic_style, res->id.number, _resManager->getViewType(), _staticPalette, _portBounds);
 	}
 
 	if (scaled_pic && scaled_pic->undithered_buffer)
@@ -109,7 +109,7 @@
 	if (_version == SCI_VERSION_1_1)
 		gfxr_draw_pic11(scaled_pic, flags, default_palette, res->size, res->data, &style, res->id.number, _staticPalette, _portBounds);
 	else
-		gfxr_draw_pic01(scaled_pic, flags, default_palette, res->size, res->data, &style, res->id.number, _resManager->isVGA(), _staticPalette, _portBounds);
+		gfxr_draw_pic01(scaled_pic, flags, default_palette, res->size, res->data, &style, res->id.number, _resManager->getViewType(), _staticPalette, _portBounds);
 
 	if (!_resManager->isVGA()) {
 		if (need_unscaled)
@@ -536,7 +536,7 @@
 			int pal = (_version <= SCI_VERSION_01) ? -1 : palette;
 			view = getEGAView(resid, viewRes->data, viewRes->size, pal);
 		} else {
-			view = getVGAView(resid, viewRes->data, viewRes->size, _staticPalette, viewType == kViewVga11);
+			view = getVGAView(resid, viewRes->data, viewRes->size, viewType);
 
 			if (view->palette) {
 				// Palettize view

Modified: scummvm/trunk/engines/sci/gfx/gfx_resource.h
===================================================================
--- scummvm/trunk/engines/sci/gfx/gfx_resource.h	2009-08-19 21:09:10 UTC (rev 43548)
+++ scummvm/trunk/engines/sci/gfx/gfx_resource.h	2009-08-19 21:10:24 UTC (rev 43549)
@@ -199,13 +199,13 @@
  * @param[in] resource			Pointer to the resource data
  * @param[in] style				The drawing style
  * @param[in] resid				The resource ID
- * @param[in] sci1				true if SCI1, false otherwise
+ * @param[in] viewType			The view type for embedded views
  * @param[in] static_pal		The static palette
  * @param[in] portBounds		The bounds of the port being drawn to
  */
 void gfxr_draw_pic01(gfxr_pic_t *pic, int fill_normally,
 		int default_palette, int size, byte *resource,
-		gfxr_pic0_params_t *style, int resid, int sci1,
+		gfxr_pic0_params_t *style, int resid, ViewType viewType,
 		Palette *static_pal, Common::Rect portBounds);
 
 /**
@@ -321,9 +321,9 @@
  * @param[in] isSci11		true if SCI1.1, false otherwise
  * @return					The resulting view
  */
-gfxr_view_t *getVGAView(int id, byte *resource, int size, Palette *static_pal, bool isSci11);
+gfxr_view_t *getVGAView(int id, byte *resource, int size, ViewType viewType);
 
-gfx_pixmap_t *gfxr_draw_cel1(int id, int loop, int cel, int mirrored, byte *resource, byte *cel_base, int size, gfxr_view_t *view, bool isAmiga, bool isSci11);
+gfx_pixmap_t *gfxr_draw_cel1(int id, int loop, int cel, int mirrored, byte *resource, byte *cel_base, int size, gfxr_view_t *view, ViewType viewType);
 /** @} */
 
 } // End of namespace Sci

Modified: scummvm/trunk/engines/sci/gfx/res_pic.cpp
===================================================================
--- scummvm/trunk/engines/sci/gfx/res_pic.cpp	2009-08-19 21:09:10 UTC (rev 43548)
+++ scummvm/trunk/engines/sci/gfx/res_pic.cpp	2009-08-19 21:10:24 UTC (rev 43549)
@@ -1135,7 +1135,7 @@
 extern void _gfx_crossblit_simple(byte *dest, byte *src, int dest_line_width, int src_line_width, int xl, int yl, int bpp);
 
 void gfxr_draw_pic01(gfxr_pic_t *pic, int flags, int default_palette, int size, byte *resource,
-					 gfxr_pic0_params_t *style, int resid, int sci1, Palette *static_pal, Common::Rect portBounds) {
+					 gfxr_pic0_params_t *style, int resid, ViewType viewType, Palette *static_pal, Common::Rect portBounds) {
 	const int default_palette_table[GFXR_PIC0_PALETTE_SIZE] = {
 		0x00, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77,
 		0x88, 0x99, 0xaa, 0xbb, 0xcc, 0xdd, 0xee, 0x88,
@@ -1189,7 +1189,7 @@
 		case PIC_OP_SET_COLOR:
 			p0printf("Set color @%d\n", pos);
 
-			if (!sci1) {
+			if (viewType == kViewEga) {
 				pal = *(resource + pos++);
 				index = pal % GFXR_PIC0_PALETTE_SIZE;
 				pal /= GFXR_PIC0_PALETTE_SIZE;
@@ -1216,7 +1216,7 @@
 		case PIC_OP_SET_PRIORITY:
 			p0printf("Set priority @%d\n", pos);
 
-			if (!sci1) {
+			if (viewType == kViewEga) {
 				pal = *(resource + pos++);
 				index = pal % GFXR_PIC0_PALETTE_SIZE;
 				pal /= GFXR_PIC0_PALETTE_SIZE; // Ignore pal
@@ -1425,7 +1425,7 @@
 			opx = *(resource + pos++);
 			p0printf("OPX: ");
 
-			if (sci1)
+			if (viewType != kViewEga)
 				opx += SCI1_OP_OFFSET; // See comment at the definition of SCI1_OP_OFFSET.
 
 			switch (opx) {
@@ -1509,11 +1509,13 @@
 				bytesize = (*(resource + pos)) + (*(resource + pos + 1) << 8);
 				p0printf("(%d, %d)\n", posx, posy);
 				pos += 2;
-				if (!sci1 && !nodraw)
-					view = gfxr_draw_cel0(-1, -1, -1, resource + pos, bytesize, NULL, flags & DRAWPIC1_FLAG_MIRRORED);
-				else
-					view = gfxr_draw_cel1(-1, -1, -1, flags & DRAWPIC1_FLAG_MIRRORED, resource + pos, resource + pos,
-										  bytesize, NULL, (static_pal && static_pal->size() == GFX_SCI1_AMIGA_COLORS_NR), false);
+				if (!nodraw) {
+					if (viewType == kViewEga)
+						view = gfxr_draw_cel0(-1, -1, -1, resource + pos, bytesize, NULL, flags & DRAWPIC1_FLAG_MIRRORED);
+					else
+						view = gfxr_draw_cel1(-1, -1, -1, flags & DRAWPIC1_FLAG_MIRRORED, resource + pos, resource + pos,
+											  bytesize, NULL, viewType);
+				}
 				pos += bytesize;
 				if (nodraw)
 					continue;
@@ -1526,20 +1528,22 @@
 				// we can only safely replace the palette if it's static
 				// *if it's not for some reason, we should die
 
-				if (view->palette && view->palette->isShared() && !sci1) {
+				if (view->palette && view->palette->isShared() && (viewType == kViewEga)) {
 					warning("gfx_draw_pic0(): can't set a non-static palette for an embedded view");
 				}
 
 				// For SCI0, use special color mapping to copy the low
 				// nibble of the color index to the high nibble.
 
-				if (sci1) {
-					if (static_pal && static_pal->size() == GFX_SCI1_AMIGA_COLORS_NR) {
-						// Assume Amiga game
+				if (viewType != kViewEga) {
+					if (view->palette)
+						view->palette->free();
+
+					if (viewType == kViewAmiga) {
 						pic->visual_map->palette = static_pal->getref();
+					} else {
+						view->palette = pic->visual_map->palette->copy();
 					}
-					if (view->palette) view->palette->free();
-					view->palette = pic->visual_map->palette->copy();
 				} else
 					view->palette = embedded_view_pal->getref();
 
@@ -1648,7 +1652,7 @@
 	pic->visual_map->palette = gfxr_read_pal11(-1, resource + palette_data_ptr, 1284);
 
 	if (has_bitmap)
-		view = gfxr_draw_cel1(-1, 0, 0, flags & DRAWPIC1_FLAG_MIRRORED, resource, resource + bitmap_data_ptr, size - bitmap_data_ptr, NULL, 0, true);
+		view = gfxr_draw_cel1(-1, 0, 0, flags & DRAWPIC1_FLAG_MIRRORED, resource, resource + bitmap_data_ptr, size - bitmap_data_ptr, NULL, kViewVga11);
 
 	if (view) {
 		view->palette = pic->visual_map->palette->getref();
@@ -1677,7 +1681,7 @@
 		warning("[GFX] No view was contained in SCI1.1 pic resource");
 	}
 
-	gfxr_draw_pic01(pic, flags, default_palette, size - vector_data_ptr, resource + vector_data_ptr, style, resid, 1, static_pal, portBounds);
+	gfxr_draw_pic01(pic, flags, default_palette, size - vector_data_ptr, resource + vector_data_ptr, style, resid, kViewVga11, static_pal, portBounds);
 }
 
 void gfxr_dither_pic0(gfxr_pic_t *pic, int dmode, int pattern) {

Modified: scummvm/trunk/engines/sci/gfx/res_view.cpp
===================================================================
--- scummvm/trunk/engines/sci/gfx/res_view.cpp	2009-08-19 21:09:10 UTC (rev 43548)
+++ scummvm/trunk/engines/sci/gfx/res_view.cpp	2009-08-19 21:10:24 UTC (rev 43549)
@@ -326,19 +326,19 @@
 	return 0;
 }
 
-gfx_pixmap_t *gfxr_draw_cel1(int id, int loop, int cel, int mirrored, byte *resource, byte *cel_base, int size, gfxr_view_t *view, bool isAmiga, bool isSci11) {
+gfx_pixmap_t *gfxr_draw_cel1(int id, int loop, int cel, int mirrored, byte *resource, byte *cel_base, int size, gfxr_view_t *view, ViewType viewType) {
 	int xl = READ_LE_UINT16(cel_base);
 	int yl = READ_LE_UINT16(cel_base + 2);
 	int pixmap_size = xl * yl;
-	int xdisplace = isSci11 ? READ_LE_UINT16(cel_base + 4) : (int8) cel_base[4];
-	int ydisplace = isSci11 ? READ_LE_UINT16(cel_base + 6) : cel_base[5];
-	int runlength_offset = isSci11 ? READ_LE_UINT16(cel_base + 24) : 8;
-	int literal_offset = isSci11 ? READ_LE_UINT16(cel_base + 28) : 8;
+	int xdisplace = (viewType == kViewVga11) ? READ_LE_UINT16(cel_base + 4) : (int8) cel_base[4];
+	int ydisplace = (viewType == kViewVga11) ? READ_LE_UINT16(cel_base + 6) : cel_base[5];
+	int runlength_offset = (viewType == kViewVga11) ? READ_LE_UINT16(cel_base + 24) : 8;
+	int literal_offset = (viewType == kViewVga11) ? READ_LE_UINT16(cel_base + 28) : 8;
 	gfx_pixmap_t *retval = gfx_pixmap_alloc_index_data(gfx_new_pixmap(xl, yl, id, loop, cel));
 	byte *dest = retval->index_data;
 	int decompress_failed;
 
-	retval->color_key = cel_base[isSci11 ? 8 : 6];
+	retval->color_key = cel_base[(viewType == kViewVga11) ? 8 : 6];
 	retval->xoffset = mirrored ? xdisplace : -xdisplace;
 	retval->yoffset = -ydisplace;
 	// FIXME: In LSL5, it seems that the inventory has views without palettes (or we don't load palettes properly)
@@ -350,12 +350,12 @@
 		return NULL;
 	}
 
-	if (!isAmiga)
-		decompress_failed = decompress_sci_view(id, loop, cel, resource, dest, mirrored, pixmap_size, size, runlength_offset,
-		                                        literal_offset, xl, yl, retval->color_key);
-	else
+	if (viewType == kViewAmiga)
 		decompress_failed = decompress_sci_view_amiga(id, loop, cel, resource, dest, mirrored, pixmap_size, size, runlength_offset,
 		                    xl, yl, retval->color_key);
+	else
+		decompress_failed = decompress_sci_view(id, loop, cel, resource, dest, mirrored, pixmap_size, size, runlength_offset,
+		                                        literal_offset, xl, yl, retval->color_key);
 
 	if (decompress_failed) {
 		gfx_free_pixmap(retval);
@@ -365,27 +365,22 @@
 	return retval;
 }
 
-gfxr_view_t *getVGAView(int id, byte *resource, int size, Palette *static_pal, bool isSci11) {
-	uint16 palOffset = READ_LE_UINT16(resource + V1_PALETTE_OFFSET + (isSci11 ? 2 : 0));
-	uint16 headerSize = isSci11 ? READ_LE_UINT16(resource + V2_HEADER_SIZE) : 0;
+gfxr_view_t *getVGAView(int id, byte *resource, int size, ViewType viewType) {
+	uint16 palOffset = READ_LE_UINT16(resource + V1_PALETTE_OFFSET + ((viewType == kViewVga11) ? 2 : 0));
+	uint16 headerSize = (viewType == kViewVga11) ? READ_LE_UINT16(resource + V2_HEADER_SIZE) : 0;
 	byte* seeker = resource + headerSize;
 	uint16 loopOffset = 0;
-	int amiga_game = 0;
 	gfxr_view_t *view = (gfxr_view_t *)malloc(sizeof(gfxr_view_t));
 
 	view->ID = id;
 	view->flags = 0;
-	view->loops_nr = READ_LE_UINT16(resource + V1_LOOPS_NR_OFFSET + (isSci11 ? 2 : 0)) & 0xFF;
+	view->loops_nr = READ_LE_UINT16(resource + V1_LOOPS_NR_OFFSET + ((viewType == kViewVga11) ? 2 : 0)) & 0xFF;
 
 	if (palOffset > 0) {
-		if (!isSci11)
-			view->palette = gfxr_read_pal1(id, resource + palOffset, size - palOffset);
-		else
+		if (viewType == kViewVga11)
 			view->palette = gfxr_read_pal11(id, resource + palOffset, size - palOffset);
-	} else if (static_pal && static_pal->size() == GFX_SCI1_AMIGA_COLORS_NR) {
-		// Assume we're running an amiga game.
-		amiga_game = 1;
-		view->palette = static_pal->getref();
+		else
+			view->palette = gfxr_read_pal1(id, resource + palOffset, size - palOffset);
 	} else {
 		view->palette = NULL;
 	}
@@ -393,7 +388,7 @@
 	view->loops = (gfxr_loop_t *)calloc(view->loops_nr, sizeof(gfxr_loop_t));
 
 	for (int i = 0; i < view->loops_nr; i++) {
-		if (!isSci11) {
+		if (viewType != kViewVga11) {
 			bool mirrored = READ_LE_UINT16(resource + V1_MIRROR_MASK) & (1 << i);
 			loopOffset = READ_LE_UINT16(resource + V1_FIRST_LOOP_OFFSET + (i << 1));
 			view->loops[i].cels_nr = READ_LE_UINT16(resource + loopOffset);
@@ -405,7 +400,7 @@
 														resource + cel_offset, 
 														resource + cel_offset, 
 														size - cel_offset, 
-														view, amiga_game, false);
+														view, viewType);
 			}
 		} else {
 			byte copy_entry = seeker[V2_COPY_OF_LOOP];
@@ -417,7 +412,7 @@
 
 			byte* cellSeeker = resource + loopOffset;
 			for (int j = 0; j < view->loops[i].cels_nr; j++) {
-				view->loops[i].cels[j] = gfxr_draw_cel1(id, i, j, mirrored, resource, cellSeeker, size, view, 0, true);
+				view->loops[i].cels[j] = gfxr_draw_cel1(id, i, j, mirrored, resource, cellSeeker, size, view, viewType);
 				cellSeeker += resource[V2_BYTES_PER_CEL];
 			}
 


This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.




More information about the Scummvm-git-logs mailing list