diff --git a/build/__pycache__/amsbuildlib4.cpython-312.pyc b/build/__pycache__/amsbuildlib4.cpython-312.pyc new file mode 100644 index 0000000..b8ce9c3 Binary files /dev/null and b/build/__pycache__/amsbuildlib4.cpython-312.pyc differ diff --git a/build_linux64/libamscimglib4.linux64.a b/build_linux64/libamscimglib4.linux64.a index 889d11a..e9e2953 100644 Binary files a/build_linux64/libamscimglib4.linux64.a and b/build_linux64/libamscimglib4.linux64.a differ diff --git a/build_linux64/libamscimglib4.linux64.so b/build_linux64/libamscimglib4.linux64.so index fe55311..c48ace3 100644 Binary files a/build_linux64/libamscimglib4.linux64.so and b/build_linux64/libamscimglib4.linux64.so differ diff --git a/build_linux64/objstore/amscimglib4_bitmap.o b/build_linux64/objstore/amscimglib4_bitmap.o index fc753be..5156daa 100644 Binary files a/build_linux64/objstore/amscimglib4_bitmap.o and b/build_linux64/objstore/amscimglib4_bitmap.o differ diff --git a/build_linux64/objstore/amscimglib4_image.o b/build_linux64/objstore/amscimglib4_image.o index d80ec3d..fb043f6 100644 Binary files a/build_linux64/objstore/amscimglib4_image.o and b/build_linux64/objstore/amscimglib4_image.o differ diff --git a/build_linux64/objstore/amscimglib4_jpeg.o b/build_linux64/objstore/amscimglib4_jpeg.o index d6a0d6a..f50b512 100644 Binary files a/build_linux64/objstore/amscimglib4_jpeg.o and b/build_linux64/objstore/amscimglib4_jpeg.o differ diff --git a/build_linux64/objstore/amscimglib4_png.o b/build_linux64/objstore/amscimglib4_png.o index 2dfe828..c1dd29e 100644 Binary files a/build_linux64/objstore/amscimglib4_png.o and b/build_linux64/objstore/amscimglib4_png.o differ diff --git a/build_linux64/objstore/amscimglib4_templatetest.o b/build_linux64/objstore/amscimglib4_templatetest.o index 9572ae3..641d176 100644 Binary files a/build_linux64/objstore/amscimglib4_templatetest.o and b/build_linux64/objstore/amscimglib4_templatetest.o differ diff --git a/build_linux64/objstore/amscimglib4_tests.o b/build_linux64/objstore/amscimglib4_tests.o index 4932087..2dc8cfd 100644 Binary files a/build_linux64/objstore/amscimglib4_tests.o and b/build_linux64/objstore/amscimglib4_tests.o differ diff --git a/build_linux64/objstore/amscimglib4_tests2.o b/build_linux64/objstore/amscimglib4_tests2.o new file mode 100644 index 0000000..fae8793 Binary files /dev/null and b/build_linux64/objstore/amscimglib4_tests2.o differ diff --git a/build_linux64/objstore/amscimglib4_util.o b/build_linux64/objstore/amscimglib4_util.o index afe56ca..ee751ea 100644 Binary files a/build_linux64/objstore/amscimglib4_util.o and b/build_linux64/objstore/amscimglib4_util.o differ diff --git a/build_linux64/tests b/build_linux64/tests index 251d612..2b9cb3c 100644 Binary files a/build_linux64/tests and b/build_linux64/tests differ diff --git a/build_mingw64/libamscimglib4.winx64.a b/build_mingw64/libamscimglib4.winx64.a index 089c742..0408e05 100644 Binary files a/build_mingw64/libamscimglib4.winx64.a and b/build_mingw64/libamscimglib4.winx64.a differ diff --git a/build_mingw64/libamscimglib4.winx64.dll b/build_mingw64/libamscimglib4.winx64.dll index 0e6e243..4473f11 100644 Binary files a/build_mingw64/libamscimglib4.winx64.dll and b/build_mingw64/libamscimglib4.winx64.dll differ diff --git a/build_mingw64/objstore/amscimglib4_image.o b/build_mingw64/objstore/amscimglib4_image.o index 8c74c24..db1a11d 100644 Binary files a/build_mingw64/objstore/amscimglib4_image.o and b/build_mingw64/objstore/amscimglib4_image.o differ diff --git a/build_mingw64/objstore/amscimglib4_png.o b/build_mingw64/objstore/amscimglib4_png.o index 545fd66..71c181e 100644 Binary files a/build_mingw64/objstore/amscimglib4_png.o and b/build_mingw64/objstore/amscimglib4_png.o differ diff --git a/build_mingw64/objstore/amscimglib4_tests.o b/build_mingw64/objstore/amscimglib4_tests.o index f61c112..c6b58dc 100644 Binary files a/build_mingw64/objstore/amscimglib4_tests.o and b/build_mingw64/objstore/amscimglib4_tests.o differ diff --git a/build_mingw64/objstore/amscimglib4_tests2.o b/build_mingw64/objstore/amscimglib4_tests2.o new file mode 100644 index 0000000..4209514 Binary files /dev/null and b/build_mingw64/objstore/amscimglib4_tests2.o differ diff --git a/build_mingw64/objstore/amscimglib4_util.o b/build_mingw64/objstore/amscimglib4_util.o index fd79fb3..7bc8ae0 100644 Binary files a/build_mingw64/objstore/amscimglib4_util.o and b/build_mingw64/objstore/amscimglib4_util.o differ diff --git a/build_mingw64/tests.exe b/build_mingw64/tests.exe index 983a6ea..a583f25 100644 Binary files a/build_mingw64/tests.exe and b/build_mingw64/tests.exe differ diff --git a/dependencies/linux64/include/jerror.h b/dependencies/linux64/include/jerror.h new file mode 100644 index 0000000..fc2fffe --- /dev/null +++ b/dependencies/linux64/include/jerror.h @@ -0,0 +1,291 @@ +/* + * jerror.h + * + * Copyright (C) 1994-1997, Thomas G. Lane. + * This file is part of the Independent JPEG Group's software. + * For conditions of distribution and use, see the accompanying README file. + * + * This file defines the error and message codes for the JPEG library. + * Edit this file to add new codes, or to translate the message strings to + * some other language. + * A set of error-reporting macros are defined too. Some applications using + * the JPEG library may wish to include this file to get the error codes + * and/or the macros. + */ + +/* + * To define the enum list of message codes, include this file without + * defining macro JMESSAGE. To create a message string table, include it + * again with a suitable JMESSAGE definition (see jerror.c for an example). + */ +#ifndef JMESSAGE +#ifndef JERROR_H +/* First time through, define the enum list */ +#define JMAKE_ENUM_LIST +#else +/* Repeated inclusions of this file are no-ops unless JMESSAGE is defined */ +#define JMESSAGE(code,string) +#endif /* JERROR_H */ +#endif /* JMESSAGE */ + +#ifdef JMAKE_ENUM_LIST + +typedef enum { + +#define JMESSAGE(code,string) code , + +#endif /* JMAKE_ENUM_LIST */ + +JMESSAGE(JMSG_NOMESSAGE, "Bogus message code %d") /* Must be first entry! */ + +/* For maintenance convenience, list is alphabetical by message code name */ +JMESSAGE(JERR_ARITH_NOTIMPL, + "Sorry, there are legal restrictions on arithmetic coding") +JMESSAGE(JERR_BAD_ALIGN_TYPE, "ALIGN_TYPE is wrong, please fix") +JMESSAGE(JERR_BAD_ALLOC_CHUNK, "MAX_ALLOC_CHUNK is wrong, please fix") +JMESSAGE(JERR_BAD_BUFFER_MODE, "Bogus buffer control mode") +JMESSAGE(JERR_BAD_COMPONENT_ID, "Invalid component ID %d in SOS") +JMESSAGE(JERR_BAD_DCT_COEF, "DCT coefficient out of range") +JMESSAGE(JERR_BAD_DCTSIZE, "IDCT output block size %d not supported") +JMESSAGE(JERR_BAD_HUFF_TABLE, "Bogus Huffman table definition") +JMESSAGE(JERR_BAD_IN_COLORSPACE, "Bogus input colorspace") +JMESSAGE(JERR_BAD_J_COLORSPACE, "Bogus JPEG colorspace") +JMESSAGE(JERR_BAD_LENGTH, "Bogus marker length") +JMESSAGE(JERR_BAD_LIB_VERSION, + "Wrong JPEG library version: library is %d, caller expects %d") +JMESSAGE(JERR_BAD_MCU_SIZE, "Sampling factors too large for interleaved scan") +JMESSAGE(JERR_BAD_POOL_ID, "Invalid memory pool code %d") +JMESSAGE(JERR_BAD_PRECISION, "Unsupported JPEG data precision %d") +JMESSAGE(JERR_BAD_PROGRESSION, + "Invalid progressive parameters Ss=%d Se=%d Ah=%d Al=%d") +JMESSAGE(JERR_BAD_PROG_SCRIPT, + "Invalid progressive parameters at scan script entry %d") +JMESSAGE(JERR_BAD_SAMPLING, "Bogus sampling factors") +JMESSAGE(JERR_BAD_SCAN_SCRIPT, "Invalid scan script at entry %d") +JMESSAGE(JERR_BAD_STATE, "Improper call to JPEG library in state %d") +JMESSAGE(JERR_BAD_STRUCT_SIZE, + "JPEG parameter struct mismatch: library thinks size is %u, caller expects %u") +JMESSAGE(JERR_BAD_VIRTUAL_ACCESS, "Bogus virtual array access") +JMESSAGE(JERR_BUFFER_SIZE, "Buffer passed to JPEG library is too small") +JMESSAGE(JERR_CANT_SUSPEND, "Suspension not allowed here") +JMESSAGE(JERR_CCIR601_NOTIMPL, "CCIR601 sampling not implemented yet") +JMESSAGE(JERR_COMPONENT_COUNT, "Too many color components: %d, max %d") +JMESSAGE(JERR_CONVERSION_NOTIMPL, "Unsupported color conversion request") +JMESSAGE(JERR_DAC_INDEX, "Bogus DAC index %d") +JMESSAGE(JERR_DAC_VALUE, "Bogus DAC value 0x%x") +JMESSAGE(JERR_DHT_INDEX, "Bogus DHT index %d") +JMESSAGE(JERR_DQT_INDEX, "Bogus DQT index %d") +JMESSAGE(JERR_EMPTY_IMAGE, "Empty JPEG image (DNL not supported)") +JMESSAGE(JERR_EMS_READ, "Read from EMS failed") +JMESSAGE(JERR_EMS_WRITE, "Write to EMS failed") +JMESSAGE(JERR_EOI_EXPECTED, "Didn't expect more than one scan") +JMESSAGE(JERR_FILE_READ, "Input file read error") +JMESSAGE(JERR_FILE_WRITE, "Output file write error --- out of disk space?") +JMESSAGE(JERR_FRACT_SAMPLE_NOTIMPL, "Fractional sampling not implemented yet") +JMESSAGE(JERR_HUFF_CLEN_OVERFLOW, "Huffman code size table overflow") +JMESSAGE(JERR_HUFF_MISSING_CODE, "Missing Huffman code table entry") +JMESSAGE(JERR_IMAGE_TOO_BIG, "Maximum supported image dimension is %u pixels") +JMESSAGE(JERR_INPUT_EMPTY, "Empty input file") +JMESSAGE(JERR_INPUT_EOF, "Premature end of input file") +JMESSAGE(JERR_MISMATCHED_QUANT_TABLE, + "Cannot transcode due to multiple use of quantization table %d") +JMESSAGE(JERR_MISSING_DATA, "Scan script does not transmit all data") +JMESSAGE(JERR_MODE_CHANGE, "Invalid color quantization mode change") +JMESSAGE(JERR_NOTIMPL, "Not implemented yet") +JMESSAGE(JERR_NOT_COMPILED, "Requested feature was omitted at compile time") +JMESSAGE(JERR_NO_BACKING_STORE, "Backing store not supported") +JMESSAGE(JERR_NO_HUFF_TABLE, "Huffman table 0x%02x was not defined") +JMESSAGE(JERR_NO_IMAGE, "JPEG datastream contains no image") +JMESSAGE(JERR_NO_QUANT_TABLE, "Quantization table 0x%02x was not defined") +JMESSAGE(JERR_NO_SOI, "Not a JPEG file: starts with 0x%02x 0x%02x") +JMESSAGE(JERR_OUT_OF_MEMORY, "Insufficient memory (case %d)") +JMESSAGE(JERR_QUANT_COMPONENTS, + "Cannot quantize more than %d color components") +JMESSAGE(JERR_QUANT_FEW_COLORS, "Cannot quantize to fewer than %d colors") +JMESSAGE(JERR_QUANT_MANY_COLORS, "Cannot quantize to more than %d colors") +JMESSAGE(JERR_SOF_DUPLICATE, "Invalid JPEG file structure: two SOF markers") +JMESSAGE(JERR_SOF_NO_SOS, "Invalid JPEG file structure: missing SOS marker") +JMESSAGE(JERR_SOF_UNSUPPORTED, "Unsupported JPEG process: SOF type 0x%02x") +JMESSAGE(JERR_SOI_DUPLICATE, "Invalid JPEG file structure: two SOI markers") +JMESSAGE(JERR_SOS_NO_SOF, "Invalid JPEG file structure: SOS before SOF") +JMESSAGE(JERR_TFILE_CREATE, "Failed to create temporary file %s") +JMESSAGE(JERR_TFILE_READ, "Read failed on temporary file") +JMESSAGE(JERR_TFILE_SEEK, "Seek failed on temporary file") +JMESSAGE(JERR_TFILE_WRITE, + "Write failed on temporary file --- out of disk space?") +JMESSAGE(JERR_TOO_LITTLE_DATA, "Application transferred too few scanlines") +JMESSAGE(JERR_UNKNOWN_MARKER, "Unsupported marker type 0x%02x") +JMESSAGE(JERR_VIRTUAL_BUG, "Virtual array controller messed up") +JMESSAGE(JERR_WIDTH_OVERFLOW, "Image too wide for this implementation") +JMESSAGE(JERR_XMS_READ, "Read from XMS failed") +JMESSAGE(JERR_XMS_WRITE, "Write to XMS failed") +JMESSAGE(JMSG_COPYRIGHT, JCOPYRIGHT) +JMESSAGE(JMSG_VERSION, JVERSION) +JMESSAGE(JTRC_16BIT_TABLES, + "Caution: quantization tables are too coarse for baseline JPEG") +JMESSAGE(JTRC_ADOBE, + "Adobe APP14 marker: version %d, flags 0x%04x 0x%04x, transform %d") +JMESSAGE(JTRC_APP0, "Unknown APP0 marker (not JFIF), length %u") +JMESSAGE(JTRC_APP14, "Unknown APP14 marker (not Adobe), length %u") +JMESSAGE(JTRC_DAC, "Define Arithmetic Table 0x%02x: 0x%02x") +JMESSAGE(JTRC_DHT, "Define Huffman Table 0x%02x") +JMESSAGE(JTRC_DQT, "Define Quantization Table %d precision %d") +JMESSAGE(JTRC_DRI, "Define Restart Interval %u") +JMESSAGE(JTRC_EMS_CLOSE, "Freed EMS handle %u") +JMESSAGE(JTRC_EMS_OPEN, "Obtained EMS handle %u") +JMESSAGE(JTRC_EOI, "End Of Image") +JMESSAGE(JTRC_HUFFBITS, " %3d %3d %3d %3d %3d %3d %3d %3d") +JMESSAGE(JTRC_JFIF, "JFIF APP0 marker: version %d.%02d, density %dx%d %d") +JMESSAGE(JTRC_JFIF_BADTHUMBNAILSIZE, + "Warning: thumbnail image size does not match data length %u") +JMESSAGE(JTRC_JFIF_EXTENSION, + "JFIF extension marker: type 0x%02x, length %u") +JMESSAGE(JTRC_JFIF_THUMBNAIL, " with %d x %d thumbnail image") +JMESSAGE(JTRC_MISC_MARKER, "Miscellaneous marker 0x%02x, length %u") +JMESSAGE(JTRC_PARMLESS_MARKER, "Unexpected marker 0x%02x") +JMESSAGE(JTRC_QUANTVALS, " %4u %4u %4u %4u %4u %4u %4u %4u") +JMESSAGE(JTRC_QUANT_3_NCOLORS, "Quantizing to %d = %d*%d*%d colors") +JMESSAGE(JTRC_QUANT_NCOLORS, "Quantizing to %d colors") +JMESSAGE(JTRC_QUANT_SELECTED, "Selected %d colors for quantization") +JMESSAGE(JTRC_RECOVERY_ACTION, "At marker 0x%02x, recovery action %d") +JMESSAGE(JTRC_RST, "RST%d") +JMESSAGE(JTRC_SMOOTH_NOTIMPL, + "Smoothing not supported with nonstandard sampling ratios") +JMESSAGE(JTRC_SOF, "Start Of Frame 0x%02x: width=%u, height=%u, components=%d") +JMESSAGE(JTRC_SOF_COMPONENT, " Component %d: %dhx%dv q=%d") +JMESSAGE(JTRC_SOI, "Start of Image") +JMESSAGE(JTRC_SOS, "Start Of Scan: %d components") +JMESSAGE(JTRC_SOS_COMPONENT, " Component %d: dc=%d ac=%d") +JMESSAGE(JTRC_SOS_PARAMS, " Ss=%d, Se=%d, Ah=%d, Al=%d") +JMESSAGE(JTRC_TFILE_CLOSE, "Closed temporary file %s") +JMESSAGE(JTRC_TFILE_OPEN, "Opened temporary file %s") +JMESSAGE(JTRC_THUMB_JPEG, + "JFIF extension marker: JPEG-compressed thumbnail image, length %u") +JMESSAGE(JTRC_THUMB_PALETTE, + "JFIF extension marker: palette thumbnail image, length %u") +JMESSAGE(JTRC_THUMB_RGB, + "JFIF extension marker: RGB thumbnail image, length %u") +JMESSAGE(JTRC_UNKNOWN_IDS, + "Unrecognized component IDs %d %d %d, assuming YCbCr") +JMESSAGE(JTRC_XMS_CLOSE, "Freed XMS handle %u") +JMESSAGE(JTRC_XMS_OPEN, "Obtained XMS handle %u") +JMESSAGE(JWRN_ADOBE_XFORM, "Unknown Adobe color transform code %d") +JMESSAGE(JWRN_BOGUS_PROGRESSION, + "Inconsistent progression sequence for component %d coefficient %d") +JMESSAGE(JWRN_EXTRANEOUS_DATA, + "Corrupt JPEG data: %u extraneous bytes before marker 0x%02x") +JMESSAGE(JWRN_HIT_MARKER, "Corrupt JPEG data: premature end of data segment") +JMESSAGE(JWRN_HUFF_BAD_CODE, "Corrupt JPEG data: bad Huffman code") +JMESSAGE(JWRN_JFIF_MAJOR, "Warning: unknown JFIF revision number %d.%02d") +JMESSAGE(JWRN_JPEG_EOF, "Premature end of JPEG file") +JMESSAGE(JWRN_MUST_RESYNC, + "Corrupt JPEG data: found marker 0x%02x instead of RST%d") +JMESSAGE(JWRN_NOT_SEQUENTIAL, "Invalid SOS parameters for sequential JPEG") +JMESSAGE(JWRN_TOO_MUCH_DATA, "Application transferred too many scanlines") + +#ifdef JMAKE_ENUM_LIST + + JMSG_LASTMSGCODE +} J_MESSAGE_CODE; + +#undef JMAKE_ENUM_LIST +#endif /* JMAKE_ENUM_LIST */ + +/* Zap JMESSAGE macro so that future re-inclusions do nothing by default */ +#undef JMESSAGE + + +#ifndef JERROR_H +#define JERROR_H + +/* Macros to simplify using the error and trace message stuff */ +/* The first parameter is either type of cinfo pointer */ + +/* Fatal errors (print message and exit) */ +#define ERREXIT(cinfo,code) \ + ((cinfo)->err->msg_code = (code), \ + (*(cinfo)->err->error_exit) ((j_common_ptr) (cinfo))) +#define ERREXIT1(cinfo,code,p1) \ + ((cinfo)->err->msg_code = (code), \ + (cinfo)->err->msg_parm.i[0] = (p1), \ + (*(cinfo)->err->error_exit) ((j_common_ptr) (cinfo))) +#define ERREXIT2(cinfo,code,p1,p2) \ + ((cinfo)->err->msg_code = (code), \ + (cinfo)->err->msg_parm.i[0] = (p1), \ + (cinfo)->err->msg_parm.i[1] = (p2), \ + (*(cinfo)->err->error_exit) ((j_common_ptr) (cinfo))) +#define ERREXIT3(cinfo,code,p1,p2,p3) \ + ((cinfo)->err->msg_code = (code), \ + (cinfo)->err->msg_parm.i[0] = (p1), \ + (cinfo)->err->msg_parm.i[1] = (p2), \ + (cinfo)->err->msg_parm.i[2] = (p3), \ + (*(cinfo)->err->error_exit) ((j_common_ptr) (cinfo))) +#define ERREXIT4(cinfo,code,p1,p2,p3,p4) \ + ((cinfo)->err->msg_code = (code), \ + (cinfo)->err->msg_parm.i[0] = (p1), \ + (cinfo)->err->msg_parm.i[1] = (p2), \ + (cinfo)->err->msg_parm.i[2] = (p3), \ + (cinfo)->err->msg_parm.i[3] = (p4), \ + (*(cinfo)->err->error_exit) ((j_common_ptr) (cinfo))) +#define ERREXITS(cinfo,code,str) \ + ((cinfo)->err->msg_code = (code), \ + strncpy((cinfo)->err->msg_parm.s, (str), JMSG_STR_PARM_MAX), \ + (*(cinfo)->err->error_exit) ((j_common_ptr) (cinfo))) + +#define MAKESTMT(stuff) do { stuff } while (0) + +/* Nonfatal errors (we can keep going, but the data is probably corrupt) */ +#define WARNMS(cinfo,code) \ + ((cinfo)->err->msg_code = (code), \ + (*(cinfo)->err->emit_message) ((j_common_ptr) (cinfo), -1)) +#define WARNMS1(cinfo,code,p1) \ + ((cinfo)->err->msg_code = (code), \ + (cinfo)->err->msg_parm.i[0] = (p1), \ + (*(cinfo)->err->emit_message) ((j_common_ptr) (cinfo), -1)) +#define WARNMS2(cinfo,code,p1,p2) \ + ((cinfo)->err->msg_code = (code), \ + (cinfo)->err->msg_parm.i[0] = (p1), \ + (cinfo)->err->msg_parm.i[1] = (p2), \ + (*(cinfo)->err->emit_message) ((j_common_ptr) (cinfo), -1)) + +/* Informational/debugging messages */ +#define TRACEMS(cinfo,lvl,code) \ + ((cinfo)->err->msg_code = (code), \ + (*(cinfo)->err->emit_message) ((j_common_ptr) (cinfo), (lvl))) +#define TRACEMS1(cinfo,lvl,code,p1) \ + ((cinfo)->err->msg_code = (code), \ + (cinfo)->err->msg_parm.i[0] = (p1), \ + (*(cinfo)->err->emit_message) ((j_common_ptr) (cinfo), (lvl))) +#define TRACEMS2(cinfo,lvl,code,p1,p2) \ + ((cinfo)->err->msg_code = (code), \ + (cinfo)->err->msg_parm.i[0] = (p1), \ + (cinfo)->err->msg_parm.i[1] = (p2), \ + (*(cinfo)->err->emit_message) ((j_common_ptr) (cinfo), (lvl))) +#define TRACEMS3(cinfo,lvl,code,p1,p2,p3) \ + MAKESTMT(int * _mp = (cinfo)->err->msg_parm.i; \ + _mp[0] = (p1); _mp[1] = (p2); _mp[2] = (p3); \ + (cinfo)->err->msg_code = (code); \ + (*(cinfo)->err->emit_message) ((j_common_ptr) (cinfo), (lvl)); ) +#define TRACEMS4(cinfo,lvl,code,p1,p2,p3,p4) \ + MAKESTMT(int * _mp = (cinfo)->err->msg_parm.i; \ + _mp[0] = (p1); _mp[1] = (p2); _mp[2] = (p3); _mp[3] = (p4); \ + (cinfo)->err->msg_code = (code); \ + (*(cinfo)->err->emit_message) ((j_common_ptr) (cinfo), (lvl)); ) +#define TRACEMS5(cinfo,lvl,code,p1,p2,p3,p4,p5) \ + MAKESTMT(int * _mp = (cinfo)->err->msg_parm.i; \ + _mp[0] = (p1); _mp[1] = (p2); _mp[2] = (p3); _mp[3] = (p4); \ + _mp[4] = (p5); \ + (cinfo)->err->msg_code = (code); \ + (*(cinfo)->err->emit_message) ((j_common_ptr) (cinfo), (lvl)); ) +#define TRACEMS8(cinfo,lvl,code,p1,p2,p3,p4,p5,p6,p7,p8) \ + MAKESTMT(int * _mp = (cinfo)->err->msg_parm.i; \ + _mp[0] = (p1); _mp[1] = (p2); _mp[2] = (p3); _mp[3] = (p4); \ + _mp[4] = (p5); _mp[5] = (p6); _mp[6] = (p7); _mp[7] = (p8); \ + (cinfo)->err->msg_code = (code); \ + (*(cinfo)->err->emit_message) ((j_common_ptr) (cinfo), (lvl)); ) +#define TRACEMSS(cinfo,lvl,code,str) \ + ((cinfo)->err->msg_code = (code), \ + strncpy((cinfo)->err->msg_parm.s, (str), JMSG_STR_PARM_MAX), \ + (*(cinfo)->err->emit_message) ((j_common_ptr) (cinfo), (lvl))) + +#endif /* JERROR_H */ diff --git a/include/amscimglib4/amscimglib4.h b/include/amscimglib4/amscimglib4.h index ef3a06b..a493876 100644 --- a/include/amscimglib4/amscimglib4.h +++ b/include/amscimglib4/amscimglib4.h @@ -118,7 +118,13 @@ AMSCIMGLIB4_API void amscimglib4_writeimage_png(const char *fname, amscimglib4_i AMSCIMGLIB4_API void amscimglib4_readimage_jpeg(const char *fname, amscimglib4_image *img); AMSCIMGLIB4_API void amscimglib4_writeimage_jpeg(const char *fname, amscimglib4_image *img, int quality); +//Read and write PNG files from memory buffers +AMSCIMGLIB4_API int amscimglib4_pngbytebuffer_to_img(amscimglib4_image *img, unsigned char *bytebuffer, long nbytes); +//returns length required for a bytebuffer to store img as a png +AMSCIMGLIB4_API long amscimglib4_pngbytebufferlen(amscimglib4_image *img); + +AMSCIMGLIB4_API int amscimglib4_pngbytebuffer_from_img(amscimglib4_image *img, unsigned char *bytebuffer, long bufflen, long *nbytes); #ifdef __cplusplus diff --git a/include/amscimglib4/amscimglib4_intl.h b/include/amscimglib4/amscimglib4_intl.h index 93a5d9a..25c25f0 100644 --- a/include/amscimglib4/amscimglib4_intl.h +++ b/include/amscimglib4/amscimglib4_intl.h @@ -14,7 +14,12 @@ extern "C" { #endif //returns the size of a file using ANSI C -unsigned int amscimglib4_filesize(FILE *fp); +unsigned long amscimglib4_filesize(FILE *fp); + +int amscimglib4_readbinfile(const char *fname, unsigned char *bytes, long bufflen, long *bytesread); + +int amscimglib4_writebinfile(const char *fname, unsigned char *bytes, long bufflen); + #ifdef __cplusplus }; //end extern "C" diff --git a/include/amscimglib4/amscimglib4_tests.h b/include/amscimglib4/amscimglib4_tests.h index 0dc10d6..53ade97 100644 --- a/include/amscimglib4/amscimglib4_tests.h +++ b/include/amscimglib4/amscimglib4_tests.h @@ -9,6 +9,9 @@ AMSCIMGLIB4_API void amscimglib4_test_init(); AMSCIMGLIB4_API void amscimglib4_test_loadsave(); +AMSCIMGLIB4_API void amscimglib4_test_binreadwrite(); + + #ifdef __cplusplus }; //end extern "C" #endif diff --git a/src/amscimglib4/amscimglib4_image.c b/src/amscimglib4/amscimglib4_image.c index 8f8dd53..731e6e1 100644 --- a/src/amscimglib4/amscimglib4_image.c +++ b/src/amscimglib4/amscimglib4_image.c @@ -473,7 +473,7 @@ AMSCIMGLIB4_API void amscimglib4_writeimage(const char *fname, amscimglib4_image } else if(strcmp(ext,".bmp")==0) { - amscimglib4_writeimage_select(fname,img,amscimglib4_type_png); + amscimglib4_writeimage_select(fname,img,amscimglib4_type_bmp); } else if(strcmp(ext,".jpg")==0||strcmp(ext,".jpeg")==0) { diff --git a/src/amscimglib4/amscimglib4_png.c b/src/amscimglib4/amscimglib4_png.c index 0b569c3..5e02a2f 100644 --- a/src/amscimglib4/amscimglib4_png.c +++ b/src/amscimglib4/amscimglib4_png.c @@ -136,6 +136,272 @@ AMSCIMGLIB4_API void amscimglib4_writeimage_png(const char *fname, amscimglib4_i } + +//Nevermind, there is a int png_image_begin_read_from_memory(png_imagep image, png_const_voidp memory, size_t size) + +// int png_image_write_to_memory (png_imagep image, void *memory, +// png_alloc_size_t * PNG_RESTRICT memory_bytes, +// int convert_to_8_bit, const void *buffer, ptrdiff_t row_stride, +// const void *colormap)); + + + +//Reads and writes png data to and from a bytebuffer in memory (for compression) +AMSCIMGLIB4_API int amscimglib4_pngbytebuffer_to_img(amscimglib4_image *img, unsigned char *bytebuffer, long nbytes) +{ + int ret = amscimglib4_success; + int res; + png_image image; //control structure used by libpng + unsigned char *imgbuffer = NULL; + long z; + unsigned char R,G,B,A; + long I,J; + + + if(img==NULL || bytebuffer==NULL || nbytes<8) + { + ret = amscimglib4_failure; + return ret; + } + + memset(&image,0,sizeof(image)); //fills memory with zeros + image.version = PNG_IMAGE_VERSION; + + res = png_image_begin_read_from_memory(&image,bytebuffer,nbytes); + if(res != 0) + { + image.format = PNG_FORMAT_RGBA; //force conversion to RGBA before calling finish read + imgbuffer = (png_bytep) malloc(PNG_IMAGE_SIZE(image)); + if(imgbuffer==NULL) + { + printf("amscimglib4_pngbytebuffer_to_img:: imgbuffer failed to allocate.\n"); + ret = amscimglib4_failure; + png_image_free(&image); + return ret; + } + + + res = png_image_finish_read( + &image, + NULL, //background + imgbuffer, //buffer to fill + 0, //row stride + NULL //colormap + ); + + if(res!=0 && imgbuffer!=NULL) + { + res = amscimglib4_image_resize(img,image.width,image.height); + if(res==amscimglib4_success) + { + for(I=0;Isizex; + pngimage.height = img->sizey; + + res = png_image_write_to_memory( + &pngimage, + NULL, //memory + &bufflen, //buffer size required + 0, //convert to 8 bit + img->data, //RGBA buffer + 0, //row stride, + NULL //colormap + ); + + ret = bufflen; + + return ret; +} + +// int png_image_write_to_memory (png_imagep image, void *memory, +// png_alloc_size_t * PNG_RESTRICT memory_bytes, +// int convert_to_8_bit, const void *buffer, ptrdiff_t row_stride, +// const void *colormap)); + +AMSCIMGLIB4_API int amscimglib4_pngbytebuffer_from_img(amscimglib4_image *img, unsigned char *bytebuffer, long bufflen, long *nbyteswritten) +{ + int ret = amscimglib4_success; + int res; + + png_image pngimage; + png_alloc_size_t bufflen2 = bufflen; + + pngimage.version = PNG_IMAGE_VERSION; + pngimage.format = PNG_FORMAT_RGBA; + pngimage.width = img->sizex; + pngimage.height = img->sizey; + + res = png_image_write_to_memory( + &pngimage, + bytebuffer, //memory + &bufflen2, //buffer size + 0, //convert to 8 bit + img->data, //RGBA buffer + 0, //row stride, + NULL //colormap + ); + + if(nbyteswritten!=NULL) *nbyteswritten = bufflen2; + + + return ret; +} + + #ifdef __cplusplus }; //end extern "C" -#endif \ No newline at end of file +#endif + + + +// Old Code // + +// Structure to hold our buffer data +// typedef struct amscimglib4_png_buffer_data { +// const unsigned char *data; +// size_t size; +// size_t offset; +// } amscimglib4_png_buffer_data; + +// //fills data bytes with data from png_ptr +// void amscimglib4_pngbytes_readfn( +// png_structp png_ptr, +// png_bytep data, +// png_size_t length +// ) +// { +// amscimglib4_png_buffer_data *buff = (amscimglib4_png_buffer_data*) png_get_io_ptr(png_ptr); + +// if(buff->offset + length > buff->size) +// { +// //not enough data in buffer; +// return; +// } + +// memcpy(data,buff->data + buff->offset, length); +// buff->offset += length; +// return; +// } + +// //Reads and writes png data to and from a bytebuffer in memory (for compression) +// AMSCIMGLIB4_API int amscimglib4_pngbytebuffer_to_img(amscimglib4_image *img, unsigned char *bytebuffer, long nbytes) +// { +// // Following tutorial https://pulsarengine.com/2009/01/reading-png-images-from-memory/ + +// int ret = amscimglib4_success; + +// if(img==NULL || bytebuffer==NULL) +// { +// ret = amscimglib4_failure; +// return ret; +// } + +// if(nbytes<8) +// { +// ret = amscimglib4_failure; +// return ret; +// } + +// if(!png_check_sig(bytebuffer,8)) +// { +// printf("amscimglib4_pngbytebuffer_to_img - bytes do not have PNG signature.\n"); +// ret = amscimglib4_failure; +// return ret; +// } + +// amscimglib4_png_buffer_data buffer2; +// buffer2.data = bytebuffer; +// buffer2.size = nbytes; +// buffer2.offset = 0; + +// // get PNG file info struct (memory is allocated by libpng) +// png_structp png_ptr = NULL; +// png_ptr = png_create_read_struct(PNG_LIBPNG_VER_STRING, NULL, NULL, NULL); + +// if(png_ptr == NULL) +// { +// printf("amscimglib4_pngbytebuffer_to_img - png pointer failed to allocate.\n"); +// ret = amscimglib4_failure; +// return ret; +// } + +// // get PNG image data info struct (memory is allocated by libpng) +// png_infop info_ptr = NULL; +// info_ptr = png_create_info_struct(png_ptr); + +// if(info_ptr == NULL) +// { +// // libpng must free file info struct memory before we bail +// png_destroy_read_struct(&png_ptr, NULL, NULL); +// ret = amscimglib4_failure; +// return ret; +// } + +// //This is where the magic happens. Now we must tell libpng to use a our own custom routine for retrieving the image data. To do this, we use the png_set_read_fn() routine: +// //png_set_read_fn(png_ptr, &inputStream, ReadDataFromInputStream); + +// /* +// http://www.libpng.org/pub/png/libpng-1.2.5-manual.html#section-5 +// Input/Output in libpng is done through png_read() and png_write(), which currently just call fread() and fwrite(). The FILE * is stored in png_struct and is initialized via png_init_io(). If you wish to change the method of I/O, the library supplies callbacks that you can set through the function png_set_read_fn() and png_set_write_fn() at run time, instead of calling the png_init_io() function. These functions also provide a void pointer that can be retrieved via the function png_get_io_ptr(). For example: + +// png_set_read_fn(png_structp read_ptr, +// voidp read_io_ptr, png_rw_ptr read_data_fn) + +// The replacement I/O functions must have prototypes as follows: + +// void user_read_data(png_structp png_ptr, +// png_bytep data, png_size_t length); +// void user_write_data(png_structp png_ptr, +// png_bytep data, png_size_t length); +// void user_flush_data(png_structp png_ptr); +// */ + +// png_set_read_fn(png_ptr, &buffer2, &amscimglib4_pngbytes_readfn); + +// png_read_info(png_ptr, info_ptr); +// int w,h,bit_depth,color_type; + +// w = png_get_image_width(png_ptr, info_ptr); +// h = png_get_image_height(png_ptr, info_ptr); +// bit_depth = png_get_bit_depth(png_ptr, info_ptr); +// color_type = png_get_color_type(png_ptr, info_ptr); + + + + +// return ret; +// } \ No newline at end of file diff --git a/src/amscimglib4/amscimglib4_tests.c b/src/amscimglib4/amscimglib4_tests.c index 4d733bf..188af7b 100644 --- a/src/amscimglib4/amscimglib4_tests.c +++ b/src/amscimglib4/amscimglib4_tests.c @@ -66,6 +66,57 @@ AMSCIMGLIB4_API void amscimglib4_test_loadsave() } +AMSCIMGLIB4_API void amscimglib4_test_binreadwrite() +{ + int res; + unsigned char *bytebuff = NULL; + long bufflen = 10000000; + long nread = 0; + const char *fname1 = "../testimg/testpfp0.png"; + const char *fname2 = "../testimg/testpfp0_bwrite.png"; + const char *fname3 = "../testimg/testpfp0_bwrite2.png"; + bytebuff = (unsigned char *) malloc(sizeof(unsigned char)*bufflen); + if(bytebuff==NULL) + { + printf("bytebuff failed to allocate.\n"); + return; + } + + amscimglib4_image *img1 = NULL; + amscimglib4_image *img2 = NULL; + + amscimglib4_readbinfile(fname1,bytebuff,bufflen,&nread); + printf("Read %ld bytes into byte buffer from %s\n",(long)nread,fname1); + + amscimglib4_writebinfile(fname2,bytebuff,nread); + + amscimglib4_image_new(&img1,1,1); + amscimglib4_image_new(&img2,1,1); + + + //every so often this segfaults for some reason + res = amscimglib4_pngbytebuffer_to_img(img1,bytebuff,nread); + printf("check something: %d\n",(int)sizeof(unsigned char)); + + printf("Interpreted png as (%d, %d) image.\n",(int)img1->sizex,(int)img1->sizey); + + memset(bytebuff,0,bufflen); + nread = amscimglib4_pngbytebufferlen(img1); + printf("To write the image to a bytebuffer, I need %ld bytes\n",nread); + + res = amscimglib4_pngbytebuffer_from_img(img1,bytebuff,bufflen,&nread); + printf("Wrote %ld bytes to buffer\n.",nread); + + amscimglib4_writebinfile(fname3,bytebuff,nread); + + amscimglib4_image_delete(&img1); + amscimglib4_image_delete(&img2); + + free(bytebuff); + + return; +} + #ifdef __cplusplus }; //end extern "C" #endif \ No newline at end of file diff --git a/src/amscimglib4/amscimglib4_tests2.c b/src/amscimglib4/amscimglib4_tests2.c new file mode 100644 index 0000000..30d79ad --- /dev/null +++ b/src/amscimglib4/amscimglib4_tests2.c @@ -0,0 +1,10 @@ +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif + +#ifdef __cplusplus +}; //end extern "C" +#endif \ No newline at end of file diff --git a/src/amscimglib4/amscimglib4_util.c b/src/amscimglib4/amscimglib4_util.c index 410238d..fbe4324 100644 --- a/src/amscimglib4/amscimglib4_util.c +++ b/src/amscimglib4/amscimglib4_util.c @@ -6,20 +6,100 @@ extern "C" { #endif //returns the size of a file using ANSI C -unsigned int amscimglib4_filesize(FILE *fp) +unsigned long amscimglib4_filesize(FILE *fp) { - unsigned int ret = 0; + unsigned long ret = 0L; fseek(fp,0L,SEEK_END); ret = ftell(fp); //find the size of the file fseek(fp,0L,SEEK_SET); return ret; } +int amscimglib4_readbinfile(const char *fname, unsigned char *bytes, long bufflen, long *bytesread) +{ + + FILE *fp = NULL; + int ret = amscimglib4_success; + long filesize; + long I; + static const long chunklen = 4096; + long clen; + long lres; + long res; + + if(fname==NULL) + { + ret = amscimglib4_failure; + return ret; + } + fp = fopen(fname,"rb"); + + + if(fp==NULL) + { + printf("amscimglib4_readbinfile:: could not open %s for reading.\n",fname); + ret = amscimglib4_failure; + return ret; + } + + if(bytes==NULL || bufflen<=0) + { + ret = amscimglib4_failure; + return ret; + } + + filesize = (long) amscimglib4_filesize(fp); + + I = 0; + while(I(bufflen-I)) ? bufflen-I : clen; + clen = (clen>chunklen) ? chunklen : clen; + res = fread(&(bytes[I]),sizeof(unsigned char),clen,fp); + I = I + clen; + } + + if(bytesread!=NULL) *bytesread = I; + + fclose(fp); + + return ret; +} + +int amscimglib4_writebinfile(const char *fname, unsigned char *bytes, long bufflen) +{ + int ret = amscimglib4_success; + FILE *fp = NULL; + + if(fname==NULL) + { + ret = amscimglib4_failure; + return ret; + } + fp = fopen(fname,"w+b"); + + if(fp==NULL) + { + printf("amscimglib4_writebinfile:: could not open %s for writing.\n",fname); + ret = amscimglib4_failure; + return ret; + } + + fwrite(bytes,sizeof(unsigned char),bufflen,fp); + + fclose(fp); + + return ret; +} + AMSCIMGLIB4_API int amscimglib4_magic_type(const char *fname) { FILE *fp = NULL; int ret = amscimglib4_type_unknown; //unidentified type unsigned char magicbuff[8]; + size_t res; fp = fopen(fname,"rb"); if(fp==NULL) @@ -29,7 +109,7 @@ AMSCIMGLIB4_API int amscimglib4_magic_type(const char *fname) else { fseek(fp,0L,SEEK_SET); - fread(magicbuff,8,1,fp); + res = fread(magicbuff,8,1,fp); fseek(fp,0L,SEEK_SET); //is this file one of PNG, BMP, or JPEG? diff --git a/src/main.cpp b/src/main.cpp index 19cc209..5f8e1b0 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -5,8 +5,9 @@ int main(int argc, char* argv[]) { int ret = 0; - amscimglib4_test_init(); + //amscimglib4_test_init(); amscimglib4_test_loadsave(); + amscimglib4_test_binreadwrite(); return ret; } \ No newline at end of file diff --git a/testimg/testpfp0_bwrite.png b/testimg/testpfp0_bwrite.png new file mode 100644 index 0000000..1d4e780 Binary files /dev/null and b/testimg/testpfp0_bwrite.png differ diff --git a/testimg/testpfp0_bwrite2.png b/testimg/testpfp0_bwrite2.png new file mode 100644 index 0000000..6c7adf5 Binary files /dev/null and b/testimg/testpfp0_bwrite2.png differ diff --git a/testimg/testpfp1_1.bmp b/testimg/testpfp1_1.bmp index 5299029..65e1638 100644 Binary files a/testimg/testpfp1_1.bmp and b/testimg/testpfp1_1.bmp differ diff --git a/testimg/testpfp2_1.bmp b/testimg/testpfp2_1.bmp index a7a39a4..043396e 100644 Binary files a/testimg/testpfp2_1.bmp and b/testimg/testpfp2_1.bmp differ