view_dims.Access_size().Set_x(imageSize.Get_x());
view_dims.Access_size().Set_y(imageSize.Get_y());
int region_buf_size = imageSize.Get_x() * imageSize.Get_y();
int[] region_buf = new int[region_buf_size];
Kdu_region_decompressor decompressor = new Kdu_region_decompressor();
decompressor.Start(codestream, channels, -1, params.getLevelReductionFactor(), 16384, image_dims,
ref_expansion, new Kdu_coords(1, 1), false, Kdu_global.KDU_WANT_OUTPUT_COMPONENTS);
Kdu_dims new_region = new Kdu_dims();
Kdu_dims incomplete_region = new Kdu_dims();
Kdu_coords viewSize = view_dims.Access_size();
incomplete_region.Assign(image_dims);
int[] imgBuffer = new int[viewSize.Get_x() * viewSize.Get_y()];
int[] kduBuffer = null;
while (decompressor.Process(region_buf, image_dims.Access_pos(), 0, 0, region_buf_size,
incomplete_region, new_region)) {
Kdu_coords newOffset = new_region.Access_pos();
Kdu_coords newSize = new_region.Access_size();
newOffset.Subtract(view_dims.Access_pos());
kduBuffer = region_buf;
int imgBuffereIdx = newOffset.Get_x() + newOffset.Get_y() * viewSize.Get_x();
int kduBufferIdx = 0;
int xDiff = viewSize.Get_x() - newSize.Get_x();
for (int j = 0; j < newSize.Get_y(); j++, imgBuffereIdx += xDiff) {
for (int i = 0; i < newSize.Get_x(); i++) {
imgBuffer[imgBuffereIdx++] = kduBuffer[kduBufferIdx++];
}
}
}
BufferedImage image = new BufferedImage(imageSize.Get_x(), imageSize.Get_y(), BufferedImage.TYPE_INT_RGB);
image.setRGB(0, 0, viewSize.Get_x(), viewSize.Get_y(), imgBuffer, 0, viewSize.Get_x());
if (params.getRotationDegree() > 0) {
image = ImageProcessingUtils.rotate(image, params.getRotationDegree());
}
decompressor.Native_destroy();
channels.Native_destroy();
if (codestream.Exists()) {
codestream.Destroy();
}
inputSource.Native_destroy();