1 //***************************************************************************/ 2 // This software is released under the 2-Clause BSD license, included 3 // below. 4 // 5 // Copyright (c) 2019, Aous Naman 6 // Copyright (c) 2019, Kakadu Software Pty Ltd, Australia 7 // Copyright (c) 2019, The University of New South Wales, Australia 8 // 9 // Redistribution and use in source and binary forms, with or without 10 // modification, are permitted provided that the following conditions are 11 // met: 12 // 13 // 1. Redistributions of source code must retain the above copyright 14 // notice, this list of conditions and the following disclaimer. 15 // 16 // 2. Redistributions in binary form must reproduce the above copyright 17 // notice, this list of conditions and the following disclaimer in the 18 // documentation and/or other materials provided with the distribution. 19 // 20 // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS 21 // IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED 22 // TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A 23 // PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 24 // HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 25 // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED 26 // TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR 27 // PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF 28 // LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING 29 // NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS 30 // SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 31 //***************************************************************************/ 32 // This file is part of the OpenJPH software implementation. 33 // File: ojph_colour_local.h 34 // Author: Aous Naman 35 // Date: 28 August 2019 36 //***************************************************************************/ 37 38 39 #ifndef OJPH_COLOR_LOCAL_H 40 #define OJPH_COLOR_LOCAL_H 41 42 namespace ojph { 43 namespace local { 44 45 struct CT_CNST 46 { 47 // for irreversible color transform 48 static const float ALPHA_RF; 49 static const float ALPHA_GF; 50 static const float ALPHA_BF; 51 static const float BETA_CbF; 52 static const float BETA_CrF; 53 static const float GAMMA_CR2R; 54 static const float GAMMA_CB2B; 55 static const float GAMMA_CR2G; 56 static const float GAMMA_CB2G; 57 }; 58 59 ////////////////////////////////////////////////////////////////////////// 60 // 61 // 62 // Generic Functions 63 // 64 // 65 ////////////////////////////////////////////////////////////////////////// 66 67 ////////////////////////////////////////////////////////////////////////// 68 void gen_cnvrt_si32_to_si32_shftd(const si32 *sp, si32 *dp, int shift, 69 int width); 70 71 ////////////////////////////////////////////////////////////////////////// 72 void gen_cnvrt_si32_to_float_shftd(const si32 *sp, float *dp, float mul, 73 int width); 74 75 ////////////////////////////////////////////////////////////////////////// 76 void gen_cnvrt_si32_to_float(const si32 *sp, float *dp, float mul, 77 int width); 78 79 ////////////////////////////////////////////////////////////////////////// 80 void gen_cnvrt_float_to_si32_shftd(const float *sp, si32 *dp, float mul, 81 int width); 82 83 ////////////////////////////////////////////////////////////////////////// 84 void gen_cnvrt_float_to_si32(const float *sp, si32 *dp, float mul, 85 int width); 86 87 ////////////////////////////////////////////////////////////////////////// 88 void gen_rct_forward(const si32 *r, const si32 *g, const si32 *b, 89 si32 *y, si32 *cb, si32 *cr, int repeat); 90 91 ////////////////////////////////////////////////////////////////////////// 92 void gen_rct_backward(const si32 *y, const si32 *cb, const si32 *cr, 93 si32 *r, si32 *g, si32 *b, int repeat); 94 95 ////////////////////////////////////////////////////////////////////////// 96 void gen_ict_forward(const float *r, const float *g, const float *b, 97 float *y, float *cb, float *cr, int repeat); 98 99 ////////////////////////////////////////////////////////////////////////// 100 void gen_ict_backward(const float *y, const float *cb, const float *cr, 101 float *r, float *g, float *b, int repeat); 102 103 ////////////////////////////////////////////////////////////////////////// 104 // 105 // 106 // SSE Functions (float) 107 // 108 // 109 ////////////////////////////////////////////////////////////////////////// 110 111 ////////////////////////////////////////////////////////////////////////// 112 void sse_cnvrt_si32_to_float_shftd(const si32 *sp, float *dp, float mul, 113 int width); 114 115 ////////////////////////////////////////////////////////////////////////// 116 void sse_cnvrt_si32_to_float(const si32 *sp, float *dp, float mul, 117 int width); 118 119 ////////////////////////////////////////////////////////////////////////// 120 void sse_cnvrt_float_to_si32_shftd(const float *sp, si32 *dp, float mul, 121 int width); 122 123 ////////////////////////////////////////////////////////////////////////// 124 void sse_cnvrt_float_to_si32(const float *sp, si32 *dp, float mul, 125 int width); 126 127 ////////////////////////////////////////////////////////////////////////// 128 void sse_ict_forward(const float *r, const float *g, const float *b, 129 float *y, float *cb, float *cr, int repeat); 130 131 ////////////////////////////////////////////////////////////////////////// 132 void sse_ict_backward(const float *y, const float *cb, const float *cr, 133 float *r, float *g, float *b, int repeat); 134 135 ////////////////////////////////////////////////////////////////////////// 136 // 137 // 138 // SSE2 Functions (float) 139 // 140 // 141 ////////////////////////////////////////////////////////////////////////// 142 143 ////////////////////////////////////////////////////////////////////////// 144 void sse2_cnvrt_float_to_si32_shftd(const float *sp, si32 *dp, float mul, 145 int width); 146 147 ////////////////////////////////////////////////////////////////////////// 148 void sse2_cnvrt_float_to_si32(const float *sp, si32 *dp, float mul, 149 int width); 150 151 ////////////////////////////////////////////////////////////////////////// 152 // 153 // 154 // SSE2 Functions (integer) 155 // 156 // 157 ////////////////////////////////////////////////////////////////////////// 158 159 ////////////////////////////////////////////////////////////////////////// 160 void sse2_cnvrt_si32_to_si32_shftd(const si32 *sp, si32 *dp, int shift, 161 int width); 162 163 ////////////////////////////////////////////////////////////////////////// 164 void sse2_rct_forward(const si32 *r, const si32 *g, const si32 *b, 165 si32 *y, si32 *cb, si32 *cr, int repeat); 166 167 ////////////////////////////////////////////////////////////////////////// 168 void sse2_rct_backward(const si32 *y, const si32 *cb, const si32 *cr, 169 si32 *r, si32 *g, si32 *b, int repeat); 170 171 ////////////////////////////////////////////////////////////////////////// 172 // 173 // 174 // AVX Functions (float) 175 // 176 // 177 ////////////////////////////////////////////////////////////////////////// 178 179 ////////////////////////////////////////////////////////////////////////// 180 void avx_cnvrt_si32_to_float_shftd(const si32 *sp, float *dp, float mul, 181 int width); 182 183 ////////////////////////////////////////////////////////////////////////// 184 void avx_cnvrt_si32_to_float(const si32 *sp, float *dp, float mul, 185 int width); 186 187 ////////////////////////////////////////////////////////////////////////// 188 void avx_cnvrt_float_to_si32_shftd(const float *sp, si32 *dp, float mul, 189 int width); 190 191 ////////////////////////////////////////////////////////////////////////// 192 void avx_cnvrt_float_to_si32(const float *sp, si32 *dp, float mul, 193 int width); 194 195 ////////////////////////////////////////////////////////////////////////// 196 void avx_ict_forward(const float *r, const float *g, const float *b, 197 float *y, float *cb, float *cr, int repeat); 198 199 ////////////////////////////////////////////////////////////////////////// 200 void avx_ict_backward(const float *y, const float *cb, const float *cr, 201 float *r, float *g, float *b, int repeat); 202 203 ////////////////////////////////////////////////////////////////////////// 204 // 205 // 206 // AVX2 Functions (integer) 207 // 208 // 209 ////////////////////////////////////////////////////////////////////////// 210 211 ////////////////////////////////////////////////////////////////////////// 212 void avx2_cnvrt_si32_to_si32_shftd(const si32 *sp, si32 *dp, int shift, 213 int width); 214 215 ////////////////////////////////////////////////////////////////////////// 216 void avx2_rct_forward(const si32 *r, const si32 *g, const si32 *b, 217 si32 *y, si32 *cb, si32 *cr, int repeat); 218 219 ////////////////////////////////////////////////////////////////////////// 220 void avx2_rct_backward(const si32 *y, const si32 *cb, const si32 *cr, 221 si32 *r, si32 *g, si32 *b, int repeat); 222 223 224 } 225 } 226 227 228 229 #endif // !OJPH_COLOR_LOCAL_H 230