[Scummvm-git-logs] scummvm master -> dc95314c1aef145c0acad544ae8e17d3c35d113b

djsrv dservilla at gmail.com
Thu Jun 10 16:02:45 UTC 2021


This automated email contains information about 9 new commits which have been
pushed to the 'scummvm' repo located at https://github.com/scummvm/scummvm .

Summary:
eee17da97a DIRECTOR: Add Score::getSpriteIdByMemberId
8ac995cf8a GRAPHICS: MACGUI: Allow selection to be drawn on inactive text
7baac7da4d GRAPHICS: MACGUI: Fix out of bounds array access
85a2bf6d7d DIRECTOR: LINGO: Implement b_hilite/c_hilite
5e1a0d5ddc DIRECTOR: LINGO: Use Common::isSpace to detect word boundaries
b5767a793c DIRECTOR: LINGO: Ignore non-existent chunks in b_hilite
e3f75a9bc4 DIRECTOR: LINGO: Implement b_delete/cb_delete
a2d35bbdf3 DIRECTOR: LINGO: Temporarily disable evaluation in c_eval
dc95314c1a DIRECTOR: LINGO: Add delete tests


Commit: eee17da97a1bc9f571f0028a0dbac5018f5d31f0
    https://github.com/scummvm/scummvm/commit/eee17da97a1bc9f571f0028a0dbac5018f5d31f0
Author: djsrv (dservilla at gmail.com)
Date: 2021-06-10T10:57:19-04:00

Commit Message:
DIRECTOR: Add Score::getSpriteIdByMemberId

Changed paths:
    engines/director/score.cpp
    engines/director/score.h


diff --git a/engines/director/score.cpp b/engines/director/score.cpp
index cbc6a49688..beae07970c 100644
--- a/engines/director/score.cpp
+++ b/engines/director/score.cpp
@@ -614,6 +614,14 @@ Common::List<Channel *> Score::getSpriteIntersections(const Common::Rect &r) {
 	return intersections;
 }
 
