| OLD | NEW |
| 1 // Copyright 2014 PDFium Authors. All rights reserved. | 1 // Copyright 2014 PDFium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 // Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com | 5 // Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com |
| 6 | 6 |
| 7 #include <algorithm> | 7 #include <algorithm> |
| 8 #include <limits> | 8 #include <limits> |
| 9 #include <vector> | 9 #include <vector> |
| 10 | 10 |
| (...skipping 147 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 158 *out_g = g; | 158 *out_g = g; |
| 159 b = y + (int)(1.772 * (float)cb); | 159 b = y + (int)(1.772 * (float)cb); |
| 160 if (b < 0) { | 160 if (b < 0) { |
| 161 b = 0; | 161 b = 0; |
| 162 } else if (b > upb) { | 162 } else if (b > upb) { |
| 163 b = upb; | 163 b = upb; |
| 164 } | 164 } |
| 165 *out_b = b; | 165 *out_b = b; |
| 166 } | 166 } |
| 167 static void sycc444_to_rgb(opj_image_t* img) { | 167 static void sycc444_to_rgb(opj_image_t* img) { |
| 168 int prec = img->comps[0].prec; |
| 169 int offset = 1 << (prec - 1); |
| 170 int upb = (1 << prec) - 1; |
| 171 OPJ_UINT32 maxw = |
| 172 std::min(std::min(img->comps[0].w, img->comps[1].w), img->comps[2].w); |
| 173 OPJ_UINT32 maxh = |
| 174 std::min(std::min(img->comps[0].h, img->comps[1].h), img->comps[2].h); |
| 175 FX_SAFE_SIZE_T max_size = maxw; |
| 176 max_size *= maxh; |
| 177 if (!max_size.IsValid()) |
| 178 return; |
| 179 |
| 180 const int* y = img->comps[0].data; |
| 181 const int* cb = img->comps[1].data; |
| 182 const int* cr = img->comps[2].data; |
| 168 int *d0, *d1, *d2, *r, *g, *b; | 183 int *d0, *d1, *d2, *r, *g, *b; |
| 169 const int *y, *cb, *cr; | 184 d0 = r = FX_Alloc(int, max_size.ValueOrDie()); |
| 170 int maxw, maxh, max, i, offset, upb; | 185 d1 = g = FX_Alloc(int, max_size.ValueOrDie()); |
| 171 i = (int)img->comps[0].prec; | 186 d2 = b = FX_Alloc(int, max_size.ValueOrDie()); |
| 172 offset = 1 << (i - 1); | 187 for (size_t i = 0; i < max_size.ValueOrDie(); ++i) { |
| 173 upb = (1 << i) - 1; | |
| 174 maxw = (int)img->comps[0].w; | |
| 175 maxh = (int)img->comps[0].h; | |
| 176 max = maxw * maxh; | |
| 177 y = img->comps[0].data; | |
| 178 cb = img->comps[1].data; | |
| 179 cr = img->comps[2].data; | |
| 180 d0 = r = FX_Alloc(int, (size_t)max); | |
| 181 d1 = g = FX_Alloc(int, (size_t)max); | |
| 182 d2 = b = FX_Alloc(int, (size_t)max); | |
| 183 for (i = 0; i < max; ++i) { | |
| 184 sycc_to_rgb(offset, upb, *y, *cb, *cr, r, g, b); | 188 sycc_to_rgb(offset, upb, *y, *cb, *cr, r, g, b); |
| 185 ++y; | 189 ++y; |
| 186 ++cb; | 190 ++cb; |
| 187 ++cr; | 191 ++cr; |
| 188 ++r; | 192 ++r; |
| 189 ++g; | 193 ++g; |
| 190 ++b; | 194 ++b; |
| 191 } | 195 } |
| 192 FX_Free(img->comps[0].data); | 196 FX_Free(img->comps[0].data); |
| 193 img->comps[0].data = d0; | 197 img->comps[0].data = d0; |
| 194 FX_Free(img->comps[1].data); | 198 FX_Free(img->comps[1].data); |
| 195 img->comps[1].data = d1; | 199 img->comps[1].data = d1; |
| 196 FX_Free(img->comps[2].data); | 200 FX_Free(img->comps[2].data); |
| 197 img->comps[2].data = d2; | 201 img->comps[2].data = d2; |
| 198 } | 202 } |
| 199 static void sycc422_to_rgb(opj_image_t* img) { | 203 static void sycc422_to_rgb(opj_image_t* img) { |
| 204 int prec = img->comps[0].prec; |
| 205 int offset = 1 << (prec - 1); |
| 206 int upb = (1 << prec) - 1; |
| 207 OPJ_UINT32 maxw = |
| 208 std::min(std::min(img->comps[0].w, img->comps[1].w), img->comps[2].w); |
| 209 OPJ_UINT32 maxh = |
| 210 std::min(std::min(img->comps[0].h, img->comps[1].h), img->comps[2].h); |
| 211 FX_SAFE_SIZE_T max_size = maxw; |
| 212 max_size *= maxh; |
| 213 if (!max_size.IsValid()) |
| 214 return; |
| 215 |
| 216 const int* y = img->comps[0].data; |
| 217 const int* cb = img->comps[1].data; |
| 218 const int* cr = img->comps[2].data; |
| 200 int *d0, *d1, *d2, *r, *g, *b; | 219 int *d0, *d1, *d2, *r, *g, *b; |
| 201 const int *y, *cb, *cr; | 220 d0 = r = FX_Alloc(int, max_size.ValueOrDie()); |
| 202 int maxw, maxh, max, offset, upb; | 221 d1 = g = FX_Alloc(int, max_size.ValueOrDie()); |
| 203 int i, j; | 222 d2 = b = FX_Alloc(int, max_size.ValueOrDie()); |
| 204 i = (int)img->comps[0].prec; | 223 for (uint32_t i = 0; i < maxh; ++i) { |
| 205 offset = 1 << (i - 1); | 224 OPJ_UINT32 j; |
| 206 upb = (1 << i) - 1; | 225 for (j = 0; j < (maxw & ~static_cast<OPJ_UINT32>(1)); j += 2) { |
| 207 maxw = (int)img->comps[0].w; | |
| 208 maxh = (int)img->comps[0].h; | |
| 209 max = maxw * maxh; | |
| 210 y = img->comps[0].data; | |
| 211 cb = img->comps[1].data; | |
| 212 cr = img->comps[2].data; | |
| 213 d0 = r = FX_Alloc(int, (size_t)max); | |
| 214 d1 = g = FX_Alloc(int, (size_t)max); | |
| 215 d2 = b = FX_Alloc(int, (size_t)max); | |
| 216 for (i = 0; i < maxh; ++i) { | |
| 217 for (j = 0; (OPJ_UINT32)j < (maxw & ~(OPJ_UINT32)1); j += 2) { | |
| 218 sycc_to_rgb(offset, upb, *y, *cb, *cr, r, g, b); | 226 sycc_to_rgb(offset, upb, *y, *cb, *cr, r, g, b); |
| 219 ++y; | 227 ++y; |
| 220 ++r; | 228 ++r; |
| 221 ++g; | 229 ++g; |
| 222 ++b; | 230 ++b; |
| 223 sycc_to_rgb(offset, upb, *y, *cb, *cr, r, g, b); | 231 sycc_to_rgb(offset, upb, *y, *cb, *cr, r, g, b); |
| 224 ++y; | 232 ++y; |
| 225 ++r; | 233 ++r; |
| 226 ++g; | 234 ++g; |
| 227 ++b; | 235 ++b; |
| (...skipping 13 matching lines...) Expand all Loading... |
| 241 FX_Free(img->comps[0].data); | 249 FX_Free(img->comps[0].data); |
| 242 img->comps[0].data = d0; | 250 img->comps[0].data = d0; |
| 243 FX_Free(img->comps[1].data); | 251 FX_Free(img->comps[1].data); |
| 244 img->comps[1].data = d1; | 252 img->comps[1].data = d1; |
| 245 FX_Free(img->comps[2].data); | 253 FX_Free(img->comps[2].data); |
| 246 img->comps[2].data = d2; | 254 img->comps[2].data = d2; |
| 247 img->comps[1].w = maxw; | 255 img->comps[1].w = maxw; |
| 248 img->comps[1].h = maxh; | 256 img->comps[1].h = maxh; |
| 249 img->comps[2].w = maxw; | 257 img->comps[2].w = maxw; |
| 250 img->comps[2].h = maxh; | 258 img->comps[2].h = maxh; |
| 251 img->comps[1].w = (OPJ_UINT32)maxw; | |
| 252 img->comps[1].h = (OPJ_UINT32)maxh; | |
| 253 img->comps[2].w = (OPJ_UINT32)maxw; | |
| 254 img->comps[2].h = (OPJ_UINT32)maxh; | |
| 255 img->comps[1].dx = img->comps[0].dx; | 259 img->comps[1].dx = img->comps[0].dx; |
| 256 img->comps[2].dx = img->comps[0].dx; | 260 img->comps[2].dx = img->comps[0].dx; |
| 257 img->comps[1].dy = img->comps[0].dy; | 261 img->comps[1].dy = img->comps[0].dy; |
| 258 img->comps[2].dy = img->comps[0].dy; | 262 img->comps[2].dy = img->comps[0].dy; |
| 259 } | 263 } |
| 260 static bool sycc420_size_is_valid(OPJ_UINT32 y, OPJ_UINT32 cbcr) { | 264 static bool sycc420_size_is_valid(OPJ_UINT32 y, OPJ_UINT32 cbcr) { |
| 261 if (!y || !cbcr) | 265 if (!y || !cbcr) |
| 262 return false; | 266 return false; |
| 263 | 267 |
| 264 return (cbcr == y / 2) || ((y & 1) && (cbcr == y / 2 + 1)); | 268 return (cbcr == y / 2) || ((y & 1) && (cbcr == y / 2 + 1)); |
| (...skipping 611 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 876 bool CCodec_JpxModule::Decode(CJPX_Decoder* pDecoder, | 880 bool CCodec_JpxModule::Decode(CJPX_Decoder* pDecoder, |
| 877 uint8_t* dest_data, | 881 uint8_t* dest_data, |
| 878 int pitch, | 882 int pitch, |
| 879 const std::vector<uint8_t>& offsets) { | 883 const std::vector<uint8_t>& offsets) { |
| 880 return pDecoder->Decode(dest_data, pitch, offsets); | 884 return pDecoder->Decode(dest_data, pitch, offsets); |
| 881 } | 885 } |
| 882 | 886 |
| 883 void CCodec_JpxModule::DestroyDecoder(CJPX_Decoder* pDecoder) { | 887 void CCodec_JpxModule::DestroyDecoder(CJPX_Decoder* pDecoder) { |
| 884 delete pDecoder; | 888 delete pDecoder; |
| 885 } | 889 } |
| OLD | NEW |