15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* vim: set ts=8 sw=8 noexpandtab: */ 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// qcms 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (C) 2009 Mozilla Foundation 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Permission is hereby granted, free of charge, to any person obtaining 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// a copy of this software and associated documentation files (the "Software"), 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// to deal in the Software without restriction, including without limitation 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// the rights to use, copy, modify, merge, publish, distribute, sublicense, 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// and/or sell copies of the Software, and to permit persons to whom the Software 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// is furnished to do so, subject to the following conditions: 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// The above copyright notice and this permission notice shall be included in 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// all copies or substantial portions of the Software. 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "qcms.h" 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "qcmstypes.h" 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* used as a lookup table for the output transformation. 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * we refcount them so we only need to have one around per output 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * profile, instead of duplicating them per transform */ 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct precache_output 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){ 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int ref_count; 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* We previously used a count of 65536 here but that seems like more 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * precision than we actually need. By reducing the size we can 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * improve startup performance and reduce memory usage. ColorSync on 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 10.5 uses 4097 which is perhaps because they use a fixed point 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * representation where 1. is represented by 0x1000. */ 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define PRECACHE_OUTPUT_SIZE 8192 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define PRECACHE_OUTPUT_MAX (PRECACHE_OUTPUT_SIZE-1) 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) uint8_t data[PRECACHE_OUTPUT_SIZE]; 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef _MSC_VER 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define ALIGN __declspec(align(16)) 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define ALIGN __attribute__(( aligned (16) )) 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)typedef struct _qcms_format_type { 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int r; 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int b; 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} qcms_format_type; 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct _qcms_transform { 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) float ALIGN matrix[3][4]; 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) float *input_gamma_table_r; 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) float *input_gamma_table_g; 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) float *input_gamma_table_b; 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) float *input_clut_table_r; 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) float *input_clut_table_g; 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) float *input_clut_table_b; 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) uint16_t input_clut_table_length; 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) float *r_clut; 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) float *g_clut; 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) float *b_clut; 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) uint16_t grid_size; 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) float *output_clut_table_r; 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) float *output_clut_table_g; 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) float *output_clut_table_b; 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) uint16_t output_clut_table_length; 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) float *input_gamma_table_gray; 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) float out_gamma_r; 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) float out_gamma_g; 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) float out_gamma_b; 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) float out_gamma_gray; 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) uint16_t *output_gamma_lut_r; 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) uint16_t *output_gamma_lut_g; 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) uint16_t *output_gamma_lut_b; 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) uint16_t *output_gamma_lut_gray; 855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) size_t output_gamma_lut_r_length; 875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) size_t output_gamma_lut_g_length; 885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) size_t output_gamma_lut_b_length; 895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) size_t output_gamma_lut_gray_length; 915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) struct precache_output *output_table_r; 935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) struct precache_output *output_table_g; 945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) struct precache_output *output_table_b; 955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void (*transform_fn)(struct _qcms_transform *transform, unsigned char *src, unsigned char *dest, size_t length, struct _qcms_format_type output_format); 975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct matrix { 1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) float m[3][3]; 1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool invalid; 1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct qcms_modular_transform; 1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)typedef void (*transform_module_fn_t)(struct qcms_modular_transform *transform, float *src, float *dest, size_t length); 1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct qcms_modular_transform { 1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) struct matrix matrix; 1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) float tx, ty, tz; 1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) float *input_clut_table_r; 1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) float *input_clut_table_g; 1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) float *input_clut_table_b; 1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) uint16_t input_clut_table_length; 1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) float *r_clut; 1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) float *g_clut; 1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) float *b_clut; 1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) uint16_t grid_size; 1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) float *output_clut_table_r; 1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) float *output_clut_table_g; 1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) float *output_clut_table_b; 1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) uint16_t output_clut_table_length; 1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) uint16_t *output_gamma_lut_r; 1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) uint16_t *output_gamma_lut_g; 1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) uint16_t *output_gamma_lut_b; 1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) size_t output_gamma_lut_r_length; 1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) size_t output_gamma_lut_g_length; 1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) size_t output_gamma_lut_b_length; 1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) transform_module_fn_t transform_module_fn; 1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) struct qcms_modular_transform *next_transform; 1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)typedef int32_t s15Fixed16Number; 1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)typedef uint16_t uInt16Number; 1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)typedef uint8_t uInt8Number; 1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct XYZNumber { 1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) s15Fixed16Number X; 1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) s15Fixed16Number Y; 1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) s15Fixed16Number Z; 1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct curveType { 1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) uint32_t type; 1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) uint32_t count; 1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) float parameter[7]; 1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) uInt16Number data[]; 1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct lutmABType { 1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) uint8_t num_in_channels; 1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) uint8_t num_out_channels; 1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // 16 is the upperbound, actual is 0..num_in_channels. 1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) uint8_t num_grid_points[16]; 1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) s15Fixed16Number e00; 1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) s15Fixed16Number e01; 1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) s15Fixed16Number e02; 1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) s15Fixed16Number e03; 1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) s15Fixed16Number e10; 1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) s15Fixed16Number e11; 1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) s15Fixed16Number e12; 1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) s15Fixed16Number e13; 1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) s15Fixed16Number e20; 1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) s15Fixed16Number e21; 1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) s15Fixed16Number e22; 1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) s15Fixed16Number e23; 1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // reversed elements (for mBA) 1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool reversed; 1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) float *clut_table; 1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) struct curveType *a_curves[10]; 1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) struct curveType *b_curves[10]; 1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) struct curveType *m_curves[10]; 1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) float clut_table_data[]; 1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* should lut8Type and lut16Type be different types? */ 1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct lutType { // used by lut8Type/lut16Type (mft2) only 1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) uint8_t num_input_channels; 1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) uint8_t num_output_channels; 1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) uint8_t num_clut_grid_points; 1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) s15Fixed16Number e00; 1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) s15Fixed16Number e01; 1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) s15Fixed16Number e02; 1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) s15Fixed16Number e10; 1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) s15Fixed16Number e11; 1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) s15Fixed16Number e12; 1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) s15Fixed16Number e20; 1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) s15Fixed16Number e21; 1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) s15Fixed16Number e22; 1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) uint16_t num_input_table_entries; 2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) uint16_t num_output_table_entries; 2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) float *input_table; 2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) float *clut_table; 2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) float *output_table; 2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) float table_data[]; 2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if 0 2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* this is from an intial idea of having the struct correspond to the data in 2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * the file. I decided that it wasn't a good idea. 2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct tag_value { 2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) uint32_t type; 2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) union { 2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) struct { 2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) uint32_t reserved; 2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) struct { 2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) s15Fixed16Number X; 2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) s15Fixed16Number Y; 2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) s15Fixed16Number Z; 2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } XYZNumber; 2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } XYZType; 2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }; 2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; // I guess we need to pack this? 2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define RGB_SIGNATURE 0x52474220 2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define GRAY_SIGNATURE 0x47524159 2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define XYZ_SIGNATURE 0x58595A20 2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define LAB_SIGNATURE 0x4C616220 2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct _qcms_profile { 2336e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) char description[64]; 2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) uint32_t class; 2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) uint32_t color_space; 2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) uint32_t pcs; 2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) qcms_intent rendering_intent; 2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) struct XYZNumber redColorant; 2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) struct XYZNumber blueColorant; 2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) struct XYZNumber greenColorant; 2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) struct curveType *redTRC; 2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) struct curveType *blueTRC; 2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) struct curveType *greenTRC; 2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) struct curveType *grayTRC; 2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) struct lutType *A2B0; 2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) struct lutType *B2A0; 2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) struct lutmABType *mAB; 2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) struct lutmABType *mBA; 2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) struct matrix chromaticAdaption; 2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) struct precache_output *output_table_r; 2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) struct precache_output *output_table_g; 2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) struct precache_output *output_table_b; 2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef _MSC_VER 2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define inline _inline 2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* produces the nearest float to 'a' with a maximum error 2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * of 1/1024 which happens for large values like 0x40000040 */ 2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static inline float s15Fixed16Number_to_float(s15Fixed16Number a) 2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){ 2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return ((int32_t)a)/65536.f; 2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static inline s15Fixed16Number double_to_s15Fixed16Number(double v) 2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){ 2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (int32_t)(v*65536); 2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static inline float uInt8Number_to_float(uInt8Number a) 2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){ 2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return ((int32_t)a)/255.f; 2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static inline float uInt16Number_to_float(uInt16Number a) 2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){ 2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return ((int32_t)a)/65535.f; 2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void precache_release(struct precache_output *p); 2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)qcms_bool set_rgb_colorants(qcms_profile *profile, qcms_CIE_xyY white_point, qcms_CIE_xyYTRIPLE primaries); 2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void qcms_transform_data_rgb_out_lut_sse2(qcms_transform *transform, 2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) unsigned char *src, 2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) unsigned char *dest, 2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) size_t length, 2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) qcms_format_type output_format); 2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void qcms_transform_data_rgba_out_lut_sse2(qcms_transform *transform, 2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) unsigned char *src, 2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) unsigned char *dest, 2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) size_t length, 2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) qcms_format_type output_format); 2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void qcms_transform_data_rgb_out_lut_sse1(qcms_transform *transform, 2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) unsigned char *src, 2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) unsigned char *dest, 2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) size_t length, 3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) qcms_format_type output_format); 3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void qcms_transform_data_rgba_out_lut_sse1(qcms_transform *transform, 3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) unsigned char *src, 3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) unsigned char *dest, 3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) size_t length, 3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) qcms_format_type output_format); 3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)extern qcms_bool qcms_supports_iccv4; 308a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 309a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 310a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#ifdef _MSC_VER 311a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 312a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)long __cdecl _InterlockedIncrement(long volatile *); 313a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)long __cdecl _InterlockedDecrement(long volatile *); 314a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#pragma intrinsic(_InterlockedIncrement) 315a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#pragma intrinsic(_InterlockedDecrement) 316a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 317a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#define qcms_atomic_increment(x) _InterlockedIncrement((long volatile *)&x) 318a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#define qcms_atomic_decrement(x) _InterlockedDecrement((long volatile*)&x) 319a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 320a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#else 321a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 322a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#define qcms_atomic_increment(x) __sync_add_and_fetch(&x, 1) 323a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#define qcms_atomic_decrement(x) __sync_sub_and_fetch(&x, 1) 324a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 325a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#endif 326