[Scummvm-cvs-logs] SF.net SVN: scummvm: [28811] scummvm/trunk/engines/agi

thebluegr at users.sourceforge.net thebluegr at users.sourceforge.net
Sun Sep 2 02:49:04 CEST 2007


Revision: 28811
          http://scummvm.svn.sourceforge.net/scummvm/?rev=28811&view=rev
Author:   thebluegr
Date:     2007-09-01 17:49:03 -0700 (Sat, 01 Sep 2007)

Log Message:
-----------
Merged all the different picture decoding functions

Modified Paths:
--------------
    scummvm/trunk/engines/agi/picture.cpp
    scummvm/trunk/engines/agi/picture.h

Modified: scummvm/trunk/engines/agi/picture.cpp
===================================================================
--- scummvm/trunk/engines/agi/picture.cpp	2007-09-01 23:30:37 UTC (rev 28810)
+++ scummvm/trunk/engines/agi/picture.cpp	2007-09-02 00:49:03 UTC (rev 28811)
@@ -499,10 +499,10 @@
 }
 
 /**************************************************************************
-** Draw AGI vC64 format picture
+** Draw AGI picture
 **************************************************************************/
 
-void PictureMgr::drawPictureVC64() {
+void PictureMgr::drawPicture() {
 	uint8 act;
 	int drawing;
 
@@ -514,235 +514,141 @@
 
 	drawing = 1;
 
-	debugC(8, kDebugLevelMain, "Drawing vC64 picture");
+	debugC(8, kDebugLevelMain, "Drawing v2 picture");
 	for (drawing = 1; drawing && foffs < flen;) {
 		act = nextByte;
+
+		if (pictureType == AGIPIC_C64 && act >= 0xf0 && act <= 0xfe) {
+			scrColour = act - 0xf0;
+			continue;
+		}
+
 		switch (act) {
-		case 0xe0:	/* x-corner */
+		case 0xe0:	// x-corner (C64)
 			xCorner();
 			break;
-		case 0xe1:	/* y-corner */
+		case 0xe1:	// y-corner (C64)
 			yCorner();
 			break;
-		case 0xe2:	/* dynamic draw lines */
+		case 0xe2:	// dynamic draw lines (C64)
 			dynamicDrawLine();
 			break;
-		case 0xe3:	/* absolute draw lines */
+		case 0xe3:	// absolute draw lines (C64)
 			absoluteDrawLine();
 			break;
-		case 0xe4:	/* fill */
+		case 0xe4:	// fill (C64)
 			scrColour = nextByte;
 			scrColour &= 0xF;	/* for v3 drawing diff */
 			fill();
 			break;
-		case 0xe5:	/* enable screen drawing */
+		case 0xe5:	// enable screen drawing (C64)
 			scrOn = true;
 			break;
-		case 0xe6:	/* plot brush */
+		case 0xe6:	// plot brush (C64)
 			patCode = nextByte;
 			plotBrush();
 			break;
-		case 0xf0:	/* set colour on screen */
-		case 0xf2:
-		case 0xf3:
-		case 0xf4:
-		case 0xf5:
-		case 0xf6:
-		case 0xf7:
-		case 0xf8:
-		case 0xf9:
-		case 0xfa:
-		case 0xfb:
-		case 0xfc:
-		case 0xfd:
-		case 0xfe:
-			scrColour = act - 0xf0;
-			break;
-		default:
-			warning("Unknown vC64 picture opcode (%x)", act);
-		}
-	}
-}
-
-/**************************************************************************
-** Draw AGI v1 format picture
-**************************************************************************/
-
-void PictureMgr::drawPictureV1() {
-	uint8 act;
-	int drawing;
-
-	patCode = 0;
-	patNum = 0;
-	priOn = scrOn = false;
-	scrColour = 0xf;
-	priColour = 0x4;
-
-	drawing = 1;
-
-	debugC(8, kDebugLevelMain, "Drawing v1 picture");
-	for (drawing = 1; drawing && foffs < flen;) {
-		act = nextByte;
-		switch (act) {
-		case 0xf1:	/* set colour on screen */
+		case 0xf0:	// set colour on screen (AGI pic v2)
 			scrColour = nextByte;
-			scrColour &= 0xF;	/* for v3 drawing diff */
+			scrColour &= 0xF;	// for v3 drawing diff
 			scrOn = true;
-			priOn = false;
 			break;
-		case 0xf3:	/* set colour on priority */
-			scrColour = nextByte;
-			scrColour &= 0xF;	/* for v3 drawing diff */
-			scrOn = true;
+		case 0xf1:
+			if (pictureType == AGIPIC_V1) {
+				scrColour = nextByte;
+				scrColour &= 0xF;	// for v3 drawing diff
+				scrOn = true;
+				priOn = false;
+			} else if (pictureType == AGIPIC_V15) {	// set colour on screen
+				scrColour = nextByte;
+				scrColour &= 0xF;
+			} else if (pictureType == AGIPIC_V2) {	// disable screen drawing
+				scrOn = false;
+			}
+			break;
+		case 0xf2:	// set colour on priority (AGI pic v2)
 			priColour = nextByte;
-			priColour &= 0xf;	/* for v3 drawing diff */
+			priColour &= 0xf;	// for v3 drawing diff
 			priOn = true;
 			break;
-		case 0xf4:	/* y-corner */
+		case 0xf3:
+			if (pictureType == AGIPIC_V1) {
+				scrColour = nextByte;
+				scrColour &= 0xF;	// for v3 drawing diff
+				scrOn = true;
+				priColour = nextByte;
+				priColour &= 0xf;	// for v3 drawing diff
+				priOn = true;
+			}
+
+			// Empty in AGI pic V1.5
+
+			if (pictureType == AGIPIC_V2)	// disable priority screen
+				priOn = false;
+			break;
+		case 0xf4:	// y-corner
 			yCorner();
 			break;
-		case 0xf5:	/* x-corner */
+		case 0xf5:	// x-corner
 			xCorner();
 			break;
-		case 0xf6:	/* absolute draw lines */
+		case 0xf6:	// absolute draw lines
 			absoluteDrawLine();
 			break;
-		case 0xf7:	/* dynamic draw lines */
-		case 0xfb:
+		case 0xf7:	// dynamic draw lines
 			dynamicDrawLine();
 			break;
-		case 0xfa:
-			scrOn = false;
-			priOn = true;
-			absoluteDrawLine();
-			scrOn = true;
-			priOn = false;
+		case 0xf8:	// fill
+			if (pictureType == AGIPIC_V15) {
+				absoluteDrawLine();
+			} else if (pictureType == AGIPIC_V2) {
+				fill();
+			}
 			break;
-		case 0xfc:	/* fill */
-			scrColour = nextByte;
-			scrColour &= 0xF;
-			priColour = nextByte;
-			priColour &= 0xf;
-			fill();
-			break;
-		case 0xFF:	/* end of pic data */
-			drawing = 0;
-			break;
-		default:
-			warning("Unknown v1 picture opcode (%x)", act);
-		}
-	}
-}
+		case 0xf9:	// set pattern
+			if (pictureType == AGIPIC_V15) {
+				absoluteDrawLine();
+			} else if (pictureType == AGIPIC_V2) {
+				patCode = nextByte;
 
-/**************************************************************************
-** Draw AGI v1.5 format picture
-**************************************************************************/
-
-void PictureMgr::drawPictureV15() {
-	uint8 act;
-	int drawing;
-
-	patCode = 0;
-	patNum = 0;
-	priOn = scrOn = false;
-	scrColour = 0xf;
-
-	drawing = 1;
-
-	debugC(8, kDebugLevelMain, "Drawing v1.5 picture");
-	for (drawing = 1; drawing && foffs < flen;) {
-		act = nextByte;
-		switch (act) {
-		case 0xf0:	
+				if (_vm->getGameType() == GType_PreAGI)
+					plotBrush();
+			}
 			break;
-		case 0xf1:	/* set colour on screen */
-			scrColour = nextByte;
-			scrColour &= 0xF;
+		case 0xfa:	// plot brush
+			if (pictureType == AGIPIC_V1) {
+				scrOn = false;
+				priOn = true;
+				absoluteDrawLine();
+				scrOn = true;
+				priOn = false;
+			} else if (pictureType == AGIPIC_V15) {
+				absoluteDrawLine();
+			} else if (pictureType == AGIPIC_V2) {
+				plotBrush();
+			}
 			break;
-		case 0xf3:
-			break;
-		case 0xf8:	/* absolute draw lines */
-		case 0xf9:
-		case 0xfa:
 		case 0xfb:
-			absoluteDrawLine();
+			if (pictureType == AGIPIC_V1) {
+				dynamicDrawLine();
+			} else if (pictureType == AGIPIC_V15) {
+				absoluteDrawLine();
+			}
 			break;
-		case 0xfe:	/* fill */
+		case 0xfc:	// fill (AGI pic v1)
 			scrColour = nextByte;
 			scrColour &= 0xF;
-			scrOn = true;
+			priColour = nextByte;
+			priColour &= 0xf;
 			fill();
 			break;
-		case 0xFF:	/* end of pic data */
-			drawing = 0;
-			break;
-		default:
-			warning("Unknown v1.5 picture opcode (%x)", act);
-		}
-	}
-}
-
-/**************************************************************************
-** Draw AGI v2 format picture
-**************************************************************************/
-
-void PictureMgr::drawPictureV2() {
-	uint8 act;
-	int drawing;
-
-	patCode = 0;
-	patNum = 0;
-	priOn = scrOn = false;
-	scrColour = 0xf;
-	priColour = 0x4;
-
-	drawing = 1;
-
-	debugC(8, kDebugLevelMain, "Drawing v2 picture");
-	for (drawing = 1; drawing && foffs < flen;) {
-		act = nextByte;
-		switch (act) {
-		case 0xf0:	/* set colour on screen */
+		case 0xfe:	// fill (AGI pic v1.5)
 			scrColour = nextByte;
-			scrColour &= 0xF;	/* for v3 drawing diff */
+			scrColour &= 0xF;
 			scrOn = true;
-			break;
-		case 0xf1:	/* disable screen drawing */
-			scrOn = false;
-			break;
-		case 0xf2:	/* set colour on priority */
-			priColour = nextByte;
-			priColour &= 0xf;	/* for v3 drawing diff */
-			priOn = true;
-			break;
-		case 0xf3:	/* disable priority screen */
-			priOn = false;
-			break;
-		case 0xf4:	/* y-corner */
-			yCorner();
-			break;
-		case 0xf5:	/* x-corner */
-			xCorner();
-			break;
-		case 0xf6:	/* absolute draw lines */
-			absoluteDrawLine();
-			break;
-		case 0xf7:	/* dynamic draw lines */
-			dynamicDrawLine();
-			break;
-		case 0xf8:	/* fill */
 			fill();
 			break;
-		case 0xf9:	/* set pattern */
-			patCode = nextByte;
-
-			if (_vm->getGameType() == GType_PreAGI)
-				plotBrush();
-			break;
-		case 0xfA:	/* plot brush */
-			plotBrush();
-			break;
-		case 0xFF:	/* end of pic data */
+		case 0xff:	// end of pic data
 			drawing = 0;
 			break;
 		default:
@@ -825,7 +731,7 @@
 		memset(_vm->_game.sbuf16c, 0x4f, _WIDTH * _HEIGHT); // Clear 16 color AGI screen (Priority 4, color white).
 
 	if (!agi256) {
-		drawPictureV2(); // Draw 16 color picture.
+		drawPicture(); // Draw 16 color picture.
 	} else {
 		const uint32 maxFlen = _WIDTH * _HEIGHT;
 		memcpy(_vm->_game.sbuf256c, data, MIN(flen, maxFlen)); // Draw 256 color picture.

Modified: scummvm/trunk/engines/agi/picture.h
===================================================================
--- scummvm/trunk/engines/agi/picture.h	2007-09-01 23:30:37 UTC (rev 28810)
+++ scummvm/trunk/engines/agi/picture.h	2007-09-02 00:49:03 UTC (rev 28811)
@@ -38,6 +38,14 @@
 	uint8 *rdata;			/**< raw vector image data */
 };
 
+// AGI picture version
+enum AgiPictureVersion {
+	AGIPIC_C64,
+	AGIPIC_V1,
+	AGIPIC_V15,
+	AGIPIC_V2,
+};
+
 class AgiBase;
 class GfxMgr;
 
@@ -60,11 +68,11 @@
 	int plotPatternPoint(int x, int y, int bitpos);
 	void plotPattern(int x, int y);
 	void plotBrush();
-	void drawPictureVC64();
-	void drawPictureV1();
-	void drawPictureV15();
-	void drawPictureV2();
+	void drawPicture();
 
+	// TODO: this is hardcoded for V2 pictures for now
+	static const int pictureType = AGIPIC_V2;
+
 public:
 	PictureMgr(AgiBase *agi, GfxMgr *gfx) {
 		_vm = agi;


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