Backed out changeset 6f3c2171bbb2:

Bug 481926 - Rewrite color management component. r=joe,ted sr=vlad
This commit is contained in:
Joe Drew 2009-04-03 16:27:27 -04:00
Родитель aaedb2ca38
Коммит 745c70f481
52 изменённых файлов: 848 добавлений и 3375 удалений

Просмотреть файл

@ -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)
OS_INCLUDES = $(NSPR_CFLAGS) $(JPEG_CFLAGS) $(PNG_CFLAGS) $(ZLIB_CFLAGS) $(LCMS_CFLAGS)
OS_LIBS = @LIBS@
ACDEFINES = @MOZ_DEFINES@
@ -448,7 +448,9 @@ PNG_LIBS = @MOZ_PNG_LIBS@
PNG_REQUIRES = png
endif
QCMS_LIBS = @QCMS_LIBS@
LCMS_CFLAGS = @LCMS_CFLAGS@
LCMS_LIBS = @LCMS_LIBS@
LCMS_REQUIRES = lcms
MOZ_NATIVE_SQLITE = @MOZ_NATIVE_SQLITE@
SQLITE_CFLAGS = @SQLITE_CFLAGS@

Просмотреть файл

@ -69,6 +69,7 @@ STATIC_EXTRA_LIBS += \
$(PNG_LIBS) \
$(JPEG_LIBS) \
$(ZLIB_LIBS) \
$(LCMS_LIBS) \
$(NULL)
ifdef MOZ_PSM

Просмотреть файл

@ -129,6 +129,7 @@ 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
@ -7646,11 +7647,22 @@ AC_SUBST(MOZ_TREE_CAIRO)
AC_SUBST(MOZ_CAIRO_CFLAGS)
AC_SUBST(MOZ_CAIRO_LIBS)
dnl qcms
dnl ========================================================
dnl Check for lcms
dnl ========================================================
QCMS_LIBS='$(DEPTH)/gfx/qcms/$(LIB_PREFIX)mozqcms.$(LIB_SUFFIX)'
AC_SUBST(QCMS_LIBS)
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)
dnl ========================================================
dnl disable xul

Просмотреть файл

@ -65,7 +65,6 @@ 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 qcms
DIRS += thebes public idl src
ifdef ENABLE_TESTS
ifndef MOZ_ENABLE_LIBXUL

Просмотреть файл

@ -1,24 +0,0 @@
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

Просмотреть файл

@ -1,783 +0,0 @@
// 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();
//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();
//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();
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;
}

Просмотреть файл

@ -1,153 +0,0 @@
#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

Просмотреть файл

@ -1,143 +0,0 @@
#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);

Просмотреть файл

@ -1,43 +0,0 @@
#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;
#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;
#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,7 +62,6 @@ REQUIRES = xpcom \
unicharutil \
imglib2 \
$(ZLIB_REQUIRES) \
qcms \
$(NULL)
CPPSRCS = \
@ -93,7 +92,6 @@ CPPSRCS += nsSystemFontsWin.cpp \
REQUIRES += \
cairo \
qcms \
$(NULL)
_OS_LIBS = usp10

Просмотреть файл

@ -48,11 +48,13 @@
#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;
@ -267,39 +269,39 @@ public:
*
* Sets 'out' to 'in' if transform is NULL.
*/
static void TransformPixel(const gfxRGBA& in, gfxRGBA& out, qcms_transform *transform);
static void TransformPixel(const gfxRGBA& in, gfxRGBA& out, cmsHTRANSFORM transform);
/**
* Return the output device ICC profile.
*/
static qcms_profile* GetCMSOutputProfile();
static cmsHPROFILE GetCMSOutputProfile();
/**
* Return the sRGB ICC profile.
*/
static qcms_profile* GetCMSsRGBProfile();
static cmsHPROFILE GetCMSsRGBProfile();
/**
* Return sRGB -> output device transform.
*/
static qcms_transform* GetCMSRGBTransform();
static cmsHTRANSFORM GetCMSRGBTransform();
/**
* Return output -> sRGB device transform.
*/
static qcms_transform* GetCMSInverseRGBTransform();
static cmsHTRANSFORM GetCMSInverseRGBTransform();
/**
* Return sRGBA -> output device transform.
*/
static qcms_transform* GetCMSRGBATransform();
static cmsHTRANSFORM GetCMSRGBATransform();
protected:
gfxPlatform() { }
virtual ~gfxPlatform();
private:
virtual qcms_profile* GetPlatformCMSOutputProfile();
virtual cmsHPROFILE GetPlatformCMSOutputProfile();
nsCOMPtr<nsIObserver> overrideObserver;
};

Просмотреть файл

@ -142,7 +142,7 @@ protected:
static gfxFontconfigUtils *sFontconfigUtils;
private:
virtual qcms_profile *GetPlatformCMSOutputProfile();
virtual cmsHPROFILE GetPlatformCMSOutputProfile();
};
#endif /* GFX_PLATFORM_GTK_H */

Просмотреть файл

@ -107,7 +107,7 @@ private:
void AppendCJKPrefLangs(eFontPrefLang aPrefLangs[], PRUint32 &aLen,
eFontPrefLang aCharLang, eFontPrefLang aPageLang);
virtual qcms_profile* GetPlatformCMSOutputProfile();
virtual cmsHPROFILE 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 qcms_profile *GetPlatformCMSOutputProfile();
virtual cmsHPROFILE GetPlatformCMSOutputProfile();
};
#endif /* GFX_PLATFORM_QT_H */

Просмотреть файл

@ -163,7 +163,7 @@ private:
nsRefPtr<FontFamily>& aFontFamily,
void* userArg);
virtual qcms_profile* GetPlatformCMSOutputProfile();
virtual cmsHPROFILE GetPlatformCMSOutputProfile();
static int PrefChangedCallback(const char*, void*);

Просмотреть файл

@ -18,7 +18,6 @@ REQUIRES = \
xpcom \
unicharutil \
$(LCMS_REQUIRES) \
qcms \
$(NULL)
CPPSRCS = \
@ -48,7 +47,7 @@ EXTRA_DSO_LDOPTS += \
$(XPCOM_LIBS) \
$(NSPR_LIBS) \
$(ZLIB_LIBS) \
$(QCMS_LIBS) \
$(LCMS_LIBS) \
$(NULL)

