1 | diff --git a/engines/toon/toon.cpp b/engines/toon/toon.cpp
|
---|
2 | index 44c747c..30c4239 100644
|
---|
3 | --- a/engines/toon/toon.cpp
|
---|
4 | +++ b/engines/toon/toon.cpp
|
---|
5 | @@ -464,24 +464,42 @@ void ToonEngine::doMagnifierEffect() {
|
---|
6 | 11, 11, 11, 11, 12
|
---|
7 | };
|
---|
8 |
|
---|
9 | + // clip the range so that it doesn't go outside the screen
|
---|
10 | + int32 minY = -12, maxY = 12, minX = -12, maxX = 12;
|
---|
11 | + if (minY + posY < 0)
|
---|
12 | + minY = -posY;
|
---|
13 | + if (maxY + posY >= surface.h)
|
---|
14 | + maxY = surface.h - posY - 1;
|
---|
15 | + if (minX + posX < 0)
|
---|
16 | + minX = -posX;
|
---|
17 | + if (maxX + posX >= surface.w)
|
---|
18 | + maxX = surface.w - posX - 1;
|
---|
19 | +
|
---|
20 | byte tempBuffer[25 * 25];
|
---|
21 | - for (int32 y = -12; y <= 12; y++) {
|
---|
22 | - for (int32 x = -12; x <= 12; x++) {
|
---|
23 | + for (int32 y = minY; y <= maxY; y++) {
|
---|
24 | + for (int32 x = minX; x <= maxX; x++) {
|
---|
25 | int32 destPitch = surface.pitch;
|
---|
26 | uint8 *curRow = (uint8 *)surface.pixels + (posY + y) * destPitch + (posX + x);
|
---|
27 | tempBuffer[(y + 12) * 25 + x + 12] = *curRow;
|
---|
28 | }
|
---|
29 | }
|
---|
30 |
|
---|
31 | - for (int32 y = -12; y <= 12; y++) {
|
---|
32 | - for (int32 x = -12; x <= 12; x++) {
|
---|
33 | + for (int32 y = minY; y <= maxY; y++) {
|
---|
34 | + for (int32 x = minX; x <= maxX; x++) {
|
---|
35 | int32 dist = y * y + x * x;
|
---|
36 | if (dist > 144)
|
---|
37 | continue;
|
---|
38 | int32 destPitch = surface.pitch;
|
---|
39 | uint8 *curRow = (uint8 *)surface.pixels + (posY + y) * destPitch + (posX + x);
|
---|
40 | +
|
---|
41 | + // force the magnification source to only use pixels which are present
|
---|
42 | int32 lerp = (512 + intSqrt[dist] * 256 / 12);
|
---|
43 | - *curRow = tempBuffer[(y * lerp / 1024 + 12) * 25 + x * lerp / 1024 + 12];
|
---|
44 | + int32 srcX = (x * lerp / 1024);
|
---|
45 | + srcX = MAX(MIN(srcX, maxX), minX);
|
---|
46 | + int32 srcY = (y * lerp / 1024);
|
---|
47 | + srcY = MAX(MIN(srcY, maxY), minY);
|
---|
48 | +
|
---|
49 | + *curRow = tempBuffer[(srcY + 12) * 25 + srcX + 12];
|
---|
50 | }
|
---|
51 | }
|
---|
52 | }
|
---|