gfx/qcms/transform_util.h

Tue, 06 Jan 2015 21:39:09 +0100

author
Michael Schloh von Bennewitz <michael@schloh.com>
date
Tue, 06 Jan 2015 21:39:09 +0100
branch
TOR_BUG_9701
changeset 8
97036ab72558
permissions
-rw-r--r--

Conditionally force memory storage according to privacy.thirdparty.isolate;
This solves Tor bug #9701, complying with disk avoidance documented in
https://www.torproject.org/projects/torbrowser/design/#disk-avoidance.

     1 /* vim: set ts=8 sw=8 noexpandtab: */
     2 //  qcms
     3 //  Copyright (C) 2009 Mozilla Foundation
     4 //  Copyright (C) 1998-2007 Marti Maria
     5 //
     6 // Permission is hereby granted, free of charge, to any person obtaining 
     7 // a copy of this software and associated documentation files (the "Software"), 
     8 // to deal in the Software without restriction, including without limitation 
     9 // the rights to use, copy, modify, merge, publish, distribute, sublicense, 
    10 // and/or sell copies of the Software, and to permit persons to whom the Software 
    11 // is furnished to do so, subject to the following conditions:
    12 //
    13 // The above copyright notice and this permission notice shall be included in 
    14 // all copies or substantial portions of the Software.
    15 //
    16 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 
    17 // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO 
    18 // THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND 
    19 // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE 
    20 // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION 
    21 // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION 
    22 // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
    24 #ifndef _QCMS_TRANSFORM_UTIL_H
    25 #define _QCMS_TRANSFORM_UTIL_H
    27 #include <stdlib.h>
    29 #define CLU(table,x,y,z) table[(x*len + y*x_len + z*xy_len)*3]
    31 //XXX: could use a bettername
    32 typedef uint16_t uint16_fract_t;
    34 float lut_interp_linear(double value, uint16_t *table, int length);
    35 float lut_interp_linear_float(float value, float *table, int length);
    36 uint16_t lut_interp_linear16(uint16_t input_value, uint16_t *table, int length);
    39 static inline float lerp(float a, float b, float t)
    40 {
    41         return a*(1.f-t) + b*t;
    42 }
    44 static inline unsigned char clamp_u8(float v)
    45 {
    46   if (v > 255.)
    47     return 255;
    48   else if (v < 0)
    49     return 0;
    50   else
    51     return floorf(v+.5);
    52 }
    54 static inline float clamp_float(float a)
    55 {
    56   /* One would naturally write this function as the following:
    57   if (a > 1.)
    58     return 1.;
    59   else if (a < 0)
    60     return 0;
    61   else
    62     return a;
    64   However, that version will let NaNs pass through which is undesirable
    65   for most consumers.
    66   */
    68   if (a > 1.)
    69     return 1.;
    70   else if (a >= 0)
    71     return a;
    72   else // a < 0 or a is NaN
    73     return 0;
    74 }
    76 static inline float u8Fixed8Number_to_float(uint16_t x)
    77 {
    78   // 0x0000 = 0.
    79   // 0x0100 = 1.
    80   // 0xffff = 255  + 255/256
    81   return x/256.;
    82 }
    84 float *build_input_gamma_table(struct curveType *TRC);
    85 struct matrix build_colorant_matrix(qcms_profile *p);
    86 void build_output_lut(struct curveType *trc,
    87                       uint16_t **output_gamma_lut, size_t *output_gamma_lut_length);
    89 struct matrix matrix_invert(struct matrix mat);
    90 qcms_bool compute_precache(struct curveType *trc, uint8_t *output);
    93 #endif

mercurial