Просмотреть файл

@ -46,6 +46,7 @@
#endif
#include "cairo.h"
#include "lcms.h"
#include "gfxContext.h"

Просмотреть файл

@ -41,6 +41,7 @@
#include "gfxPlatform.h"
#include "cairo.h"
#include "lcms.h"
gfxPattern::gfxPattern(cairo_pattern_t *aPattern)
{

Просмотреть файл

@ -65,7 +65,7 @@
#include "nsWeakReference.h"
#include "cairo.h"
#include "qcms.h"
#include "lcms.h"
#include "plstr.h"
#include "nsIPrefService.h"
@ -75,12 +75,12 @@
gfxPlatform *gPlatform = nsnull;
// These two may point to the same profile
static qcms_profile *gCMSOutputProfile = nsnull;
static qcms_profile *gCMSsRGBProfile = nsnull;
static cmsHPROFILE gCMSOutputProfile = nsnull;
static cmsHPROFILE gCMSsRGBProfile = nsnull;
static qcms_transform *gCMSRGBTransform = nsnull;
static qcms_transform *gCMSInverseRGBTransform = nsnull;
static qcms_transform *gCMSRGBATransform = nsnull;
static cmsHTRANSFORM gCMSRGBTransform = nsnull;
static cmsHTRANSFORM gCMSInverseRGBTransform = nsnull;
static cmsHTRANSFORM gCMSRGBATransform = nsnull;
static PRBool gCMSInitialized = PR_FALSE;
static eCMSMode gCMSMode = eCMSMode_Off;
@ -224,6 +224,16 @@ 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;
}
@ -503,9 +513,7 @@ 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 QCMS_INTENT_PERCEPTUAL
#define INTENT_MIN 0
#define INTENT_MAX 3
#define INTENT_DEFAULT INTENT_PERCEPTUAL
PRBool
gfxPlatform::GetRenderingIntent()
@ -537,24 +545,20 @@ gfxPlatform::GetRenderingIntent()
}
void
gfxPlatform::TransformPixel(const gfxRGBA& in, gfxRGBA& out, qcms_transform *transform)
gfxPlatform::TransformPixel(const gfxRGBA& in, gfxRGBA& out, cmsHTRANSFORM 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);
qcms_transform_data(transform,
cmsDoTransform(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);
/* add one to move past the alpha byte */
qcms_transform_data(transform,
cmsDoTransform(transform,
(PRUint8 *)&packed + 1, (PRUint8 *)&packed + 1,
1);
out.~gfxRGBA();
@ -566,13 +570,13 @@ gfxPlatform::TransformPixel(const gfxRGBA& in, gfxRGBA& out, qcms_transform *tra
out = in;
}
qcms_profile *
cmsHPROFILE
gfxPlatform::GetPlatformCMSOutputProfile()
{
return nsnull;
}
qcms_profile *
cmsHPROFILE
gfxPlatform::GetCMSOutputProfile()
{
if (!gCMSOutputProfile) {
@ -598,7 +602,7 @@ gfxPlatform::GetCMSOutputProfile()
rv = prefs->GetCharPref(CMProfilePrefName,
getter_Copies(fname));
if (NS_SUCCEEDED(rv) && !fname.IsEmpty()) {
gCMSOutputProfile = qcms_profile_from_path(fname);
gCMSOutputProfile = cmsOpenProfileFromFile(fname, "r");
}
}
}
@ -610,87 +614,92 @@ gfxPlatform::GetCMSOutputProfile()
/* Determine if the profile looks bogus. If so, close the profile
* and use sRGB instead. See bug 460629, */
if (gCMSOutputProfile && qcms_profile_is_bogus(gCMSOutputProfile)) {
if (gCMSOutputProfile && cmsProfileIsBogus(gCMSOutputProfile)) {
NS_ASSERTION(gCMSOutputProfile != GetCMSsRGBProfile(),
"Builtin sRGB profile tagged as bogus!!!");
qcms_profile_release(gCMSOutputProfile);
cmsCloseProfile(gCMSOutputProfile);
gCMSOutputProfile = nsnull;
}
if (!gCMSOutputProfile) {
gCMSOutputProfile = GetCMSsRGBProfile();
}
/* Precache the LUT16 Interpolations for the output profile. See
bug 444661 for details. */
qcms_profile_precache_output_transform(gCMSOutputProfile);
cmsPrecacheProfile(gCMSOutputProfile, CMS_PRECACHE_LI168_REVERSE);
}
return gCMSOutputProfile;
}
qcms_profile *
cmsHPROFILE
gfxPlatform::GetCMSsRGBProfile()
{
if (!gCMSsRGBProfile) {
/* Create the profile using lcms. */
gCMSsRGBProfile = qcms_profile_sRGB();
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);
}
return gCMSsRGBProfile;
}
qcms_transform *
cmsHTRANSFORM
gfxPlatform::GetCMSRGBTransform()
{
if (!gCMSRGBTransform) {
qcms_profile *inProfile, *outProfile;
cmsHPROFILE inProfile, outProfile;
outProfile = GetCMSOutputProfile();
inProfile = GetCMSsRGBProfile();
if (!inProfile || !outProfile)
return nsnull;
gCMSRGBTransform = qcms_transform_create(inProfile, QCMS_DATA_RGB_8,
outProfile, QCMS_DATA_RGB_8,
QCMS_INTENT_PERCEPTUAL);
gCMSRGBTransform = cmsCreateTransform(inProfile, TYPE_RGB_8,
outProfile, TYPE_RGB_8,
INTENT_PERCEPTUAL, cmsFLAGS_FLOATSHAPER);
}
return gCMSRGBTransform;
}
qcms_transform *
cmsHTRANSFORM
gfxPlatform::GetCMSInverseRGBTransform()
{
if (!gCMSInverseRGBTransform) {
qcms_profile *inProfile, *outProfile;
cmsHPROFILE inProfile, outProfile;
inProfile = GetCMSOutputProfile();
outProfile = GetCMSsRGBProfile();
if (!inProfile || !outProfile)
return nsnull;
gCMSInverseRGBTransform = qcms_transform_create(inProfile, QCMS_DATA_RGB_8,
outProfile, QCMS_DATA_RGB_8,
QCMS_INTENT_PERCEPTUAL);
gCMSInverseRGBTransform = cmsCreateTransform(inProfile, TYPE_RGB_8,
outProfile, TYPE_RGB_8,
INTENT_PERCEPTUAL, cmsFLAGS_FLOATSHAPER);
}
return gCMSInverseRGBTransform;
}
qcms_transform *
cmsHTRANSFORM
gfxPlatform::GetCMSRGBATransform()
{
if (!gCMSRGBATransform) {
qcms_profile *inProfile, *outProfile;
cmsHPROFILE inProfile, outProfile;
outProfile = GetCMSOutputProfile();
inProfile = GetCMSsRGBProfile();
if (!inProfile || !outProfile)
return nsnull;
gCMSRGBATransform = qcms_transform_create(inProfile, QCMS_DATA_RGBA_8,
outProfile, QCMS_DATA_RGBA_8,
QCMS_INTENT_PERCEPTUAL);
gCMSRGBATransform = cmsCreateTransform(inProfile, TYPE_RGBA_8,
outProfile, TYPE_RGBA_8,
INTENT_PERCEPTUAL, cmsFLAGS_FLOATSHAPER);
}
return gCMSRGBATransform;
@ -701,19 +710,19 @@ static void ShutdownCMS()
{
if (gCMSRGBTransform) {
qcms_transform_release(gCMSRGBTransform);
cmsDeleteTransform(gCMSRGBTransform);
gCMSRGBTransform = nsnull;
}
if (gCMSInverseRGBTransform) {
qcms_transform_release(gCMSInverseRGBTransform);
cmsDeleteTransform(gCMSInverseRGBTransform);
gCMSInverseRGBTransform = nsnull;
}
if (gCMSRGBATransform) {
qcms_transform_release(gCMSRGBATransform);
cmsDeleteTransform(gCMSRGBATransform);
gCMSRGBATransform = nsnull;
}
if (gCMSOutputProfile) {
qcms_profile_release(gCMSOutputProfile);
cmsCloseProfile(gCMSOutputProfile);
// handle the aliased case
if (gCMSsRGBProfile == gCMSOutputProfile)
@ -721,7 +730,7 @@ static void ShutdownCMS()
gCMSOutputProfile = nsnull;
}
if (gCMSsRGBProfile) {
qcms_profile_release(gCMSsRGBProfile);
cmsCloseProfile(gCMSsRGBProfile);
gCMSsRGBProfile = nsnull;
}

Просмотреть файл

@ -77,6 +77,8 @@
#include "nsMathUtils.h"
#include "lcms.h"
#define GDK_PIXMAP_SIZE_MAX 32767
#ifndef MOZ_PANGO
@ -527,7 +529,7 @@ gfxPlatformGtk::InitDPI()
}
}
qcms_profile *
cmsHPROFILE
gfxPlatformGtk::GetPlatformCMSOutputProfile()
{
#ifdef MOZ_X11
@ -557,10 +559,10 @@ gfxPlatformGtk::GetPlatformCMSOutputProfile()
&retAtom, &retFormat, &retLength,
&retAfter, &retProperty);
qcms_profile* profile = NULL;
cmsHPROFILE profile = NULL;
if (retLength > 0)
profile = qcms_profile_from_memory(retProperty, retLength);
profile = cmsOpenProfileFromMem(retProperty, retLength);
XFree(retProperty);
@ -582,8 +584,8 @@ gfxPlatformGtk::GetPlatformCMSOutputProfile()
&retAtom, &retFormat, &retLength,
&retAfter, &retProperty)) {
double gamma;
qcms_CIE_xyY whitePoint;
qcms_CIE_xyYTRIPLE primaries;
cmsCIExyY whitePoint;
cmsCIExyYTRIPLE primaries;
if (retLength != 128) {
#ifdef DEBUG_tor
@ -601,23 +603,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);
@ -631,8 +633,17 @@ gfxPlatformGtk::GetPlatformCMSOutputProfile()
primaries.Blue.x, primaries.Blue.y, primaries.Blue.Y);
#endif
qcms_profile* profile =
qcms_profile_create_rgb_with_gamma(whitePoint, primaries, gamma);
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]);
#ifdef DEBUG_tor
if (profile) {

Просмотреть файл

@ -58,7 +58,7 @@
#include "nsTArray.h"
#include "nsUnicodeRange.h"
#include "qcms.h"
#include "lcms.h"
gfxPlatformMac::gfxPlatformMac()
{
@ -382,7 +382,7 @@ gfxPlatformMac::ReadAntiAliasingThreshold()
return threshold;
}
qcms_profile *
cmsHPROFILE
gfxPlatformMac::GetPlatformCMSOutputProfile()
{
CMProfileLocation device;
@ -393,14 +393,14 @@ gfxPlatformMac::GetPlatformCMSOutputProfile()
if (err != noErr)
return nsnull;
qcms_profile *profile = nsnull;
cmsHPROFILE 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 = qcms_profile_from_path(path);
profile = cmsOpenProfileFromFile(path, "r");
#ifdef DEBUG_tor
if (profile)
fprintf(stderr,
@ -411,7 +411,7 @@ gfxPlatformMac::GetPlatformCMSOutputProfile()
break;
}
case cmPathBasedProfile:
profile = qcms_profile_from_path(device.u.pathLoc.path);
profile = cmsOpenProfileFromFile(device.u.pathLoc.path, "r");
#ifdef DEBUG_tor
if (profile)
fprintf(stderr,

Просмотреть файл

@ -59,7 +59,7 @@
#include "nsMathUtils.h"
#include "nsTArray.h"
#include "qcms.h"
#include "lcms.h"
#include <ft2build.h>
#include FT_FREETYPE_H
@ -354,7 +354,7 @@ gfxQtPlatform::InitDPI()
}
}
qcms_profile*
cmsHPROFILE
gfxQtPlatform::GetPlatformCMSOutputProfile()
{
return nsnull;

Просмотреть файл

@ -70,6 +70,8 @@
#include <string>
#include "lcms.h"
#ifdef MOZ_FT2_FONTS
static FT_Library gPlatformFTLibrary = NULL;
#endif
@ -827,7 +829,7 @@ gfxWindowsPlatform::FindFontEntry(const nsAString& aName, const gfxFontStyle& aF
return ff->FindFontEntry(aFontStyle);
}
qcms_profile*
cmsHPROFILE
gfxWindowsPlatform::GetPlatformCMSOutputProfile()
{
#ifndef MOZ_FT2_FONTS
@ -838,8 +840,8 @@ gfxWindowsPlatform::GetPlatformCMSOutputProfile()
GetICMProfileW(dc, &size, (LPWSTR)&str);
ReleaseDC(nsnull, dc);
qcms_profile* profile =
qcms_profile_from_path(NS_ConvertUTF16toUTF8(str).get());
cmsHPROFILE profile =
cmsOpenProfileFromFile(NS_ConvertUTF16toUTF8(str).get(), "r");
#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,6 +86,7 @@ LIBS = $(HELPER_OBJS) \
$(NSPR_LIBS) \
$(TK_LIBS) \
$(ZLIB_LIBS) \
$(LCMS_LIBS) \
$(NULL)
ifeq ($(MOZ_WIDGET_TOOLKIT),windows)

Просмотреть файл

@ -78,7 +78,6 @@ REQUIRES = xpcom \
shistory \
caps \
thebes \
qcms \
$(NULL)
ifdef ACCESSIBILITY

Просмотреть файл

@ -64,7 +64,6 @@ REQUIRES = xpcom \
webbrwsr \
pref \
js \
qcms \
$(NULL)
LOCAL_INCLUDES = \

Просмотреть файл

@ -63,7 +63,6 @@ REQUIRES = xpcom \
xpconnect \
docshell \
thebes \
qcms \
$(NULL)
CPPSRCS = \

Просмотреть файл

@ -60,7 +60,7 @@ REQUIRES = xpcom \
$(JPEG_REQUIRES) \
$(PNG_REQUIRES) \
$(ZLIB_REQUIRES) \
qcms \
$(LCMS_REQUIRES) \
$(NULL)
CPPSRCS = \
@ -93,7 +93,7 @@ EXTRA_DSO_LDOPTS = \
$(LIBS_DIR) \
$(JPEG_LIBS) \
$(PNG_LIBS) $(ZLIB_LIBS) \
$(QCMS_LIBS) \
$(LCMS_LIBS) \
$(EXTRA_DSO_LIBS) \
$(MOZ_COMPONENT_LIBS) \
$(NULL)

Просмотреть файл

@ -53,7 +53,7 @@ REQUIRES = xpcom \
gfx \
thebes \
imglib2 \
qcms \
$(LCMS_REQUIRES) \
$(NULL)
CPPSRCS = nsGIFDecoder2.cpp

Просмотреть файл

@ -86,7 +86,7 @@ mailing address.
#include "gfxColor.h"
#include "gfxPlatform.h"
#include "qcms.h"
#include "lcms.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) {
qcms_transform *transform = gfxPlatform::GetCMSRGBTransform();
cmsHTRANSFORM transform = gfxPlatform::GetCMSRGBTransform();
if (transform)
qcms_transform_data(transform, aColormap, aColormap, aColors);
cmsDoTransform(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) \
qcms \
$(LCMS_REQUIRES) \
$(NULL)
CPPSRCS = nsJPEGDecoder.cpp

Просмотреть файл

@ -125,9 +125,9 @@ nsJPEGDecoder::~nsJPEGDecoder()
{
PR_FREEIF(mBackBuffer);
if (mTransform)
qcms_transform_release(mTransform);
cmsDeleteTransform(mTransform);
if (mInProfile)
qcms_profile_release(mInProfile);
cmsCloseProfile(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 = qcms_profile_from_memory(profile, profileLength)) != NULL) {
(mInProfile = cmsOpenProfileFromMem(profile, profileLength)) != NULL) {
free(profile);
PRUint32 profileSpace = qcms_profile_get_color_space(mInProfile);
PRUint32 profileSpace = cmsGetColorSpace(mInProfile);
PRBool mismatch = PR_FALSE;
#ifdef DEBUG_tor
@ -361,13 +361,14 @@ nsresult nsJPEGDecoder::ProcessData(const char *data, PRUint32 count, PRUint32 *
case JCS_YCbCr:
if (profileSpace == icSigRgbData)
mInfo.out_color_space = JCS_RGB;
else
// qcms doesn't support ycbcr
else if (profileSpace != icSigYCbCrData)
mismatch = PR_TRUE;
break;
case JCS_CMYK:
case JCS_YCCK:
// qcms doesn't support cmyk
if (profileSpace == icSigCmykData)
mInfo.out_color_space = JCS_CMYK;
else
mismatch = PR_TRUE;
break;
default:
@ -378,13 +379,19 @@ nsresult nsJPEGDecoder::ProcessData(const char *data, PRUint32 count, PRUint32 *
}
if (!mismatch) {
qcms_data_type type;
PRUint32 type;
switch (mInfo.out_color_space) {
case JCS_GRAYSCALE:
type = QCMS_DATA_GRAY_8;
type = COLORSPACE_SH(PT_GRAY) | CHANNELS_SH(1) | BYTES_SH(1);
break;
case JCS_RGB:
type = QCMS_DATA_RGB_8;
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);
break;
default:
mState = JPEG_ERROR;
@ -392,28 +399,26 @@ 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 = qcms_profile_get_rendering_intent(mInProfile);
intent = cmsTakeRenderingIntent(mInProfile);
/* Create the color management transform. */
mTransform = qcms_transform_create(mInProfile,
mTransform = cmsCreateTransform(mInProfile,
type,
gfxPlatform::GetCMSOutputProfile(),
QCMS_DATA_RGB_8,
(qcms_intent)intent);
TYPE_RGB_8,
intent,
cmsFLAGS_FLOATSHAPER);
}
} else {
#ifdef DEBUG_tor
@ -741,7 +746,7 @@ nsJPEGDecoder::OutputScanlines(PRBool* suspend)
to the 3byte RGB byte pixels at 'end' of row */
sampleRow += mInfo.output_width;
}
qcms_transform_data(mTransform, source, sampleRow, mInfo.output_width);
cmsDoTransform(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,
@ -759,9 +764,9 @@ nsJPEGDecoder::OutputScanlines(PRBool* suspend)
}
if (gfxPlatform::GetCMSMode() == eCMSMode_All) {
/* No embedded ICC profile - treat as sRGB */
qcms_transform *transform = gfxPlatform::GetCMSRGBTransform();
cmsHTRANSFORM transform = gfxPlatform::GetCMSRGBTransform();
if (transform) {
qcms_transform_data(transform, sampleRow, sampleRow, mInfo.output_width);
cmsDoTransform(transform, sampleRow, sampleRow, mInfo.output_width);
}
}
}

Просмотреть файл

@ -50,7 +50,7 @@
#include "imgILoad.h"
#include "nsIInputStream.h"
#include "nsIPipe.h"
#include "qcms.h"
#include "lcms.h"
extern "C" {
#include "jpeglib.h"
@ -122,8 +122,8 @@ public:
JOCTET *mProfile;
PRUint32 mProfileLength;
qcms_profile *mInProfile;
qcms_transform *mTransform;
cmsHPROFILE mInProfile;
cmsHTRANSFORM mTransform;
PRPackedBool mReading;
};

Просмотреть файл

@ -57,7 +57,7 @@ REQUIRES = xpcom \
imglib2 \
$(PNG_REQUIRES) \
$(ZLIB_REQUIRES) \
qcms \
$(LCMS_REQUIRES) \
$(NULL)
CPPSRCS = nsPNGDecoder.cpp

Просмотреть файл

@ -89,11 +89,11 @@ nsPNGDecoder::~nsPNGDecoder()
if (interlacebuf)
nsMemory::Free(interlacebuf);
if (mInProfile) {
qcms_profile_release(mInProfile);
cmsCloseProfile(mInProfile);
/* mTransform belongs to us only if mInProfile is non-null */
if (mTransform)
qcms_transform_release(mTransform);
cmsDeleteTransform(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 qcms_profile *
static cmsHPROFILE
PNGGetColorProfile(png_structp png_ptr, png_infop info_ptr,
int color_type, qcms_data_type *inType, PRUint32 *intent)
int color_type, PRUint32 *inType, PRUint32 *intent)
{
qcms_profile *profile = nsnull;
*intent = QCMS_INTENT_PERCEPTUAL; // Our default
cmsHPROFILE profile = nsnull;
*intent = 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,40 +413,38 @@ PNGGetColorProfile(png_structp png_ptr, png_infop info_ptr,
png_get_iCCP(png_ptr, info_ptr, &profileName, &compression,
&profileData, &profileLen);
profile = qcms_profile_from_memory(profileData, profileLen);
if (profile) {
PRUint32 profileSpace = qcms_profile_get_color_space(profile);
profile = cmsOpenProfileFromMem(profileData, profileLen);
PRUint32 profileSpace = cmsGetColorSpace(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) {
qcms_profile_release(profile);
profile = nsnull;
} else {
*intent = qcms_profile_get_rendering_intent(profile);
}
if (mismatch) {
cmsCloseProfile(profile);
profile = nsnull;
} else {
*intent = cmsTakeRenderingIntent(profile);
}
}
// Check sRGB chunk
if (!profile && png_get_valid(png_ptr, info_ptr, PNG_INFO_sRGB)) {
profile = qcms_profile_sRGB();
profile = cmsCreate_sRGBProfile();
if (profile) {
int fileIntent;
png_set_gray_to_rgb(png_ptr);
png_get_sRGB(png_ptr, info_ptr, &fileIntent);
PRUint32 map[] = { QCMS_INTENT_PERCEPTUAL, QCMS_INTENT_RELATIVE_COLORIMETRIC,
QCMS_INTENT_SATURATION, QCMS_INTENT_ABSOLUTE_COLORIMETRIC };
PRUint32 map[] = { INTENT_PERCEPTUAL, INTENT_RELATIVE_COLORIMETRIC,
INTENT_SATURATION, INTENT_ABSOLUTE_COLORIMETRIC };
*intent = map[fileIntent];
}
}
@ -455,40 +453,49 @@ 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)) {
qcms_CIE_xyYTRIPLE primaries;
qcms_CIE_xyY whitePoint;
cmsCIExyYTRIPLE primaries;
cmsCIExyY 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);
profile = qcms_profile_create_rgb_with_gamma(whitePoint, primaries, 1/gammaOfFile);
gammaTable[0] = gammaTable[1] = gammaTable[2] =
cmsBuildGamma(256, 1/gammaOfFile);
if (!gammaTable[0])
return nsnull;
profile = cmsCreateRGBProfile(&whitePoint, &primaries, gammaTable);
if (profile)
png_set_gray_to_rgb(png_ptr);
cmsFreeGamma(gammaTable[0]);
}
if (profile) {
PRUint32 profileSpace = qcms_profile_get_color_space(profile);
PRUint32 profileSpace = cmsGetColorSpace(profile);
if (profileSpace == icSigGrayData) {
if (color_type & PNG_COLOR_MASK_ALPHA)
*inType = QCMS_DATA_GRAYA_8;
*inType = TYPE_GRAYA_8;
else
*inType = QCMS_DATA_GRAY_8;
*inType = TYPE_GRAY_8;
} else {
if (color_type & PNG_COLOR_MASK_ALPHA ||
png_get_valid(png_ptr, info_ptr, PNG_INFO_tRNS))
*inType = QCMS_DATA_RGBA_8;
*inType = TYPE_RGBA_8;
else
*inType = QCMS_DATA_RGB_8;
*inType = TYPE_RGB_8;
}
}
@ -549,8 +556,7 @@ info_callback(png_structp png_ptr, png_infop info_ptr)
if (bit_depth == 16)
png_set_strip_16(png_ptr);
qcms_data_type inType;
PRUint32 intent, pIntent;
PRUint32 inType, intent, pIntent;
if (gfxPlatform::GetCMSMode() != eCMSMode_Off) {
intent = gfxPlatform::GetRenderingIntent();
decoder->mInProfile = PNGGetColorProfile(png_ptr, info_ptr,
@ -560,19 +566,25 @@ info_callback(png_structp png_ptr, png_infop info_ptr)
intent = pIntent;
}
if (decoder->mInProfile && gfxPlatform::GetCMSOutputProfile()) {
qcms_data_type outType;
PRUint32 outType;
PRUint32 dwFlags = 0;
if (color_type & PNG_COLOR_MASK_ALPHA || num_trans)
outType = QCMS_DATA_RGBA_8;
outType = TYPE_RGBA_8;
else
outType = QCMS_DATA_RGB_8;
outType = TYPE_RGB_8;
decoder->mTransform = qcms_transform_create(decoder->mInProfile,
/* 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,
inType,
gfxPlatform::GetCMSOutputProfile(),
outType,
(qcms_intent)intent);
intent,
dwFlags);
} else {
png_set_gray_to_rgb(png_ptr);
PNGDoGammaCorrection(png_ptr, info_ptr);
@ -737,7 +749,7 @@ row_callback(png_structp png_ptr, png_bytep new_row,
if (decoder->mTransform) {
if (decoder->mCMSLine) {
qcms_transform_data(decoder->mTransform, line, decoder->mCMSLine, iwidth);
cmsDoTransform(decoder->mTransform, line, decoder->mCMSLine, iwidth);
/* copy alpha over */
PRUint32 channels = decoder->mChannels;
if (channels == 2 || channels == 4) {
@ -746,7 +758,7 @@ row_callback(png_structp png_ptr, png_bytep new_row,
}
line = decoder->mCMSLine;
} else {
qcms_transform_data(decoder->mTransform, line, line, iwidth);
cmsDoTransform(decoder->mTransform, line, line, iwidth);
}
}

Просмотреть файл

@ -52,7 +52,7 @@
#include "png.h"
#include "qcms.h"
#include "lcms.h"
#define NS_PNGDECODER_CID \
{ /* 36fa00c2-1dd2-11b2-be07-d16eeb4c50ed */ \
@ -87,8 +87,8 @@ public:
png_infop mInfo;
PRUint8 *mCMSLine;
PRUint8 *interlacebuf;
qcms_profile *mInProfile;
qcms_transform *mTransform;
cmsHPROFILE mInProfile;
cmsHTRANSFORM mTransform;
gfx_format format;
PRUint8 mChannels;

Разница между файлами не показана из-за своего большого размера Загрузить разницу

Просмотреть файл

@ -1,4 +1,8 @@
<html><body>
<html>
<head>
<script src="lcms-asm-check.js" type="application/ecmascript"></script>
</head>
<body>
<table cellpadding='0' cellspacing='0' width='32' height='32'>
<tr height='1'>
<td width='1' style='background-color: rgba(255,255,255,1)'></td>
@ -82,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(254,255,253,1)'></td>
<td width='1' style='background-color: rgba(253,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>
@ -110,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(189,255,220,1)'></td>
<td width='1' style='background-color: rgba(188,255,219,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(70,255,144,1)'></td>
<td width='1' style='background-color: rgba(70,255,144,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(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>
@ -143,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,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(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(86,255,159,1)'></td>
<td width='1' style='background-color: rgba(70,255,144,1)'></td>
<td width='1' style='background-color: rgba(71,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(207,255,188,1)'></td>
<td width='1' style='background-color: rgba(206,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>
@ -180,15 +184,21 @@
<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(100,255,166,1)'></td>
<td width='1' style='background-color: rgba(101,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>
<td width='1' style='background-color: rgba(164,255,91,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(199,255,148,1)'></td>
<td width='1' style='background-color: rgba(254,255,253,1)'></td>
<td width='1' style='background-color: rgba(253,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>
@ -219,9 +229,16 @@
<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,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(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(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>
@ -243,7 +260,7 @@
<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(220,255,240,1)'></td>
<td width='1' style='background-color: rgba(219,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>
@ -253,9 +270,15 @@
<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>
<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>
<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(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>
@ -288,10 +311,10 @@
<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(187,255,96,1)'></td>
<td width='1' style='background-color: rgba(186,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,68,1)'></td>
<td width='1' style='background-color: rgba(209,255,68,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(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>
@ -315,8 +338,8 @@
<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(148,255,208,1)'></td>
<td width='1' style='background-color: rgba(148,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(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>
@ -348,13 +371,13 @@
<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(148,255,208,1)'></td>
<td width='1' style='background-color: rgba(148,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(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(187,255,179,1)'></td>
<td width='1' style='background-color: rgba(186,255,178,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>
@ -378,26 +401,26 @@
<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,217,1)'></td>
<td width='1' style='background-color: rgba(96,255,211,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(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,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(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(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,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(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(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(252,254,95,1)'></td>
<td width='1' style='background-color: rgba(252,254,95,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(255,245,96,1)'></td>
<td width='1' style='background-color: rgba(255,249,185,1)'></td>
<td width='1' style='background-color: rgba(254,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>
@ -411,28 +434,28 @@
<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(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(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(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,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(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(190,255,194,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(206,255,188,1)'></td>
<td width='1' style='background-color: rgba(209,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(251,255,133,1)'></td>
<td width='1' style='background-color: rgba(252,254,95,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(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,243,196,1)'></td>
<td width='1' style='background-color: rgba(255,242,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>
@ -445,28 +468,28 @@
<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,234,1)'></td>
<td width='1' style='background-color: rgba(68,255,217,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(114,255,219,1)'></td>
<td width='1' style='background-color: rgba(134,255,223,1)'></td>
<td width='1' style='background-color: rgba(134,255,222,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,232,1)'></td>
<td width='1' style='background-color: rgba(179,255,231,1)'></td>
<td width='1' style='background-color: rgba(187,255,227,1)'></td>
<td width='1' style='background-color: rgba(197,255,224,1)'></td>
<td width='1' style='background-color: rgba(197,255,223,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,191,1)'></td>
<td width='1' style='background-color: rgba(218,255,191,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(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(251,255,133,1)'></td>
<td width='1' style='background-color: rgba(250,254,133,1)'></td>
<td width='1' style='background-color: rgba(255,245,96,1)'></td>
<td width='1' style='background-color: rgba(255,233,116,1)'></td>
<td width='1' style='background-color: rgba(255,232,117,1)'></td>
<td width='1' style='background-color: rgba(255,225,95,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,206,93,1)'></td>
<td width='1' style='background-color: rgba(255,206,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>
@ -480,29 +503,29 @@
<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,217,1)'></td>
<td width='1' style='background-color: rgba(68,255,216,1)'></td>
<td width='1' style='background-color: rgba(114,255,219,1)'></td>
<td width='1' style='background-color: rgba(134,255,223,1)'></td>
<td width='1' style='background-color: rgba(134,255,222,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,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(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(216,255,222,1)'></td>
<td width='1' style='background-color: rgba(225,255,195,1)'></td>
<td width='1' style='background-color: rgba(224,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,233,116,1)'></td>
<td width='1' style='background-color: rgba(255,232,117,1)'></td>
<td width='1' style='background-color: rgba(255,212,119,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,206,93,1)'></td>
<td width='1' style='background-color: rgba(255,197,92,1)'></td>
<td width='1' style='background-color: rgba(255,179,66,1)'></td>
<td width='1' style='background-color: rgba(255,236,226,1)'></td>
<td width='1' style='background-color: rgba(254,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>
@ -513,31 +536,31 @@
<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,231,1)'></td>
<td width='1' style='background-color: rgba(61,255,230,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,232,1)'></td>
<td width='1' style='background-color: rgba(179,255,231,1)'></td>
<td width='1' style='background-color: rgba(188,255,236,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(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(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(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(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,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,91,1)'></td>
<td width='1' style='background-color: rgba(255,197,91,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,179,66,1)'></td>
<td width='1' style='background-color: rgba(255,176,88,1)'></td>
<td width='1' style='background-color: rgba(255,236,226,1)'></td>
<td width='1' style='background-color: rgba(254,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>
@ -546,33 +569,33 @@
</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,248,1)'></td>
<td width='1' style='background-color: rgba(61,255,231,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(106,255,234,1)'></td>
<td width='1' style='background-color: rgba(135,255,239,1)'></td>
<td width='1' style='background-color: rgba(135,255,238,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,240,1)'></td>
<td width='1' style='background-color: rgba(185,255,239,1)'></td>
<td width='1' style='background-color: rgba(188,255,236,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(203,255,242,1)'></td>
<td width='1' style='background-color: rgba(219,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,234,1)'></td>
<td width='1' style='background-color: rgba(235,255,233,1)'></td>
<td width='1' style='background-color: rgba(243,255,228,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(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(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,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,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,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(255,236,226,1)'></td>
<td width='1' style='background-color: rgba(254,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>
@ -581,28 +604,28 @@
<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,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(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(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,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(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(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,255,215,1)'></td>
<td width='1' style='background-color: rgba(253,254,214,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,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,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,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>
@ -614,35 +637,35 @@
</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,249,1)'></td>
<td width='1' style='background-color: rgba(136,255,248,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,249,1)'></td>
<td width='1' style='background-color: rgba(155,255,246,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(169,254,251,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(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(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(255,236,226,1)'></td>
<td width='1' style='background-color: rgba(254,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,168,140,1)'></td>
<td width='1' style='background-color: rgba(255,168,140,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,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,242,242,1)'></td>
<td width='1' style='background-color: rgba(255,241,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>
@ -650,91 +673,91 @@
<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,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(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(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,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>
<td width='1' style='background-color: rgba(255,230,238,1)'></td>
<td width='1' style='background-color: rgba(255,230,238,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(255,198,227,1)'></td>
<td width='1' style='background-color: rgba(255,191,216,1)'></td>
<td width='1' style='background-color: rgba(255,191,215,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,181,1)'></td>
<td width='1' style='background-color: rgba(255,149,181,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,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,164,1)'></td>
<td width='1' style='background-color: rgba(255,126,163,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,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,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,255,255,1)'></td>
</tr>
<tr height='1'>
<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(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(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,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(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(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,230,238,1)'></td>
<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,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>
<td width='1' style='background-color: rgba(255,198,227,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,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,135,167,1)'></td>
<td width='1' style='background-color: rgba(255,118,168,1)'></td>
<td width='1' style='background-color: rgba(255,118,167,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,55,135,1)'></td>
<td width='1' style='background-color: rgba(255,56,135,1)'></td>
<td width='1' style='background-color: rgba(255,135,167,1)'></td>
<td width='1' style='background-color: rgba(255,249,250,1)'></td>
<td width='1' style='background-color: rgba(255,248,249,1)'></td>
</tr>
<tr height='1'>
<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(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(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,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(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(255,212,239,1)'></td>
<td width='1' style='background-color: rgba(255,205,234,1)'></td>
<td width='1' style='background-color: rgba(255,205,233,1)'></td>
<td width='1' style='background-color: rgba(255,198,227,1)'></td>
<td width='1' style='background-color: rgba(254,189,233,1)'></td>
<td width='1' style='background-color: rgba(254,189,232,1)'></td>
<td width='1' style='background-color: rgba(255,177,227,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,170,215,1)'></td>
<td width='1' style='background-color: rgba(255,163,210,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>
@ -743,14 +766,14 @@
<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,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,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,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,235,255,1)'></td>
<td width='1' style='background-color: rgba(79,234,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>
@ -759,23 +782,23 @@
<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(243,210,240,1)'></td>
<td width='1' style='background-color: rgba(243,210,240,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(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,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,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,120,196,1)'></td>
<td width='1' style='background-color: rgba(255,120,196,1)'></td>
<td width='1' style='background-color: rgba(255,91,192,1)'></td>
<td width='1' style='background-color: rgba(255,92,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,55,160,1)'></td>
<td width='1' style='background-color: rgba(255,55,160,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,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>
@ -784,8 +807,8 @@
</tr>
<tr height='1'>
<td width='1' style='background-color: rgba(197,243,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(79,234,255,1)'></td>
<td width='1' style='background-color: rgba(79,234,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>
@ -793,24 +816,24 @@
<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(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(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(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(252,125,213,1)'></td>
<td width='1' style='background-color: rgba(251,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,91,192,1)'></td>
<td width='1' style='background-color: rgba(255,92,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(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(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(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>
@ -818,28 +841,28 @@
</tr>
<tr height='1'>
<td width='1' style='background-color: rgba(197,243,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(101,221,255,1)'></td>
<td width='1' style='background-color: rgba(101,221,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,211,255,1)'></td>
<td width='1' style='background-color: rgba(151,210,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(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(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(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,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(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(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>
@ -852,28 +875,35 @@
</tr>
<tr height='1'>
<td width='1' style='background-color: rgba(205,241,255,1)'></td>
<td width='1' style='background-color: rgba(83,212,255,1)'></td>
<td width='1' style='background-color: rgba(83,212,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(98,205,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(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(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(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(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,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>
@ -889,22 +919,22 @@
<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(160,194,255,1)'></td>
<td width='1' style='background-color: rgba(159,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,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(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(246,185,205,1)'></td>
<td width='1' style='background-color: rgba(245,242,243,1)'></td>
<td width='1' style='background-color: rgba(244,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>
<td width='1' style='background-color: rgba(255,255,255,1)'></td>
@ -928,15 +958,15 @@
<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,255,1)'></td>
<td width='1' style='background-color: rgba(241,81,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(228,28,235,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(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(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>
@ -953,7 +983,7 @@
<td width='1' style='background-color: rgba(255,255,255,1)'></td>
</tr>
<tr height='1'>
<td width='1' style='background-color: rgba(253,254,254,1)'></td>
<td width='1' style='background-color: rgba(253,253,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>
@ -963,11 +993,11 @@
<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,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(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(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>
@ -994,12 +1024,12 @@
<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,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(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(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>
@ -1023,14 +1053,14 @@
<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,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(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(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>
@ -1089,4 +1119,4 @@
<td width='1' style='background-color: rgba(255,255,255,1)'></td>
</tr>
</table>
</body></html>
</body></html>

Просмотреть файл

@ -40,7 +40,7 @@ EXTRA_DSO_LDOPTS += \
$(LIBS_DIR) \
$(JPEG_LIBS) \
$(PNG_LIBS) \
$(QCMS_LIBS) \
$(LCMS_LIBS) \
$(MOZ_JS_LIBS) \
$(NSS_LIBS) \
$(MOZ_CAIRO_LIBS) \

Просмотреть файл

@ -755,8 +755,10 @@ MAKEFILES_libmar="
modules/libmar/tool/Makefile
"
MAKEFILES_qcms="
modules/qcms/Makefile
MAKEFILES_lcms="
modules/lcms/Makefile
modules/lcms/include/Makefile
modules/lcms/src/Makefile
"
add_makefiles "
@ -802,7 +804,6 @@ add_makefiles "
$MAKEFILES_zlib
$MAKEFILES_libmar
$MAKEFILES_lcms
$MAKEFILES_qcms
"
#

Просмотреть файл

@ -70,7 +70,7 @@ endif
tier_external_dirs += modules/libmar
endif
tier_external_dirs += gfx/qcms
tier_external_dirs += modules/lcms
#
# tier "gecko" - core components

Просмотреть файл

@ -90,7 +90,7 @@ EXTRA_DSO_LDOPTS = \
$(EXTRA_DSO_LIBS) \
$(MOZ_COMPONENT_LIBS) \
$(MOZ_UNICHARUTIL_LIBS) \
$(QCMS_LIBS)
$(LCMS_LIBS) \
$(NULL)
include $(topsrcdir)/config/rules.mk

Просмотреть файл

@ -66,7 +66,7 @@ REQUIRES = xpcom \
intl \
exthandler \
appshell \
qcms \
lcms \
thebes \
js \
xpconnect \
@ -125,7 +125,7 @@ EXTRA_DSO_LDOPTS += \
$(call EXPAND_LIBNAME_PATH,gkgfx,$(DEPTH)/gfx/src) \
$(MOZ_COMPONENT_LIBS) \
-lthebes \
$(QCMS_LIBS) \
$(LCMS_LIBS) \
$(NULL)
include $(topsrcdir)/config/rules.mk

Просмотреть файл

@ -64,7 +64,7 @@
#include "nsNativeThemeColors.h"
#include "gfxPlatform.h"
#include "qcms.h"
#include "lcms.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) {
qcms_transform *transform = gfxPlatform::GetCMSRGBATransform();
cmsHTRANSFORM 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);
qcms_transform_data(transform, color, color, 1);
cmsDoTransform(transform, color, color, 1);
aColor = NS_RGB(color[0], color[1], color[2]);
}
}

Просмотреть файл

@ -69,7 +69,6 @@ REQUIRES = xpcom \
locale \
thebes \
cairo \
qcms \
$(NULL)
ifdef MOZ_X11
@ -143,7 +142,7 @@ EXTRA_DSO_LDOPTS += \
$(XCOMPOSITE_LIBS) \
$(MOZ_GTK2_LIBS) \
-lthebes \
$(QCMS_LIBS) \
$(LCMS_LIBS) \
$(NULL)
ifdef MOZ_PLATFORM_HILDON

Просмотреть файл

@ -107,7 +107,7 @@ EXTRA_DSO_LDOPTS = \
$(MOZ_UNICHARUTIL_LIBS) \
$(MOZ_COMPONENT_LIBS) \
-lthebes \
$(QCMS_LIBS) \
$(LCMS_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,7 +71,6 @@ REQUIRES = xpcom \
unicharutil \
thebes \
cairo \
qcms \
$(NULL)
CPPSRCS = \

Просмотреть файл

@ -61,7 +61,7 @@ REQUIRES = xpcom \
unicharutil \
view \
windowwatcher \
qcms \
lcms \
thebes \
$(NULL)

Просмотреть файл

@ -47,7 +47,7 @@
#include "nsFont.h"
#include "gfxPlatform.h"
#include "qcms.h"
#include "lcms.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)) {
qcms_transform *transform = gfxPlatform::GetCMSInverseRGBTransform();
cmsHTRANSFORM 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);
qcms_transform_data(transform, color, color, 1);
cmsDoTransform(transform, color, color, 1);
aColor = NS_RGB(color[0], color[1], color[2]);
}
}