CGE: replace some 'tricky replicate lines' memcpy by two, in order to avoid overlapping

This commit is contained in:
Strangerke 2011-07-09 00:25:09 +02:00
parent 080d7cf7f0
commit 0b27de942b
2 changed files with 23 additions and 7 deletions

View File

@ -108,7 +108,6 @@ public:
~Mouse();
void on();
void off();
void tick();
void newMouse(Common::Event &event);
private:
CGEEngine *_vm;

View File

@ -248,13 +248,22 @@ void Talk::putLine(int line, const char *text) {
// clear whole rectangle
p = v; // assume blanked line above text
memcpy(p, p - lsiz, rsiz);
byte *tmpBuf = new byte[rsiz];
memcpy(tmpBuf, p - lsiz, rsiz);
memcpy(p, tmpBuf, rsiz);
p += psiz; // tricky replicate lines for plane 0
memcpy(p, p - lsiz, rsiz);
memcpy(tmpBuf, p - lsiz, rsiz);
memcpy(p, tmpBuf, rsiz);
p += psiz; // same for plane 1
memcpy(p, p - lsiz, rsiz);
memcpy(tmpBuf, p - lsiz, rsiz);
memcpy(p, tmpBuf, rsiz);
p += psiz; // same for plane 2
memcpy(p, p - lsiz, rsiz); // same for plane 3
memcpy(tmpBuf, p - lsiz, rsiz);
memcpy(p, tmpBuf, rsiz);
delete[] tmpBuf;
// paint text line
if (text) {
@ -302,10 +311,18 @@ void InfoLine::update(const char *tx) {
uint16 size = 4 * psiz; // whole map size
// clear whole rectangle
byte *tmpBuf = new byte[size];
memset(v + 2, TEXT_BG, dsiz); // data bytes
memcpy(v + lsiz, v, psiz - lsiz); // tricky replicate lines
memcpy(tmpBuf, v, psiz - lsiz);
memcpy(v + lsiz, tmpBuf, psiz - lsiz);
*(uint16 *)(v + psiz - 2) = EOI; // plane trailer uint16
memcpy(v + psiz, v, 3 * psiz); // tricky replicate planes
memcpy(tmpBuf, v, 3 * psiz);
memcpy(v + psiz, tmpBuf, 3 * psiz);
delete[] tmpBuf;
// paint text line
if (tx) {