handle this other random image

This commit is contained in:
Adam D. Ruppe 2022-07-26 11:03:29 -04:00
parent 4bb2d56480
commit 257d7277f1
1 changed files with 34 additions and 4 deletions

38
jpeg.d
View File

@ -2510,8 +2510,20 @@ private:
m_max_mcu_x_size = 8;
m_max_mcu_y_size = 8;
}
else
else if ((m_comp_h_samp.ptr[0] == 2) && (m_comp_v_samp.ptr[0] == 1))
{
// adr added this. idk if it is right seems wrong since it the same as above but..... meh ship it.
m_scan_type = JPGD_GRAYSCALE;
m_max_blocks_per_mcu = 4;
m_max_mcu_x_size = 8;
m_max_mcu_y_size = 8;
}
else {
// code -231 brings us here
//import std.conv;
//assert(0, to!string(m_comp_h_samp) ~ to!string(m_comp_v_samp));
stop_decoding(JPGD_UNSUPPORTED_SAMP_FACTORS);
}
}
else if (m_comps_in_frame == 3)
{
@ -3249,6 +3261,17 @@ public ubyte[] decompress_jpeg_image_from_file(bool useMalloc=false) (VFile fl,
// if we have access "arsd.color", add some handy API
static if (__traits(compiles, { import arsd.color; })) enum JpegHasArsd = true; else enum JpegHasArsd = false;
public struct LastJpegError {
int stage;
int code;
int details;
}
public LastJpegError lastJpegError;
static if (JpegHasArsd) {
import arsd.color;
@ -3261,7 +3284,7 @@ public MemoryImage readJpegFromStream (scope JpegStreamReadFunc rfn) {
if (rfn is null) return null;
auto decoder = jpeg_decoder(rfn);
if (decoder.error_code != JPGD_SUCCESS) return null;
if (decoder.error_code != JPGD_SUCCESS) { lastJpegError = LastJpegError(1, decoder.error_code); return null; }
version(jpegd_test) scope(exit) { import core.stdc.stdio : printf; printf("%u bytes read.\n", cast(uint)decoder.total_bytes_read); }
immutable int image_width = decoder.width;
@ -3272,7 +3295,11 @@ public MemoryImage readJpegFromStream (scope JpegStreamReadFunc rfn) {
version(jpegd_test) {{ import core.stdc.stdio; stderr.fprintf("starting (%dx%d)...\n", image_width, image_height); }}
if (decoder.begin_decoding() != JPGD_SUCCESS || image_width < 1 || image_height < 1) return null;
auto err = decoder.begin_decoding();
if (err != JPGD_SUCCESS || image_width < 1 || image_height < 1) {
lastJpegError = LastJpegError(2, err, decoder.m_error_code);
return null;
}
immutable int dst_bpl = image_width*req_comps;
auto img = new TrueColorImage(image_width, image_height);
@ -3284,7 +3311,9 @@ public MemoryImage readJpegFromStream (scope JpegStreamReadFunc rfn) {
const(ubyte)* pScan_line;
uint scan_line_len;
if (decoder.decode(/*(const void**)*/cast(void**)&pScan_line, &scan_line_len) != JPGD_SUCCESS) {
err = decoder.decode(/*(const void**)*/cast(void**)&pScan_line, &scan_line_len);
if (err != JPGD_SUCCESS) {
lastJpegError = LastJpegError(3, err);
img.clearInternal();
img = null;
//jpgd_free(pImage_data);
@ -3340,6 +3369,7 @@ public MemoryImage readJpegFromStream (scope JpegStreamReadFunc rfn) {
// ////////////////////////////////////////////////////////////////////////// //
/// decompress JPEG image from disk file.
/// Returns null if loading failed for any reason.
public MemoryImage readJpeg (const(char)[] filename) {
import core.stdc.stdio;