[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