diff --git a/src/main/java/azgracompress/io/loader/BasicLoader.java b/src/main/java/azgracompress/io/loader/BasicLoader.java index 244386bf095d1a4ee17c0056a34acea4cd056da0..e6260031365d5aeb133aaff742a0d1183fa477bd 100644 --- a/src/main/java/azgracompress/io/loader/BasicLoader.java +++ b/src/main/java/azgracompress/io/loader/BasicLoader.java @@ -188,7 +188,6 @@ public abstract class BasicLoader { valueAt(planeIndex, Block.index(dims.getX() - ((srcX - dims.getX()) + 1), srcY, dims.getX())); continue; } - } block[Block.index(x, y, blockDim.getX())] = valueAt(planeIndex, Block.index(srcX, srcY, dims.getX())); } @@ -199,14 +198,51 @@ public abstract class BasicLoader { int srcX, srcY; for (int y = 0; y < blockDim.getY(); y++) { srcY = blockYOffset + y; + // Row overflow if (srcY >= dims.getY()) { - // handleBlockRowOverflow(block, blockDim, y, srcY); - continue; + + if (wrappingStrategy == DataWrappingStrategy.LeaveBlank) + break; + + if (wrappingStrategy == DataWrappingStrategy.ClampToEdge) { + final int srcRow = dims.getY() - 1; + final int dstOffset = y * blockDim.getX(); + for (int x = 0; x < blockDim.getX(); x++) { + srcX = (blockXOffset + x); + if (srcX >= dims.getX()) + srcX = dims.getX() - 1; + block[dstOffset + x] = planeData[Block.index(srcX, srcRow, dims.getX())]; + } + continue; + } else if (wrappingStrategy == DataWrappingStrategy.MirroredRepeat) { + final int srcRow = dims.getY() - ((srcY - dims.getY()) + 1); + final int dstOffset = y * blockDim.getX(); + for (int x = 0; x < blockDim.getX(); x++) { + srcX = (blockXOffset + x); + if (srcX >= dims.getX()) + srcX = dims.getX() - 1; + block[dstOffset + x] = planeData[Block.index(srcX, srcRow, dims.getX())]; + } + continue; + } } for (int x = 0; x < blockDim.getX(); x++) { srcX = blockXOffset + x; - if (srcX >= dims.getX()) - break; + // Column overflow. + if (srcX >= dims.getX()) { + + if (wrappingStrategy == DataWrappingStrategy.LeaveBlank) + break; + if (wrappingStrategy == DataWrappingStrategy.ClampToEdge) { + block[Block.index(x, y, blockDim.getX())] = planeData[Block.index(dims.getX() - 1, srcY, dims.getX())]; + continue; + } else if (wrappingStrategy == DataWrappingStrategy.MirroredRepeat) { + + block[Block.index(x, y, blockDim.getX())] = + planeData[Block.index(dims.getX() - ((srcX - dims.getX()) + 1), srcY, dims.getX())]; + continue; + } + } block[Block.index(x, y, blockDim.getX())] = planeData[Block.index(srcX, srcY, dims.getX())]; }