+uint16 Score::getSpriteIdByMemberId(uint16 id) {
+	for (uint i = 0; i < _channels.size(); i++)
+		if (_channels[i]->_sprite->_castId == id)
+			return i;
+
+	return 0;
+}
+
 Sprite *Score::getSpriteById(uint16 id) {
 	Channel *channel = getChannelById(id);
 
diff --git a/engines/director/score.h b/engines/director/score.h
index 061585e9d4..bc5f9de962 100644
--- a/engines/director/score.h
+++ b/engines/director/score.h
@@ -105,6 +105,7 @@ public:
 	uint16 getActiveSpriteIDFromPos(Common::Point pos);
 	bool checkSpriteIntersection(uint16 spriteId, Common::Point pos);
 	Common::List<Channel *> getSpriteIntersections(const Common::Rect &r);
+	uint16 getSpriteIdByMemberId(uint16 id);
 
 	bool renderTransition(uint16 frameId);
 	void renderFrame(uint16 frameId, RenderMode mode = kRenderModeNormal);


Commit: 8ac995cf8a2c75ad7b5a810947753c4f359f6798
    https://github.com/scummvm/scummvm/commit/8ac995cf8a2c75ad7b5a810947753c4f359f6798
Author: djsrv (dservilla at gmail.com)
Date: 2021-06-10T10:57:19-04:00

Commit Message:
GRAPHICS: MACGUI: Allow selection to be drawn on inactive text

Hilite can select text on an inactive text field

Changed paths:
    graphics/macgui/mactext.cpp


diff --git a/graphics/macgui/mactext.cpp b/graphics/macgui/mactext.cpp
index dd18cb6c83..6f7e8cf81a 100644
--- a/graphics/macgui/mactext.cpp
+++ b/graphics/macgui/mactext.cpp
@@ -1087,7 +1087,7 @@ bool MacText::draw(bool forceRedraw) {
 	if (_cursorState && !((_inTextSelection || _selectedText.endY != -1) && _active))
 		_composeSurface->blitFrom(*_cursorSurface, *_cursorRect, Common::Point(_cursorX, _cursorY + offset.y + 1));
 
-	if (_selectedText.endY != -1 && _active)
+	if (_selectedText.endY != -1)
 		drawSelection(offset.x, offset.y);
 
 	return true;


Commit: 7baac7da4d622631e314cbf940e3940fd0107337
    https://github.com/scummvm/scummvm/commit/7baac7da4d622631e314cbf940e3940fd0107337
Author: djsrv (dservilla at gmail.com)
Date: 2021-06-10T10:58:27-04:00

Commit Message:
GRAPHICS: MACGUI: Fix out of bounds array access

Changed paths:
    graphics/macgui/mactext.cpp


diff --git a/graphics/macgui/mactext.cpp b/graphics/macgui/mactext.cpp
index 6f7e8cf81a..9b5ed34781 100644
--- a/graphics/macgui/mactext.cpp
+++ b/graphics/macgui/mactext.cpp
@@ -1319,6 +1319,7 @@ void MacText::setSelection(int pos, bool start) {
 
 			row++;
 			if ((uint)row >= _textLines.size()) {
+				row = _textLines.size() - 1;
 				colX = _surface->w;
 				col = getLineCharWidth(row);
 


Commit: 85a2bf6d7db3c1b2b210234b73cba8d322858512
    https://github.com/scummvm/scummvm/commit/85a2bf6d7db3c1b2b210234b73cba8d322858512
Author: djsrv (dservilla at gmail.com)
Date: 2021-06-10T10:58:27-04:00

Commit Message:
DIRECTOR: LINGO: Implement b_hilite/c_hilite

Changed paths:
    engines/director/lingo/lingo-builtins.cpp
    engines/director/lingo/lingo-code.cpp


diff --git a/engines/director/lingo/lingo-builtins.cpp b/engines/director/lingo/lingo-builtins.cpp
index a4808c6925..985be188a6 100644
--- a/engines/director/lingo/lingo-builtins.cpp
+++ b/engines/director/lingo/lingo-builtins.cpp
@@ -27,6 +27,7 @@
 
 #include "graphics/macgui/macwindowmanager.h"
 #include "graphics/macgui/macmenu.h"
+#include "graphics/macgui/mactext.h"
 
 #include "director/director.h"
 #include "director/cast.h"
@@ -511,13 +512,33 @@ void LB::b_delete(int nargs) {
 }
 
 void LB::b_hilite(int nargs) {
-	Datum d = g_lingo->pop();
-
-	Datum res(d.asInt());
+	Datum d = g_lingo->pop(false);
+
+	int fieldId, start, end;
+	if (d.type == FIELDREF) {
+		fieldId = d.u.i;
+		start = -1;
+		end = -1;
+	} else if (d.type == CHUNKREF) {
+		TYPECHECK(d.u.cref->source, FIELDREF);
+		fieldId = d.u.cref->source.u.i;
+		start = d.u.cref->start;
+		end = d.u.cref->end;
+	} else {
+		warning("b_hilite: bad field type: %s", d.type2str());
+		return;
+	}
 
-	warning("STUB: b_hilite");
+	Score *score = g_director->getCurrentMovie()->getScore();
+	uint16 spriteId = score->getSpriteIdByMemberId(fieldId);
+	if (spriteId == 0)
+		return;
 
-	g_lingo->push(res);
+	Channel *channel = score->getChannelById(spriteId);
+	if (channel->_sprite->_cast && channel->_sprite->_cast->_type == kCastText && channel->_widget) {
+		((Graphics::MacText *)channel->_widget)->setSelection(start, true);
+		((Graphics::MacText *)channel->_widget)->setSelection(end, false);
+	}
 }
 
 void LB::b_length(int nargs) {
diff --git a/engines/director/lingo/lingo-code.cpp b/engines/director/lingo/lingo-code.cpp
index 133517a474..0428d2398d 100644
--- a/engines/director/lingo/lingo-code.cpp
+++ b/engines/director/lingo/lingo-code.cpp
@@ -1644,20 +1644,11 @@ void LC::c_procret() {
 }
 
 void LC::c_hilite() {
-	Datum first_char = g_lingo->pop();
-	Datum last_char = g_lingo->pop();
-	Datum first_word = g_lingo->pop();
-	Datum last_word = g_lingo->pop();
-	Datum first_item = g_lingo->pop();
-	Datum last_item = g_lingo->pop();
-	Datum first_line = g_lingo->pop();
-	Datum last_line = g_lingo->pop();
-	Datum cast_id = g_lingo->pop();
-
-	warning("STUB: LC::c_hilite(): %d %d %d %d %d %d %d %d %d",
-		first_char.u.i, last_char.u.i, first_word.u.i, last_word.u.i,
-		first_item.u.i, last_item.u.i, first_line.u.i, last_line.u.i,
-		cast_id.u.i);
+	Datum fieldID = g_lingo->pop().asCastId();
+	fieldID.type = FIELDREF;
+	Datum chunkRef = readChunkRef(fieldID);
+	g_lingo->push(chunkRef);
+	LB::b_hilite(1);
 }
 
 void LC::c_asserterror() {


Commit: 5e1a0d5ddc740c72087a9b205756ade840e2dc79
    https://github.com/scummvm/scummvm/commit/5e1a0d5ddc740c72087a9b205756ade840e2dc79
Author: djsrv (dservilla at gmail.com)
Date: 2021-06-10T10:58:27-04:00

Commit Message:
DIRECTOR: LINGO: Use Common::isSpace to detect word boundaries

Changed paths:
    engines/director/lingo/lingo-code.cpp


diff --git a/engines/director/lingo/lingo-code.cpp b/engines/director/lingo/lingo-code.cpp
index 0428d2398d..bf9b7055f3 100644
--- a/engines/director/lingo/lingo-code.cpp
+++ b/engines/director/lingo/lingo-code.cpp
@@ -915,10 +915,8 @@ Datum LC::chunkRef(ChunkType type, int startChunk, int endChunk, const Datum &sr
 		break;
 	case kChunkWord:
 		{
-			Common::String whitespace = "\t\n\r ";
-
 			int idx = 0;
-			while (idx < (int)str.size() && whitespace.contains(str[idx])) {
+			while (idx < (int)str.size() && Common::isSpace(str[idx])) {
 				idx++;
 			}
 			while (idx < (int)str.size()) {
@@ -931,7 +929,7 @@ Datum LC::chunkRef(ChunkType type, int startChunk, int endChunk, const Datum &sr
 					exprStartIdx = chunkStartIdx;
 				}
 
-				while (idx < (int)str.size() && !whitespace.contains(str[idx])) {
+				while (idx < (int)str.size() && !Common::isSpace(str[idx])) {
 					idx++;
 				}
 
@@ -943,7 +941,7 @@ Datum LC::chunkRef(ChunkType type, int startChunk, int endChunk, const Datum &sr
 					break;
 				}
 
-				while (idx < (int)str.size() && whitespace.contains(str[idx])) {
+				while (idx < (int)str.size() && Common::isSpace(str[idx])) {
 					idx++;
 				}
 			}


Commit: b5767a793c2647aa0e01d6b6066d57186c0b5ae9
    https://github.com/scummvm/scummvm/commit/b5767a793c2647aa0e01d6b6066d57186c0b5ae9
Author: djsrv (dservilla at gmail.com)
Date: 2021-06-10T10:58:27-04:00

Commit Message:
DIRECTOR: LINGO: Ignore non-existent chunks in b_hilite

Changed paths:
    engines/director/lingo/lingo-builtins.cpp


diff --git a/engines/director/lingo/lingo-builtins.cpp b/engines/director/lingo/lingo-builtins.cpp
index 985be188a6..7fdd667b97 100644
--- a/engines/director/lingo/lingo-builtins.cpp
+++ b/engines/director/lingo/lingo-builtins.cpp
@@ -517,7 +517,7 @@ void LB::b_hilite(int nargs) {
 	int fieldId, start, end;
 	if (d.type == FIELDREF) {
 		fieldId = d.u.i;
-		start = -1;
+		start = 0;
 		end = -1;
 	} else if (d.type == CHUNKREF) {
 		TYPECHECK(d.u.cref->source, FIELDREF);
@@ -529,6 +529,9 @@ void LB::b_hilite(int nargs) {
 		return;
 	}
 
+	if (start < 0)
+		return;
+
 	Score *score = g_director->getCurrentMovie()->getScore();
 	uint16 spriteId = score->getSpriteIdByMemberId(fieldId);
 	if (spriteId == 0)


Commit: e3f75a9bc49423fcb6fc34e9a71dfe97271ac47a
    https://github.com/scummvm/scummvm/commit/e3f75a9bc49423fcb6fc34e9a71dfe97271ac47a
Author: djsrv (dservilla at gmail.com)
Date: 2021-06-10T11:51:50-04:00

Commit Message:
DIRECTOR: LINGO: Implement b_delete/cb_delete

Changed paths:
    engines/director/lingo/lingo-builtins.cpp
    engines/director/lingo/lingo-bytecode.cpp


diff --git a/engines/director/lingo/lingo-builtins.cpp b/engines/director/lingo/lingo-builtins.cpp
index 7fdd667b97..14b0468cbc 100644
--- a/engines/director/lingo/lingo-builtins.cpp
+++ b/engines/director/lingo/lingo-builtins.cpp
@@ -502,13 +502,50 @@ void LB::b_charToNum(int nargs) {
 }
 
 void LB::b_delete(int nargs) {
-	Datum d = g_lingo->pop();
+	Datum d = g_lingo->pop(false);
 
-	Datum res(d.asInt());
+	Datum field;
+	int start, end;
+	if (d.type == FIELDREF || d.type == VAR) {
+		field = d;
+		start = 0;
+		end = -1;
+	} else if (d.type == CHUNKREF) {
+		TYPECHECK2(d.u.cref->source, FIELDREF, VAR);
+		field = d.u.cref->source;
+		start = d.u.cref->start;
+		end = d.u.cref->end;
+	} else {
+		warning("b_delete: bad field type: %s", d.type2str());
+		return;
+	}
 
-	warning("STUB: b_delete");
+	if (start < 0)
+		return;
 
-	g_lingo->push(res);
+	Common::String text = g_lingo->varFetch(field).asString();
+	if (d.type == CHUNKREF) {
+		switch (d.u.cref->type) {
+		case kChunkChar:
+			break;
+		case kChunkWord:
+			while (end < (int)text.size() && Common::isSpace(text[end]))
+				end++;
+			break;
+		case kChunkItem:
+		case kChunkLine:
+			// last char of the first portion is the delimiter. skip it.
+			if (start > 0)
+				start--;
+			break;
+		}
+	}
+
+	Common::String res = text.substr(0, start) + text.substr(end);
+	Datum s;
+	s.u.s = new Common::String(res);
+	s.type = STRING;
+	g_lingo->varAssign(field, s);
 }
 
 void LB::b_hilite(int nargs) {
diff --git a/engines/director/lingo/lingo-bytecode.cpp b/engines/director/lingo/lingo-bytecode.cpp
index db32e786e4..a926583a39 100644
--- a/engines/director/lingo/lingo-bytecode.cpp
+++ b/engines/director/lingo/lingo-bytecode.cpp
@@ -372,9 +372,12 @@ void LC::cb_unk2() {
 }
 
 void LC::cb_delete() {
-	g_lingo->readInt();
-	g_lingo->printSTUBWithArglist("cb_delete", 9);
-	g_lingo->dropStack(9);
+	int varType = g_lingo->readInt();
+	Datum varID = g_lingo->pop();
+	Datum var = g_lingo->findVarV4(varType, varID);
+	Datum chunkRef = readChunkRef(var);
+	g_lingo->push(chunkRef);
+	LB::b_delete(1);
 }
 
 void LC::cb_field() {


Commit: a2d35bbdf3d789e76365e460844eecb84664ae8e
    https://github.com/scummvm/scummvm/commit/a2d35bbdf3d789e76365e460844eecb84664ae8e
Author: djsrv (dservilla at gmail.com)
Date: 2021-06-10T11:52:36-04:00

Commit Message:
DIRECTOR: LINGO: Temporarily disable evaluation in c_eval

Changed paths:
    engines/director/lingo/lingo-code.cpp


diff --git a/engines/director/lingo/lingo-code.cpp b/engines/director/lingo/lingo-code.cpp
index bf9b7055f3..8e3911a043 100644
--- a/engines/director/lingo/lingo-code.cpp
+++ b/engines/director/lingo/lingo-code.cpp
@@ -499,6 +499,11 @@ void LC::c_assign() {
 void LC::c_eval() {
 	LC::c_varpush();
 
+	// HACK: The grammar currently doesn't differentiate between cases
+	// when it should push a reference (e.g. delete char 2 of "abc")
+	// and cases when it should push the value (e.g. put char 2 of "abc")
+	// Until that's fixed, just push the reference, and it will be evaluated by pop.
+#if 0
 	Datum d;
 	d = g_lingo->pop(false);
 
@@ -510,6 +515,7 @@ void LC::c_eval() {
 	d = g_lingo->varFetch(d);
 
 	g_lingo->push(d);
+#endif
 }
 
 void LC::c_theentitypush() {


Commit: dc95314c1aef145c0acad544ae8e17d3c35d113b
    https://github.com/scummvm/scummvm/commit/dc95314c1aef145c0acad544ae8e17d3c35d113b
Author: djsrv (dservilla at gmail.com)
Date: 2021-06-10T11:52:52-04:00

Commit Message:
DIRECTOR: LINGO: Add delete tests

Changed paths:
  A engines/director/lingo/tests/delete.lingo


diff --git a/engines/director/lingo/tests/delete.lingo b/engines/director/lingo/tests/delete.lingo
new file mode 100644
index 0000000000..62689daf9d
--- /dev/null
+++ b/engines/director/lingo/tests/delete.lingo
@@ -0,0 +1,43 @@
+put "qwertyuiop" into test
+delete char 2 of test
+scummvmAssertEqual(test, "qertyuiop")
+
+put "qwertyuiop" into test
+delete char 2 to 9 of test
+scummvmAssertEqual(test, "qp")
+
+put "qwertyuiop" into test
+delete char 2 to 1000 of test
+scummvmAssertEqual(test, "q")
+
+put "qwertyuiop" into test
+delete char 0 of test
+scummvmAssertEqual(test, "")
+
+put "lorem  ipsum    dolor" into test
+delete word 2 of test
+scummvmAssertEqual(test, "lorem  dolor")
+
+put "lorem  ipsum    dolor" into test
+delete word 2 to 3 of test
+scummvmAssertEqual(test, "lorem  ")
+
+put "lorem  ipsum    dolor" into test
+delete word 2 to 1000 of test
+scummvmAssertEqual(test, "lorem  ")
+
+put "lorem,ipsum,dolor,sit,amet" into test
+delete item 3 of test
+scummvmAssertEqual(test, "lorem,ipsum,sit,amet")
+
+put "lorem,ipsum,dolor,sit,amet" into test
+delete item 2 to 5 of test
+scummvmAssertEqual(test, "lorem")
+
+put "lorem" & RETURN & "ipsum" & RETURN & "dolor" & RETURN & "sit" & RETURN & "amet" into test
+delete line 3 of test
+scummvmAssertEqual(test, "lorem" & RETURN & "ipsum" & RETURN & "sit" & RETURN & "amet")
+
+put "lorem" & RETURN & "ipsum" & RETURN & "dolor" & RETURN & "sit" & RETURN & "amet" into test
+delete line 2 to 5 of test
+scummvmAssertEqual(test, "lorem")




More information about the Scummvm-git-logs mailing list