| 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 | }
|
|---|