From cca286b73a06bb93e111e46be07327c74fa3b2a8 Mon Sep 17 00:00:00 2001 From: MatthewBeshay <92357869+MatthewBeshay@users.noreply.github.com> Date: Wed, 1 Apr 2026 16:14:43 +1100 Subject: [PATCH] fix: getSubimage pixel data written to copy, not actual buffer --- .../Source Files/BufferedImage.cpp | 24 ++++++++++++++----- 1 file changed, 18 insertions(+), 6 deletions(-) diff --git a/minecraft/Minecraft.Client/Source Files/BufferedImage.cpp b/minecraft/Minecraft.Client/Source Files/BufferedImage.cpp index a9adab365..2bc104a4a 100644 --- a/minecraft/Minecraft.Client/Source Files/BufferedImage.cpp +++ b/minecraft/Minecraft.Client/Source Files/BufferedImage.cpp @@ -223,20 +223,32 @@ BufferedImage* BufferedImage::getSubimage(int x, int y, int w, int h) { // TODO - 4J Implement BufferedImage* img = new BufferedImage(w, h, 0); - std::vector arrayWrapper(img->data[0], img->data[0] + w * h); - this->getRGB(x, y, w, h, arrayWrapper, 0, w); + + // Copy pixel data directly into img->data[0]. + // The old arrayWithLength was a non-owning wrapper — std::vector copies, + // so we write to the raw array directly instead. + int srcW = width; + for (int row = 0; row < h; row++) { + for (int col = 0; col < w; col++) { + img->data[0][row * w + col] = + data[0][(y + row) * srcW + (x + col)]; + } + } int level = 1; - // prevent overflow while (level < 10 && getData(level) != nullptr) { int ww = w >> level; int hh = h >> level; int xx = x >> level; int yy = y >> level; + int srcW = width >> level; img->data[level] = new int[ww * hh]; - std::vector levelWrapper(img->data[level], img->data[level] + ww * hh); - this->getRGB(xx, yy, ww, hh, levelWrapper, 0, ww, level); - + for (int row = 0; row < hh; row++) { + for (int col = 0; col < ww; col++) { + img->data[level][row * ww + col] = + data[level][(yy + row) * srcW + (xx + col)]; + } + } ++level; }