зеркало из https://github.com/mozilla/pjs.git
Bug 481926 - Rewrite color management component sr=vlad, r=ted, r=joedrew (\o/)
Replaces lcms with qcms
This commit is contained in:
Родитель
f601978513
Коммит
560a20d5d1
|
@ -281,7 +281,7 @@ OS_LDFLAGS = @LDFLAGS@
|
|||
OS_COMPILE_CFLAGS = $(OS_CPPFLAGS) @COMPILE_CFLAGS@
|
||||
OS_COMPILE_CXXFLAGS = $(OS_CPPFLAGS) @COMPILE_CXXFLAGS@
|
||||
|
||||
OS_INCLUDES = $(NSPR_CFLAGS) $(JPEG_CFLAGS) $(PNG_CFLAGS) $(ZLIB_CFLAGS) $(LCMS_CFLAGS)
|
||||
OS_INCLUDES = $(NSPR_CFLAGS) $(JPEG_CFLAGS) $(PNG_CFLAGS) $(ZLIB_CFLAGS)
|
||||
OS_LIBS = @LIBS@
|
||||
ACDEFINES = @MOZ_DEFINES@
|
||||
|
||||
|
@ -448,9 +448,7 @@ PNG_LIBS = @MOZ_PNG_LIBS@
|
|||
PNG_REQUIRES = png
|
||||
endif
|
||||
|
||||
LCMS_CFLAGS = @LCMS_CFLAGS@
|
||||
LCMS_LIBS = @LCMS_LIBS@
|
||||
LCMS_REQUIRES = lcms
|
||||
QCMS_LIBS = @QCMS_LIBS@
|
||||
|
||||
MOZ_NATIVE_SQLITE = @MOZ_NATIVE_SQLITE@
|
||||
SQLITE_CFLAGS = @SQLITE_CFLAGS@
|
||||
|
|
|
@ -69,7 +69,6 @@ STATIC_EXTRA_LIBS += \
|
|||
$(PNG_LIBS) \
|
||||
$(JPEG_LIBS) \
|
||||
$(ZLIB_LIBS) \
|
||||
$(LCMS_LIBS) \
|
||||
$(NULL)
|
||||
|
||||
ifdef MOZ_PSM
|
||||
|
|
18
configure.in
18
configure.in
|
@ -130,7 +130,6 @@ GCONF_VERSION=1.2.1
|
|||
LIBGNOME_VERSION=2.0
|
||||
STARTUP_NOTIFICATION_VERSION=0.8
|
||||
DBUS_VERSION=0.60
|
||||
LCMS_VERSION=1.17
|
||||
SQLITE_VERSION=3.6.10
|
||||
LIBNOTIFY_VERSION=0.4
|
||||
|
||||
|
@ -7683,22 +7682,11 @@ AC_SUBST(MOZ_TREE_CAIRO)
|
|||
AC_SUBST(MOZ_CAIRO_CFLAGS)
|
||||
AC_SUBST(MOZ_CAIRO_LIBS)
|
||||
|
||||
dnl ========================================================
|
||||
dnl Check for lcms
|
||||
dnl qcms
|
||||
dnl ========================================================
|
||||
|
||||
LCMS_CFLAGS=
|
||||
if test "$_WIN32_MSVC"; then
|
||||
if test -z "$BUILD_STATIC_LIBS" -a -z "$MOZ_ENABLE_LIBXUL"; then
|
||||
LCMS_CFLAGS=-DLCMS_DLL
|
||||
fi
|
||||
LCMS_LIBS='$(LIBXUL_DIST)/lib/mozlcms.lib'
|
||||
else
|
||||
LCMS_LIBS='-L$(LIBXUL_DIST)/bin -lmozlcms'
|
||||
fi
|
||||
|
||||
AC_SUBST(LCMS_CFLAGS)
|
||||
AC_SUBST(LCMS_LIBS)
|
||||
QCMS_LIBS='$(DEPTH)/gfx/qcms/$(LIB_PREFIX)mozqcms.$(LIB_SUFFIX)'
|
||||
AC_SUBST(QCMS_LIBS)
|
||||
|
||||
dnl ========================================================
|
||||
dnl disable xul
|
||||
|
|
|
@ -65,6 +65,7 @@ REQUIRES = \
|
|||
imglib2 \
|
||||
thebes \
|
||||
view \
|
||||
qcms \
|
||||
$(NULL)
|
||||
|
||||
# XXX some platforms can't handle building
|
||||
|
|
|
@ -48,7 +48,7 @@ ifdef MOZ_TREE_CAIRO
|
|||
DIRS = cairo
|
||||
endif
|
||||
|
||||
DIRS += thebes public idl src
|
||||
DIRS += thebes public idl src qcms
|
||||
|
||||
ifdef ENABLE_TESTS
|
||||
ifndef MOZ_ENABLE_LIBXUL
|
||||
|
|
|
@ -0,0 +1,24 @@
|
|||
DEPTH = ../..
|
||||
topsrcdir = @top_srcdir@
|
||||
srcdir = @srcdir@
|
||||
VPATH = @srcdir@
|
||||
|
||||
include $(DEPTH)/config/autoconf.mk
|
||||
|
||||
MODULE = qcms
|
||||
LIBRARY_NAME = mozqcms
|
||||
LIBXUL_LIBRARY = 1
|
||||
GRE_MODULE = 1
|
||||
DIST_INSTALL = 1
|
||||
|
||||
EXPORTS = qcms.h qcmstypes.h
|
||||
|
||||
CSRCS = iccread.c transform.c
|
||||
|
||||
FORCE_STATIC_LIB = 1
|
||||
# This library is used by other shared libs
|
||||
FORCE_USE_PIC = 1
|
||||
|
||||
include $(topsrcdir)/config/rules.mk
|
||||
|
||||
CFLAGS += -DMOZ_QCMS
|
|
@ -0,0 +1,789 @@
|
|||
// qcms
|
||||
// Copyright (C) 2009 Mozilla Foundation
|
||||
// Copyright (C) 1998-2007 Marti Maria
|
||||
//
|
||||
// Permission is hereby granted, free of charge, to any person obtaining
|
||||
// a copy of this software and associated documentation files (the "Software"),
|
||||
// to deal in the Software without restriction, including without limitation
|
||||
// the rights to use, copy, modify, merge, publish, distribute, sublicense,
|
||||
// and/or sell copies of the Software, and to permit persons to whom the Software
|
||||
// is furnished to do so, subject to the following conditions:
|
||||
//
|
||||
// The above copyright notice and this permission notice shall be included in
|
||||
// all copies or substantial portions of the Software.
|
||||
//
|
||||
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||
// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO
|
||||
// THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
||||
// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
||||
// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
||||
// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
||||
// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
|
||||
#include <math.h>
|
||||
#include <assert.h>
|
||||
#include <stdlib.h>
|
||||
#include "qcmsint.h"
|
||||
|
||||
//XXX: use a better typename
|
||||
typedef uint32_t __be32;
|
||||
typedef uint16_t __be16;
|
||||
|
||||
/* all of the platforms that we use _MSC_VER on are little endian
|
||||
* so this is sufficient for now */
|
||||
#ifdef _MSC_VER
|
||||
#define LITTLE_ENDIAN
|
||||
#endif
|
||||
|
||||
#if !defined(BIG_ENDIAN) && !defined(LITTLE_ENDIAN)
|
||||
#error Unknown endianess
|
||||
#endif
|
||||
|
||||
#if 0
|
||||
not used yet
|
||||
/* __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);
|
||||
return v;
|
||||
#endif
|
||||
}
|
||||
#endif
|
||||
|
||||
static uint32_t be32_to_cpu(__be32 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
|
||||
}
|
||||
|
||||
static uint32_t be16_to_cpu(__be16 v)
|
||||
{
|
||||
#ifdef LITTLE_ENDIAN
|
||||
return ((v & 0xff) << 8) | ((v & 0xff00) >> 8);
|
||||
#else
|
||||
return v;
|
||||
#endif
|
||||
}
|
||||
|
||||
/* a wrapper around the memory that we are going to parse
|
||||
* into a qcms_profile */
|
||||
struct mem_source
|
||||
{
|
||||
const unsigned char *buf;
|
||||
size_t size;
|
||||
qcms_bool valid;
|
||||
const char *invalid_reason;
|
||||
};
|
||||
|
||||
static void invalid_source(struct mem_source *mem, const char *reason)
|
||||
{
|
||||
mem->valid = false;
|
||||
mem->invalid_reason = reason;
|
||||
}
|
||||
|
||||
static uint32_t read_u32(struct mem_source *mem, size_t offset)
|
||||
{
|
||||
if (offset + 4 > mem->size) {
|
||||
invalid_source(mem, "Invalid offset");
|
||||
return 0;
|
||||
} else {
|
||||
return be32_to_cpu(*(__be32*)(mem->buf + offset));
|
||||
}
|
||||
}
|
||||
|
||||
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));
|
||||
}
|
||||
}
|
||||
|
||||
static uint8_t read_u8(struct mem_source *mem, size_t offset)
|
||||
{
|
||||
if (offset + 1 > mem->size) {
|
||||
invalid_source(mem, "Invalid offset");
|
||||
return 0;
|
||||
} else {
|
||||
return *(uint8_t*)(mem->buf + offset);
|
||||
}
|
||||
}
|
||||
|
||||
static s15Fixed16Number read_s15Fixed16Number(struct mem_source *mem, size_t offset)
|
||||
{
|
||||
return read_u32(mem, offset);
|
||||
}
|
||||
|
||||
#if 0
|
||||
static uInt16Number read_uInt16Number(struct mem_source *mem, size_t offset)
|
||||
{
|
||||
return read_u16(mem, offset);
|
||||
}
|
||||
#endif
|
||||
|
||||
#define BAD_VALUE_PROFILE NULL
|
||||
#define INVALID_PROFILE NULL
|
||||
#define NO_MEM_PROFILE NULL
|
||||
|
||||
/* An arbitrary 4MB limit on profile size */
|
||||
#define MAX_PROFILE_SIZE 1024*1024*4
|
||||
#define MAX_TAG_COUNT 1024
|
||||
|
||||
static void check_CMM_type_signature(struct mem_source *src)
|
||||
{
|
||||
//uint32_t CMM_type_signature = read_u32(src, 4);
|
||||
//TODO: do the check?
|
||||
|
||||
}
|
||||
|
||||
static void check_profile_version(struct mem_source *src)
|
||||
{
|
||||
uint8_t major_revision = read_u8(src, 8 + 0);
|
||||
uint8_t minor_revision = read_u8(src, 8 + 1);
|
||||
uint8_t reserved1 = read_u8(src, 8 + 2);
|
||||
uint8_t reserved2 = read_u8(src, 8 + 3);
|
||||
if (major_revision > 0x2)
|
||||
invalid_source(src, "Unsupported major revision");
|
||||
if (minor_revision > 0x40)
|
||||
invalid_source(src, "Unsupported minor revision");
|
||||
if (reserved1 != 0 || reserved2 != 0)
|
||||
invalid_source(src, "Invalid reserved bytes");
|
||||
}
|
||||
|
||||
#define INPUT_DEVICE_PROFILE 0x73636e72 // 'scnr'
|
||||
#define DISPLAY_DEVICE_PROFILE 0x6d6e7472 // 'mntr'
|
||||
#define OUTPUT_DEVICE_PROFILE 0x70727472 // 'prtr'
|
||||
#define DEVICE_LINK_PROFILE 0x6c696e6b // 'link'
|
||||
#define COLOR_SPACE_PROFILE 0x73706163 // 'spac'
|
||||
#define ABSTRACT_PROFILE 0x61627374 // 'abst'
|
||||
#define NAMED_COLOR_PROFILE 0x6e6d636c // 'nmcl'
|
||||
|
||||
static void read_class_signature(qcms_profile *profile, struct mem_source *mem)
|
||||
{
|
||||
profile->class = read_u32(mem, 12);
|
||||
switch (profile->class) {
|
||||
case DISPLAY_DEVICE_PROFILE:
|
||||
case INPUT_DEVICE_PROFILE:
|
||||
break;
|
||||
case OUTPUT_DEVICE_PROFILE:
|
||||
default:
|
||||
invalid_source(mem, "Invalid Profile/Device Class signature");
|
||||
}
|
||||
}
|
||||
|
||||
static void read_color_space(qcms_profile *profile, struct mem_source *mem)
|
||||
{
|
||||
profile->color_space = read_u32(mem, 16);
|
||||
switch (profile->color_space) {
|
||||
case RGB_SIGNATURE:
|
||||
case GRAY_SIGNATURE:
|
||||
break;
|
||||
default:
|
||||
invalid_source(mem, "Unsupported colorspace");
|
||||
}
|
||||
}
|
||||
|
||||
struct tag
|
||||
{
|
||||
uint32_t signature;
|
||||
uint32_t offset;
|
||||
uint32_t size;
|
||||
};
|
||||
|
||||
struct tag_index {
|
||||
uint32_t count;
|
||||
struct tag *tags;
|
||||
};
|
||||
|
||||
static struct tag_index read_tag_table(qcms_profile *profile, struct mem_source *mem)
|
||||
{
|
||||
struct tag_index index = {0, NULL};
|
||||
int i;
|
||||
|
||||
index.count = read_u32(mem, 128);
|
||||
if (index.count > MAX_TAG_COUNT) {
|
||||
invalid_source(mem, "max number of tags exceeded");
|
||||
return index;
|
||||
}
|
||||
|
||||
index.tags = malloc(sizeof(struct tag)*index.count);
|
||||
if (index.tags) {
|
||||
for (i = 0; i < index.count; i++) {
|
||||
index.tags[i].signature = read_u32(mem, 128 + 4 + 4*i*3);
|
||||
index.tags[i].offset = read_u32(mem, 128 + 4 + 4*i*3 + 4);
|
||||
index.tags[i].size = read_u32(mem, 128 + 4 + 4*i*3 + 8);
|
||||
}
|
||||
}
|
||||
|
||||
return index;
|
||||
}
|
||||
|
||||
// Checks a profile for obvious inconsistencies and returns
|
||||
// true if the profile looks bogus and should probably be
|
||||
// ignored.
|
||||
qcms_bool qcms_profile_is_bogus(qcms_profile *profile)
|
||||
{
|
||||
float sum[3], target[3], tolerance[3];
|
||||
unsigned i;
|
||||
|
||||
// Sum the values
|
||||
sum[0] = s15Fixed16Number_to_float(profile->redColorant.X) +
|
||||
s15Fixed16Number_to_float(profile->greenColorant.X) +
|
||||
s15Fixed16Number_to_float(profile->blueColorant.X);
|
||||
sum[1] = s15Fixed16Number_to_float(profile->redColorant.Y) +
|
||||
s15Fixed16Number_to_float(profile->greenColorant.Y) +
|
||||
s15Fixed16Number_to_float(profile->blueColorant.Y);
|
||||
sum[2] = s15Fixed16Number_to_float(profile->redColorant.Z) +
|
||||
s15Fixed16Number_to_float(profile->greenColorant.Z) +
|
||||
s15Fixed16Number_to_float(profile->blueColorant.Z);
|
||||
|
||||
// Build our target vector (see mozilla bug 460629)
|
||||
target[0] = 0.96420;
|
||||
target[1] = 1.00000;
|
||||
target[2] = 0.82491;
|
||||
|
||||
// Our tolerance vector - Recommended by Chris Murphy based on
|
||||
// conversion from the LAB space criterion of no more than 3 in any one
|
||||
// channel. This is similar to, but slightly more tolerant than Adobe's
|
||||
// criterion.
|
||||
tolerance[0] = 0.02;
|
||||
tolerance[1] = 0.02;
|
||||
tolerance[2] = 0.04;
|
||||
|
||||
// Compare with our tolerance
|
||||
for (i = 0; i < 3; ++i) {
|
||||
if (!(((sum[i] - tolerance[i]) <= target[i]) &&
|
||||
((sum[i] + tolerance[i]) >= target[i])))
|
||||
return true;
|
||||
}
|
||||
|
||||
// All Good
|
||||
return false;
|
||||
}
|
||||
|
||||
#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
|
||||
|
||||
static struct tag *find_tag(struct tag_index index, uint32_t tag_id)
|
||||
{
|
||||
int i;
|
||||
struct tag *tag = NULL;
|
||||
for (i = 0; i < index.count; i++) {
|
||||
if (index.tags[i].signature == tag_id) {
|
||||
return &index.tags[i];
|
||||
}
|
||||
}
|
||||
return tag;
|
||||
}
|
||||
|
||||
#define XYZ_TYPE 0x58595a20 // 'XYZ '
|
||||
#define CURVE_TYPE 0x63757276 // 'curv'
|
||||
#define LUT16_TYPE 0x6d667432 // 'mft2'
|
||||
#define LUT8_TYPE 0x6d667431 // 'mft1'
|
||||
|
||||
static struct XYZNumber read_tag_XYZType(struct mem_source *src, struct tag_index index, uint32_t tag_id)
|
||||
{
|
||||
struct XYZNumber num = {0};
|
||||
struct tag *tag = find_tag(index, tag_id);
|
||||
if (tag) {
|
||||
uint32_t offset = tag->offset;
|
||||
|
||||
uint32_t type = read_u32(src, offset);
|
||||
if (type != XYZ_TYPE)
|
||||
invalid_source(src, "unexpected type, expected XYZ");
|
||||
num.X = read_s15Fixed16Number(src, offset+8);
|
||||
num.Y = read_s15Fixed16Number(src, offset+12);
|
||||
num.Z = read_s15Fixed16Number(src, offset+16);
|
||||
} else {
|
||||
invalid_source(src, "missing xyztag");
|
||||
}
|
||||
return num;
|
||||
}
|
||||
|
||||
static struct curveType *read_tag_curveType(struct mem_source *src, struct tag_index index, uint32_t tag_id)
|
||||
{
|
||||
struct tag *tag = find_tag(index, tag_id);
|
||||
struct curveType *curve = NULL;
|
||||
if (tag) {
|
||||
uint32_t offset = tag->offset;
|
||||
uint32_t type = read_u32(src, offset);
|
||||
uint32_t count = read_u32(src, offset+8);
|
||||
int i;
|
||||
|
||||
if (type != CURVE_TYPE) {
|
||||
invalid_source(src, "unexpected type, expected CURV");
|
||||
return NULL;
|
||||
}
|
||||
|
||||
#define MAX_CURVE_ENTRIES 40000 //arbitrary
|
||||
if (count > MAX_CURVE_ENTRIES) {
|
||||
invalid_source(src, "curve size too large");
|
||||
return NULL;
|
||||
}
|
||||
curve = malloc(sizeof(struct curveType) + sizeof(uInt16Number)*count);
|
||||
if (!curve)
|
||||
return NULL;
|
||||
|
||||
curve->count = count;
|
||||
for (i=0; i<count; i++) {
|
||||
curve->data[i] = read_u16(src, offset + 12 + i *2);
|
||||
}
|
||||
} else {
|
||||
invalid_source(src, "missing curvetag");
|
||||
}
|
||||
|
||||
return curve;
|
||||
}
|
||||
|
||||
/* This function's not done yet */
|
||||
static struct lutType *read_tag_lutType(struct mem_source *src, struct tag_index index, uint32_t tag_id)
|
||||
{
|
||||
struct tag *tag = find_tag(index, tag_id);
|
||||
uint32_t offset = tag->offset;
|
||||
uint32_t type = read_u32(src, offset);
|
||||
uint16_t num_input_table_entries;
|
||||
uint16_t num_output_table_entries;
|
||||
uint8_t in_chan, grid_points, out_chan;
|
||||
uint32_t clut_size;
|
||||
struct lutType *lut;
|
||||
int i;
|
||||
|
||||
num_input_table_entries = read_u16(src, offset + 48);
|
||||
num_output_table_entries = read_u16(src, offset + 50);
|
||||
|
||||
in_chan = read_u8(src, offset + 8);
|
||||
out_chan = read_u8(src, offset + 9);
|
||||
grid_points = read_u8(src, offset + 10);
|
||||
|
||||
if (!src->valid)
|
||||
return NULL;
|
||||
|
||||
clut_size = in_chan * grid_points * out_chan;
|
||||
#define MAX_CLUT_SIZE 10000 // arbitrary
|
||||
if (clut_size > MAX_CLUT_SIZE) {
|
||||
return NULL;
|
||||
}
|
||||
|
||||
if (type != LUT16_TYPE && type != LUT8_TYPE)
|
||||
return NULL;
|
||||
|
||||
lut = malloc(sizeof(struct lutType) + (clut_size + num_input_table_entries + num_output_table_entries)*sizeof(uint8_t));
|
||||
if (!lut)
|
||||
return NULL;
|
||||
lut->num_input_channels = read_u8(src, offset + 8);
|
||||
lut->num_output_channels = read_u8(src, offset + 9);
|
||||
lut->num_clut_grid_points = read_u8(src, offset + 10);
|
||||
lut->e00 = read_s15Fixed16Number(src, offset+12);
|
||||
lut->e01 = read_s15Fixed16Number(src, offset+16);
|
||||
lut->e02 = read_s15Fixed16Number(src, offset+20);
|
||||
lut->e10 = read_s15Fixed16Number(src, offset+24);
|
||||
lut->e11 = read_s15Fixed16Number(src, offset+28);
|
||||
lut->e12 = read_s15Fixed16Number(src, offset+32);
|
||||
lut->e20 = read_s15Fixed16Number(src, offset+36);
|
||||
lut->e21 = read_s15Fixed16Number(src, offset+40);
|
||||
lut->e22 = read_s15Fixed16Number(src, offset+44);
|
||||
|
||||
//TODO: finish up
|
||||
for (i = 0; i < lut->num_input_table_entries; i++) {
|
||||
}
|
||||
return lut;
|
||||
}
|
||||
|
||||
static void read_rendering_intent(qcms_profile *profile, struct mem_source *src)
|
||||
{
|
||||
profile->rendering_intent = read_u32(src, 64);
|
||||
switch (profile->rendering_intent) {
|
||||
case QCMS_INTENT_PERCEPTUAL:
|
||||
case QCMS_INTENT_SATURATION:
|
||||
case QCMS_INTENT_RELATIVE_COLORIMETRIC:
|
||||
case QCMS_INTENT_ABSOLUTE_COLORIMETRIC:
|
||||
break;
|
||||
default:
|
||||
invalid_source(src, "unknown rendering intent");
|
||||
}
|
||||
}
|
||||
|
||||
qcms_profile *qcms_profile_create(void)
|
||||
{
|
||||
return calloc(sizeof(qcms_profile), 1);
|
||||
}
|
||||
|
||||
/* build sRGB gamma table */
|
||||
/* based on cmsBuildParametricGamma() */
|
||||
static uint16_t *build_sRGB_gamma_table(int num_entries)
|
||||
{
|
||||
int i;
|
||||
/* taken from lcms: Build_sRGBGamma() */
|
||||
double gamma = 2.4;
|
||||
double a = 1./1.055;
|
||||
double b = 0.055/1.055;
|
||||
double c = 1./12.92;
|
||||
double d = 0.04045;
|
||||
|
||||
uint16_t *table = malloc(sizeof(uint16_t) * num_entries);
|
||||
if (!table)
|
||||
return NULL;
|
||||
|
||||
for (i=0; i<num_entries; i++) {
|
||||
double x = (double)i / (num_entries-1);
|
||||
double y, output;
|
||||
// IEC 61966-2.1 (sRGB)
|
||||
// Y = (aX + b)^Gamma | X >= d
|
||||
// Y = cX | X < d
|
||||
if (x >= d) {
|
||||
double e = (a*x + b);
|
||||
if (e > 0)
|
||||
y = pow(e, gamma);
|
||||
else
|
||||
y = 0;
|
||||
} else {
|
||||
y = c*x;
|
||||
}
|
||||
|
||||
// Saturate -- this could likely move to a separate function
|
||||
output = y * 65535. + .5;
|
||||
if (output > 65535.)
|
||||
output = 65535;
|
||||
if (output < 0)
|
||||
output = 0;
|
||||
table[i] = (uint16_t)floor(output);
|
||||
}
|
||||
return table;
|
||||
}
|
||||
|
||||
static struct curveType *curve_from_table(uint16_t *table, int num_entries)
|
||||
{
|
||||
struct curveType *curve;
|
||||
int i;
|
||||
curve = malloc(sizeof(struct curveType) + sizeof(uInt16Number)*num_entries);
|
||||
if (!curve)
|
||||
return NULL;
|
||||
curve->count = num_entries;
|
||||
for (i = 0; i < num_entries; i++) {
|
||||
curve->data[i] = table[i];
|
||||
}
|
||||
return curve;
|
||||
}
|
||||
|
||||
static uint16_t float_to_u8Fixed8Number(float a)
|
||||
{
|
||||
if (a > (255. + 255./256))
|
||||
return 0xffff;
|
||||
else if (a < 0.)
|
||||
return 0;
|
||||
else
|
||||
return floor(a*256. + .5);
|
||||
}
|
||||
|
||||
static struct curveType *curve_from_gamma(float gamma)
|
||||
{
|
||||
struct curveType *curve;
|
||||
int num_entries = 1;
|
||||
curve = malloc(sizeof(struct curveType) + sizeof(uInt16Number)*num_entries);
|
||||
if (!curve)
|
||||
return NULL;
|
||||
curve->count = num_entries;
|
||||
curve->data[0] = float_to_u8Fixed8Number(gamma);
|
||||
return curve;
|
||||
}
|
||||
|
||||
static void qcms_profile_fini(qcms_profile *profile)
|
||||
{
|
||||
free(profile->redTRC);
|
||||
free(profile->blueTRC);
|
||||
free(profile->greenTRC);
|
||||
free(profile->grayTRC);
|
||||
free(profile);
|
||||
}
|
||||
|
||||
//XXX: it would be nice if we had a way of ensuring
|
||||
// everything in a profile was initialized regardless of how it was created
|
||||
|
||||
//XXX: should this also be taking a black_point?
|
||||
/* similar to CGColorSpaceCreateCalibratedRGB */
|
||||
qcms_profile* qcms_profile_create_rgb_with_gamma(
|
||||
qcms_CIE_xyY white_point,
|
||||
qcms_CIE_xyYTRIPLE primaries,
|
||||
float gamma)
|
||||
{
|
||||
qcms_profile* profile = qcms_profile_create();
|
||||
if (!profile)
|
||||
return NO_MEM_PROFILE;
|
||||
|
||||
//XXX: should store the whitepoint
|
||||
set_rgb_colorants(profile, white_point, primaries);
|
||||
|
||||
profile->redTRC = curve_from_gamma(gamma);
|
||||
profile->blueTRC = curve_from_gamma(gamma);
|
||||
profile->greenTRC = curve_from_gamma(gamma);
|
||||
|
||||
if (!profile->redTRC || !profile->blueTRC || !profile->greenTRC) {
|
||||
qcms_profile_fini(profile);
|
||||
return NO_MEM_PROFILE;
|
||||
}
|
||||
profile->class = DISPLAY_DEVICE_PROFILE;
|
||||
profile->rendering_intent = QCMS_INTENT_PERCEPTUAL;
|
||||
profile->color_space = RGB_SIGNATURE;
|
||||
return profile;
|
||||
}
|
||||
|
||||
qcms_profile* qcms_profile_create_rgb_with_table(
|
||||
qcms_CIE_xyY white_point,
|
||||
qcms_CIE_xyYTRIPLE primaries,
|
||||
uint16_t *table, int num_entries)
|
||||
{
|
||||
qcms_profile* profile = qcms_profile_create();
|
||||
if (!profile)
|
||||
return NO_MEM_PROFILE;
|
||||
|
||||
//XXX: should store the whitepoint
|
||||
set_rgb_colorants(profile, white_point, primaries);
|
||||
|
||||
profile->redTRC = curve_from_table(table, num_entries);
|
||||
profile->blueTRC = curve_from_table(table, num_entries);
|
||||
profile->greenTRC = curve_from_table(table, num_entries);
|
||||
|
||||
if (!profile->redTRC || !profile->blueTRC || !profile->greenTRC) {
|
||||
qcms_profile_fini(profile);
|
||||
return NO_MEM_PROFILE;
|
||||
}
|
||||
profile->class = DISPLAY_DEVICE_PROFILE;
|
||||
profile->rendering_intent = QCMS_INTENT_PERCEPTUAL;
|
||||
profile->color_space = RGB_SIGNATURE;
|
||||
return profile;
|
||||
}
|
||||
|
||||
/* from lcms: cmsWhitePointFromTemp */
|
||||
/* tempK must be >= 4000. and <= 25000.
|
||||
* similar to argyll: icx_DTEMP2XYZ() */
|
||||
static qcms_CIE_xyY white_point_from_temp(int temp_K)
|
||||
{
|
||||
qcms_CIE_xyY white_point;
|
||||
double x, y;
|
||||
double T, T2, T3;
|
||||
// double M1, M2;
|
||||
|
||||
// No optimization provided.
|
||||
T = temp_K;
|
||||
T2 = T*T; // Square
|
||||
T3 = T2*T; // Cube
|
||||
|
||||
// For correlated color temperature (T) between 4000K and 7000K:
|
||||
if (T >= 4000. && T <= 7000.) {
|
||||
x = -4.6070*(1E9/T3) + 2.9678*(1E6/T2) + 0.09911*(1E3/T) + 0.244063;
|
||||
} else {
|
||||
// or for correlated color temperature (T) between 7000K and 25000K:
|
||||
if (T > 7000.0 && T <= 25000.0) {
|
||||
x = -2.0064*(1E9/T3) + 1.9018*(1E6/T2) + 0.24748*(1E3/T) + 0.237040;
|
||||
} else {
|
||||
assert(0 && "invalid temp");
|
||||
}
|
||||
}
|
||||
|
||||
// Obtain y(x)
|
||||
|
||||
y = -3.000*(x*x) + 2.870*x - 0.275;
|
||||
|
||||
// wave factors (not used, but here for futures extensions)
|
||||
|
||||
// M1 = (-1.3515 - 1.7703*x + 5.9114 *y)/(0.0241 + 0.2562*x - 0.7341*y);
|
||||
// M2 = (0.0300 - 31.4424*x + 30.0717*y)/(0.0241 + 0.2562*x - 0.7341*y);
|
||||
|
||||
// Fill white_point struct
|
||||
white_point.x = x;
|
||||
white_point.y = y;
|
||||
white_point.Y = 1.0;
|
||||
|
||||
return white_point;
|
||||
}
|
||||
|
||||
qcms_profile* qcms_profile_sRGB(void)
|
||||
{
|
||||
qcms_profile *profile;
|
||||
uint16_t *table;
|
||||
|
||||
qcms_CIE_xyYTRIPLE Rec709Primaries = {
|
||||
{0.6400, 0.3300, 1.0},
|
||||
{0.3000, 0.6000, 1.0},
|
||||
{0.1500, 0.0600, 1.0}
|
||||
};
|
||||
qcms_CIE_xyY D65;
|
||||
|
||||
D65 = white_point_from_temp(6504);
|
||||
|
||||
table = build_sRGB_gamma_table(1024);
|
||||
|
||||
if (!table)
|
||||
return NO_MEM_PROFILE;
|
||||
|
||||
profile = qcms_profile_create_rgb_with_table(D65, Rec709Primaries, table, 1024);
|
||||
free(table);
|
||||
return profile;
|
||||
}
|
||||
|
||||
|
||||
/* qcms_profile_from_memory does not hold a reference to the memory passed in */
|
||||
qcms_profile* qcms_profile_from_memory(const void *mem, size_t size)
|
||||
{
|
||||
uint32_t length;
|
||||
struct mem_source source;
|
||||
struct mem_source *src = &source;
|
||||
struct tag_index index;
|
||||
qcms_profile *profile;
|
||||
|
||||
source.buf = mem;
|
||||
source.size = size;
|
||||
source.valid = true;
|
||||
length = read_u32(src, 0);
|
||||
if (length <= size) {
|
||||
// shrink the area that we can read if appropriate
|
||||
source.size = length;
|
||||
} else {
|
||||
return INVALID_PROFILE;
|
||||
}
|
||||
|
||||
profile = qcms_profile_create();
|
||||
if (!profile)
|
||||
return NO_MEM_PROFILE;
|
||||
|
||||
check_CMM_type_signature(src);
|
||||
check_profile_version(src);
|
||||
read_class_signature(profile, src);
|
||||
read_rendering_intent(profile, src);
|
||||
read_color_space(profile, src);
|
||||
//TODO read rest of profile stuff
|
||||
|
||||
if (!src->valid)
|
||||
goto invalid_profile;
|
||||
|
||||
index = read_tag_table(profile, src);
|
||||
if (!src->valid || !index.tags)
|
||||
goto invalid_tag_table;
|
||||
|
||||
if (profile->class == DISPLAY_DEVICE_PROFILE || profile->class == INPUT_DEVICE_PROFILE) {
|
||||
if (profile->color_space == RGB_SIGNATURE) {
|
||||
|
||||
profile->redColorant = read_tag_XYZType(src, index, TAG_rXYZ);
|
||||
profile->blueColorant = read_tag_XYZType(src, index, TAG_bXYZ);
|
||||
profile->greenColorant = read_tag_XYZType(src, index, TAG_gXYZ);
|
||||
|
||||
if (!src->valid)
|
||||
goto invalid_tag_table;
|
||||
|
||||
profile->redTRC = read_tag_curveType(src, index, TAG_rTRC);
|
||||
profile->blueTRC = read_tag_curveType(src, index, TAG_bTRC);
|
||||
profile->greenTRC = read_tag_curveType(src, index, TAG_gTRC);
|
||||
|
||||
if (!profile->redTRC || !profile->blueTRC || !profile->greenTRC)
|
||||
goto invalid_tag_table;
|
||||
|
||||
} else if (profile->color_space == GRAY_SIGNATURE) {
|
||||
|
||||
profile->grayTRC = read_tag_curveType(src, index, TAG_kTRC);
|
||||
if (!profile->grayTRC)
|
||||
goto invalid_tag_table;
|
||||
|
||||
} else {
|
||||
goto invalid_tag_table;
|
||||
}
|
||||
} else if (0 && profile->class == OUTPUT_DEVICE_PROFILE) {
|
||||
profile->A2B0 = read_tag_lutType(src, index, TAG_A2B0);
|
||||
} else {
|
||||
goto invalid_tag_table;
|
||||
}
|
||||
|
||||
if (!src->valid)
|
||||
goto invalid_tag_table;
|
||||
|
||||
free(index.tags);
|
||||
|
||||
return profile;
|
||||
|
||||
invalid_tag_table:
|
||||
free(index.tags);
|
||||
invalid_profile:
|
||||
qcms_profile_fini(profile);
|
||||
return INVALID_PROFILE;
|
||||
}
|
||||
|
||||
qcms_intent qcms_profile_get_rendering_intent(qcms_profile *profile)
|
||||
{
|
||||
return profile->rendering_intent;
|
||||
}
|
||||
|
||||
icColorSpaceSignature
|
||||
qcms_profile_get_color_space(qcms_profile *profile)
|
||||
{
|
||||
return profile->color_space;
|
||||
}
|
||||
|
||||
void qcms_profile_release(qcms_profile *profile)
|
||||
{
|
||||
if (profile->output_table_r)
|
||||
precache_release(profile->output_table_r);
|
||||
if (profile->output_table_g)
|
||||
precache_release(profile->output_table_g);
|
||||
if (profile->output_table_b)
|
||||
precache_release(profile->output_table_b);
|
||||
|
||||
qcms_profile_fini(profile);
|
||||
}
|
||||
|
||||
#include <stdio.h>
|
||||
qcms_profile* qcms_profile_from_file(FILE *file)
|
||||
{
|
||||
uint32_t length, remaining_length;
|
||||
qcms_profile *profile;
|
||||
size_t read_length;
|
||||
__be32 length_be;
|
||||
void *data;
|
||||
|
||||
fread(&length_be, sizeof(length), 1, file);
|
||||
length = be32_to_cpu(length_be);
|
||||
if (length > MAX_PROFILE_SIZE)
|
||||
return BAD_VALUE_PROFILE;
|
||||
|
||||
/* allocate room for the entire profile */
|
||||
data = malloc(length);
|
||||
if (!data)
|
||||
return NO_MEM_PROFILE;
|
||||
|
||||
/* copy in length to the front so that the buffer will contain the entire profile */
|
||||
*((__be32*)data) = length_be;
|
||||
remaining_length = length - sizeof(length_be);
|
||||
|
||||
/* read the rest profile */
|
||||
read_length = fread((unsigned char*)data + sizeof(length_be), 1, remaining_length, file);
|
||||
if (read_length != remaining_length)
|
||||
return INVALID_PROFILE;
|
||||
|
||||
profile = qcms_profile_from_memory(data, length);
|
||||
free(data);
|
||||
return profile;
|
||||
}
|
||||
|
||||
qcms_profile* qcms_profile_from_path(const char *path)
|
||||
{
|
||||
qcms_profile *profile = NULL;
|
||||
FILE *file = fopen(path, "r");
|
||||
if (file) {
|
||||
profile = qcms_profile_from_file(file);
|
||||
fclose(file);
|
||||
}
|
||||
return profile;
|
||||
}
|
|
@ -0,0 +1,153 @@
|
|||
#ifndef QCMS_H
|
||||
#define QCMS_H
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
/* if we've already got an ICC_H header we can ignore the following */
|
||||
#ifndef ICC_H
|
||||
/* icc34 defines */
|
||||
|
||||
/*****************************************************************
|
||||
Copyright (c) 1994-1996 SunSoft, Inc.
|
||||
|
||||
Rights Reserved
|
||||
|
||||
Permission is hereby granted, free of charge, to any person
|
||||
obtaining a copy of this software and associated documentation
|
||||
files (the "Software"), to deal in the Software without restrict-
|
||||
ion, including without limitation the rights to use, copy, modify,
|
||||
merge, publish distribute, sublicense, and/or sell copies of the
|
||||
Software, and to permit persons to whom the Software is furnished
|
||||
to do so, subject to the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be
|
||||
included in all copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
|
||||
OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-
|
||||
INFRINGEMENT. IN NO EVENT SHALL SUNSOFT, INC. OR ITS PARENT
|
||||
COMPANY BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
|
||||
WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
||||
FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
|
||||
OTHER DEALINGS IN THE SOFTWARE.
|
||||
|
||||
Except as contained in this notice, the name of SunSoft, Inc.
|
||||
shall not be used in advertising or otherwise to promote the
|
||||
sale, use or other dealings in this Software without written
|
||||
authorization from SunSoft Inc.
|
||||
******************************************************************/
|
||||
|
||||
/*
|
||||
* Color Space Signatures
|
||||
* Note that only icSigXYZData and icSigLabData are valid
|
||||
* Profile Connection Spaces (PCSs)
|
||||
*/
|
||||
typedef enum {
|
||||
icSigXYZData = 0x58595A20L, /* 'XYZ ' */
|
||||
icSigLabData = 0x4C616220L, /* 'Lab ' */
|
||||
icSigLuvData = 0x4C757620L, /* 'Luv ' */
|
||||
icSigYCbCrData = 0x59436272L, /* 'YCbr' */
|
||||
icSigYxyData = 0x59787920L, /* 'Yxy ' */
|
||||
icSigRgbData = 0x52474220L, /* 'RGB ' */
|
||||
icSigGrayData = 0x47524159L, /* 'GRAY' */
|
||||
icSigHsvData = 0x48535620L, /* 'HSV ' */
|
||||
icSigHlsData = 0x484C5320L, /* 'HLS ' */
|
||||
icSigCmykData = 0x434D594BL, /* 'CMYK' */
|
||||
icSigCmyData = 0x434D5920L, /* 'CMY ' */
|
||||
icSig2colorData = 0x32434C52L, /* '2CLR' */
|
||||
icSig3colorData = 0x33434C52L, /* '3CLR' */
|
||||
icSig4colorData = 0x34434C52L, /* '4CLR' */
|
||||
icSig5colorData = 0x35434C52L, /* '5CLR' */
|
||||
icSig6colorData = 0x36434C52L, /* '6CLR' */
|
||||
icSig7colorData = 0x37434C52L, /* '7CLR' */
|
||||
icSig8colorData = 0x38434C52L, /* '8CLR' */
|
||||
icSig9colorData = 0x39434C52L, /* '9CLR' */
|
||||
icSig10colorData = 0x41434C52L, /* 'ACLR' */
|
||||
icSig11colorData = 0x42434C52L, /* 'BCLR' */
|
||||
icSig12colorData = 0x43434C52L, /* 'CCLR' */
|
||||
icSig13colorData = 0x44434C52L, /* 'DCLR' */
|
||||
icSig14colorData = 0x45434C52L, /* 'ECLR' */
|
||||
icSig15colorData = 0x46434C52L, /* 'FCLR' */
|
||||
icMaxEnumData = 0xFFFFFFFFL
|
||||
} icColorSpaceSignature;
|
||||
#endif
|
||||
|
||||
#include <stdio.h>
|
||||
|
||||
typedef int qcms_bool;
|
||||
|
||||
struct _qcms_transform;
|
||||
typedef struct _qcms_transform qcms_transform;
|
||||
|
||||
struct _qcms_profile;
|
||||
typedef struct _qcms_profile qcms_profile;
|
||||
|
||||
/* these values match the Rendering Intent values from the ICC spec */
|
||||
typedef enum {
|
||||
QCMS_INTENT_DEFAULT = 0,
|
||||
QCMS_INTENT_PERCEPTUAL = 0,
|
||||
QCMS_INTENT_RELATIVE_COLORIMETRIC = 1,
|
||||
QCMS_INTENT_SATURATION = 2,
|
||||
QCMS_INTENT_ABSOLUTE_COLORIMETRIC = 3
|
||||
} qcms_intent;
|
||||
|
||||
//XXX: I don't really like the _DATA_ prefix
|
||||
typedef enum {
|
||||
QCMS_DATA_RGB_8,
|
||||
QCMS_DATA_RGBA_8,
|
||||
QCMS_DATA_GRAY_8,
|
||||
QCMS_DATA_GRAYA_8
|
||||
} qcms_data_type;
|
||||
|
||||
/* the names for the following two types are sort of ugly */
|
||||
typedef struct
|
||||
{
|
||||
double x;
|
||||
double y;
|
||||
double Y;
|
||||
} qcms_CIE_xyY;
|
||||
|
||||
typedef struct
|
||||
{
|
||||
qcms_CIE_xyY red;
|
||||
qcms_CIE_xyY green;
|
||||
qcms_CIE_xyY blue;
|
||||
} qcms_CIE_xyYTRIPLE;
|
||||
|
||||
qcms_profile* qcms_profile_create_rgb_with_gamma(
|
||||
qcms_CIE_xyY white_point,
|
||||
qcms_CIE_xyYTRIPLE primaries,
|
||||
float gamma);
|
||||
|
||||
qcms_profile* qcms_profile_from_memory(const void *mem, size_t size);
|
||||
|
||||
qcms_profile* qcms_profile_from_file(FILE *file);
|
||||
qcms_profile* qcms_profile_from_path(const char *path);
|
||||
qcms_profile* qcms_profile_sRGB(void);
|
||||
void qcms_profile_release(qcms_profile *profile);
|
||||
|
||||
qcms_bool qcms_profile_is_bogus(qcms_profile *profile);
|
||||
qcms_intent qcms_profile_get_rendering_intent(qcms_profile *profile);
|
||||
icColorSpaceSignature qcms_profile_get_color_space(qcms_profile *profile);
|
||||
|
||||
void qcms_profile_precache_output_transform(qcms_profile *profile);
|
||||
|
||||
qcms_transform* qcms_transform_create(
|
||||
qcms_profile *in, qcms_data_type in_type,
|
||||
qcms_profile* out, qcms_data_type out_type,
|
||||
qcms_intent intent);
|
||||
|
||||
void qcms_transform_release(qcms_transform *);
|
||||
|
||||
void qcms_transform_data(qcms_transform *transform, void *src, void *dest, size_t length);
|
||||
|
||||
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif
|
|
@ -0,0 +1,143 @@
|
|||
#include <stdlib.h>
|
||||
#include "qcms.h"
|
||||
#include "qcmstypes.h"
|
||||
|
||||
/* used as a 16bit lookup table for the output transformation.
|
||||
* we refcount them so we only need to have one around per output
|
||||
* profile, instead of duplicating them per transform */
|
||||
struct precache_output
|
||||
{
|
||||
int ref_count;
|
||||
uint8_t data[65535];
|
||||
};
|
||||
|
||||
#ifdef _MSC_VER
|
||||
#define ALIGN __declspec(align(16))
|
||||
#else
|
||||
#define ALIGN __attribute__(( aligned (16) ))
|
||||
#endif
|
||||
|
||||
struct _qcms_transform {
|
||||
float ALIGN matrix[3][4];
|
||||
float *input_gamma_table_r;
|
||||
float *input_gamma_table_g;
|
||||
float *input_gamma_table_b;
|
||||
|
||||
float *input_gamma_table_gray;
|
||||
|
||||
float out_gamma_r;
|
||||
float out_gamma_g;
|
||||
float out_gamma_b;
|
||||
|
||||
float out_gamma_gray;
|
||||
|
||||
uint16_t *output_gamma_lut_r;
|
||||
uint16_t *output_gamma_lut_g;
|
||||
uint16_t *output_gamma_lut_b;
|
||||
|
||||
uint16_t *output_gamma_lut_gray;
|
||||
|
||||
size_t output_gamma_lut_r_length;
|
||||
size_t output_gamma_lut_g_length;
|
||||
size_t output_gamma_lut_b_length;
|
||||
|
||||
size_t output_gamma_lut_gray_length;
|
||||
|
||||
struct precache_output *output_table_r;
|
||||
struct precache_output *output_table_g;
|
||||
struct precache_output *output_table_b;
|
||||
|
||||
void (*transform_fn)(struct _qcms_transform *transform, unsigned char *src, unsigned char *dest, size_t length);
|
||||
};
|
||||
|
||||
typedef int32_t s15Fixed16Number;
|
||||
typedef uint16_t uInt16Number;
|
||||
|
||||
struct XYZNumber {
|
||||
s15Fixed16Number X;
|
||||
s15Fixed16Number Y;
|
||||
s15Fixed16Number Z;
|
||||
};
|
||||
|
||||
struct curveType {
|
||||
uint32_t count;
|
||||
uInt16Number data[0];
|
||||
};
|
||||
|
||||
struct lutType {
|
||||
uint8_t num_input_channels;
|
||||
uint8_t num_output_channels;
|
||||
uint8_t num_clut_grid_points;
|
||||
|
||||
s15Fixed16Number e00;
|
||||
s15Fixed16Number e01;
|
||||
s15Fixed16Number e02;
|
||||
s15Fixed16Number e10;
|
||||
s15Fixed16Number e11;
|
||||
s15Fixed16Number e12;
|
||||
s15Fixed16Number e20;
|
||||
s15Fixed16Number e21;
|
||||
s15Fixed16Number e22;
|
||||
|
||||
uint16_t num_input_table_entries;
|
||||
uint16_t num_output_table_entries;
|
||||
|
||||
uint16_t *input_table;
|
||||
uint16_t *clut_table;
|
||||
uint16_t *output_table;
|
||||
};
|
||||
#if 0
|
||||
this is from an intial idea of having the struct correspond to the data in
|
||||
the file. I decided that it wasn't a good idea.
|
||||
struct tag_value {
|
||||
uint32_t type;
|
||||
union {
|
||||
struct {
|
||||
uint32_t reserved;
|
||||
struct {
|
||||
s15Fixed16Number X;
|
||||
s15Fixed16Number Y;
|
||||
s15Fixed16Number Z;
|
||||
} XYZNumber;
|
||||
} XYZType;
|
||||
};
|
||||
}; // I guess we need to pack this?
|
||||
#endif
|
||||
|
||||
#define RGB_SIGNATURE 0x52474220
|
||||
#define GRAY_SIGNATURE 0x47524159
|
||||
|
||||
struct _qcms_profile {
|
||||
uint32_t class;
|
||||
uint32_t color_space;
|
||||
qcms_intent rendering_intent;
|
||||
struct XYZNumber redColorant;
|
||||
struct XYZNumber blueColorant;
|
||||
struct XYZNumber greenColorant;
|
||||
struct curveType *redTRC;
|
||||
struct curveType *blueTRC;
|
||||
struct curveType *greenTRC;
|
||||
struct curveType *grayTRC;
|
||||
struct lutType *A2B0;
|
||||
|
||||
struct precache_output *output_table_r;
|
||||
struct precache_output *output_table_g;
|
||||
struct precache_output *output_table_b;
|
||||
};
|
||||
|
||||
#ifdef _MSC_VER
|
||||
#define inline _inline
|
||||
#endif
|
||||
|
||||
static inline float s15Fixed16Number_to_float(s15Fixed16Number a)
|
||||
{
|
||||
return ((int32_t)a)/65536.;
|
||||
}
|
||||
|
||||
static inline s15Fixed16Number double_to_s15Fixed16Number(double v)
|
||||
{
|
||||
return (int32_t)(v*65536);
|
||||
}
|
||||
|
||||
void precache_release(struct precache_output *p);
|
||||
void set_rgb_colorants(qcms_profile *profile, qcms_CIE_xyY white_point, qcms_CIE_xyYTRIPLE primaries);
|
|
@ -0,0 +1,49 @@
|
|||
#ifndef QCMS_TYPES_H
|
||||
#define QCMS_TYPES_H
|
||||
|
||||
#ifdef MOZ_QCMS
|
||||
|
||||
#include "prtypes.h"
|
||||
|
||||
typedef PRInt8 int8_t;
|
||||
typedef PRUint8 uint8_t;
|
||||
typedef PRInt16 int16_t;
|
||||
typedef PRUint16 uint16_t;
|
||||
typedef PRInt32 int32_t;
|
||||
typedef PRUint32 uint32_t;
|
||||
typedef PRInt64 int64_t;
|
||||
typedef PRUint64 uint64_t;
|
||||
typedef PRUptrdiff uintptr_t;
|
||||
|
||||
#else
|
||||
|
||||
#if defined (_SVR4) || defined (SVR4) || defined (__OpenBSD__) || defined (_sgi) || defined (__sun) || defined (sun) || defined (__digital__)
|
||||
# include <inttypes.h>
|
||||
#elif defined (_MSC_VER)
|
||||
typedef __int8 int8_t;
|
||||
typedef unsigned __int8 uint8_t;
|
||||
typedef __int16 int16_t;
|
||||
typedef unsigned __int16 uint16_t;
|
||||
typedef __int32 int32_t;
|
||||
typedef unsigned __int32 uint32_t;
|
||||
typedef __int64 int64_t;
|
||||
typedef unsigned __int64 uint64_t;
|
||||
#ifdef _WIN64
|
||||
typedef unsigned __int64 uintptr_t;
|
||||
#else
|
||||
typedef unsigned long uintptr_t;
|
||||
#endif
|
||||
|
||||
#elif defined (_AIX)
|
||||
# include <sys/inttypes.h>
|
||||
#else
|
||||
# include <stdint.h>
|
||||
#endif
|
||||
|
||||
#endif
|
||||
|
||||
typedef qcms_bool bool;
|
||||
#define true 1
|
||||
#define false 0
|
||||
|
||||
#endif
|
Разница между файлами не показана из-за своего большого размера
Загрузить разницу
|
@ -62,6 +62,7 @@ REQUIRES = xpcom \
|
|||
unicharutil \
|
||||
imglib2 \
|
||||
$(ZLIB_REQUIRES) \
|
||||
qcms \
|
||||
$(NULL)
|
||||
|
||||
CPPSRCS = \
|
||||
|
@ -92,6 +93,7 @@ CPPSRCS += nsSystemFontsWin.cpp \
|
|||
|
||||
REQUIRES += \
|
||||
cairo \
|
||||
qcms \
|
||||
$(NULL)
|
||||
|
||||
_OS_LIBS = usp10
|
||||
|
|
|
@ -48,13 +48,11 @@
|
|||
#include "gfxASurface.h"
|
||||
#include "gfxColor.h"
|
||||
|
||||
#include "qcms.h"
|
||||
#ifdef XP_OS2
|
||||
#undef OS2EMX_PLAIN_CHAR
|
||||
#endif
|
||||
|
||||
typedef void* cmsHPROFILE;
|
||||
typedef void* cmsHTRANSFORM;
|
||||
|
||||
class gfxImageSurface;
|
||||
class gfxFont;
|
||||
class gfxFontGroup;
|
||||
|
@ -269,39 +267,39 @@ public:
|
|||
*
|
||||
* Sets 'out' to 'in' if transform is NULL.
|
||||
*/
|
||||
static void TransformPixel(const gfxRGBA& in, gfxRGBA& out, cmsHTRANSFORM transform);
|
||||
static void TransformPixel(const gfxRGBA& in, gfxRGBA& out, qcms_transform *transform);
|
||||
|
||||
/**
|
||||
* Return the output device ICC profile.
|
||||
*/
|
||||
static cmsHPROFILE GetCMSOutputProfile();
|
||||
static qcms_profile* GetCMSOutputProfile();
|
||||
|
||||
/**
|
||||
* Return the sRGB ICC profile.
|
||||
*/
|
||||
static cmsHPROFILE GetCMSsRGBProfile();
|
||||
static qcms_profile* GetCMSsRGBProfile();
|
||||
|
||||
/**
|
||||
* Return sRGB -> output device transform.
|
||||
*/
|
||||
static cmsHTRANSFORM GetCMSRGBTransform();
|
||||
static qcms_transform* GetCMSRGBTransform();
|
||||
|
||||
/**
|
||||
* Return output -> sRGB device transform.
|
||||
*/
|
||||
static cmsHTRANSFORM GetCMSInverseRGBTransform();
|
||||
static qcms_transform* GetCMSInverseRGBTransform();
|
||||
|
||||
/**
|
||||
* Return sRGBA -> output device transform.
|
||||
*/
|
||||
static cmsHTRANSFORM GetCMSRGBATransform();
|
||||
static qcms_transform* GetCMSRGBATransform();
|
||||
|
||||
protected:
|
||||
gfxPlatform() { }
|
||||
virtual ~gfxPlatform();
|
||||
|
||||
private:
|
||||
virtual cmsHPROFILE GetPlatformCMSOutputProfile();
|
||||
virtual qcms_profile* GetPlatformCMSOutputProfile();
|
||||
|
||||
nsCOMPtr<nsIObserver> overrideObserver;
|
||||
};
|
||||
|
|
|
@ -142,7 +142,7 @@ protected:
|
|||
static gfxFontconfigUtils *sFontconfigUtils;
|
||||
|
||||
private:
|
||||
virtual cmsHPROFILE GetPlatformCMSOutputProfile();
|
||||
virtual qcms_profile *GetPlatformCMSOutputProfile();
|
||||
};
|
||||
|
||||
#endif /* GFX_PLATFORM_GTK_H */
|
||||
|
|
|
@ -107,7 +107,7 @@ private:
|
|||
void AppendCJKPrefLangs(eFontPrefLang aPrefLangs[], PRUint32 &aLen,
|
||||
eFontPrefLang aCharLang, eFontPrefLang aPageLang);
|
||||
|
||||
virtual cmsHPROFILE GetPlatformCMSOutputProfile();
|
||||
virtual qcms_profile* GetPlatformCMSOutputProfile();
|
||||
|
||||
// read in the pref value for the lower threshold on font anti-aliasing
|
||||
static PRUint32 ReadAntiAliasingThreshold();
|
||||
|
|
|
@ -97,7 +97,7 @@ protected:
|
|||
static gfxFontconfigUtils *sFontconfigUtils;
|
||||
|
||||
private:
|
||||
virtual cmsHPROFILE GetPlatformCMSOutputProfile();
|
||||
virtual qcms_profile *GetPlatformCMSOutputProfile();
|
||||
};
|
||||
|
||||
#endif /* GFX_PLATFORM_QT_H */
|
||||
|
|
|
@ -165,7 +165,7 @@ private:
|
|||
nsRefPtr<FontFamily>& aFontFamily,
|
||||
void* userArg);
|
||||
|
||||
virtual cmsHPROFILE GetPlatformCMSOutputProfile();
|
||||
virtual qcms_profile* GetPlatformCMSOutputProfile();
|
||||
|
||||
static int PrefChangedCallback(const char*, void*);
|
||||
|
||||
|
|
|
@ -18,6 +18,7 @@ REQUIRES = \
|
|||
xpcom \
|
||||
unicharutil \
|
||||
$(LCMS_REQUIRES) \
|
||||
qcms \
|
||||
$(NULL)
|
||||
|
||||
CPPSRCS = \
|
||||
|
@ -47,7 +48,7 @@ EXTRA_DSO_LDOPTS += \
|
|||
$(XPCOM_LIBS) \
|
||||
$(NSPR_LIBS) \
|
||||
$(ZLIB_LIBS) \
|
||||
$(LCMS_LIBS) \
|
||||
$(QCMS_LIBS) \
|
||||
$(NULL)
|
||||
|
||||
|
||||
|
|
|
@ -46,7 +46,6 @@
|
|||
#endif
|
||||
|
||||
#include "cairo.h"
|
||||
#include "lcms.h"
|
||||
|
||||
#include "gfxContext.h"
|
||||
|
||||
|
|
|
@ -41,7 +41,6 @@
|
|||
#include "gfxPlatform.h"
|
||||
|
||||
#include "cairo.h"
|
||||
#include "lcms.h"
|
||||
|
||||
gfxPattern::gfxPattern(cairo_pattern_t *aPattern)
|
||||
{
|
||||
|
|
|
@ -64,7 +64,7 @@
|
|||
#include "nsWeakReference.h"
|
||||
|
||||
#include "cairo.h"
|
||||
#include "lcms.h"
|
||||
#include "qcms.h"
|
||||
|
||||
#include "plstr.h"
|
||||
#include "nsIPrefService.h"
|
||||
|
@ -74,12 +74,12 @@
|
|||
gfxPlatform *gPlatform = nsnull;
|
||||
|
||||
// These two may point to the same profile
|
||||
static cmsHPROFILE gCMSOutputProfile = nsnull;
|
||||
static cmsHPROFILE gCMSsRGBProfile = nsnull;
|
||||
static qcms_profile *gCMSOutputProfile = nsnull;
|
||||
static qcms_profile *gCMSsRGBProfile = nsnull;
|
||||
|
||||
static cmsHTRANSFORM gCMSRGBTransform = nsnull;
|
||||
static cmsHTRANSFORM gCMSInverseRGBTransform = nsnull;
|
||||
static cmsHTRANSFORM gCMSRGBATransform = nsnull;
|
||||
static qcms_transform *gCMSRGBTransform = nsnull;
|
||||
static qcms_transform *gCMSInverseRGBTransform = nsnull;
|
||||
static qcms_transform *gCMSRGBATransform = nsnull;
|
||||
|
||||
static PRBool gCMSInitialized = PR_FALSE;
|
||||
static eCMSMode gCMSMode = eCMSMode_Off;
|
||||
|
@ -223,16 +223,6 @@ gfxPlatform::Init()
|
|||
if (prefs)
|
||||
prefs->AddObserver(CMForceSRGBPrefName, gPlatform->overrideObserver, PR_TRUE);
|
||||
|
||||
/* By default, LCMS calls exit() on error, which isn't what we want. If
|
||||
cms is enabled, change the error functionality. */
|
||||
if (GetCMSMode() != eCMSMode_Off) {
|
||||
#ifdef DEBUG
|
||||
cmsErrorAction(LCMS_ERROR_SHOW);
|
||||
#else
|
||||
cmsErrorAction(LCMS_ERROR_IGNORE);
|
||||
#endif
|
||||
}
|
||||
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
|
@ -508,7 +498,9 @@ gfxPlatform::GetCMSMode()
|
|||
/* Chris Murphy (CM consultant) suggests this as a default in the event that we
|
||||
cannot reproduce relative + Black Point Compensation. BPC brings an
|
||||
unacceptable performance overhead, so we go with perceptual. */
|
||||
#define INTENT_DEFAULT INTENT_PERCEPTUAL
|
||||
#define INTENT_DEFAULT QCMS_INTENT_PERCEPTUAL
|
||||
#define INTENT_MIN 0
|
||||
#define INTENT_MAX 3
|
||||
|
||||
PRBool
|
||||
gfxPlatform::GetRenderingIntent()
|
||||
|
@ -540,20 +532,24 @@ gfxPlatform::GetRenderingIntent()
|
|||
}
|
||||
|
||||
void
|
||||
gfxPlatform::TransformPixel(const gfxRGBA& in, gfxRGBA& out, cmsHTRANSFORM transform)
|
||||
gfxPlatform::TransformPixel(const gfxRGBA& in, gfxRGBA& out, qcms_transform *transform)
|
||||
{
|
||||
|
||||
if (transform) {
|
||||
/* we want the bytes in RGB order */
|
||||
#ifdef IS_LITTLE_ENDIAN
|
||||
/* ABGR puts the bytes in |RGBA| order on little endian */
|
||||
PRUint32 packed = in.Packed(gfxRGBA::PACKED_ABGR);
|
||||
cmsDoTransform(transform,
|
||||
qcms_transform_data(transform,
|
||||
(PRUint8 *)&packed, (PRUint8 *)&packed,
|
||||
1);
|
||||
out.~gfxRGBA();
|
||||
new (&out) gfxRGBA(packed, gfxRGBA::PACKED_ABGR);
|
||||
#else
|
||||
/* ARGB puts the bytes in |ARGB| order on big endian */
|
||||
PRUint32 packed = in.Packed(gfxRGBA::PACKED_ARGB);
|
||||
cmsDoTransform(transform,
|
||||
/* add one to move past the alpha byte */
|
||||
qcms_transform_data(transform,
|
||||
(PRUint8 *)&packed + 1, (PRUint8 *)&packed + 1,
|
||||
1);
|
||||
out.~gfxRGBA();
|
||||
|
@ -565,13 +561,13 @@ gfxPlatform::TransformPixel(const gfxRGBA& in, gfxRGBA& out, cmsHTRANSFORM trans
|
|||
out = in;
|
||||
}
|
||||
|
||||
cmsHPROFILE
|
||||
qcms_profile *
|
||||
gfxPlatform::GetPlatformCMSOutputProfile()
|
||||
{
|
||||
return nsnull;
|
||||
}
|
||||
|
||||
cmsHPROFILE
|
||||
qcms_profile *
|
||||
gfxPlatform::GetCMSOutputProfile()
|
||||
{
|
||||
if (!gCMSOutputProfile) {
|
||||
|
@ -597,7 +593,7 @@ gfxPlatform::GetCMSOutputProfile()
|
|||
rv = prefs->GetCharPref(CMProfilePrefName,
|
||||
getter_Copies(fname));
|
||||
if (NS_SUCCEEDED(rv) && !fname.IsEmpty()) {
|
||||
gCMSOutputProfile = cmsOpenProfileFromFile(fname, "r");
|
||||
gCMSOutputProfile = qcms_profile_from_path(fname);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -609,92 +605,87 @@ gfxPlatform::GetCMSOutputProfile()
|
|||
|
||||
/* Determine if the profile looks bogus. If so, close the profile
|
||||
* and use sRGB instead. See bug 460629, */
|
||||
if (gCMSOutputProfile && cmsProfileIsBogus(gCMSOutputProfile)) {
|
||||
if (gCMSOutputProfile && qcms_profile_is_bogus(gCMSOutputProfile)) {
|
||||
NS_ASSERTION(gCMSOutputProfile != GetCMSsRGBProfile(),
|
||||
"Builtin sRGB profile tagged as bogus!!!");
|
||||
cmsCloseProfile(gCMSOutputProfile);
|
||||
qcms_profile_release(gCMSOutputProfile);
|
||||
gCMSOutputProfile = nsnull;
|
||||
}
|
||||
|
||||
if (!gCMSOutputProfile) {
|
||||
gCMSOutputProfile = GetCMSsRGBProfile();
|
||||
}
|
||||
|
||||
/* Precache the LUT16 Interpolations for the output profile. See
|
||||
bug 444661 for details. */
|
||||
cmsPrecacheProfile(gCMSOutputProfile, CMS_PRECACHE_LI168_REVERSE);
|
||||
qcms_profile_precache_output_transform(gCMSOutputProfile);
|
||||
}
|
||||
|
||||
return gCMSOutputProfile;
|
||||
}
|
||||
|
||||
cmsHPROFILE
|
||||
qcms_profile *
|
||||
gfxPlatform::GetCMSsRGBProfile()
|
||||
{
|
||||
if (!gCMSsRGBProfile) {
|
||||
|
||||
/* Create the profile using lcms. */
|
||||
gCMSsRGBProfile = cmsCreate_sRGBProfile();
|
||||
|
||||
/* Precache the Fixed-point Interpolations for sRGB as an input
|
||||
profile. See bug 444661 for details. */
|
||||
cmsPrecacheProfile(gCMSsRGBProfile, CMS_PRECACHE_LI8F_FORWARD);
|
||||
gCMSsRGBProfile = qcms_profile_sRGB();
|
||||
}
|
||||
return gCMSsRGBProfile;
|
||||
}
|
||||
|
||||
cmsHTRANSFORM
|
||||
qcms_transform *
|
||||
gfxPlatform::GetCMSRGBTransform()
|
||||
{
|
||||
if (!gCMSRGBTransform) {
|
||||
cmsHPROFILE inProfile, outProfile;
|
||||
qcms_profile *inProfile, *outProfile;
|
||||
outProfile = GetCMSOutputProfile();
|
||||
inProfile = GetCMSsRGBProfile();
|
||||
|
||||
if (!inProfile || !outProfile)
|
||||
return nsnull;
|
||||
|
||||
gCMSRGBTransform = cmsCreateTransform(inProfile, TYPE_RGB_8,
|
||||
outProfile, TYPE_RGB_8,
|
||||
INTENT_PERCEPTUAL, cmsFLAGS_FLOATSHAPER);
|
||||
gCMSRGBTransform = qcms_transform_create(inProfile, QCMS_DATA_RGB_8,
|
||||
outProfile, QCMS_DATA_RGB_8,
|
||||
QCMS_INTENT_PERCEPTUAL);
|
||||
}
|
||||
|
||||
return gCMSRGBTransform;
|
||||
}
|
||||
|
||||
cmsHTRANSFORM
|
||||
qcms_transform *
|
||||
gfxPlatform::GetCMSInverseRGBTransform()
|
||||
{
|
||||
if (!gCMSInverseRGBTransform) {
|
||||
cmsHPROFILE inProfile, outProfile;
|
||||
qcms_profile *inProfile, *outProfile;
|
||||
inProfile = GetCMSOutputProfile();
|
||||
outProfile = GetCMSsRGBProfile();
|
||||
|
||||
if (!inProfile || !outProfile)
|
||||
return nsnull;
|
||||
|
||||
gCMSInverseRGBTransform = cmsCreateTransform(inProfile, TYPE_RGB_8,
|
||||
outProfile, TYPE_RGB_8,
|
||||
INTENT_PERCEPTUAL, cmsFLAGS_FLOATSHAPER);
|
||||
gCMSInverseRGBTransform = qcms_transform_create(inProfile, QCMS_DATA_RGB_8,
|
||||
outProfile, QCMS_DATA_RGB_8,
|
||||
QCMS_INTENT_PERCEPTUAL);
|
||||
}
|
||||
|
||||
return gCMSInverseRGBTransform;
|
||||
}
|
||||
|
||||
cmsHTRANSFORM
|
||||
qcms_transform *
|
||||
gfxPlatform::GetCMSRGBATransform()
|
||||
{
|
||||
if (!gCMSRGBATransform) {
|
||||
cmsHPROFILE inProfile, outProfile;
|
||||
qcms_profile *inProfile, *outProfile;
|
||||
outProfile = GetCMSOutputProfile();
|
||||
inProfile = GetCMSsRGBProfile();
|
||||
|
||||
if (!inProfile || !outProfile)
|
||||
return nsnull;
|
||||
|
||||
gCMSRGBATransform = cmsCreateTransform(inProfile, TYPE_RGBA_8,
|
||||
outProfile, TYPE_RGBA_8,
|
||||
INTENT_PERCEPTUAL, cmsFLAGS_FLOATSHAPER);
|
||||
gCMSRGBATransform = qcms_transform_create(inProfile, QCMS_DATA_RGBA_8,
|
||||
outProfile, QCMS_DATA_RGBA_8,
|
||||
QCMS_INTENT_PERCEPTUAL);
|
||||
}
|
||||
|
||||
return gCMSRGBATransform;
|
||||
|
@ -705,19 +696,19 @@ static void ShutdownCMS()
|
|||
{
|
||||
|
||||
if (gCMSRGBTransform) {
|
||||
cmsDeleteTransform(gCMSRGBTransform);
|
||||
qcms_transform_release(gCMSRGBTransform);
|
||||
gCMSRGBTransform = nsnull;
|
||||
}
|
||||
if (gCMSInverseRGBTransform) {
|
||||
cmsDeleteTransform(gCMSInverseRGBTransform);
|
||||
qcms_transform_release(gCMSInverseRGBTransform);
|
||||
gCMSInverseRGBTransform = nsnull;
|
||||
}
|
||||
if (gCMSRGBATransform) {
|
||||
cmsDeleteTransform(gCMSRGBATransform);
|
||||
qcms_transform_release(gCMSRGBATransform);
|
||||
gCMSRGBATransform = nsnull;
|
||||
}
|
||||
if (gCMSOutputProfile) {
|
||||
cmsCloseProfile(gCMSOutputProfile);
|
||||
qcms_profile_release(gCMSOutputProfile);
|
||||
|
||||
// handle the aliased case
|
||||
if (gCMSsRGBProfile == gCMSOutputProfile)
|
||||
|
@ -725,7 +716,7 @@ static void ShutdownCMS()
|
|||
gCMSOutputProfile = nsnull;
|
||||
}
|
||||
if (gCMSsRGBProfile) {
|
||||
cmsCloseProfile(gCMSsRGBProfile);
|
||||
qcms_profile_release(gCMSsRGBProfile);
|
||||
gCMSsRGBProfile = nsnull;
|
||||
}
|
||||
|
||||
|
|
|
@ -77,8 +77,6 @@
|
|||
|
||||
#include "nsMathUtils.h"
|
||||
|
||||
#include "lcms.h"
|
||||
|
||||
#define GDK_PIXMAP_SIZE_MAX 32767
|
||||
|
||||
#ifndef MOZ_PANGO
|
||||
|
@ -529,7 +527,7 @@ gfxPlatformGtk::InitDPI()
|
|||
}
|
||||
}
|
||||
|
||||
cmsHPROFILE
|
||||
qcms_profile *
|
||||
gfxPlatformGtk::GetPlatformCMSOutputProfile()
|
||||
{
|
||||
#ifdef MOZ_X11
|
||||
|
@ -559,10 +557,10 @@ gfxPlatformGtk::GetPlatformCMSOutputProfile()
|
|||
&retAtom, &retFormat, &retLength,
|
||||
&retAfter, &retProperty);
|
||||
|
||||
cmsHPROFILE profile = NULL;
|
||||
qcms_profile* profile = NULL;
|
||||
|
||||
if (retLength > 0)
|
||||
profile = cmsOpenProfileFromMem(retProperty, retLength);
|
||||
profile = qcms_profile_from_memory(retProperty, retLength);
|
||||
|
||||
XFree(retProperty);
|
||||
|
||||
|
@ -584,8 +582,8 @@ gfxPlatformGtk::GetPlatformCMSOutputProfile()
|
|||
&retAtom, &retFormat, &retLength,
|
||||
&retAfter, &retProperty)) {
|
||||
double gamma;
|
||||
cmsCIExyY whitePoint;
|
||||
cmsCIExyYTRIPLE primaries;
|
||||
qcms_CIE_xyY whitePoint;
|
||||
qcms_CIE_xyYTRIPLE primaries;
|
||||
|
||||
if (retLength != 128) {
|
||||
#ifdef DEBUG_tor
|
||||
|
@ -603,23 +601,23 @@ gfxPlatformGtk::GetPlatformCMSOutputProfile()
|
|||
(retProperty[0x1a] >> 0 & 3)) / 1024.0;
|
||||
whitePoint.Y = 1.0;
|
||||
|
||||
primaries.Red.x = ((retProperty[0x1b] << 2) |
|
||||
primaries.red.x = ((retProperty[0x1b] << 2) |
|
||||
(retProperty[0x19] >> 6 & 3)) / 1024.0;
|
||||
primaries.Red.y = ((retProperty[0x1c] << 2) |
|
||||
primaries.red.y = ((retProperty[0x1c] << 2) |
|
||||
(retProperty[0x19] >> 4 & 3)) / 1024.0;
|
||||
primaries.Red.Y = 1.0;
|
||||
primaries.red.Y = 1.0;
|
||||
|
||||
primaries.Green.x = ((retProperty[0x1d] << 2) |
|
||||
primaries.green.x = ((retProperty[0x1d] << 2) |
|
||||
(retProperty[0x19] >> 2 & 3)) / 1024.0;
|
||||
primaries.Green.y = ((retProperty[0x1e] << 2) |
|
||||
primaries.green.y = ((retProperty[0x1e] << 2) |
|
||||
(retProperty[0x19] >> 0 & 3)) / 1024.0;
|
||||
primaries.Green.Y = 1.0;
|
||||
primaries.green.Y = 1.0;
|
||||
|
||||
primaries.Blue.x = ((retProperty[0x1f] << 2) |
|
||||
primaries.blue.x = ((retProperty[0x1f] << 2) |
|
||||
(retProperty[0x1a] >> 6 & 3)) / 1024.0;
|
||||
primaries.Blue.y = ((retProperty[0x20] << 2) |
|
||||
primaries.blue.y = ((retProperty[0x20] << 2) |
|
||||
(retProperty[0x1a] >> 4 & 3)) / 1024.0;
|
||||
primaries.Blue.Y = 1.0;
|
||||
primaries.blue.Y = 1.0;
|
||||
|
||||
XFree(retProperty);
|
||||
|
||||
|
@ -633,17 +631,8 @@ gfxPlatformGtk::GetPlatformCMSOutputProfile()
|
|||
primaries.Blue.x, primaries.Blue.y, primaries.Blue.Y);
|
||||
#endif
|
||||
|
||||
LPGAMMATABLE gammaTable[3];
|
||||
gammaTable[0] = gammaTable[1] = gammaTable[2] =
|
||||
cmsBuildGamma(256, gamma);
|
||||
|
||||
if (!gammaTable[0])
|
||||
return nsnull;
|
||||
|
||||
cmsHPROFILE profile =
|
||||
cmsCreateRGBProfile(&whitePoint, &primaries, gammaTable);
|
||||
|
||||
cmsFreeGamma(gammaTable[0]);
|
||||
qcms_profile* profile =
|
||||
qcms_profile_create_rgb_with_gamma(whitePoint, primaries, gamma);
|
||||
|
||||
#ifdef DEBUG_tor
|
||||
if (profile) {
|
||||
|
|
|
@ -58,7 +58,7 @@
|
|||
#include "nsTArray.h"
|
||||
#include "nsUnicodeRange.h"
|
||||
|
||||
#include "lcms.h"
|
||||
#include "qcms.h"
|
||||
|
||||
gfxPlatformMac::gfxPlatformMac()
|
||||
{
|
||||
|
@ -382,7 +382,7 @@ gfxPlatformMac::ReadAntiAliasingThreshold()
|
|||
return threshold;
|
||||
}
|
||||
|
||||
cmsHPROFILE
|
||||
qcms_profile *
|
||||
gfxPlatformMac::GetPlatformCMSOutputProfile()
|
||||
{
|
||||
CMProfileLocation device;
|
||||
|
@ -393,14 +393,14 @@ gfxPlatformMac::GetPlatformCMSOutputProfile()
|
|||
if (err != noErr)
|
||||
return nsnull;
|
||||
|
||||
cmsHPROFILE profile = nsnull;
|
||||
qcms_profile *profile = nsnull;
|
||||
switch (device.locType) {
|
||||
case cmFileBasedProfile: {
|
||||
FSRef fsRef;
|
||||
if (!FSpMakeFSRef(&device.u.fileLoc.spec, &fsRef)) {
|
||||
char path[512];
|
||||
if (!FSRefMakePath(&fsRef, (UInt8*)(path), sizeof(path))) {
|
||||
profile = cmsOpenProfileFromFile(path, "r");
|
||||
profile = qcms_profile_from_path(path);
|
||||
#ifdef DEBUG_tor
|
||||
if (profile)
|
||||
fprintf(stderr,
|
||||
|
@ -411,7 +411,7 @@ gfxPlatformMac::GetPlatformCMSOutputProfile()
|
|||
break;
|
||||
}
|
||||
case cmPathBasedProfile:
|
||||
profile = cmsOpenProfileFromFile(device.u.pathLoc.path, "r");
|
||||
profile = qcms_profile_from_path(device.u.pathLoc.path);
|
||||
#ifdef DEBUG_tor
|
||||
if (profile)
|
||||
fprintf(stderr,
|
||||
|
|
|
@ -59,7 +59,7 @@
|
|||
#include "nsMathUtils.h"
|
||||
#include "nsTArray.h"
|
||||
|
||||
#include "lcms.h"
|
||||
#include "qcms.h"
|
||||
|
||||
#include <ft2build.h>
|
||||
#include FT_FREETYPE_H
|
||||
|
@ -354,7 +354,7 @@ gfxQtPlatform::InitDPI()
|
|||
}
|
||||
}
|
||||
|
||||
cmsHPROFILE
|
||||
qcms_profile*
|
||||
gfxQtPlatform::GetPlatformCMSOutputProfile()
|
||||
{
|
||||
return nsnull;
|
||||
|
|
|
@ -71,8 +71,6 @@
|
|||
|
||||
#include <string>
|
||||
|
||||
#include "lcms.h"
|
||||
|
||||
#ifdef MOZ_FT2_FONTS
|
||||
static FT_Library gPlatformFTLibrary = NULL;
|
||||
#endif
|
||||
|
@ -847,7 +845,7 @@ gfxWindowsPlatform::FindFontEntry(const nsAString& aName, const gfxFontStyle& aF
|
|||
return ff->FindFontEntry(aFontStyle);
|
||||
}
|
||||
|
||||
cmsHPROFILE
|
||||
qcms_profile*
|
||||
gfxWindowsPlatform::GetPlatformCMSOutputProfile()
|
||||
{
|
||||
#ifndef MOZ_FT2_FONTS
|
||||
|
@ -858,8 +856,8 @@ gfxWindowsPlatform::GetPlatformCMSOutputProfile()
|
|||
GetICMProfileW(dc, &size, (LPWSTR)&str);
|
||||
ReleaseDC(nsnull, dc);
|
||||
|
||||
cmsHPROFILE profile =
|
||||
cmsOpenProfileFromFile(NS_ConvertUTF16toUTF8(str).get(), "r");
|
||||
qcms_profile* profile =
|
||||
qcms_profile_from_path(NS_ConvertUTF16toUTF8(str).get());
|
||||
#ifdef DEBUG_tor
|
||||
if (profile)
|
||||
fprintf(stderr,
|
||||
|
|
|
@ -51,10 +51,10 @@ REQUIRES = \
|
|||
thebes \
|
||||
cairo \
|
||||
pref \
|
||||
lcms \
|
||||
necko \
|
||||
unicharutil \
|
||||
nspr \
|
||||
qcms \
|
||||
$(NULL)
|
||||
|
||||
# All platforms
|
||||
|
@ -63,8 +63,8 @@ CPPSRCS = \
|
|||
gfxFontSelectionTest.cpp \
|
||||
gfxTextRunPerfTest.cpp \
|
||||
gfxWordCacheTest.cpp \
|
||||
gfxColorManagementTest.cpp \
|
||||
$(NULL)
|
||||
# gfxColorManagementTest.cpp \
|
||||
|
||||
ifeq ($(MOZ_WIDGET_TOOLKIT),cocoa)
|
||||
CMMSRCS = gfxTestCocoaHelper.mm
|
||||
|
@ -86,7 +86,6 @@ LIBS = $(HELPER_OBJS) \
|
|||
$(NSPR_LIBS) \
|
||||
$(TK_LIBS) \
|
||||
$(ZLIB_LIBS) \
|
||||
$(LCMS_LIBS) \
|
||||
$(NULL)
|
||||
|
||||
ifeq ($(MOZ_WIDGET_TOOLKIT),windows)
|
||||
|
|
|
@ -78,6 +78,7 @@ REQUIRES = xpcom \
|
|||
shistory \
|
||||
caps \
|
||||
thebes \
|
||||
qcms \
|
||||
$(NULL)
|
||||
|
||||
ifdef ACCESSIBILITY
|
||||
|
|
|
@ -64,6 +64,7 @@ REQUIRES = xpcom \
|
|||
webbrwsr \
|
||||
pref \
|
||||
js \
|
||||
qcms \
|
||||
$(NULL)
|
||||
|
||||
LOCAL_INCLUDES = \
|
||||
|
|
|
@ -63,6 +63,7 @@ REQUIRES = xpcom \
|
|||
xpconnect \
|
||||
docshell \
|
||||
thebes \
|
||||
qcms \
|
||||
$(NULL)
|
||||
|
||||
CPPSRCS = \
|
||||
|
|
|
@ -60,7 +60,7 @@ REQUIRES = xpcom \
|
|||
$(JPEG_REQUIRES) \
|
||||
$(PNG_REQUIRES) \
|
||||
$(ZLIB_REQUIRES) \
|
||||
$(LCMS_REQUIRES) \
|
||||
qcms \
|
||||
$(NULL)
|
||||
|
||||
CPPSRCS = \
|
||||
|
@ -93,7 +93,7 @@ EXTRA_DSO_LDOPTS = \
|
|||
$(LIBS_DIR) \
|
||||
$(JPEG_LIBS) \
|
||||
$(PNG_LIBS) $(ZLIB_LIBS) \
|
||||
$(LCMS_LIBS) \
|
||||
$(QCMS_LIBS) \
|
||||
$(EXTRA_DSO_LIBS) \
|
||||
$(MOZ_COMPONENT_LIBS) \
|
||||
$(NULL)
|
||||
|
|
|
@ -53,7 +53,7 @@ REQUIRES = xpcom \
|
|||
gfx \
|
||||
thebes \
|
||||
imglib2 \
|
||||
$(LCMS_REQUIRES) \
|
||||
qcms \
|
||||
$(NULL)
|
||||
|
||||
CPPSRCS = nsGIFDecoder2.cpp
|
||||
|
|
|
@ -86,7 +86,7 @@ mailing address.
|
|||
|
||||
#include "gfxColor.h"
|
||||
#include "gfxPlatform.h"
|
||||
#include "lcms.h"
|
||||
#include "qcms.h"
|
||||
|
||||
/*
|
||||
* GETN(n, s) requests at least 'n' bytes available from 'q', at start of state 's'
|
||||
|
@ -681,9 +681,9 @@ static void ConvertColormap(PRUint32 *aColormap, PRUint32 aColors)
|
|||
{
|
||||
// Apply CMS transformation if enabled and available
|
||||
if (gfxPlatform::GetCMSMode() == eCMSMode_All) {
|
||||
cmsHTRANSFORM transform = gfxPlatform::GetCMSRGBTransform();
|
||||
qcms_transform *transform = gfxPlatform::GetCMSRGBTransform();
|
||||
if (transform)
|
||||
cmsDoTransform(transform, aColormap, aColormap, aColors);
|
||||
qcms_transform_data(transform, aColormap, aColormap, aColors);
|
||||
}
|
||||
// Convert from the GIF's RGB format to the Cairo format.
|
||||
// Work from end to begin, because of the in-place expansion
|
||||
|
|
|
@ -54,7 +54,7 @@ REQUIRES = xpcom \
|
|||
thebes \
|
||||
imglib2 \
|
||||
$(JPEG_REQUIRES) \
|
||||
$(LCMS_REQUIRES) \
|
||||
qcms \
|
||||
$(NULL)
|
||||
|
||||
CPPSRCS = nsJPEGDecoder.cpp
|
||||
|
|
|
@ -125,9 +125,9 @@ nsJPEGDecoder::~nsJPEGDecoder()
|
|||
{
|
||||
PR_FREEIF(mBackBuffer);
|
||||
if (mTransform)
|
||||
cmsDeleteTransform(mTransform);
|
||||
qcms_transform_release(mTransform);
|
||||
if (mInProfile)
|
||||
cmsCloseProfile(mInProfile);
|
||||
qcms_profile_release(mInProfile);
|
||||
|
||||
PR_LOG(gJPEGDecoderAccountingLog, PR_LOG_DEBUG,
|
||||
("nsJPEGDecoder::~nsJPEGDecoder: Destroying JPEG decoder %p",
|
||||
|
@ -338,10 +338,10 @@ nsresult nsJPEGDecoder::ProcessData(const char *data, PRUint32 count, PRUint32 *
|
|||
|
||||
if ((cmsMode != eCMSMode_Off) &&
|
||||
read_icc_profile(&mInfo, &profile, &profileLength) &&
|
||||
(mInProfile = cmsOpenProfileFromMem(profile, profileLength)) != NULL) {
|
||||
(mInProfile = qcms_profile_from_memory(profile, profileLength)) != NULL) {
|
||||
free(profile);
|
||||
|
||||
PRUint32 profileSpace = cmsGetColorSpace(mInProfile);
|
||||
PRUint32 profileSpace = qcms_profile_get_color_space(mInProfile);
|
||||
PRBool mismatch = PR_FALSE;
|
||||
|
||||
#ifdef DEBUG_tor
|
||||
|
@ -361,14 +361,13 @@ nsresult nsJPEGDecoder::ProcessData(const char *data, PRUint32 count, PRUint32 *
|
|||
case JCS_YCbCr:
|
||||
if (profileSpace == icSigRgbData)
|
||||
mInfo.out_color_space = JCS_RGB;
|
||||
else if (profileSpace != icSigYCbCrData)
|
||||
else
|
||||
// qcms doesn't support ycbcr
|
||||
mismatch = PR_TRUE;
|
||||
break;
|
||||
case JCS_CMYK:
|
||||
case JCS_YCCK:
|
||||
if (profileSpace == icSigCmykData)
|
||||
mInfo.out_color_space = JCS_CMYK;
|
||||
else
|
||||
// qcms doesn't support cmyk
|
||||
mismatch = PR_TRUE;
|
||||
break;
|
||||
default:
|
||||
|
@ -379,19 +378,13 @@ nsresult nsJPEGDecoder::ProcessData(const char *data, PRUint32 count, PRUint32 *
|
|||
}
|
||||
|
||||
if (!mismatch) {
|
||||
PRUint32 type;
|
||||
qcms_data_type type;
|
||||
switch (mInfo.out_color_space) {
|
||||
case JCS_GRAYSCALE:
|
||||
type = COLORSPACE_SH(PT_GRAY) | CHANNELS_SH(1) | BYTES_SH(1);
|
||||
type = QCMS_DATA_GRAY_8;
|
||||
break;
|
||||
case JCS_RGB:
|
||||
type = COLORSPACE_SH(PT_RGB) | CHANNELS_SH(3) | BYTES_SH(1);
|
||||
break;
|
||||
case JCS_YCbCr:
|
||||
type = COLORSPACE_SH(PT_YCbCr) | CHANNELS_SH(3) | BYTES_SH(1);
|
||||
break;
|
||||
case JCS_CMYK:
|
||||
type = COLORSPACE_SH(PT_CMYK) | CHANNELS_SH(4) | BYTES_SH(1);
|
||||
type = QCMS_DATA_RGB_8;
|
||||
break;
|
||||
default:
|
||||
mState = JPEG_ERROR;
|
||||
|
@ -399,26 +392,28 @@ nsresult nsJPEGDecoder::ProcessData(const char *data, PRUint32 count, PRUint32 *
|
|||
("} (unknown colorpsace (2))"));
|
||||
return NS_ERROR_UNEXPECTED;
|
||||
}
|
||||
|
||||
#if 0
|
||||
We don't currently support CMYK profiles. The following
|
||||
code dealt with lcms types. Add something like this
|
||||
back when we gain support for CMYK.
|
||||
/* Adobe Photoshop writes YCCK/CMYK files with inverted data */
|
||||
if (mInfo.out_color_space == JCS_CMYK)
|
||||
type |= FLAVOR_SH(mInfo.saw_Adobe_marker ? 1 : 0);
|
||||
|
||||
#endif
|
||||
|
||||
if (gfxPlatform::GetCMSOutputProfile()) {
|
||||
|
||||
/* Calculate rendering intent. */
|
||||
int intent = gfxPlatform::GetRenderingIntent();
|
||||
if (intent == -1)
|
||||
intent = cmsTakeRenderingIntent(mInProfile);
|
||||
intent = qcms_profile_get_rendering_intent(mInProfile);
|
||||
|
||||
/* Create the color management transform. */
|
||||
mTransform = cmsCreateTransform(mInProfile,
|
||||
mTransform = qcms_transform_create(mInProfile,
|
||||
type,
|
||||
gfxPlatform::GetCMSOutputProfile(),
|
||||
TYPE_RGB_8,
|
||||
intent,
|
||||
cmsFLAGS_FLOATSHAPER);
|
||||
QCMS_DATA_RGB_8,
|
||||
(qcms_intent)intent);
|
||||
}
|
||||
} else {
|
||||
#ifdef DEBUG_tor
|
||||
|
@ -743,7 +738,7 @@ nsJPEGDecoder::OutputScanlines(PRBool* suspend)
|
|||
to the 3byte RGB byte pixels at 'end' of row */
|
||||
sampleRow += mInfo.output_width;
|
||||
}
|
||||
cmsDoTransform(mTransform, source, sampleRow, mInfo.output_width);
|
||||
qcms_transform_data(mTransform, source, sampleRow, mInfo.output_width);
|
||||
/* Move 3byte RGB data to end of row */
|
||||
if (mInfo.out_color_space == JCS_CMYK) {
|
||||
memmove(sampleRow + mInfo.output_width,
|
||||
|
@ -761,9 +756,9 @@ nsJPEGDecoder::OutputScanlines(PRBool* suspend)
|
|||
}
|
||||
if (gfxPlatform::GetCMSMode() == eCMSMode_All) {
|
||||
/* No embedded ICC profile - treat as sRGB */
|
||||
cmsHTRANSFORM transform = gfxPlatform::GetCMSRGBTransform();
|
||||
qcms_transform *transform = gfxPlatform::GetCMSRGBTransform();
|
||||
if (transform) {
|
||||
cmsDoTransform(transform, sampleRow, sampleRow, mInfo.output_width);
|
||||
qcms_transform_data(transform, sampleRow, sampleRow, mInfo.output_width);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -50,7 +50,7 @@
|
|||
#include "imgILoad.h"
|
||||
#include "nsIInputStream.h"
|
||||
#include "nsIPipe.h"
|
||||
#include "lcms.h"
|
||||
#include "qcms.h"
|
||||
|
||||
extern "C" {
|
||||
#include "jpeglib.h"
|
||||
|
@ -122,8 +122,8 @@ public:
|
|||
JOCTET *mProfile;
|
||||
PRUint32 mProfileLength;
|
||||
|
||||
cmsHPROFILE mInProfile;
|
||||
cmsHTRANSFORM mTransform;
|
||||
qcms_profile *mInProfile;
|
||||
qcms_transform *mTransform;
|
||||
|
||||
PRPackedBool mReading;
|
||||
};
|
||||
|
|
|
@ -57,7 +57,7 @@ REQUIRES = xpcom \
|
|||
imglib2 \
|
||||
$(PNG_REQUIRES) \
|
||||
$(ZLIB_REQUIRES) \
|
||||
$(LCMS_REQUIRES) \
|
||||
qcms \
|
||||
$(NULL)
|
||||
|
||||
CPPSRCS = nsPNGDecoder.cpp
|
||||
|
|
|
@ -89,11 +89,11 @@ nsPNGDecoder::~nsPNGDecoder()
|
|||
if (interlacebuf)
|
||||
nsMemory::Free(interlacebuf);
|
||||
if (mInProfile) {
|
||||
cmsCloseProfile(mInProfile);
|
||||
qcms_profile_release(mInProfile);
|
||||
|
||||
/* mTransform belongs to us only if mInProfile is non-null */
|
||||
if (mTransform)
|
||||
cmsDeleteTransform(mTransform);
|
||||
qcms_transform_release(mTransform);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -397,12 +397,12 @@ PNGDoGammaCorrection(png_structp png_ptr, png_infop info_ptr)
|
|||
}
|
||||
|
||||
// Adapted from http://www.littlecms.com/pngchrm.c example code
|
||||
static cmsHPROFILE
|
||||
static qcms_profile *
|
||||
PNGGetColorProfile(png_structp png_ptr, png_infop info_ptr,
|
||||
int color_type, PRUint32 *inType, PRUint32 *intent)
|
||||
int color_type, qcms_data_type *inType, PRUint32 *intent)
|
||||
{
|
||||
cmsHPROFILE profile = nsnull;
|
||||
*intent = INTENT_PERCEPTUAL; // Our default
|
||||
qcms_profile *profile = nsnull;
|
||||
*intent = QCMS_INTENT_PERCEPTUAL; // Our default
|
||||
|
||||
// First try to see if iCCP chunk is present
|
||||
if (png_get_valid(png_ptr, info_ptr, PNG_INFO_iCCP)) {
|
||||
|
@ -413,38 +413,40 @@ PNGGetColorProfile(png_structp png_ptr, png_infop info_ptr,
|
|||
png_get_iCCP(png_ptr, info_ptr, &profileName, &compression,
|
||||
&profileData, &profileLen);
|
||||
|
||||
profile = cmsOpenProfileFromMem(profileData, profileLen);
|
||||
PRUint32 profileSpace = cmsGetColorSpace(profile);
|
||||
profile = qcms_profile_from_memory(profileData, profileLen);
|
||||
if (profile) {
|
||||
PRUint32 profileSpace = qcms_profile_get_color_space(profile);
|
||||
|
||||
PRBool mismatch = PR_FALSE;
|
||||
if (color_type & PNG_COLOR_MASK_COLOR) {
|
||||
if (profileSpace != icSigRgbData)
|
||||
mismatch = PR_TRUE;
|
||||
} else {
|
||||
if (profileSpace == icSigRgbData)
|
||||
png_set_gray_to_rgb(png_ptr);
|
||||
else if (profileSpace != icSigGrayData)
|
||||
mismatch = PR_TRUE;
|
||||
}
|
||||
PRBool mismatch = PR_FALSE;
|
||||
if (color_type & PNG_COLOR_MASK_COLOR) {
|
||||
if (profileSpace != icSigRgbData)
|
||||
mismatch = PR_TRUE;
|
||||
} else {
|
||||
if (profileSpace == icSigRgbData)
|
||||
png_set_gray_to_rgb(png_ptr);
|
||||
else if (profileSpace != icSigGrayData)
|
||||
mismatch = PR_TRUE;
|
||||
}
|
||||
|
||||
if (mismatch) {
|
||||
cmsCloseProfile(profile);
|
||||
profile = nsnull;
|
||||
} else {
|
||||
*intent = cmsTakeRenderingIntent(profile);
|
||||
if (mismatch) {
|
||||
qcms_profile_release(profile);
|
||||
profile = nsnull;
|
||||
} else {
|
||||
*intent = qcms_profile_get_rendering_intent(profile);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Check sRGB chunk
|
||||
if (!profile && png_get_valid(png_ptr, info_ptr, PNG_INFO_sRGB)) {
|
||||
profile = cmsCreate_sRGBProfile();
|
||||
profile = qcms_profile_sRGB();
|
||||
|
||||
if (profile) {
|
||||
int fileIntent;
|
||||
png_set_gray_to_rgb(png_ptr);
|
||||
png_get_sRGB(png_ptr, info_ptr, &fileIntent);
|
||||
PRUint32 map[] = { INTENT_PERCEPTUAL, INTENT_RELATIVE_COLORIMETRIC,
|
||||
INTENT_SATURATION, INTENT_ABSOLUTE_COLORIMETRIC };
|
||||
PRUint32 map[] = { QCMS_INTENT_PERCEPTUAL, QCMS_INTENT_RELATIVE_COLORIMETRIC,
|
||||
QCMS_INTENT_SATURATION, QCMS_INTENT_ABSOLUTE_COLORIMETRIC };
|
||||
*intent = map[fileIntent];
|
||||
}
|
||||
}
|
||||
|
@ -453,49 +455,40 @@ PNGGetColorProfile(png_structp png_ptr, png_infop info_ptr,
|
|||
if (!profile &&
|
||||
png_get_valid(png_ptr, info_ptr, PNG_INFO_gAMA) &&
|
||||
png_get_valid(png_ptr, info_ptr, PNG_INFO_cHRM)) {
|
||||
cmsCIExyYTRIPLE primaries;
|
||||
cmsCIExyY whitePoint;
|
||||
qcms_CIE_xyYTRIPLE primaries;
|
||||
qcms_CIE_xyY whitePoint;
|
||||
|
||||
png_get_cHRM(png_ptr, info_ptr,
|
||||
&whitePoint.x, &whitePoint.y,
|
||||
&primaries.Red.x, &primaries.Red.y,
|
||||
&primaries.Green.x, &primaries.Green.y,
|
||||
&primaries.Blue.x, &primaries.Blue.y);
|
||||
&primaries.red.x, &primaries.red.y,
|
||||
&primaries.green.x, &primaries.green.y,
|
||||
&primaries.blue.x, &primaries.blue.y);
|
||||
whitePoint.Y =
|
||||
primaries.Red.Y = primaries.Green.Y = primaries.Blue.Y = 1.0;
|
||||
primaries.red.Y = primaries.green.Y = primaries.blue.Y = 1.0;
|
||||
|
||||
double gammaOfFile;
|
||||
LPGAMMATABLE gammaTable[3];
|
||||
|
||||
png_get_gAMA(png_ptr, info_ptr, &gammaOfFile);
|
||||
|
||||
gammaTable[0] = gammaTable[1] = gammaTable[2] =
|
||||
cmsBuildGamma(256, 1/gammaOfFile);
|
||||
|
||||
if (!gammaTable[0])
|
||||
return nsnull;
|
||||
|
||||
profile = cmsCreateRGBProfile(&whitePoint, &primaries, gammaTable);
|
||||
profile = qcms_profile_create_rgb_with_gamma(whitePoint, primaries, 1/gammaOfFile);
|
||||
|
||||
if (profile)
|
||||
png_set_gray_to_rgb(png_ptr);
|
||||
|
||||
cmsFreeGamma(gammaTable[0]);
|
||||
}
|
||||
|
||||
if (profile) {
|
||||
PRUint32 profileSpace = cmsGetColorSpace(profile);
|
||||
PRUint32 profileSpace = qcms_profile_get_color_space(profile);
|
||||
if (profileSpace == icSigGrayData) {
|
||||
if (color_type & PNG_COLOR_MASK_ALPHA)
|
||||
*inType = TYPE_GRAYA_8;
|
||||
*inType = QCMS_DATA_GRAYA_8;
|
||||
else
|
||||
*inType = TYPE_GRAY_8;
|
||||
*inType = QCMS_DATA_GRAY_8;
|
||||
} else {
|
||||
if (color_type & PNG_COLOR_MASK_ALPHA ||
|
||||
png_get_valid(png_ptr, info_ptr, PNG_INFO_tRNS))
|
||||
*inType = TYPE_RGBA_8;
|
||||
*inType = QCMS_DATA_RGBA_8;
|
||||
else
|
||||
*inType = TYPE_RGB_8;
|
||||
*inType = QCMS_DATA_RGB_8;
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -556,7 +549,8 @@ info_callback(png_structp png_ptr, png_infop info_ptr)
|
|||
if (bit_depth == 16)
|
||||
png_set_strip_16(png_ptr);
|
||||
|
||||
PRUint32 inType, intent, pIntent;
|
||||
qcms_data_type inType;
|
||||
PRUint32 intent, pIntent;
|
||||
if (gfxPlatform::GetCMSMode() != eCMSMode_Off) {
|
||||
intent = gfxPlatform::GetRenderingIntent();
|
||||
decoder->mInProfile = PNGGetColorProfile(png_ptr, info_ptr,
|
||||
|
@ -566,25 +560,19 @@ info_callback(png_structp png_ptr, png_infop info_ptr)
|
|||
intent = pIntent;
|
||||
}
|
||||
if (decoder->mInProfile && gfxPlatform::GetCMSOutputProfile()) {
|
||||
PRUint32 outType;
|
||||
qcms_data_type outType;
|
||||
PRUint32 dwFlags = 0;
|
||||
|
||||
if (color_type & PNG_COLOR_MASK_ALPHA || num_trans)
|
||||
outType = TYPE_RGBA_8;
|
||||
outType = QCMS_DATA_RGBA_8;
|
||||
else
|
||||
outType = TYPE_RGB_8;
|
||||
outType = QCMS_DATA_RGB_8;
|
||||
|
||||
/* Determine if we can use the optimized floating point path. */
|
||||
if ((inType == outType) &&
|
||||
((inType == TYPE_RGB_8) || (inType == TYPE_RGBA_8)))
|
||||
dwFlags |= cmsFLAGS_FLOATSHAPER;
|
||||
|
||||
decoder->mTransform = cmsCreateTransform(decoder->mInProfile,
|
||||
decoder->mTransform = qcms_transform_create(decoder->mInProfile,
|
||||
inType,
|
||||
gfxPlatform::GetCMSOutputProfile(),
|
||||
outType,
|
||||
intent,
|
||||
dwFlags);
|
||||
(qcms_intent)intent);
|
||||
} else {
|
||||
png_set_gray_to_rgb(png_ptr);
|
||||
PNGDoGammaCorrection(png_ptr, info_ptr);
|
||||
|
@ -749,7 +737,7 @@ row_callback(png_structp png_ptr, png_bytep new_row,
|
|||
|
||||
if (decoder->mTransform) {
|
||||
if (decoder->mCMSLine) {
|
||||
cmsDoTransform(decoder->mTransform, line, decoder->mCMSLine, iwidth);
|
||||
qcms_transform_data(decoder->mTransform, line, decoder->mCMSLine, iwidth);
|
||||
/* copy alpha over */
|
||||
PRUint32 channels = decoder->mChannels;
|
||||
if (channels == 2 || channels == 4) {
|
||||
|
@ -758,7 +746,7 @@ row_callback(png_structp png_ptr, png_bytep new_row,
|
|||
}
|
||||
line = decoder->mCMSLine;
|
||||
} else {
|
||||
cmsDoTransform(decoder->mTransform, line, line, iwidth);
|
||||
qcms_transform_data(decoder->mTransform, line, line, iwidth);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -52,7 +52,7 @@
|
|||
|
||||
#include "png.h"
|
||||
|
||||
#include "lcms.h"
|
||||
#include "qcms.h"
|
||||
|
||||
#define NS_PNGDECODER_CID \
|
||||
{ /* 36fa00c2-1dd2-11b2-be07-d16eeb4c50ed */ \
|
||||
|
@ -87,8 +87,8 @@ public:
|
|||
png_infop mInfo;
|
||||
PRUint8 *mCMSLine;
|
||||
PRUint8 *interlacebuf;
|
||||
cmsHPROFILE mInProfile;
|
||||
cmsHTRANSFORM mTransform;
|
||||
qcms_profile *mInProfile;
|
||||
qcms_transform *mTransform;
|
||||
|
||||
gfx_format format;
|
||||
PRUint8 mChannels;
|
||||
|
|
Разница между файлами не показана из-за своего большого размера
Загрузить разницу
|
@ -1,6 +1,6 @@
|
|||
<html>
|
||||
<head>
|
||||
<script src="lcms-asm-check.js" type="application/ecmascript"></script>
|
||||
<script src="qcms-asm-check.js" type="application/ecmascript"></script>
|
||||
</head>
|
||||
<body>
|
||||
<table cellpadding='0' cellspacing='0' width='32' height='32'>
|
||||
|
@ -86,7 +86,7 @@
|
|||
<td width='1' style='background-color: rgba(114,255,164,1)'></td>
|
||||
<td width='1' style='background-color: rgba(163,255,187,1)'></td>
|
||||
<td width='1' style='background-color: rgba(216,255,222,1)'></td>
|
||||
<td width='1' style='background-color: rgba(253,255,253,1)'></td>
|
||||
<td width='1' style='background-color: rgba(254,255,253,1)'></td>
|
||||
<td width='1' style='background-color: rgba(255,255,255,1)'></td>
|
||||
<td width='1' style='background-color: rgba(255,255,255,1)'></td>
|
||||
<td width='1' style='background-color: rgba(255,255,255,1)'></td>
|
||||
|
@ -114,11 +114,11 @@
|
|||
<td width='1' style='background-color: rgba(255,255,255,1)'></td>
|
||||
<td width='1' style='background-color: rgba(255,255,255,1)'></td>
|
||||
<td width='1' style='background-color: rgba(255,255,255,1)'></td>
|
||||
<td width='1' style='background-color: rgba(188,255,219,1)'></td>
|
||||
<td width='1' style='background-color: rgba(189,255,220,1)'></td>
|
||||
<td width='1' style='background-color: rgba(52,255,163,1)'></td>
|
||||
<td width='1' style='background-color: rgba(52,255,163,1)'></td>
|
||||
<td width='1' style='background-color: rgba(71,255,144,1)'></td>
|
||||
<td width='1' style='background-color: rgba(71,255,144,1)'></td>
|
||||
<td width='1' style='background-color: rgba(70,255,144,1)'></td>
|
||||
<td width='1' style='background-color: rgba(70,255,144,1)'></td>
|
||||
<td width='1' style='background-color: rgba(90,255,120,1)'></td>
|
||||
<td width='1' style='background-color: rgba(134,255,127,1)'></td>
|
||||
<td width='1' style='background-color: rgba(228,255,232,1)'></td>
|
||||
|
@ -147,16 +147,16 @@
|
|||
<td width='1' style='background-color: rgba(255,255,255,1)'></td>
|
||||
<td width='1' style='background-color: rgba(255,255,255,1)'></td>
|
||||
<td width='1' style='background-color: rgba(255,255,255,1)'></td>
|
||||
<td width='1' style='background-color: rgba(197,255,223,1)'></td>
|
||||
<td width='1' style='background-color: rgba(64,255,173,1)'></td>
|
||||
<td width='1' style='background-color: rgba(64,255,173,1)'></td>
|
||||
<td width='1' style='background-color: rgba(101,255,166,1)'></td>
|
||||
<td width='1' style='background-color: rgba(197,255,224,1)'></td>
|
||||
<td width='1' style='background-color: rgba(63,255,173,1)'></td>
|
||||
<td width='1' style='background-color: rgba(63,255,173,1)'></td>
|
||||
<td width='1' style='background-color: rgba(100,255,166,1)'></td>
|
||||
<td width='1' style='background-color: rgba(86,255,159,1)'></td>
|
||||
<td width='1' style='background-color: rgba(71,255,144,1)'></td>
|
||||
<td width='1' style='background-color: rgba(70,255,144,1)'></td>
|
||||
<td width='1' style='background-color: rgba(90,255,120,1)'></td>
|
||||
<td width='1' style='background-color: rgba(90,255,120,1)'></td>
|
||||
<td width='1' style='background-color: rgba(127,255,95,1)'></td>
|
||||
<td width='1' style='background-color: rgba(206,255,188,1)'></td>
|
||||
<td width='1' style='background-color: rgba(207,255,188,1)'></td>
|
||||
<td width='1' style='background-color: rgba(255,255,255,1)'></td>
|
||||
<td width='1' style='background-color: rgba(255,255,255,1)'></td>
|
||||
<td width='1' style='background-color: rgba(255,255,255,1)'></td>
|
||||
|
@ -184,21 +184,15 @@
|
|||
<td width='1' style='background-color: rgba(52,255,187,1)'></td>
|
||||
<td width='1' style='background-color: rgba(77,255,185,1)'></td>
|
||||
<td width='1' style='background-color: rgba(77,255,185,1)'></td>
|
||||
<td width='1' style='background-color: rgba(101,255,166,1)'></td>
|
||||
<td width='1' style='background-color: rgba(100,255,166,1)'></td>
|
||||
<td width='1' style='background-color: rgba(114,255,164,1)'></td>
|
||||
<td width='1' style='background-color: rgba(114,255,164,1)'></td>
|
||||
<td width='1' style='background-color: rgba(99,255,130,1)'></td>
|
||||
<td width='1' style='background-color: rgba(90,255,120,1)'></td>
|
||||
<td width='1' style='background-color: rgba(127,255,95,1)'></td>
|
||||
<script type="application/ecmascript">
|
||||
if (lcms_has_assembly) {
|
||||
document.write("<td width='1' style='background-color: rgba(163,255,91,1)'></td>");
|
||||
} else {
|
||||
document.write("<td width='1' style='background-color: rgba(163,255,92,1)'></td>");
|
||||
}
|
||||
</script>
|
||||
<td width='1' style='background-color: rgba(164,255,91,1)'></td>
|
||||
<td width='1' style='background-color: rgba(199,255,148,1)'></td>
|
||||
<td width='1' style='background-color: rgba(253,255,253,1)'></td>
|
||||
<td width='1' style='background-color: rgba(254,255,253,1)'></td>
|
||||
<td width='1' style='background-color: rgba(255,255,255,1)'></td>
|
||||
<td width='1' style='background-color: rgba(255,255,255,1)'></td>
|
||||
<td width='1' style='background-color: rgba(255,255,255,1)'></td>
|
||||
|
@ -229,16 +223,9 @@ if (lcms_has_assembly) {
|
|||
<td width='1' style='background-color: rgba(114,255,164,1)'></td>
|
||||
<td width='1' style='background-color: rgba(123,255,159,1)'></td>
|
||||
<td width='1' style='background-color: rgba(134,255,127,1)'></td>
|
||||
<td width='1' style='background-color: rgba(153,255,104,1)'></td>
|
||||
<script type="application/ecmascript">
|
||||
if (lcms_has_assembly) {
|
||||
document.write("<td width='1' style='background-color: rgba(163,255,91,1)'></td>");
|
||||
document.write("<td width='1' style='background-color: rgba(163,255,91,1)'></td>");
|
||||
} else {
|
||||
document.write("<td width='1' style='background-color: rgba(163,255,92,1)'></td>");
|
||||
document.write("<td width='1' style='background-color: rgba(163,255,92,1)'></td>");
|
||||
}
|
||||
</script>
|
||||
<td width='1' style='background-color: rgba(153,255,103,1)'></td>
|
||||
<td width='1' style='background-color: rgba(164,255,91,1)'></td>
|
||||
<td width='1' style='background-color: rgba(164,255,91,1)'></td>
|
||||
<td width='1' style='background-color: rgba(205,255,136,1)'></td>
|
||||
<td width='1' style='background-color: rgba(253,255,246,1)'></td>
|
||||
<td width='1' style='background-color: rgba(255,255,255,1)'></td>
|
||||
|
@ -260,7 +247,7 @@ if (lcms_has_assembly) {
|
|||
<td width='1' style='background-color: rgba(255,255,255,1)'></td>
|
||||
<td width='1' style='background-color: rgba(255,255,255,1)'></td>
|
||||
<td width='1' style='background-color: rgba(255,255,255,1)'></td>
|
||||
<td width='1' style='background-color: rgba(219,255,240,1)'></td>
|
||||
<td width='1' style='background-color: rgba(220,255,240,1)'></td>
|
||||
<td width='1' style='background-color: rgba(52,255,187,1)'></td>
|
||||
<td width='1' style='background-color: rgba(90,255,198,1)'></td>
|
||||
<td width='1' style='background-color: rgba(105,255,193,1)'></td>
|
||||
|
@ -270,15 +257,9 @@ if (lcms_has_assembly) {
|
|||
<td width='1' style='background-color: rgba(138,255,169,1)'></td>
|
||||
<td width='1' style='background-color: rgba(123,255,159,1)'></td>
|
||||
<td width='1' style='background-color: rgba(134,255,127,1)'></td>
|
||||
<script type="application/ecmascript">
|
||||
if (lcms_has_assembly) {
|
||||
document.write("<td width='1' style='background-color: rgba(163,255,91,1)'></td>");
|
||||
} else {
|
||||
document.write("<td width='1' style='background-color: rgba(163,255,92,1)'></td>");
|
||||
}
|
||||
</script>
|
||||
<td width='1' style='background-color: rgba(186,255,96,1)'></td>
|
||||
<td width='1' style='background-color: rgba(186,255,96,1)'></td>
|
||||
<td width='1' style='background-color: rgba(164,255,91,1)'></td>
|
||||
<td width='1' style='background-color: rgba(187,255,96,1)'></td>
|
||||
<td width='1' style='background-color: rgba(187,255,96,1)'></td>
|
||||
<td width='1' style='background-color: rgba(195,255,79,1)'></td>
|
||||
<td width='1' style='background-color: rgba(217,255,115,1)'></td>
|
||||
<td width='1' style='background-color: rgba(253,255,246,1)'></td>
|
||||
|
@ -311,10 +292,10 @@ if (lcms_has_assembly) {
|
|||
<td width='1' style='background-color: rgba(138,255,169,1)'></td>
|
||||
<td width='1' style='background-color: rgba(172,255,140,1)'></td>
|
||||
<td width='1' style='background-color: rgba(172,255,140,1)'></td>
|
||||
<td width='1' style='background-color: rgba(186,255,96,1)'></td>
|
||||
<td width='1' style='background-color: rgba(187,255,96,1)'></td>
|
||||
<td width='1' style='background-color: rgba(195,255,79,1)'></td>
|
||||
<td width='1' style='background-color: rgba(209,255,69,1)'></td>
|
||||
<td width='1' style='background-color: rgba(209,255,69,1)'></td>
|
||||
<td width='1' style='background-color: rgba(209,255,68,1)'></td>
|
||||
<td width='1' style='background-color: rgba(209,255,68,1)'></td>
|
||||
<td width='1' style='background-color: rgba(234,255,124,1)'></td>
|
||||
<td width='1' style='background-color: rgba(255,255,253,1)'></td>
|
||||
<td width='1' style='background-color: rgba(255,255,255,1)'></td>
|
||||
|
@ -338,8 +319,8 @@ if (lcms_has_assembly) {
|
|||
<td width='1' style='background-color: rgba(91,255,202,1)'></td>
|
||||
<td width='1' style='background-color: rgba(111,255,208,1)'></td>
|
||||
<td width='1' style='background-color: rgba(137,255,206,1)'></td>
|
||||
<td width='1' style='background-color: rgba(147,255,208,1)'></td>
|
||||
<td width='1' style='background-color: rgba(147,255,208,1)'></td>
|
||||
<td width='1' style='background-color: rgba(148,255,208,1)'></td>
|
||||
<td width='1' style='background-color: rgba(148,255,208,1)'></td>
|
||||
<td width='1' style='background-color: rgba(163,255,190,1)'></td>
|
||||
<td width='1' style='background-color: rgba(163,255,190,1)'></td>
|
||||
<td width='1' style='background-color: rgba(163,255,187,1)'></td>
|
||||
|
@ -371,13 +352,13 @@ if (lcms_has_assembly) {
|
|||
<td width='1' style='background-color: rgba(68,255,207,1)'></td>
|
||||
<td width='1' style='background-color: rgba(96,255,205,1)'></td>
|
||||
<td width='1' style='background-color: rgba(111,255,208,1)'></td>
|
||||
<td width='1' style='background-color: rgba(147,255,208,1)'></td>
|
||||
<td width='1' style='background-color: rgba(147,255,208,1)'></td>
|
||||
<td width='1' style='background-color: rgba(148,255,208,1)'></td>
|
||||
<td width='1' style='background-color: rgba(148,255,208,1)'></td>
|
||||
<td width='1' style='background-color: rgba(165,255,212,1)'></td>
|
||||
<td width='1' style='background-color: rgba(176,255,209,1)'></td>
|
||||
<td width='1' style='background-color: rgba(176,255,209,1)'></td>
|
||||
<td width='1' style='background-color: rgba(163,255,187,1)'></td>
|
||||
<td width='1' style='background-color: rgba(186,255,178,1)'></td>
|
||||
<td width='1' style='background-color: rgba(187,255,179,1)'></td>
|
||||
<td width='1' style='background-color: rgba(199,255,148,1)'></td>
|
||||
<td width='1' style='background-color: rgba(205,255,136,1)'></td>
|
||||
<td width='1' style='background-color: rgba(209,255,121,1)'></td>
|
||||
|
@ -401,26 +382,26 @@ if (lcms_has_assembly) {
|
|||
<td width='1' style='background-color: rgba(255,255,255,1)'></td>
|
||||
<td width='1' style='background-color: rgba(255,255,255,1)'></td>
|
||||
<td width='1' style='background-color: rgba(248,255,251,1)'></td>
|
||||
<td width='1' style='background-color: rgba(68,255,216,1)'></td>
|
||||
<td width='1' style='background-color: rgba(96,255,210,1)'></td>
|
||||
<td width='1' style='background-color: rgba(68,255,217,1)'></td>
|
||||
<td width='1' style='background-color: rgba(96,255,211,1)'></td>
|
||||
<td width='1' style='background-color: rgba(111,255,208,1)'></td>
|
||||
<td width='1' style='background-color: rgba(137,255,216,1)'></td>
|
||||
<td width='1' style='background-color: rgba(155,255,219,1)'></td>
|
||||
<td width='1' style='background-color: rgba(169,255,215,1)'></td>
|
||||
<td width='1' style='background-color: rgba(169,255,215,1)'></td>
|
||||
<td width='1' style='background-color: rgba(188,255,219,1)'></td>
|
||||
<td width='1' style='background-color: rgba(169,255,216,1)'></td>
|
||||
<td width='1' style='background-color: rgba(169,255,216,1)'></td>
|
||||
<td width='1' style='background-color: rgba(189,255,220,1)'></td>
|
||||
<td width='1' style='background-color: rgba(176,255,209,1)'></td>
|
||||
<td width='1' style='background-color: rgba(190,255,194,1)'></td>
|
||||
<td width='1' style='background-color: rgba(194,255,180,1)'></td>
|
||||
<td width='1' style='background-color: rgba(209,255,170,1)'></td>
|
||||
<td width='1' style='background-color: rgba(209,255,170,1)'></td>
|
||||
<td width='1' style='background-color: rgba(194,255,181,1)'></td>
|
||||
<td width='1' style='background-color: rgba(210,255,170,1)'></td>
|
||||
<td width='1' style='background-color: rgba(210,255,170,1)'></td>
|
||||
<td width='1' style='background-color: rgba(226,255,148,1)'></td>
|
||||
<td width='1' style='background-color: rgba(234,255,124,1)'></td>
|
||||
<td width='1' style='background-color: rgba(234,255,124,1)'></td>
|
||||
<td width='1' style='background-color: rgba(251,254,95,1)'></td>
|
||||
<td width='1' style='background-color: rgba(251,254,95,1)'></td>
|
||||
<td width='1' style='background-color: rgba(252,254,95,1)'></td>
|
||||
<td width='1' style='background-color: rgba(252,254,95,1)'></td>
|
||||
<td width='1' style='background-color: rgba(255,245,96,1)'></td>
|
||||
<td width='1' style='background-color: rgba(254,249,185,1)'></td>
|
||||
<td width='1' style='background-color: rgba(255,249,185,1)'></td>
|
||||
<td width='1' style='background-color: rgba(255,255,255,1)'></td>
|
||||
<td width='1' style='background-color: rgba(255,255,255,1)'></td>
|
||||
<td width='1' style='background-color: rgba(255,255,255,1)'></td>
|
||||
|
@ -434,28 +415,28 @@ if (lcms_has_assembly) {
|
|||
<tr height='1'>
|
||||
<td width='1' style='background-color: rgba(255,255,255,1)'></td>
|
||||
<td width='1' style='background-color: rgba(255,255,255,1)'></td>
|
||||
<td width='1' style='background-color: rgba(203,255,242,1)'></td>
|
||||
<td width='1' style='background-color: rgba(68,255,216,1)'></td>
|
||||
<td width='1' style='background-color: rgba(96,255,210,1)'></td>
|
||||
<td width='1' style='background-color: rgba(204,255,242,1)'></td>
|
||||
<td width='1' style='background-color: rgba(68,255,217,1)'></td>
|
||||
<td width='1' style='background-color: rgba(96,255,211,1)'></td>
|
||||
<td width='1' style='background-color: rgba(123,255,220,1)'></td>
|
||||
<td width='1' style='background-color: rgba(137,255,216,1)'></td>
|
||||
<td width='1' style='background-color: rgba(155,255,219,1)'></td>
|
||||
<td width='1' style='background-color: rgba(169,255,215,1)'></td>
|
||||
<td width='1' style='background-color: rgba(188,255,219,1)'></td>
|
||||
<td width='1' style='background-color: rgba(188,255,219,1)'></td>
|
||||
<td width='1' style='background-color: rgba(197,255,223,1)'></td>
|
||||
<td width='1' style='background-color: rgba(169,255,216,1)'></td>
|
||||
<td width='1' style='background-color: rgba(189,255,220,1)'></td>
|
||||
<td width='1' style='background-color: rgba(189,255,220,1)'></td>
|
||||
<td width='1' style='background-color: rgba(197,255,224,1)'></td>
|
||||
<td width='1' style='background-color: rgba(190,255,194,1)'></td>
|
||||
<td width='1' style='background-color: rgba(206,255,188,1)'></td>
|
||||
<td width='1' style='background-color: rgba(209,255,170,1)'></td>
|
||||
<td width='1' style='background-color: rgba(207,255,188,1)'></td>
|
||||
<td width='1' style='background-color: rgba(210,255,170,1)'></td>
|
||||
<td width='1' style='background-color: rgba(226,255,148,1)'></td>
|
||||
<td width='1' style='background-color: rgba(226,255,148,1)'></td>
|
||||
<td width='1' style='background-color: rgba(241,255,147,1)'></td>
|
||||
<td width='1' style='background-color: rgba(250,254,133,1)'></td>
|
||||
<td width='1' style='background-color: rgba(251,254,95,1)'></td>
|
||||
<td width='1' style='background-color: rgba(251,255,133,1)'></td>
|
||||
<td width='1' style='background-color: rgba(252,254,95,1)'></td>
|
||||
<td width='1' style='background-color: rgba(255,245,96,1)'></td>
|
||||
<td width='1' style='background-color: rgba(255,225,95,1)'></td>
|
||||
<td width='1' style='background-color: rgba(255,225,95,1)'></td>
|
||||
<td width='1' style='background-color: rgba(255,242,196,1)'></td>
|
||||
<td width='1' style='background-color: rgba(255,243,196,1)'></td>
|
||||
<td width='1' style='background-color: rgba(255,255,255,1)'></td>
|
||||
<td width='1' style='background-color: rgba(255,255,255,1)'></td>
|
||||
<td width='1' style='background-color: rgba(255,255,255,1)'></td>
|
||||
|
@ -468,28 +449,28 @@ if (lcms_has_assembly) {
|
|||
<tr height='1'>
|
||||
<td width='1' style='background-color: rgba(255,255,255,1)'></td>
|
||||
<td width='1' style='background-color: rgba(255,255,255,1)'></td>
|
||||
<td width='1' style='background-color: rgba(170,255,233,1)'></td>
|
||||
<td width='1' style='background-color: rgba(68,255,216,1)'></td>
|
||||
<td width='1' style='background-color: rgba(170,255,234,1)'></td>
|
||||
<td width='1' style='background-color: rgba(68,255,217,1)'></td>
|
||||
<td width='1' style='background-color: rgba(114,255,219,1)'></td>
|
||||
<td width='1' style='background-color: rgba(134,255,222,1)'></td>
|
||||
<td width='1' style='background-color: rgba(134,255,223,1)'></td>
|
||||
<td width='1' style='background-color: rgba(142,255,224,1)'></td>
|
||||
<td width='1' style='background-color: rgba(169,255,229,1)'></td>
|
||||
<td width='1' style='background-color: rgba(179,255,231,1)'></td>
|
||||
<td width='1' style='background-color: rgba(179,255,232,1)'></td>
|
||||
<td width='1' style='background-color: rgba(187,255,227,1)'></td>
|
||||
<td width='1' style='background-color: rgba(197,255,223,1)'></td>
|
||||
<td width='1' style='background-color: rgba(197,255,224,1)'></td>
|
||||
<td width='1' style='background-color: rgba(205,255,218,1)'></td>
|
||||
<td width='1' style='background-color: rgba(205,255,218,1)'></td>
|
||||
<td width='1' style='background-color: rgba(218,255,190,1)'></td>
|
||||
<td width='1' style='background-color: rgba(218,255,190,1)'></td>
|
||||
<td width='1' style='background-color: rgba(218,255,191,1)'></td>
|
||||
<td width='1' style='background-color: rgba(218,255,191,1)'></td>
|
||||
<td width='1' style='background-color: rgba(230,255,196,1)'></td>
|
||||
<td width='1' style='background-color: rgba(242,255,159,1)'></td>
|
||||
<td width='1' style='background-color: rgba(242,255,159,1)'></td>
|
||||
<td width='1' style='background-color: rgba(250,254,133,1)'></td>
|
||||
<td width='1' style='background-color: rgba(251,255,133,1)'></td>
|
||||
<td width='1' style='background-color: rgba(255,245,96,1)'></td>
|
||||
<td width='1' style='background-color: rgba(255,232,117,1)'></td>
|
||||
<td width='1' style='background-color: rgba(255,233,116,1)'></td>
|
||||
<td width='1' style='background-color: rgba(255,225,95,1)'></td>
|
||||
<td width='1' style='background-color: rgba(255,206,93,1)'></td>
|
||||
<td width='1' style='background-color: rgba(255,206,93,1)'></td>
|
||||
<td width='1' style='background-color: rgba(255,207,93,1)'></td>
|
||||
<td width='1' style='background-color: rgba(255,207,93,1)'></td>
|
||||
<td width='1' style='background-color: rgba(255,231,206,1)'></td>
|
||||
<td width='1' style='background-color: rgba(255,255,255,1)'></td>
|
||||
<td width='1' style='background-color: rgba(255,255,255,1)'></td>
|
||||
|
@ -503,29 +484,29 @@ if (lcms_has_assembly) {
|
|||
<td width='1' style='background-color: rgba(255,255,255,1)'></td>
|
||||
<td width='1' style='background-color: rgba(255,255,255,1)'></td>
|
||||
<td width='1' style='background-color: rgba(106,255,234,1)'></td>
|
||||
<td width='1' style='background-color: rgba(68,255,216,1)'></td>
|
||||
<td width='1' style='background-color: rgba(68,255,217,1)'></td>
|
||||
<td width='1' style='background-color: rgba(114,255,219,1)'></td>
|
||||
<td width='1' style='background-color: rgba(134,255,222,1)'></td>
|
||||
<td width='1' style='background-color: rgba(134,255,223,1)'></td>
|
||||
<td width='1' style='background-color: rgba(142,255,224,1)'></td>
|
||||
<td width='1' style='background-color: rgba(169,255,229,1)'></td>
|
||||
<td width='1' style='background-color: rgba(187,255,227,1)'></td>
|
||||
<td width='1' style='background-color: rgba(202,255,230,1)'></td>
|
||||
<td width='1' style='background-color: rgba(211,255,234,1)'></td>
|
||||
<td width='1' style='background-color: rgba(211,255,234,1)'></td>
|
||||
<td width='1' style='background-color: rgba(202,255,231,1)'></td>
|
||||
<td width='1' style='background-color: rgba(211,255,235,1)'></td>
|
||||
<td width='1' style='background-color: rgba(211,255,235,1)'></td>
|
||||
<td width='1' style='background-color: rgba(216,255,222,1)'></td>
|
||||
<td width='1' style='background-color: rgba(224,255,195,1)'></td>
|
||||
<td width='1' style='background-color: rgba(225,255,195,1)'></td>
|
||||
<td width='1' style='background-color: rgba(230,255,196,1)'></td>
|
||||
<td width='1' style='background-color: rgba(238,255,196,1)'></td>
|
||||
<td width='1' style='background-color: rgba(254,254,168,1)'></td>
|
||||
<td width='1' style='background-color: rgba(254,254,168,1)'></td>
|
||||
<td width='1' style='background-color: rgba(255,236,151,1)'></td>
|
||||
<td width='1' style='background-color: rgba(255,236,151,1)'></td>
|
||||
<td width='1' style='background-color: rgba(255,232,117,1)'></td>
|
||||
<td width='1' style='background-color: rgba(255,233,116,1)'></td>
|
||||
<td width='1' style='background-color: rgba(255,212,119,1)'></td>
|
||||
<td width='1' style='background-color: rgba(255,206,93,1)'></td>
|
||||
<td width='1' style='background-color: rgba(255,197,92,1)'></td>
|
||||
<td width='1' style='background-color: rgba(255,207,93,1)'></td>
|
||||
<td width='1' style='background-color: rgba(255,197,91,1)'></td>
|
||||
<td width='1' style='background-color: rgba(255,179,66,1)'></td>
|
||||
<td width='1' style='background-color: rgba(254,236,226,1)'></td>
|
||||
<td width='1' style='background-color: rgba(255,236,226,1)'></td>
|
||||
<td width='1' style='background-color: rgba(255,255,255,1)'></td>
|
||||
<td width='1' style='background-color: rgba(255,255,255,1)'></td>
|
||||
<td width='1' style='background-color: rgba(255,255,255,1)'></td>
|
||||
|
@ -536,31 +517,31 @@ if (lcms_has_assembly) {
|
|||
<tr height='1'>
|
||||
<td width='1' style='background-color: rgba(255,255,255,1)'></td>
|
||||
<td width='1' style='background-color: rgba(234,255,248,1)'></td>
|
||||
<td width='1' style='background-color: rgba(61,255,230,1)'></td>
|
||||
<td width='1' style='background-color: rgba(61,255,231,1)'></td>
|
||||
<td width='1' style='background-color: rgba(106,255,234,1)'></td>
|
||||
<td width='1' style='background-color: rgba(106,255,234,1)'></td>
|
||||
<td width='1' style='background-color: rgba(142,255,224,1)'></td>
|
||||
<td width='1' style='background-color: rgba(169,255,229,1)'></td>
|
||||
<td width='1' style='background-color: rgba(179,255,231,1)'></td>
|
||||
<td width='1' style='background-color: rgba(179,255,232,1)'></td>
|
||||
<td width='1' style='background-color: rgba(188,255,236,1)'></td>
|
||||
<td width='1' style='background-color: rgba(202,255,230,1)'></td>
|
||||
<td width='1' style='background-color: rgba(211,255,234,1)'></td>
|
||||
<td width='1' style='background-color: rgba(219,255,240,1)'></td>
|
||||
<td width='1' style='background-color: rgba(202,255,231,1)'></td>
|
||||
<td width='1' style='background-color: rgba(211,255,235,1)'></td>
|
||||
<td width='1' style='background-color: rgba(220,255,240,1)'></td>
|
||||
<td width='1' style='background-color: rgba(228,255,232,1)'></td>
|
||||
<td width='1' style='background-color: rgba(230,255,196,1)'></td>
|
||||
<td width='1' style='background-color: rgba(238,255,196,1)'></td>
|
||||
<td width='1' style='background-color: rgba(246,255,196,1)'></td>
|
||||
<td width='1' style='background-color: rgba(254,249,185,1)'></td>
|
||||
<td width='1' style='background-color: rgba(255,241,170,1)'></td>
|
||||
<td width='1' style='background-color: rgba(255,241,170,1)'></td>
|
||||
<td width='1' style='background-color: rgba(255,249,185,1)'></td>
|
||||
<td width='1' style='background-color: rgba(255,242,170,1)'></td>
|
||||
<td width='1' style='background-color: rgba(255,242,170,1)'></td>
|
||||
<td width='1' style='background-color: rgba(255,236,151,1)'></td>
|
||||
<td width='1' style='background-color: rgba(255,217,125,1)'></td>
|
||||
<td width='1' style='background-color: rgba(255,212,119,1)'></td>
|
||||
<td width='1' style='background-color: rgba(255,197,92,1)'></td>
|
||||
<td width='1' style='background-color: rgba(255,197,92,1)'></td>
|
||||
<td width='1' style='background-color: rgba(255,197,91,1)'></td>
|
||||
<td width='1' style='background-color: rgba(255,197,91,1)'></td>
|
||||
<td width='1' style='background-color: rgba(255,179,66,1)'></td>
|
||||
<td width='1' style='background-color: rgba(255,176,88,1)'></td>
|
||||
<td width='1' style='background-color: rgba(254,236,226,1)'></td>
|
||||
<td width='1' style='background-color: rgba(255,236,226,1)'></td>
|
||||
<td width='1' style='background-color: rgba(255,255,255,1)'></td>
|
||||
<td width='1' style='background-color: rgba(255,255,255,1)'></td>
|
||||
<td width='1' style='background-color: rgba(255,255,255,1)'></td>
|
||||
|
@ -569,33 +550,33 @@ if (lcms_has_assembly) {
|
|||
</tr>
|
||||
<tr height='1'>
|
||||
<td width='1' style='background-color: rgba(255,255,255,1)'></td>
|
||||
<td width='1' style='background-color: rgba(202,255,247,1)'></td>
|
||||
<td width='1' style='background-color: rgba(61,255,230,1)'></td>
|
||||
<td width='1' style='background-color: rgba(202,255,248,1)'></td>
|
||||
<td width='1' style='background-color: rgba(61,255,231,1)'></td>
|
||||
<td width='1' style='background-color: rgba(106,255,234,1)'></td>
|
||||
<td width='1' style='background-color: rgba(135,255,238,1)'></td>
|
||||
<td width='1' style='background-color: rgba(135,255,239,1)'></td>
|
||||
<td width='1' style='background-color: rgba(154,255,238,1)'></td>
|
||||
<td width='1' style='background-color: rgba(167,255,238,1)'></td>
|
||||
<td width='1' style='background-color: rgba(185,255,239,1)'></td>
|
||||
<td width='1' style='background-color: rgba(185,255,240,1)'></td>
|
||||
<td width='1' style='background-color: rgba(188,255,236,1)'></td>
|
||||
<td width='1' style='background-color: rgba(203,255,242,1)'></td>
|
||||
<td width='1' style='background-color: rgba(219,255,240,1)'></td>
|
||||
<td width='1' style='background-color: rgba(204,255,242,1)'></td>
|
||||
<td width='1' style='background-color: rgba(220,255,240,1)'></td>
|
||||
<td width='1' style='background-color: rgba(230,255,243,1)'></td>
|
||||
<td width='1' style='background-color: rgba(235,255,233,1)'></td>
|
||||
<td width='1' style='background-color: rgba(235,255,234,1)'></td>
|
||||
<td width='1' style='background-color: rgba(243,255,228,1)'></td>
|
||||
<td width='1' style='background-color: rgba(253,254,214,1)'></td>
|
||||
<td width='1' style='background-color: rgba(253,254,214,1)'></td>
|
||||
<td width='1' style='background-color: rgba(255,242,196,1)'></td>
|
||||
<td width='1' style='background-color: rgba(253,255,215,1)'></td>
|
||||
<td width='1' style='background-color: rgba(253,255,215,1)'></td>
|
||||
<td width='1' style='background-color: rgba(255,243,196,1)'></td>
|
||||
<td width='1' style='background-color: rgba(255,229,185,1)'></td>
|
||||
<td width='1' style='background-color: rgba(255,229,185,1)'></td>
|
||||
<td width='1' style='background-color: rgba(255,220,184,1)'></td>
|
||||
<td width='1' style='background-color: rgba(255,199,148,1)'></td>
|
||||
<td width='1' style='background-color: rgba(255,199,148,1)'></td>
|
||||
<td width='1' style='background-color: rgba(255,197,92,1)'></td>
|
||||
<td width='1' style='background-color: rgba(255,200,149,1)'></td>
|
||||
<td width='1' style='background-color: rgba(255,200,149,1)'></td>
|
||||
<td width='1' style='background-color: rgba(255,197,91,1)'></td>
|
||||
<td width='1' style='background-color: rgba(255,176,88,1)'></td>
|
||||
<td width='1' style='background-color: rgba(255,176,88,1)'></td>
|
||||
<td width='1' style='background-color: rgba(255,151,106,1)'></td>
|
||||
<td width='1' style='background-color: rgba(255,151,106,1)'></td>
|
||||
<td width='1' style='background-color: rgba(254,236,226,1)'></td>
|
||||
<td width='1' style='background-color: rgba(255,236,226,1)'></td>
|
||||
<td width='1' style='background-color: rgba(255,255,255,1)'></td>
|
||||
<td width='1' style='background-color: rgba(255,255,255,1)'></td>
|
||||
<td width='1' style='background-color: rgba(255,255,255,1)'></td>
|
||||
|
@ -604,28 +585,28 @@ if (lcms_has_assembly) {
|
|||
<tr height='1'>
|
||||
<td width='1' style='background-color: rgba(255,255,255,1)'></td>
|
||||
<td width='1' style='background-color: rgba(169,254,251,1)'></td>
|
||||
<td width='1' style='background-color: rgba(66,254,246,1)'></td>
|
||||
<td width='1' style='background-color: rgba(108,255,239,1)'></td>
|
||||
<td width='1' style='background-color: rgba(135,255,238,1)'></td>
|
||||
<td width='1' style='background-color: rgba(66,255,246,1)'></td>
|
||||
<td width='1' style='background-color: rgba(107,255,239,1)'></td>
|
||||
<td width='1' style='background-color: rgba(135,255,239,1)'></td>
|
||||
<td width='1' style='background-color: rgba(154,255,238,1)'></td>
|
||||
<td width='1' style='background-color: rgba(167,255,238,1)'></td>
|
||||
<td width='1' style='background-color: rgba(185,255,239,1)'></td>
|
||||
<td width='1' style='background-color: rgba(199,255,242,1)'></td>
|
||||
<td width='1' style='background-color: rgba(213,253,246,1)'></td>
|
||||
<td width='1' style='background-color: rgba(227,255,248,1)'></td>
|
||||
<td width='1' style='background-color: rgba(185,255,240,1)'></td>
|
||||
<td width='1' style='background-color: rgba(199,255,243,1)'></td>
|
||||
<td width='1' style='background-color: rgba(213,254,246,1)'></td>
|
||||
<td width='1' style='background-color: rgba(227,255,249,1)'></td>
|
||||
<td width='1' style='background-color: rgba(234,255,248,1)'></td>
|
||||
<td width='1' style='background-color: rgba(237,253,249,1)'></td>
|
||||
<td width='1' style='background-color: rgba(243,255,228,1)'></td>
|
||||
<td width='1' style='background-color: rgba(255,248,223,1)'></td>
|
||||
<td width='1' style='background-color: rgba(253,254,214,1)'></td>
|
||||
<td width='1' style='background-color: rgba(253,255,215,1)'></td>
|
||||
<td width='1' style='background-color: rgba(255,231,206,1)'></td>
|
||||
<td width='1' style='background-color: rgba(255,229,185,1)'></td>
|
||||
<td width='1' style='background-color: rgba(255,220,184,1)'></td>
|
||||
<td width='1' style='background-color: rgba(255,220,184,1)'></td>
|
||||
<td width='1' style='background-color: rgba(255,199,148,1)'></td>
|
||||
<td width='1' style='background-color: rgba(255,189,148,1)'></td>
|
||||
<td width='1' style='background-color: rgba(255,178,148,1)'></td>
|
||||
<td width='1' style='background-color: rgba(255,167,140,1)'></td>
|
||||
<td width='1' style='background-color: rgba(255,200,149,1)'></td>
|
||||
<td width='1' style='background-color: rgba(255,189,149,1)'></td>
|
||||
<td width='1' style='background-color: rgba(255,178,149,1)'></td>
|
||||
<td width='1' style='background-color: rgba(255,168,140,1)'></td>
|
||||
<td width='1' style='background-color: rgba(255,151,106,1)'></td>
|
||||
<td width='1' style='background-color: rgba(255,132,95,1)'></td>
|
||||
<td width='1' style='background-color: rgba(255,132,95,1)'></td>
|
||||
|
@ -637,35 +618,35 @@ if (lcms_has_assembly) {
|
|||
</tr>
|
||||
<tr height='1'>
|
||||
<td width='1' style='background-color: rgba(255,255,255,1)'></td>
|
||||
<td width='1' style='background-color: rgba(136,255,248,1)'></td>
|
||||
<td width='1' style='background-color: rgba(136,255,249,1)'></td>
|
||||
<td width='1' style='background-color: rgba(79,255,247,1)'></td>
|
||||
<td width='1' style='background-color: rgba(98,255,245,1)'></td>
|
||||
<td width='1' style='background-color: rgba(136,255,248,1)'></td>
|
||||
<td width='1' style='background-color: rgba(154,255,246,1)'></td>
|
||||
<td width='1' style='background-color: rgba(136,255,249,1)'></td>
|
||||
<td width='1' style='background-color: rgba(155,255,246,1)'></td>
|
||||
<td width='1' style='background-color: rgba(169,254,251,1)'></td>
|
||||
<td width='1' style='background-color: rgba(185,255,239,1)'></td>
|
||||
<td width='1' style='background-color: rgba(202,255,247,1)'></td>
|
||||
<td width='1' style='background-color: rgba(213,253,246,1)'></td>
|
||||
<td width='1' style='background-color: rgba(227,255,248,1)'></td>
|
||||
<td width='1' style='background-color: rgba(185,255,240,1)'></td>
|
||||
<td width='1' style='background-color: rgba(202,255,248,1)'></td>
|
||||
<td width='1' style='background-color: rgba(213,254,246,1)'></td>
|
||||
<td width='1' style='background-color: rgba(227,255,249,1)'></td>
|
||||
<td width='1' style='background-color: rgba(237,253,249,1)'></td>
|
||||
<td width='1' style='background-color: rgba(248,255,251,1)'></td>
|
||||
<td width='1' style='background-color: rgba(253,255,246,1)'></td>
|
||||
<td width='1' style='background-color: rgba(255,248,223,1)'></td>
|
||||
<td width='1' style='background-color: rgba(254,236,226,1)'></td>
|
||||
<td width='1' style='background-color: rgba(255,236,226,1)'></td>
|
||||
<td width='1' style='background-color: rgba(255,231,206,1)'></td>
|
||||
<td width='1' style='background-color: rgba(255,231,206,1)'></td>
|
||||
<td width='1' style='background-color: rgba(255,212,196,1)'></td>
|
||||
<td width='1' style='background-color: rgba(255,202,198,1)'></td>
|
||||
<td width='1' style='background-color: rgba(255,185,155,1)'></td>
|
||||
<td width='1' style='background-color: rgba(255,185,155,1)'></td>
|
||||
<td width='1' style='background-color: rgba(255,167,140,1)'></td>
|
||||
<td width='1' style='background-color: rgba(255,167,140,1)'></td>
|
||||
<td width='1' style='background-color: rgba(255,168,140,1)'></td>
|
||||
<td width='1' style='background-color: rgba(255,168,140,1)'></td>
|
||||
<td width='1' style='background-color: rgba(255,108,125,1)'></td>
|
||||
<td width='1' style='background-color: rgba(255,108,125,1)'></td>
|
||||
<td width='1' style='background-color: rgba(255,88,115,1)'></td>
|
||||
<td width='1' style='background-color: rgba(255,88,115,1)'></td>
|
||||
<td width='1' style='background-color: rgba(255,108,125,1)'></td>
|
||||
<td width='1' style='background-color: rgba(255,241,242,1)'></td>
|
||||
<td width='1' style='background-color: rgba(255,242,242,1)'></td>
|
||||
<td width='1' style='background-color: rgba(255,255,255,1)'></td>
|
||||
<td width='1' style='background-color: rgba(255,255,255,1)'></td>
|
||||
</tr>
|
||||
|
@ -673,91 +654,109 @@ if (lcms_has_assembly) {
|
|||
<td width='1' style='background-color: rgba(255,255,255,1)'></td>
|
||||
<td width='1' style='background-color: rgba(79,255,247,1)'></td>
|
||||
<td width='1' style='background-color: rgba(79,255,247,1)'></td>
|
||||
<td width='1' style='background-color: rgba(109,250,254,1)'></td>
|
||||
<td width='1' style='background-color: rgba(136,255,248,1)'></td>
|
||||
<td width='1' style='background-color: rgba(154,255,246,1)'></td>
|
||||
<td width='1' style='background-color: rgba(109,250,255,1)'></td>
|
||||
<td width='1' style='background-color: rgba(136,255,249,1)'></td>
|
||||
<td width='1' style='background-color: rgba(155,255,246,1)'></td>
|
||||
<td width='1' style='background-color: rgba(169,254,251,1)'></td>
|
||||
<td width='1' style='background-color: rgba(185,251,255,1)'></td>
|
||||
<td width='1' style='background-color: rgba(202,255,247,1)'></td>
|
||||
<td width='1' style='background-color: rgba(222,251,255,1)'></td>
|
||||
<td width='1' style='background-color: rgba(227,255,248,1)'></td>
|
||||
<td width='1' style='background-color: rgba(241,255,254,1)'></td>
|
||||
<td width='1' style='background-color: rgba(253,253,254,1)'></td>
|
||||
<td width='1' style='background-color: rgba(255,248,249,1)'></td>
|
||||
<td width='1' style='background-color: rgba(255,241,242,1)'></td>
|
||||
<td width='1' style='background-color: rgba(255,229,238,1)'></td>
|
||||
<td width='1' style='background-color: rgba(255,229,238,1)'></td>
|
||||
<td width='1' style='background-color: rgba(202,255,248,1)'></td>
|
||||
<td width='1' style='background-color: rgba(222,252,255,1)'></td>
|
||||
<td width='1' style='background-color: rgba(227,255,249,1)'></td>
|
||||
<td width='1' style='background-color: rgba(241,255,255,1)'></td>
|
||||
<td width='1' style='background-color: rgba(253,254,254,1)'></td>
|
||||
<td width='1' style='background-color: rgba(255,249,250,1)'></td>
|
||||
<td width='1' style='background-color: rgba(255,242,242,1)'></td>
|
||||
<script type="application/ecmascript">
|
||||
if (qcms_has_assembly) {
|
||||
document.write("<td width='1' style='background-color: rgba(255,230,238,1)'></td>");
|
||||
} else {
|
||||
document.write("<td width='1' style='background-color: rgba(255,229,238,1)'></td>");
|
||||
}
|
||||
</script>
|
||||
<script type="application/ecmascript">
|
||||
if (qcms_has_assembly) {
|
||||
document.write("<td width='1' style='background-color: rgba(255,230,238,1)'></td>");
|
||||
} else {
|
||||
document.write("<td width='1' style='background-color: rgba(255,229,238,1)'></td>");
|
||||
}
|
||||
</script>
|
||||
<td width='1' style='background-color: rgba(255,198,227,1)'></td>
|
||||
<td width='1' style='background-color: rgba(255,191,215,1)'></td>
|
||||
<td width='1' style='background-color: rgba(255,191,216,1)'></td>
|
||||
<td width='1' style='background-color: rgba(255,202,198,1)'></td>
|
||||
<td width='1' style='background-color: rgba(246,185,205,1)'></td>
|
||||
<td width='1' style='background-color: rgba(255,149,180,1)'></td>
|
||||
<td width='1' style='background-color: rgba(255,149,180,1)'></td>
|
||||
<td width='1' style='background-color: rgba(255,149,181,1)'></td>
|
||||
<td width='1' style='background-color: rgba(255,149,181,1)'></td>
|
||||
<td width='1' style='background-color: rgba(255,135,167,1)'></td>
|
||||
<td width='1' style='background-color: rgba(255,135,167,1)'></td>
|
||||
<td width='1' style='background-color: rgba(255,126,163,1)'></td>
|
||||
<td width='1' style='background-color: rgba(255,126,164,1)'></td>
|
||||
<td width='1' style='background-color: rgba(255,77,134,1)'></td>
|
||||
<td width='1' style='background-color: rgba(255,77,134,1)'></td>
|
||||
<td width='1' style='background-color: rgba(255,56,135,1)'></td>
|
||||
<td width='1' style='background-color: rgba(255,126,163,1)'></td>
|
||||
<td width='1' style='background-color: rgba(255,248,249,1)'></td>
|
||||
<td width='1' style='background-color: rgba(255,55,135,1)'></td>
|
||||
<td width='1' style='background-color: rgba(255,126,164,1)'></td>
|
||||
<td width='1' style='background-color: rgba(255,249,250,1)'></td>
|
||||
<td width='1' style='background-color: rgba(255,255,255,1)'></td>
|
||||
</tr>
|
||||
<tr height='1'>
|
||||
<td width='1' style='background-color: rgba(241,255,254,1)'></td>
|
||||
<td width='1' style='background-color: rgba(79,250,254,1)'></td>
|
||||
<td width='1' style='background-color: rgba(79,250,254,1)'></td>
|
||||
<td width='1' style='background-color: rgba(109,250,254,1)'></td>
|
||||
<td width='1' style='background-color: rgba(133,249,254,1)'></td>
|
||||
<td width='1' style='background-color: rgba(241,255,255,1)'></td>
|
||||
<td width='1' style='background-color: rgba(79,250,255,1)'></td>
|
||||
<td width='1' style='background-color: rgba(79,250,255,1)'></td>
|
||||
<td width='1' style='background-color: rgba(109,250,255,1)'></td>
|
||||
<td width='1' style='background-color: rgba(133,249,255,1)'></td>
|
||||
<td width='1' style='background-color: rgba(169,254,251,1)'></td>
|
||||
<td width='1' style='background-color: rgba(185,251,255,1)'></td>
|
||||
<td width='1' style='background-color: rgba(185,251,255,1)'></td>
|
||||
<td width='1' style='background-color: rgba(203,248,255,1)'></td>
|
||||
<td width='1' style='background-color: rgba(222,251,255,1)'></td>
|
||||
<td width='1' style='background-color: rgba(222,251,255,1)'></td>
|
||||
<td width='1' style='background-color: rgba(246,248,255,1)'></td>
|
||||
<td width='1' style='background-color: rgba(222,252,255,1)'></td>
|
||||
<td width='1' style='background-color: rgba(222,252,255,1)'></td>
|
||||
<td width='1' style='background-color: rgba(247,249,255,1)'></td>
|
||||
<td width='1' style='background-color: rgba(251,240,247,1)'></td>
|
||||
<td width='1' style='background-color: rgba(255,234,244,1)'></td>
|
||||
<td width='1' style='background-color: rgba(255,229,238,1)'></td>
|
||||
<td width='1' style='background-color: rgba(251,222,240,1)'></td>
|
||||
<td width='1' style='background-color: rgba(255,205,233,1)'></td>
|
||||
<td width='1' style='background-color: rgba(255,205,233,1)'></td>
|
||||
<script type="application/ecmascript">
|
||||
if (qcms_has_assembly) {
|
||||
document.write("<td width='1' style='background-color: rgba(255,230,238,1)'></td>");
|
||||
} else {
|
||||
document.write("<td width='1' style='background-color: rgba(255,229,238,1)'></td>");
|
||||
}
|
||||
</script>
|
||||
<td width='1' style='background-color: rgba(251,223,240,1)'></td>
|
||||
<td width='1' style='background-color: rgba(255,205,234,1)'></td>
|
||||
<td width='1' style='background-color: rgba(255,205,234,1)'></td>
|
||||
<td width='1' style='background-color: rgba(255,198,227,1)'></td>
|
||||
<td width='1' style='background-color: rgba(255,191,215,1)'></td>
|
||||
<td width='1' style='background-color: rgba(255,191,215,1)'></td>
|
||||
<td width='1' style='background-color: rgba(255,163,210,1)'></td>
|
||||
<td width='1' style='background-color: rgba(255,163,210,1)'></td>
|
||||
<td width='1' style='background-color: rgba(255,149,180,1)'></td>
|
||||
<td width='1' style='background-color: rgba(255,149,180,1)'></td>
|
||||
<td width='1' style='background-color: rgba(255,191,216,1)'></td>
|
||||
<td width='1' style='background-color: rgba(255,191,216,1)'></td>
|
||||
<td width='1' style='background-color: rgba(255,164,211,1)'></td>
|
||||
<td width='1' style='background-color: rgba(255,164,211,1)'></td>
|
||||
<td width='1' style='background-color: rgba(255,149,181,1)'></td>
|
||||
<td width='1' style='background-color: rgba(255,149,181,1)'></td>
|
||||
<td width='1' style='background-color: rgba(255,135,167,1)'></td>
|
||||
<td width='1' style='background-color: rgba(255,118,167,1)'></td>
|
||||
<td width='1' style='background-color: rgba(255,118,168,1)'></td>
|
||||
<td width='1' style='background-color: rgba(255,98,162,1)'></td>
|
||||
<td width='1' style='background-color: rgba(255,77,134,1)'></td>
|
||||
<td width='1' style='background-color: rgba(255,56,135,1)'></td>
|
||||
<td width='1' style='background-color: rgba(255,55,135,1)'></td>
|
||||
<td width='1' style='background-color: rgba(255,135,167,1)'></td>
|
||||
<td width='1' style='background-color: rgba(255,248,249,1)'></td>
|
||||
<td width='1' style='background-color: rgba(255,249,250,1)'></td>
|
||||
</tr>
|
||||
<tr height='1'>
|
||||
<td width='1' style='background-color: rgba(222,251,255,1)'></td>
|
||||
<td width='1' style='background-color: rgba(79,250,254,1)'></td>
|
||||
<td width='1' style='background-color: rgba(109,250,254,1)'></td>
|
||||
<td width='1' style='background-color: rgba(133,249,254,1)'></td>
|
||||
<td width='1' style='background-color: rgba(222,252,255,1)'></td>
|
||||
<td width='1' style='background-color: rgba(79,250,255,1)'></td>
|
||||
<td width='1' style='background-color: rgba(109,250,255,1)'></td>
|
||||
<td width='1' style='background-color: rgba(133,249,255,1)'></td>
|
||||
<td width='1' style='background-color: rgba(145,242,255,1)'></td>
|
||||
<td width='1' style='background-color: rgba(168,242,255,1)'></td>
|
||||
<td width='1' style='background-color: rgba(168,242,255,1)'></td>
|
||||
<td width='1' style='background-color: rgba(197,243,255,1)'></td>
|
||||
<td width='1' style='background-color: rgba(205,241,255,1)'></td>
|
||||
<td width='1' style='background-color: rgba(221,241,255,1)'></td>
|
||||
<td width='1' style='background-color: rgba(229,232,247,1)'></td>
|
||||
<td width='1' style='background-color: rgba(239,239,251,1)'></td>
|
||||
<td width='1' style='background-color: rgba(251,216,240,1)'></td>
|
||||
<td width='1' style='background-color: rgba(229,233,247,1)'></td>
|
||||
<td width='1' style='background-color: rgba(240,240,251,1)'></td>
|
||||
<td width='1' style='background-color: rgba(251,217,240,1)'></td>
|
||||
<td width='1' style='background-color: rgba(255,212,239,1)'></td>
|
||||
<td width='1' style='background-color: rgba(255,205,233,1)'></td>
|
||||
<td width='1' style='background-color: rgba(255,205,234,1)'></td>
|
||||
<td width='1' style='background-color: rgba(255,198,227,1)'></td>
|
||||
<td width='1' style='background-color: rgba(254,189,232,1)'></td>
|
||||
<td width='1' style='background-color: rgba(254,189,233,1)'></td>
|
||||
<td width='1' style='background-color: rgba(255,177,227,1)'></td>
|
||||
<td width='1' style='background-color: rgba(255,170,215,1)'></td>
|
||||
<td width='1' style='background-color: rgba(255,163,210,1)'></td>
|
||||
<td width='1' style='background-color: rgba(255,171,215,1)'></td>
|
||||
<td width='1' style='background-color: rgba(255,164,211,1)'></td>
|
||||
<td width='1' style='background-color: rgba(255,156,211,1)'></td>
|
||||
<td width='1' style='background-color: rgba(255,137,187,1)'></td>
|
||||
<td width='1' style='background-color: rgba(255,137,187,1)'></td>
|
||||
|
@ -766,14 +765,14 @@ if (lcms_has_assembly) {
|
|||
<td width='1' style='background-color: rgba(255,112,170,1)'></td>
|
||||
<td width='1' style='background-color: rgba(255,98,162,1)'></td>
|
||||
<td width='1' style='background-color: rgba(255,98,162,1)'></td>
|
||||
<td width='1' style='background-color: rgba(255,56,159,1)'></td>
|
||||
<td width='1' style='background-color: rgba(255,56,135,1)'></td>
|
||||
<td width='1' style='background-color: rgba(255,149,180,1)'></td>
|
||||
<td width='1' style='background-color: rgba(255,55,160,1)'></td>
|
||||
<td width='1' style='background-color: rgba(255,55,135,1)'></td>
|
||||
<td width='1' style='background-color: rgba(255,149,181,1)'></td>
|
||||
<td width='1' style='background-color: rgba(255,234,244,1)'></td>
|
||||
</tr>
|
||||
<tr height='1'>
|
||||
<td width='1' style='background-color: rgba(203,248,255,1)'></td>
|
||||
<td width='1' style='background-color: rgba(79,234,255,1)'></td>
|
||||
<td width='1' style='background-color: rgba(79,235,255,1)'></td>
|
||||
<td width='1' style='background-color: rgba(114,239,255,1)'></td>
|
||||
<td width='1' style='background-color: rgba(114,239,255,1)'></td>
|
||||
<td width='1' style='background-color: rgba(145,242,255,1)'></td>
|
||||
|
@ -782,23 +781,23 @@ if (lcms_has_assembly) {
|
|||
<td width='1' style='background-color: rgba(197,230,255,1)'></td>
|
||||
<td width='1' style='background-color: rgba(197,230,255,1)'></td>
|
||||
<td width='1' style='background-color: rgba(216,226,255,1)'></td>
|
||||
<td width='1' style='background-color: rgba(242,209,239,1)'></td>
|
||||
<td width='1' style='background-color: rgba(242,209,239,1)'></td>
|
||||
<td width='1' style='background-color: rgba(243,210,240,1)'></td>
|
||||
<td width='1' style='background-color: rgba(243,210,240,1)'></td>
|
||||
<td width='1' style='background-color: rgba(255,212,239,1)'></td>
|
||||
<td width='1' style='background-color: rgba(255,185,234,1)'></td>
|
||||
<td width='1' style='background-color: rgba(255,185,234,1)'></td>
|
||||
<td width='1' style='background-color: rgba(255,177,227,1)'></td>
|
||||
<td width='1' style='background-color: rgba(255,170,215,1)'></td>
|
||||
<td width='1' style='background-color: rgba(255,148,216,1)'></td>
|
||||
<td width='1' style='background-color: rgba(255,148,216,1)'></td>
|
||||
<td width='1' style='background-color: rgba(255,135,213,1)'></td>
|
||||
<td width='1' style='background-color: rgba(255,171,215,1)'></td>
|
||||
<td width='1' style='background-color: rgba(255,149,216,1)'></td>
|
||||
<td width='1' style='background-color: rgba(255,149,216,1)'></td>
|
||||
<td width='1' style='background-color: rgba(255,135,214,1)'></td>
|
||||
<td width='1' style='background-color: rgba(255,120,196,1)'></td>
|
||||
<td width='1' style='background-color: rgba(255,120,196,1)'></td>
|
||||
<td width='1' style='background-color: rgba(255,92,192,1)'></td>
|
||||
<td width='1' style='background-color: rgba(255,91,192,1)'></td>
|
||||
<td width='1' style='background-color: rgba(255,66,180,1)'></td>
|
||||
<td width='1' style='background-color: rgba(255,66,180,1)'></td>
|
||||
<td width='1' style='background-color: rgba(255,56,159,1)'></td>
|
||||
<td width='1' style='background-color: rgba(255,56,159,1)'></td>
|
||||
<td width='1' style='background-color: rgba(255,55,160,1)'></td>
|
||||
<td width='1' style='background-color: rgba(255,55,160,1)'></td>
|
||||
<td width='1' style='background-color: rgba(255,98,162,1)'></td>
|
||||
<td width='1' style='background-color: rgba(246,185,205,1)'></td>
|
||||
<td width='1' style='background-color: rgba(254,241,242,1)'></td>
|
||||
|
@ -807,8 +806,8 @@ if (lcms_has_assembly) {
|
|||
</tr>
|
||||
<tr height='1'>
|
||||
<td width='1' style='background-color: rgba(197,243,255,1)'></td>
|
||||
<td width='1' style='background-color: rgba(79,234,255,1)'></td>
|
||||
<td width='1' style='background-color: rgba(79,234,255,1)'></td>
|
||||
<td width='1' style='background-color: rgba(79,235,255,1)'></td>
|
||||
<td width='1' style='background-color: rgba(79,235,255,1)'></td>
|
||||
<td width='1' style='background-color: rgba(138,226,255,1)'></td>
|
||||
<td width='1' style='background-color: rgba(138,226,255,1)'></td>
|
||||
<td width='1' style='background-color: rgba(173,230,255,1)'></td>
|
||||
|
@ -816,24 +815,24 @@ if (lcms_has_assembly) {
|
|||
<td width='1' style='background-color: rgba(197,230,255,1)'></td>
|
||||
<td width='1' style='background-color: rgba(188,211,255,1)'></td>
|
||||
<td width='1' style='background-color: rgba(226,188,238,1)'></td>
|
||||
<td width='1' style='background-color: rgba(234,172,255,1)'></td>
|
||||
<td width='1' style='background-color: rgba(234,172,255,1)'></td>
|
||||
<td width='1' style='background-color: rgba(253,165,247,1)'></td>
|
||||
<td width='1' style='background-color: rgba(253,165,247,1)'></td>
|
||||
<td width='1' style='background-color: rgba(235,172,255,1)'></td>
|
||||
<td width='1' style='background-color: rgba(235,172,255,1)'></td>
|
||||
<td width='1' style='background-color: rgba(253,165,248,1)'></td>
|
||||
<td width='1' style='background-color: rgba(253,165,248,1)'></td>
|
||||
<td width='1' style='background-color: rgba(255,136,236,1)'></td>
|
||||
<td width='1' style='background-color: rgba(255,136,236,1)'></td>
|
||||
<td width='1' style='background-color: rgba(255,121,225,1)'></td>
|
||||
<td width='1' style='background-color: rgba(251,125,213,1)'></td>
|
||||
<td width='1' style='background-color: rgba(252,125,213,1)'></td>
|
||||
<td width='1' style='background-color: rgba(255,108,208,1)'></td>
|
||||
<td width='1' style='background-color: rgba(255,108,208,1)'></td>
|
||||
<td width='1' style='background-color: rgba(255,92,192,1)'></td>
|
||||
<td width='1' style='background-color: rgba(255,91,192,1)'></td>
|
||||
<td width='1' style='background-color: rgba(255,66,180,1)'></td>
|
||||
<td width='1' style='background-color: rgba(255,66,180,1)'></td>
|
||||
<td width='1' style='background-color: rgba(251,28,177,1)'></td>
|
||||
<td width='1' style='background-color: rgba(242,22,159,1)'></td>
|
||||
<td width='1' style='background-color: rgba(255,149,180,1)'></td>
|
||||
<td width='1' style='background-color: rgba(255,205,233,1)'></td>
|
||||
<td width='1' style='background-color: rgba(254,253,254,1)'></td>
|
||||
<td width='1' style='background-color: rgba(252,28,177,1)'></td>
|
||||
<td width='1' style='background-color: rgba(243,21,160,1)'></td>
|
||||
<td width='1' style='background-color: rgba(255,149,181,1)'></td>
|
||||
<td width='1' style='background-color: rgba(255,205,234,1)'></td>
|
||||
<td width='1' style='background-color: rgba(255,254,254,1)'></td>
|
||||
<td width='1' style='background-color: rgba(255,255,255,1)'></td>
|
||||
<td width='1' style='background-color: rgba(255,255,255,1)'></td>
|
||||
<td width='1' style='background-color: rgba(255,255,255,1)'></td>
|
||||
|
@ -841,28 +840,28 @@ if (lcms_has_assembly) {
|
|||
</tr>
|
||||
<tr height='1'>
|
||||
<td width='1' style='background-color: rgba(197,243,255,1)'></td>
|
||||
<td width='1' style='background-color: rgba(101,221,255,1)'></td>
|
||||
<td width='1' style='background-color: rgba(101,221,255,1)'></td>
|
||||
<td width='1' style='background-color: rgba(101,222,255,1)'></td>
|
||||
<td width='1' style='background-color: rgba(101,222,255,1)'></td>
|
||||
<td width='1' style='background-color: rgba(138,226,255,1)'></td>
|
||||
<td width='1' style='background-color: rgba(138,226,255,1)'></td>
|
||||
<td width='1' style='background-color: rgba(151,210,255,1)'></td>
|
||||
<td width='1' style='background-color: rgba(151,211,255,1)'></td>
|
||||
<td width='1' style='background-color: rgba(188,211,255,1)'></td>
|
||||
<td width='1' style='background-color: rgba(188,211,255,1)'></td>
|
||||
<td width='1' style='background-color: rgba(178,173,255,1)'></td>
|
||||
<td width='1' style='background-color: rgba(234,172,255,1)'></td>
|
||||
<td width='1' style='background-color: rgba(234,172,255,1)'></td>
|
||||
<td width='1' style='background-color: rgba(253,165,247,1)'></td>
|
||||
<td width='1' style='background-color: rgba(253,165,247,1)'></td>
|
||||
<td width='1' style='background-color: rgba(235,172,255,1)'></td>
|
||||
<td width='1' style='background-color: rgba(235,172,255,1)'></td>
|
||||
<td width='1' style='background-color: rgba(253,165,248,1)'></td>
|
||||
<td width='1' style='background-color: rgba(253,165,248,1)'></td>
|
||||
<td width='1' style='background-color: rgba(255,136,236,1)'></td>
|
||||
<td width='1' style='background-color: rgba(255,136,236,1)'></td>
|
||||
<td width='1' style='background-color: rgba(255,121,225,1)'></td>
|
||||
<td width='1' style='background-color: rgba(255,90,215,1)'></td>
|
||||
<td width='1' style='background-color: rgba(255,90,215,1)'></td>
|
||||
<td width='1' style='background-color: rgba(255,59,200,1)'></td>
|
||||
<td width='1' style='background-color: rgba(255,59,200,1)'></td>
|
||||
<td width='1' style='background-color: rgba(251,28,177,1)'></td>
|
||||
<td width='1' style='background-color: rgba(242,22,159,1)'></td>
|
||||
<td width='1' style='background-color: rgba(229,13,174,1)'></td>
|
||||
<td width='1' style='background-color: rgba(255,58,201,1)'></td>
|
||||
<td width='1' style='background-color: rgba(255,58,201,1)'></td>
|
||||
<td width='1' style='background-color: rgba(252,28,177,1)'></td>
|
||||
<td width='1' style='background-color: rgba(243,21,160,1)'></td>
|
||||
<td width='1' style='background-color: rgba(230,12,174,1)'></td>
|
||||
<td width='1' style='background-color: rgba(246,185,205,1)'></td>
|
||||
<td width='1' style='background-color: rgba(254,241,242,1)'></td>
|
||||
<td width='1' style='background-color: rgba(255,255,255,1)'></td>
|
||||
|
@ -875,35 +874,28 @@ if (lcms_has_assembly) {
|
|||
</tr>
|
||||
<tr height='1'>
|
||||
<td width='1' style='background-color: rgba(205,241,255,1)'></td>
|
||||
<script type="application/ecmascript">
|
||||
if (lcms_has_assembly) {
|
||||
document.write("<td width='1' style='background-color: rgba(83,212,255,1)'></td>");
|
||||
document.write("<td width='1' style='background-color: rgba(83,212,255,1)'></td>");
|
||||
} else {
|
||||
document.write("<td width='1' style='background-color: rgba(83,211,255,1)'></td>");
|
||||
document.write("<td width='1' style='background-color: rgba(83,211,255,1)'></td>");
|
||||
}
|
||||
</script>
|
||||
<td width='1' style='background-color: rgba(83,212,255,1)'></td>
|
||||
<td width='1' style='background-color: rgba(83,212,255,1)'></td>
|
||||
<td width='1' style='background-color: rgba(98,205,255,1)'></td>
|
||||
<td width='1' style='background-color: rgba(151,210,255,1)'></td>
|
||||
<td width='1' style='background-color: rgba(159,194,255,1)'></td>
|
||||
<td width='1' style='background-color: rgba(159,194,255,1)'></td>
|
||||
<td width='1' style='background-color: rgba(151,211,255,1)'></td>
|
||||
<td width='1' style='background-color: rgba(160,194,255,1)'></td>
|
||||
<td width='1' style='background-color: rgba(160,194,255,1)'></td>
|
||||
<td width='1' style='background-color: rgba(178,173,255,1)'></td>
|
||||
<td width='1' style='background-color: rgba(219,126,255,1)'></td>
|
||||
<td width='1' style='background-color: rgba(219,126,255,1)'></td>
|
||||
<td width='1' style='background-color: rgba(241,122,255,1)'></td>
|
||||
<td width='1' style='background-color: rgba(241,122,255,1)'></td>
|
||||
<td width='1' style='background-color: rgba(241,122,255,1)'></td>
|
||||
<td width='1' style='background-color: rgba(254,85,238,1)'></td>
|
||||
<td width='1' style='background-color: rgba(254,85,238,1)'></td>
|
||||
<td width='1' style='background-color: rgba(254,53,220,1)'></td>
|
||||
<td width='1' style='background-color: rgba(254,53,220,1)'></td>
|
||||
<td width='1' style='background-color: rgba(247,13,210,1)'></td>
|
||||
<td width='1' style='background-color: rgba(229,13,174,1)'></td>
|
||||
<td width='1' style='background-color: rgba(209,0,167,1)'></td>
|
||||
<td width='1' style='background-color: rgba(244,148,155,1)'></td>
|
||||
<td width='1' style='background-color: rgba(229,214,232,1)'></td>
|
||||
<td width='1' style='background-color: rgba(254,253,254,1)'></td>
|
||||
<td width='1' style='background-color: rgba(255,85,238,1)'></td>
|
||||
<td width='1' style='background-color: rgba(255,85,238,1)'></td>
|
||||
<td width='1' style='background-color: rgba(255,53,221,1)'></td>
|
||||
<td width='1' style='background-color: rgba(255,53,221,1)'></td>
|
||||
<td width='1' style='background-color: rgba(247,12,210,1)'></td>
|
||||
<td width='1' style='background-color: rgba(230,12,174,1)'></td>
|
||||
<td width='1' style='background-color: rgba(210,0,168,1)'></td>
|
||||
<td width='1' style='background-color: rgba(245,148,155,1)'></td>
|
||||
<td width='1' style='background-color: rgba(229,214,233,1)'></td>
|
||||
<td width='1' style='background-color: rgba(255,254,254,1)'></td>
|
||||
<td width='1' style='background-color: rgba(255,255,255,1)'></td>
|
||||
<td width='1' style='background-color: rgba(255,255,255,1)'></td>
|
||||
<td width='1' style='background-color: rgba(255,255,255,1)'></td>
|
||||
|
@ -919,22 +911,22 @@ if (lcms_has_assembly) {
|
|||
<td width='1' style='background-color: rgba(98,205,255,1)'></td>
|
||||
<td width='1' style='background-color: rgba(93,193,255,1)'></td>
|
||||
<td width='1' style='background-color: rgba(93,193,255,1)'></td>
|
||||
<td width='1' style='background-color: rgba(159,194,255,1)'></td>
|
||||
<td width='1' style='background-color: rgba(160,194,255,1)'></td>
|
||||
<td width='1' style='background-color: rgba(119,158,255,1)'></td>
|
||||
<td width='1' style='background-color: rgba(184,133,255,1)'></td>
|
||||
<td width='1' style='background-color: rgba(184,133,255,1)'></td>
|
||||
<td width='1' style='background-color: rgba(219,126,255,1)'></td>
|
||||
<td width='1' style='background-color: rgba(219,126,255,1)'></td>
|
||||
<td width='1' style='background-color: rgba(241,81,254,1)'></td>
|
||||
<td width='1' style='background-color: rgba(241,81,254,1)'></td>
|
||||
<td width='1' style='background-color: rgba(242,34,244,1)'></td>
|
||||
<td width='1' style='background-color: rgba(254,85,238,1)'></td>
|
||||
<td width='1' style='background-color: rgba(247,13,210,1)'></td>
|
||||
<td width='1' style='background-color: rgba(229,13,174,1)'></td>
|
||||
<td width='1' style='background-color: rgba(209,0,167,1)'></td>
|
||||
<td width='1' style='background-color: rgba(209,0,167,1)'></td>
|
||||
<td width='1' style='background-color: rgba(241,81,255,1)'></td>
|
||||
<td width='1' style='background-color: rgba(241,81,255,1)'></td>
|
||||
<td width='1' style='background-color: rgba(243,33,244,1)'></td>
|
||||
<td width='1' style='background-color: rgba(255,85,238,1)'></td>
|
||||
<td width='1' style='background-color: rgba(247,12,210,1)'></td>
|
||||
<td width='1' style='background-color: rgba(230,12,174,1)'></td>
|
||||
<td width='1' style='background-color: rgba(210,0,168,1)'></td>
|
||||
<td width='1' style='background-color: rgba(210,0,168,1)'></td>
|
||||
<td width='1' style='background-color: rgba(246,185,205,1)'></td>
|
||||
<td width='1' style='background-color: rgba(244,242,242,1)'></td>
|
||||
<td width='1' style='background-color: rgba(245,242,243,1)'></td>
|
||||
<td width='1' style='background-color: rgba(255,255,255,1)'></td>
|
||||
<td width='1' style='background-color: rgba(255,255,255,1)'></td>
|
||||
<td width='1' style='background-color: rgba(255,255,255,1)'></td>
|
||||
|
@ -958,15 +950,15 @@ if (lcms_has_assembly) {
|
|||
<td width='1' style='background-color: rgba(184,133,255,1)'></td>
|
||||
<td width='1' style='background-color: rgba(219,126,255,1)'></td>
|
||||
<td width='1' style='background-color: rgba(219,126,255,1)'></td>
|
||||
<td width='1' style='background-color: rgba(241,81,254,1)'></td>
|
||||
<td width='1' style='background-color: rgba(241,81,254,1)'></td>
|
||||
<td width='1' style='background-color: rgba(241,81,255,1)'></td>
|
||||
<td width='1' style='background-color: rgba(241,81,255,1)'></td>
|
||||
<td width='1' style='background-color: rgba(228,28,235,1)'></td>
|
||||
<td width='1' style='background-color: rgba(223,86,229,1)'></td>
|
||||
<td width='1' style='background-color: rgba(209,0,167,1)'></td>
|
||||
<td width='1' style='background-color: rgba(209,0,167,1)'></td>
|
||||
<td width='1' style='background-color: rgba(196,146,202,1)'></td>
|
||||
<td width='1' style='background-color: rgba(229,214,232,1)'></td>
|
||||
<td width='1' style='background-color: rgba(253,253,254,1)'></td>
|
||||
<td width='1' style='background-color: rgba(224,86,229,1)'></td>
|
||||
<td width='1' style='background-color: rgba(210,0,168,1)'></td>
|
||||
<td width='1' style='background-color: rgba(210,0,168,1)'></td>
|
||||
<td width='1' style='background-color: rgba(196,146,203,1)'></td>
|
||||
<td width='1' style='background-color: rgba(229,214,233,1)'></td>
|
||||
<td width='1' style='background-color: rgba(254,254,254,1)'></td>
|
||||
<td width='1' style='background-color: rgba(255,255,255,1)'></td>
|
||||
<td width='1' style='background-color: rgba(255,255,255,1)'></td>
|
||||
<td width='1' style='background-color: rgba(255,255,255,1)'></td>
|
||||
|
@ -983,7 +975,7 @@ if (lcms_has_assembly) {
|
|||
<td width='1' style='background-color: rgba(255,255,255,1)'></td>
|
||||
</tr>
|
||||
<tr height='1'>
|
||||
<td width='1' style='background-color: rgba(253,253,254,1)'></td>
|
||||
<td width='1' style='background-color: rgba(253,254,254,1)'></td>
|
||||
<td width='1' style='background-color: rgba(95,176,255,1)'></td>
|
||||
<td width='1' style='background-color: rgba(95,176,255,1)'></td>
|
||||
<td width='1' style='background-color: rgba(85,128,255,1)'></td>
|
||||
|
@ -993,11 +985,11 @@ if (lcms_has_assembly) {
|
|||
<td width='1' style='background-color: rgba(198,0,227,1)'></td>
|
||||
<td width='1' style='background-color: rgba(198,0,227,1)'></td>
|
||||
<td width='1' style='background-color: rgba(198,0,227,1)'></td>
|
||||
<td width='1' style='background-color: rgba(187,0,203,1)'></td>
|
||||
<td width='1' style='background-color: rgba(132,13,161,1)'></td>
|
||||
<td width='1' style='background-color: rgba(132,13,161,1)'></td>
|
||||
<td width='1' style='background-color: rgba(196,146,202,1)'></td>
|
||||
<td width='1' style='background-color: rgba(244,242,242,1)'></td>
|
||||
<td width='1' style='background-color: rgba(187,0,204,1)'></td>
|
||||
<td width='1' style='background-color: rgba(132,12,161,1)'></td>
|
||||
<td width='1' style='background-color: rgba(132,12,161,1)'></td>
|
||||
<td width='1' style='background-color: rgba(196,146,203,1)'></td>
|
||||
<td width='1' style='background-color: rgba(245,242,243,1)'></td>
|
||||
<td width='1' style='background-color: rgba(255,255,255,1)'></td>
|
||||
<td width='1' style='background-color: rgba(255,255,255,1)'></td>
|
||||
<td width='1' style='background-color: rgba(255,255,255,1)'></td>
|
||||
|
@ -1024,12 +1016,12 @@ if (lcms_has_assembly) {
|
|||
<td width='1' style='background-color: rgba(130,28,228,1)'></td>
|
||||
<td width='1' style='background-color: rgba(130,28,228,1)'></td>
|
||||
<td width='1' style='background-color: rgba(146,77,224,1)'></td>
|
||||
<td width='1' style='background-color: rgba(132,13,161,1)'></td>
|
||||
<td width='1' style='background-color: rgba(132,13,161,1)'></td>
|
||||
<td width='1' style='background-color: rgba(132,13,161,1)'></td>
|
||||
<td width='1' style='background-color: rgba(196,146,202,1)'></td>
|
||||
<td width='1' style='background-color: rgba(221,221,227,1)'></td>
|
||||
<td width='1' style='background-color: rgba(253,253,254,1)'></td>
|
||||
<td width='1' style='background-color: rgba(132,12,161,1)'></td>
|
||||
<td width='1' style='background-color: rgba(132,12,161,1)'></td>
|
||||
<td width='1' style='background-color: rgba(132,12,161,1)'></td>
|
||||
<td width='1' style='background-color: rgba(196,146,203,1)'></td>
|
||||
<td width='1' style='background-color: rgba(222,221,227,1)'></td>
|
||||
<td width='1' style='background-color: rgba(254,254,254,1)'></td>
|
||||
<td width='1' style='background-color: rgba(255,255,255,1)'></td>
|
||||
<td width='1' style='background-color: rgba(255,255,255,1)'></td>
|
||||
<td width='1' style='background-color: rgba(255,255,255,1)'></td>
|
||||
|
@ -1053,14 +1045,14 @@ if (lcms_has_assembly) {
|
|||
<tr height='1'>
|
||||
<td width='1' style='background-color: rgba(255,255,255,1)'></td>
|
||||
<td width='1' style='background-color: rgba(255,255,255,1)'></td>
|
||||
<td width='1' style='background-color: rgba(253,253,254,1)'></td>
|
||||
<td width='1' style='background-color: rgba(239,239,251,1)'></td>
|
||||
<td width='1' style='background-color: rgba(239,239,251,1)'></td>
|
||||
<td width='1' style='background-color: rgba(229,232,247,1)'></td>
|
||||
<td width='1' style='background-color: rgba(221,221,227,1)'></td>
|
||||
<td width='1' style='background-color: rgba(221,221,227,1)'></td>
|
||||
<td width='1' style='background-color: rgba(221,221,227,1)'></td>
|
||||
<td width='1' style='background-color: rgba(244,242,242,1)'></td>
|
||||
<td width='1' style='background-color: rgba(253,254,254,1)'></td>
|
||||
<td width='1' style='background-color: rgba(240,240,251,1)'></td>
|
||||
<td width='1' style='background-color: rgba(240,240,251,1)'></td>
|
||||
<td width='1' style='background-color: rgba(229,233,247,1)'></td>
|
||||
<td width='1' style='background-color: rgba(222,221,227,1)'></td>
|
||||
<td width='1' style='background-color: rgba(222,221,227,1)'></td>
|
||||
<td width='1' style='background-color: rgba(222,221,227,1)'></td>
|
||||
<td width='1' style='background-color: rgba(245,242,243,1)'></td>
|
||||
<td width='1' style='background-color: rgba(255,255,255,1)'></td>
|
||||
<td width='1' style='background-color: rgba(255,255,255,1)'></td>
|
||||
<td width='1' style='background-color: rgba(255,255,255,1)'></td>
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
// This is a workaround for bug 465088, that the lcms assembly doesn't
|
||||
// This is a workaround for bug 465088, that the qcms assembly doesn't
|
||||
// quite match the non-assembly output.
|
||||
|
||||
function check_lcms_has_assembly()
|
||||
function check_qcms_has_assembly()
|
||||
{
|
||||
// We have assembly code on x86 and x86_64 architectures.
|
||||
// Unfortunately, detecting that is a little complicated.
|
||||
|
@ -25,4 +25,4 @@ function check_lcms_has_assembly()
|
|||
return false;
|
||||
}
|
||||
|
||||
var lcms_has_assembly = check_lcms_has_assembly();
|
||||
var qcms_has_assembly = check_qcms_has_assembly();
|
|
@ -40,7 +40,7 @@ EXTRA_DSO_LDOPTS += \
|
|||
$(LIBS_DIR) \
|
||||
$(JPEG_LIBS) \
|
||||
$(PNG_LIBS) \
|
||||
$(LCMS_LIBS) \
|
||||
$(QCMS_LIBS) \
|
||||
$(MOZ_JS_LIBS) \
|
||||
$(NSS_LIBS) \
|
||||
$(MOZ_CAIRO_LIBS) \
|
||||
|
|
|
@ -755,10 +755,8 @@ MAKEFILES_libmar="
|
|||
modules/libmar/tool/Makefile
|
||||
"
|
||||
|
||||
MAKEFILES_lcms="
|
||||
modules/lcms/Makefile
|
||||
modules/lcms/include/Makefile
|
||||
modules/lcms/src/Makefile
|
||||
MAKEFILES_qcms="
|
||||
modules/qcms/Makefile
|
||||
"
|
||||
|
||||
add_makefiles "
|
||||
|
@ -804,6 +802,7 @@ add_makefiles "
|
|||
$MAKEFILES_zlib
|
||||
$MAKEFILES_libmar
|
||||
$MAKEFILES_lcms
|
||||
$MAKEFILES_qcms
|
||||
"
|
||||
|
||||
#
|
||||
|
|
|
@ -70,7 +70,7 @@ endif
|
|||
tier_external_dirs += modules/libmar
|
||||
endif
|
||||
|
||||
tier_external_dirs += modules/lcms
|
||||
tier_external_dirs += gfx/qcms
|
||||
|
||||
#
|
||||
# tier "gecko" - core components
|
||||
|
|
|
@ -90,7 +90,7 @@ EXTRA_DSO_LDOPTS = \
|
|||
$(EXTRA_DSO_LIBS) \
|
||||
$(MOZ_COMPONENT_LIBS) \
|
||||
$(MOZ_UNICHARUTIL_LIBS) \
|
||||
$(LCMS_LIBS) \
|
||||
$(QCMS_LIBS) \
|
||||
$(NULL)
|
||||
|
||||
include $(topsrcdir)/config/rules.mk
|
||||
|
|
|
@ -66,7 +66,7 @@ REQUIRES = xpcom \
|
|||
intl \
|
||||
exthandler \
|
||||
appshell \
|
||||
lcms \
|
||||
qcms \
|
||||
thebes \
|
||||
js \
|
||||
xpconnect \
|
||||
|
@ -125,7 +125,7 @@ EXTRA_DSO_LDOPTS += \
|
|||
$(call EXPAND_LIBNAME_PATH,gkgfx,$(DEPTH)/gfx/src) \
|
||||
$(MOZ_COMPONENT_LIBS) \
|
||||
-lthebes \
|
||||
$(LCMS_LIBS) \
|
||||
$(QCMS_LIBS) \
|
||||
$(NULL)
|
||||
|
||||
include $(topsrcdir)/config/rules.mk
|
||||
|
|
|
@ -64,7 +64,7 @@
|
|||
#include "nsNativeThemeColors.h"
|
||||
|
||||
#include "gfxPlatform.h"
|
||||
#include "lcms.h"
|
||||
#include "qcms.h"
|
||||
|
||||
// defined in nsAppShell.mm
|
||||
extern nsCocoaAppModalWindowList *gCocoaAppModalWindowList;
|
||||
|
@ -1354,13 +1354,13 @@ NS_IMETHODIMP nsCocoaWindow::SetWindowTitlebarColor(nscolor aColor, PRBool aActi
|
|||
// to match the system appearance lame, so probably we just shouldn't color
|
||||
// correct chrome.
|
||||
if (gfxPlatform::GetCMSMode() == eCMSMode_All) {
|
||||
cmsHTRANSFORM transform = gfxPlatform::GetCMSRGBATransform();
|
||||
qcms_transform *transform = gfxPlatform::GetCMSRGBATransform();
|
||||
if (transform) {
|
||||
PRUint8 color[3];
|
||||
color[0] = NS_GET_R(aColor);
|
||||
color[1] = NS_GET_G(aColor);
|
||||
color[2] = NS_GET_B(aColor);
|
||||
cmsDoTransform(transform, color, color, 1);
|
||||
qcms_transform_data(transform, color, color, 1);
|
||||
aColor = NS_RGB(color[0], color[1], color[2]);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -69,6 +69,7 @@ REQUIRES = xpcom \
|
|||
locale \
|
||||
thebes \
|
||||
cairo \
|
||||
qcms \
|
||||
$(NULL)
|
||||
|
||||
ifdef MOZ_X11
|
||||
|
@ -142,7 +143,7 @@ EXTRA_DSO_LDOPTS += \
|
|||
$(XCOMPOSITE_LIBS) \
|
||||
$(MOZ_GTK2_LIBS) \
|
||||
-lthebes \
|
||||
$(LCMS_LIBS) \
|
||||
$(QCMS_LIBS) \
|
||||
$(NULL)
|
||||
|
||||
ifdef MOZ_PLATFORM_HILDON
|
||||
|
|
|
@ -107,7 +107,7 @@ EXTRA_DSO_LDOPTS = \
|
|||
$(MOZ_UNICHARUTIL_LIBS) \
|
||||
$(MOZ_COMPONENT_LIBS) \
|
||||
-lthebes \
|
||||
$(LCMS_LIBS) \
|
||||
$(QCMS_LIBS) \
|
||||
$(NULL)
|
||||
|
||||
ifdef ENABLE_TESTS
|
||||
|
|
|
@ -106,10 +106,10 @@ EXTRA_DSO_LDOPTS = \
|
|||
$(MOZ_COMPONENT_LIBS) \
|
||||
-lgkgfx \
|
||||
-lthebes \
|
||||
$(LCMS_LIBS) \
|
||||
$(MOZ_JS_LIBS) \
|
||||
$(MOZ_QT_LIBS) \
|
||||
$(GLIB_LIBS) \
|
||||
$(QCMS_LIBS) \
|
||||
$(NULL)
|
||||
|
||||
|
||||
|
|
|
@ -71,6 +71,7 @@ REQUIRES = xpcom \
|
|||
unicharutil \
|
||||
thebes \
|
||||
cairo \
|
||||
qcms \
|
||||
$(NULL)
|
||||
|
||||
CPPSRCS = \
|
||||
|
|
|
@ -61,7 +61,7 @@ REQUIRES = xpcom \
|
|||
unicharutil \
|
||||
view \
|
||||
windowwatcher \
|
||||
lcms \
|
||||
qcms \
|
||||
thebes \
|
||||
$(NULL)
|
||||
|
||||
|
|
|
@ -47,7 +47,7 @@
|
|||
#include "nsFont.h"
|
||||
|
||||
#include "gfxPlatform.h"
|
||||
#include "lcms.h"
|
||||
#include "qcms.h"
|
||||
|
||||
#ifdef DEBUG
|
||||
#include "nsSize.h"
|
||||
|
@ -632,13 +632,13 @@ nsXPLookAndFeel::GetColor(const nsColorID aID, nscolor &aColor)
|
|||
|
||||
if (sUseNativeColors && NS_SUCCEEDED(NativeGetColor(aID, aColor))) {
|
||||
if ((gfxPlatform::GetCMSMode() == eCMSMode_All) && !IsSpecialColor(aID, aColor)) {
|
||||
cmsHTRANSFORM transform = gfxPlatform::GetCMSInverseRGBTransform();
|
||||
qcms_transform *transform = gfxPlatform::GetCMSInverseRGBTransform();
|
||||
if (transform) {
|
||||
PRUint8 color[3];
|
||||
color[0] = NS_GET_R(aColor);
|
||||
color[1] = NS_GET_G(aColor);
|
||||
color[2] = NS_GET_B(aColor);
|
||||
cmsDoTransform(transform, color, color, 1);
|
||||
qcms_transform_data(transform, color, color, 1);
|
||||
aColor = NS_RGB(color[0], color[1], color[2]);
|
||||
}
|
||||
}
|
||||
|
|
Загрузка…
Ссылка в новой задаче