blob: c40225204b740843811780dc3fbf5244af839179 [file] [log] [blame]
#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;
}