| #include <stdlib.h> |
| #include <assert.h> |
| #include <stdint.h> |
| #include "qcms.h" |
| |
| typedef uint32_t __be32; |
| |
| /* __builtin_bswap isn't available in older gccs |
| * so open code it for now */ |
| static __be32 cpu_to_be32(int32_t v) |
| { |
| #ifdef LITTLE_ENDIAN |
| return ((v & 0xff) << 24) | ((v & 0xff00) << 8) | ((v & 0xff0000) >> 8) | ((v & 0xff000000) >> 24); |
| //return __builtin_bswap32(v); |
| #else |
| return v; |
| #endif |
| } |
| |
| char *buf; |
| |
| static void write_u32(size_t offset, uint32_t value) |
| { |
| *(__be32*)(buf + offset) = cpu_to_be32(value); |
| } |
| #if 0 |
| static uint16_t read_u16(struct mem_source *mem, size_t offset) |
| { |
| if (offset + 2 > mem->size) { |
| invalid_source(mem, "Invalid offset"); |
| return 0; |
| } else { |
| return be16_to_cpu(*(__be16*)(mem->buf + offset)); |
| } |
| } |
| #endif |
| static void write_u8(size_t offset, uint8_t value) |
| { |
| *(uint8_t*)(buf + offset) = value; |
| } |
| |
| |
| int main() |
| { |
| qcms_profile_release(qcms_profile_sRGB()); |
| |
| buf = calloc(1500, 1); |
| assert(!qcms_profile_from_memory(buf, 1500)); |
| // invalid size |
| write_u32(0, 2500); |
| assert(!qcms_profile_from_memory(buf, 1500)); |
| |
| // proper size |
| write_u32(0, 1500); |
| assert(!qcms_profile_from_memory(buf, 1500)); |
| |
| #define INPUT_DEVICE_PROFILE 0x73636e72 // 'scnr' |
| write_u32(12, INPUT_DEVICE_PROFILE); |
| assert(!qcms_profile_from_memory(buf, 1500)); |
| |
| write_u8(8, 0x3); // invalid major revision |
| assert(!qcms_profile_from_memory(buf, 1500)); |
| |
| write_u8(8, 0x2); // major revision |
| write_u8(9, 0x55); // invalid minor revision |
| assert(!qcms_profile_from_memory(buf, 1500)); |
| |
| write_u8(8, 0x2); // major revision |
| write_u8(9, 0x40); // minor revision |
| write_u8(10, 1); // reserved 1 |
| write_u8(11, 0); // reserved 2 |
| assert(!qcms_profile_from_memory(buf, 1500)); |
| write_u8(10, 0); // reserved 1 |
| |
| write_u8(64, 0x32); // invalid rendering intent |
| assert(!qcms_profile_from_memory(buf, 1500)); |
| write_u8(64, 0); // invalid rendering intent |
| |
| #define RGB_SIGNATURE 0x52474220 |
| #define GRAY_SIGNATURE 0x47524159 |
| write_u32(16, RGB_SIGNATURE); |
| assert(!qcms_profile_from_memory(buf, 1500)); |
| |
| write_u32(128, 15000); // tag count |
| assert(!qcms_profile_from_memory(buf, 1500)); |
| |
| write_u32(128, 15); // tag count |
| assert(!qcms_profile_from_memory(buf, 1500)); |
| |
| #define TAG_bXYZ 0x6258595a |
| #define TAG_gXYZ 0x6758595a |
| #define TAG_rXYZ 0x7258595a |
| #define TAG_rTRC 0x72545243 |
| #define TAG_bTRC 0x62545243 |
| #define TAG_gTRC 0x67545243 |
| #define TAG_kTRC 0x6b545243 |
| #define TAG_A2B0 0x41324230 |
| |
| write_u32(128 + 4, TAG_rXYZ); // tag |
| assert(!qcms_profile_from_memory(buf, 1500)); |
| write_u32(128 + 4 + 4, 1000); // offset |
| assert(!qcms_profile_from_memory(buf, 1500)); |
| |
| write_u32(128 + 4 + 4*1*3, TAG_gXYZ); // tag |
| assert(!qcms_profile_from_memory(buf, 1500)); |
| write_u32(128 + 4 + 4*1*3 + 4, 1000); // offset |
| assert(!qcms_profile_from_memory(buf, 1500)); |
| |
| write_u32(128 + 4 + 4*2*3, TAG_bXYZ); // tag |
| assert(!qcms_profile_from_memory(buf, 1500)); |
| write_u32(128 + 4 + 4*2*3 + 4, 1000); // offset |
| assert(!qcms_profile_from_memory(buf, 1500)); |
| |
| #define XYZ_TYPE 0x58595a20 // 'XYZ ' |
| #define CURVE_TYPE 0x63757276 // 'curv' |
| #define LUT16_TYPE 0x6d667432 // 'mft2' |
| #define LUT8_TYPE 0x6d667431 // 'mft1' |
| |
| write_u32(1000, XYZ_TYPE); |
| assert(!qcms_profile_from_memory(buf, 1500)); |
| |
| write_u32(128 + 4 + 4*3*3, TAG_rTRC); // tag |
| assert(!qcms_profile_from_memory(buf, 1500)); |
| write_u32(128 + 4 + 4*3*3 + 4, 1100); // offset |
| assert(!qcms_profile_from_memory(buf, 1500)); |
| |
| write_u32(128 + 4 + 4*4*3, TAG_gTRC); // tag |
| assert(!qcms_profile_from_memory(buf, 1500)); |
| write_u32(128 + 4 + 4*4*3 + 4, 1100); // offset |
| assert(!qcms_profile_from_memory(buf, 1500)); |
| |
| write_u32(128 + 4 + 4*5*3, TAG_bTRC); // tag |
| assert(!qcms_profile_from_memory(buf, 1500)); |
| write_u32(128 + 4 + 4*5*3 + 4, 1100); // offset |
| assert(!qcms_profile_from_memory(buf, 1500)); |
| |
| |
| write_u32(1100, CURVE_TYPE); |
| qcms_profile_release(qcms_profile_from_memory(buf, 1500)); |
| |
| write_u32(1108, 100000); // curve count |
| assert(!qcms_profile_from_memory(buf, 1500)); |
| |
| write_u32(1108, 1); // curve count |
| qcms_profile_release(qcms_profile_from_memory(buf, 1500)); |
| |
| /* test out gray profiles */ |
| write_u32(16, GRAY_SIGNATURE); |
| assert(!qcms_profile_from_memory(buf, 1500)); |
| |
| write_u32(128 + 4 + 4*6*3, TAG_kTRC); // tag |
| assert(!qcms_profile_from_memory(buf, 1500)); |
| write_u32(128 + 4 + 4*6*3 + 4, 1100); // offset |
| qcms_profile_release(qcms_profile_from_memory(buf, 1500)); |
| |
| /* test out profiles that are the wrong size */ |
| qcms_profile_from_path("sample-trunc.icc"); |
| |
| return 0; |
| } |
| |