| OLD | NEW |
| 1 /* | 1 /* |
| 2 * jdmerge.c | 2 * jdmerge.c |
| 3 * | 3 * |
| 4 * This file was part of the Independent JPEG Group's software: | 4 * This file was part of the Independent JPEG Group's software: |
| 5 * Copyright (C) 1994-1996, Thomas G. Lane. | 5 * Copyright (C) 1994-1996, Thomas G. Lane. |
| 6 * libjpeg-turbo Modifications: |
| 6 * Copyright 2009 Pierre Ossman <ossman@cendio.se> for Cendio AB | 7 * Copyright 2009 Pierre Ossman <ossman@cendio.se> for Cendio AB |
| 7 * libjpeg-turbo Modifications: | 8 * Copyright (C) 2009, 2011, 2014-2015, D. R. Commander. |
| 8 * Copyright (C) 2009, 2011, 2014 D. R. Commander. | |
| 9 * Copyright (C) 2013, Linaro Limited. | 9 * Copyright (C) 2013, Linaro Limited. |
| 10 * For conditions of distribution and use, see the accompanying README file. | 10 * For conditions of distribution and use, see the accompanying README.ijg |
| 11 * file. |
| 11 * | 12 * |
| 12 * This file contains code for merged upsampling/color conversion. | 13 * This file contains code for merged upsampling/color conversion. |
| 13 * | 14 * |
| 14 * This file combines functions from jdsample.c and jdcolor.c; | 15 * This file combines functions from jdsample.c and jdcolor.c; |
| 15 * read those files first to understand what's going on. | 16 * read those files first to understand what's going on. |
| 16 * | 17 * |
| 17 * When the chroma components are to be upsampled by simple replication | 18 * When the chroma components are to be upsampled by simple replication |
| 18 * (ie, box filtering), we can save some work in color conversion by | 19 * (ie, box filtering), we can save some work in color conversion by |
| 19 * calculating all the output pixels corresponding to a pair of chroma | 20 * calculating all the output pixels corresponding to a pair of chroma |
| 20 * samples at one time. In the conversion equations | 21 * samples at one time. In the conversion equations |
| 21 *» R = Y + K1 * Cr | 22 * R = Y + K1 * Cr |
| 22 *» G = Y + K2 * Cb + K3 * Cr | 23 * G = Y + K2 * Cb + K3 * Cr |
| 23 *» B = Y + K4 * Cb | 24 * B = Y + K4 * Cb |
| 24 * only the Y term varies among the group of pixels corresponding to a pair | 25 * only the Y term varies among the group of pixels corresponding to a pair |
| 25 * of chroma samples, so the rest of the terms can be calculated just once. | 26 * of chroma samples, so the rest of the terms can be calculated just once. |
| 26 * At typical sampling ratios, this eliminates half or three-quarters of the | 27 * At typical sampling ratios, this eliminates half or three-quarters of the |
| 27 * multiplications needed for color conversion. | 28 * multiplications needed for color conversion. |
| 28 * | 29 * |
| 29 * This file currently provides implementations for the following cases: | 30 * This file currently provides implementations for the following cases: |
| 30 *» YCbCr => RGB color conversion only. | 31 * YCbCr => RGB color conversion only. |
| 31 *» Sampling ratios of 2h1v or 2h2v. | 32 * Sampling ratios of 2h1v or 2h2v. |
| 32 *» No scaling needed at upsample time. | 33 * No scaling needed at upsample time. |
| 33 *» Corner-aligned (non-CCIR601) sampling alignment. | 34 * Corner-aligned (non-CCIR601) sampling alignment. |
| 34 * Other special cases could be added, but in most applications these are | 35 * Other special cases could be added, but in most applications these are |
| 35 * the only common cases. (For uncommon cases we fall back on the more | 36 * the only common cases. (For uncommon cases we fall back on the more |
| 36 * general code in jdsample.c and jdcolor.c.) | 37 * general code in jdsample.c and jdcolor.c.) |
| 37 */ | 38 */ |
| 38 | 39 |
| 39 #define JPEG_INTERNALS | 40 #define JPEG_INTERNALS |
| 40 #include "jinclude.h" | 41 #include "jinclude.h" |
| 41 #include "jpeglib.h" | 42 #include "jpeglib.h" |
| 42 #include "jsimd.h" | 43 #include "jsimd.h" |
| 43 #include "config.h" | 44 #include "jconfigint.h" |
| 44 | 45 |
| 45 #ifdef UPSAMPLE_MERGING_SUPPORTED | 46 #ifdef UPSAMPLE_MERGING_SUPPORTED |
| 46 | 47 |
| 47 | 48 |
| 48 /* Private subobject */ | 49 /* Private subobject */ |
| 49 | 50 |
| 50 typedef struct { | 51 typedef struct { |
| 51 struct jpeg_upsampler pub;» /* public fields */ | 52 struct jpeg_upsampler pub; /* public fields */ |
| 52 | 53 |
| 53 /* Pointer to routine to do actual upsampling/conversion of one row group */ | 54 /* Pointer to routine to do actual upsampling/conversion of one row group */ |
| 54 JMETHOD(void, upmethod, (j_decompress_ptr cinfo, | 55 void (*upmethod) (j_decompress_ptr cinfo, JSAMPIMAGE input_buf, |
| 55 » » » JSAMPIMAGE input_buf, JDIMENSION in_row_group_ctr, | 56 JDIMENSION in_row_group_ctr, JSAMPARRAY output_buf); |
| 56 » » » JSAMPARRAY output_buf)); | |
| 57 | 57 |
| 58 /* Private state for YCC->RGB conversion */ | 58 /* Private state for YCC->RGB conversion */ |
| 59 int * Cr_r_tab;» » /* => table for Cr to R conversion */ | 59 int *Cr_r_tab; /* => table for Cr to R conversion */ |
| 60 int * Cb_b_tab;» » /* => table for Cb to B conversion */ | 60 int *Cb_b_tab; /* => table for Cb to B conversion */ |
| 61 INT32 * Cr_g_tab;» » /* => table for Cr to G conversion */ | 61 JLONG *Cr_g_tab; /* => table for Cr to G conversion */ |
| 62 INT32 * Cb_g_tab;» » /* => table for Cb to G conversion */ | 62 JLONG *Cb_g_tab; /* => table for Cb to G conversion */ |
| 63 | 63 |
| 64 /* For 2:1 vertical sampling, we produce two output rows at a time. | 64 /* For 2:1 vertical sampling, we produce two output rows at a time. |
| 65 * We need a "spare" row buffer to hold the second output row if the | 65 * We need a "spare" row buffer to hold the second output row if the |
| 66 * application provides just a one-row buffer; we also use the spare | 66 * application provides just a one-row buffer; we also use the spare |
| 67 * to discard the dummy last row if the image height is odd. | 67 * to discard the dummy last row if the image height is odd. |
| 68 */ | 68 */ |
| 69 JSAMPROW spare_row; | 69 JSAMPROW spare_row; |
| 70 boolean spare_full;» » /* T if spare buffer is occupied */ | 70 boolean spare_full; /* T if spare buffer is occupied */ |
| 71 | 71 |
| 72 JDIMENSION out_row_width;» /* samples per output row */ | 72 JDIMENSION out_row_width; /* samples per output row */ |
| 73 JDIMENSION rows_to_go;» /* counts rows remaining in image */ | 73 JDIMENSION rows_to_go; /* counts rows remaining in image */ |
| 74 } my_upsampler; | 74 } my_upsampler; |
| 75 | 75 |
| 76 typedef my_upsampler * my_upsample_ptr; | 76 typedef my_upsampler *my_upsample_ptr; |
| 77 | 77 |
| 78 #define SCALEBITS» 16» /* speediest right-shift on some machines */ | 78 #define SCALEBITS 16 /* speediest right-shift on some machines */ |
| 79 #define ONE_HALF» ((INT32) 1 << (SCALEBITS-1)) | 79 #define ONE_HALF ((JLONG) 1 << (SCALEBITS-1)) |
| 80 #define FIX(x)» » ((INT32) ((x) * (1L<<SCALEBITS) + 0.5)) | 80 #define FIX(x) ((JLONG) ((x) * (1L<<SCALEBITS) + 0.5)) |
| 81 | 81 |
| 82 | 82 |
| 83 /* Include inline routines for colorspace extensions */ | 83 /* Include inline routines for colorspace extensions */ |
| 84 | 84 |
| 85 #include "jdmrgext.c" | 85 #include "jdmrgext.c" |
| 86 #undef RGB_RED | 86 #undef RGB_RED |
| 87 #undef RGB_GREEN | 87 #undef RGB_GREEN |
| 88 #undef RGB_BLUE | 88 #undef RGB_BLUE |
| 89 #undef RGB_PIXELSIZE | 89 #undef RGB_PIXELSIZE |
| 90 | 90 |
| (...skipping 93 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 184 /* | 184 /* |
| 185 * Initialize tables for YCC->RGB colorspace conversion. | 185 * Initialize tables for YCC->RGB colorspace conversion. |
| 186 * This is taken directly from jdcolor.c; see that file for more info. | 186 * This is taken directly from jdcolor.c; see that file for more info. |
| 187 */ | 187 */ |
| 188 | 188 |
| 189 LOCAL(void) | 189 LOCAL(void) |
| 190 build_ycc_rgb_table (j_decompress_ptr cinfo) | 190 build_ycc_rgb_table (j_decompress_ptr cinfo) |
| 191 { | 191 { |
| 192 my_upsample_ptr upsample = (my_upsample_ptr) cinfo->upsample; | 192 my_upsample_ptr upsample = (my_upsample_ptr) cinfo->upsample; |
| 193 int i; | 193 int i; |
| 194 INT32 x; | 194 JLONG x; |
| 195 SHIFT_TEMPS | 195 SHIFT_TEMPS |
| 196 | 196 |
| 197 upsample->Cr_r_tab = (int *) | 197 upsample->Cr_r_tab = (int *) |
| 198 (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE, | 198 (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE, |
| 199 » » » » (MAXJSAMPLE+1) * SIZEOF(int)); | 199 (MAXJSAMPLE+1) * sizeof(int)); |
| 200 upsample->Cb_b_tab = (int *) | 200 upsample->Cb_b_tab = (int *) |
| 201 (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE, | 201 (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE, |
| 202 » » » » (MAXJSAMPLE+1) * SIZEOF(int)); | 202 (MAXJSAMPLE+1) * sizeof(int)); |
| 203 upsample->Cr_g_tab = (INT32 *) | 203 upsample->Cr_g_tab = (JLONG *) |
| 204 (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE, | 204 (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE, |
| 205 » » » » (MAXJSAMPLE+1) * SIZEOF(INT32)); | 205 (MAXJSAMPLE+1) * sizeof(JLONG)); |
| 206 upsample->Cb_g_tab = (INT32 *) | 206 upsample->Cb_g_tab = (JLONG *) |
| 207 (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE, | 207 (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE, |
| 208 » » » » (MAXJSAMPLE+1) * SIZEOF(INT32)); | 208 (MAXJSAMPLE+1) * sizeof(JLONG)); |
| 209 | 209 |
| 210 for (i = 0, x = -CENTERJSAMPLE; i <= MAXJSAMPLE; i++, x++) { | 210 for (i = 0, x = -CENTERJSAMPLE; i <= MAXJSAMPLE; i++, x++) { |
| 211 /* i is the actual input pixel value, in the range 0..MAXJSAMPLE */ | 211 /* i is the actual input pixel value, in the range 0..MAXJSAMPLE */ |
| 212 /* The Cb or Cr value we are thinking of is x = i - CENTERJSAMPLE */ | 212 /* The Cb or Cr value we are thinking of is x = i - CENTERJSAMPLE */ |
| 213 /* Cr=>R value is nearest int to 1.40200 * x */ | 213 /* Cr=>R value is nearest int to 1.40200 * x */ |
| 214 upsample->Cr_r_tab[i] = (int) | 214 upsample->Cr_r_tab[i] = (int) |
| 215 » » RIGHT_SHIFT(FIX(1.40200) * x + ONE_HALF, SCALEBITS); | 215 RIGHT_SHIFT(FIX(1.40200) * x + ONE_HALF, SCALEBITS); |
| 216 /* Cb=>B value is nearest int to 1.77200 * x */ | 216 /* Cb=>B value is nearest int to 1.77200 * x */ |
| 217 upsample->Cb_b_tab[i] = (int) | 217 upsample->Cb_b_tab[i] = (int) |
| 218 » » RIGHT_SHIFT(FIX(1.77200) * x + ONE_HALF, SCALEBITS); | 218 RIGHT_SHIFT(FIX(1.77200) * x + ONE_HALF, SCALEBITS); |
| 219 /* Cr=>G value is scaled-up -0.71414 * x */ | 219 /* Cr=>G value is scaled-up -0.71414 * x */ |
| 220 upsample->Cr_g_tab[i] = (- FIX(0.71414)) * x; | 220 upsample->Cr_g_tab[i] = (- FIX(0.71414)) * x; |
| 221 /* Cb=>G value is scaled-up -0.34414 * x */ | 221 /* Cb=>G value is scaled-up -0.34414 * x */ |
| 222 /* We also add in ONE_HALF so that need not do it in inner loop */ | 222 /* We also add in ONE_HALF so that need not do it in inner loop */ |
| 223 upsample->Cb_g_tab[i] = (- FIX(0.34414)) * x + ONE_HALF; | 223 upsample->Cb_g_tab[i] = (- FIX(0.34414)) * x + ONE_HALF; |
| 224 } | 224 } |
| 225 } | 225 } |
| 226 | 226 |
| 227 | 227 |
| 228 /* | 228 /* |
| (...skipping 13 matching lines...) Expand all Loading... |
| 242 | 242 |
| 243 | 243 |
| 244 /* | 244 /* |
| 245 * Control routine to do upsampling (and color conversion). | 245 * Control routine to do upsampling (and color conversion). |
| 246 * | 246 * |
| 247 * The control routine just handles the row buffering considerations. | 247 * The control routine just handles the row buffering considerations. |
| 248 */ | 248 */ |
| 249 | 249 |
| 250 METHODDEF(void) | 250 METHODDEF(void) |
| 251 merged_2v_upsample (j_decompress_ptr cinfo, | 251 merged_2v_upsample (j_decompress_ptr cinfo, |
| 252 » » JSAMPIMAGE input_buf, JDIMENSION *in_row_group_ctr, | 252 JSAMPIMAGE input_buf, JDIMENSION *in_row_group_ctr, |
| 253 » » JDIMENSION in_row_groups_avail, | 253 JDIMENSION in_row_groups_avail, |
| 254 » » JSAMPARRAY output_buf, JDIMENSION *out_row_ctr, | 254 JSAMPARRAY output_buf, JDIMENSION *out_row_ctr, |
| 255 » » JDIMENSION out_rows_avail) | 255 JDIMENSION out_rows_avail) |
| 256 /* 2:1 vertical sampling case: may need a spare row. */ | 256 /* 2:1 vertical sampling case: may need a spare row. */ |
| 257 { | 257 { |
| 258 my_upsample_ptr upsample = (my_upsample_ptr) cinfo->upsample; | 258 my_upsample_ptr upsample = (my_upsample_ptr) cinfo->upsample; |
| 259 JSAMPROW work_ptrs[2]; | 259 JSAMPROW work_ptrs[2]; |
| 260 JDIMENSION num_rows;» » /* number of rows returned to caller */ | 260 JDIMENSION num_rows; /* number of rows returned to caller */ |
| 261 | 261 |
| 262 if (upsample->spare_full) { | 262 if (upsample->spare_full) { |
| 263 /* If we have a spare row saved from a previous cycle, just return it. */ | 263 /* If we have a spare row saved from a previous cycle, just return it. */ |
| 264 JDIMENSION size = upsample->out_row_width; | 264 JDIMENSION size = upsample->out_row_width; |
| 265 if (cinfo->out_color_space == JCS_RGB565) | 265 if (cinfo->out_color_space == JCS_RGB565) |
| 266 size = cinfo->output_width * 2; | 266 size = cinfo->output_width * 2; |
| 267 jcopy_sample_rows(& upsample->spare_row, 0, output_buf + *out_row_ctr, 0, | 267 jcopy_sample_rows(& upsample->spare_row, 0, output_buf + *out_row_ctr, 0, |
| 268 » » 1, size); | 268 1, size); |
| 269 num_rows = 1; | 269 num_rows = 1; |
| 270 upsample->spare_full = FALSE; | 270 upsample->spare_full = FALSE; |
| 271 } else { | 271 } else { |
| 272 /* Figure number of rows to return to caller. */ | 272 /* Figure number of rows to return to caller. */ |
| 273 num_rows = 2; | 273 num_rows = 2; |
| 274 /* Not more than the distance to the end of the image. */ | 274 /* Not more than the distance to the end of the image. */ |
| 275 if (num_rows > upsample->rows_to_go) | 275 if (num_rows > upsample->rows_to_go) |
| 276 num_rows = upsample->rows_to_go; | 276 num_rows = upsample->rows_to_go; |
| 277 /* And not more than what the client can accept: */ | 277 /* And not more than what the client can accept: */ |
| 278 out_rows_avail -= *out_row_ctr; | 278 out_rows_avail -= *out_row_ctr; |
| (...skipping 15 matching lines...) Expand all Loading... |
| 294 *out_row_ctr += num_rows; | 294 *out_row_ctr += num_rows; |
| 295 upsample->rows_to_go -= num_rows; | 295 upsample->rows_to_go -= num_rows; |
| 296 /* When the buffer is emptied, declare this input row group consumed */ | 296 /* When the buffer is emptied, declare this input row group consumed */ |
| 297 if (! upsample->spare_full) | 297 if (! upsample->spare_full) |
| 298 (*in_row_group_ctr)++; | 298 (*in_row_group_ctr)++; |
| 299 } | 299 } |
| 300 | 300 |
| 301 | 301 |
| 302 METHODDEF(void) | 302 METHODDEF(void) |
| 303 merged_1v_upsample (j_decompress_ptr cinfo, | 303 merged_1v_upsample (j_decompress_ptr cinfo, |
| 304 » » JSAMPIMAGE input_buf, JDIMENSION *in_row_group_ctr, | 304 JSAMPIMAGE input_buf, JDIMENSION *in_row_group_ctr, |
| 305 » » JDIMENSION in_row_groups_avail, | 305 JDIMENSION in_row_groups_avail, |
| 306 » » JSAMPARRAY output_buf, JDIMENSION *out_row_ctr, | 306 JSAMPARRAY output_buf, JDIMENSION *out_row_ctr, |
| 307 » » JDIMENSION out_rows_avail) | 307 JDIMENSION out_rows_avail) |
| 308 /* 1:1 vertical sampling case: much easier, never need a spare row. */ | 308 /* 1:1 vertical sampling case: much easier, never need a spare row. */ |
| 309 { | 309 { |
| 310 my_upsample_ptr upsample = (my_upsample_ptr) cinfo->upsample; | 310 my_upsample_ptr upsample = (my_upsample_ptr) cinfo->upsample; |
| 311 | 311 |
| 312 /* Just do the upsampling. */ | 312 /* Just do the upsampling. */ |
| 313 (*upsample->upmethod) (cinfo, input_buf, *in_row_group_ctr, | 313 (*upsample->upmethod) (cinfo, input_buf, *in_row_group_ctr, |
| 314 » » » output_buf + *out_row_ctr); | 314 output_buf + *out_row_ctr); |
| 315 /* Adjust counts */ | 315 /* Adjust counts */ |
| 316 (*out_row_ctr)++; | 316 (*out_row_ctr)++; |
| 317 (*in_row_group_ctr)++; | 317 (*in_row_group_ctr)++; |
| 318 } | 318 } |
| 319 | 319 |
| 320 | 320 |
| 321 /* | 321 /* |
| 322 * These are the routines invoked by the control routines to do | 322 * These are the routines invoked by the control routines to do |
| 323 * the actual upsampling/conversion. One row group is processed per call. | 323 * the actual upsampling/conversion. One row group is processed per call. |
| 324 * | 324 * |
| 325 * Note: since we may be writing directly into application-supplied buffers, | 325 * Note: since we may be writing directly into application-supplied buffers, |
| 326 * we have to be honest about the output width; we can't assume the buffer | 326 * we have to be honest about the output width; we can't assume the buffer |
| 327 * has been rounded up to an even width. | 327 * has been rounded up to an even width. |
| 328 */ | 328 */ |
| 329 | 329 |
| 330 | 330 |
| 331 /* | 331 /* |
| 332 * Upsample and color convert for the case of 2:1 horizontal and 1:1 vertical. | 332 * Upsample and color convert for the case of 2:1 horizontal and 1:1 vertical. |
| 333 */ | 333 */ |
| 334 | 334 |
| 335 METHODDEF(void) | 335 METHODDEF(void) |
| 336 h2v1_merged_upsample (j_decompress_ptr cinfo, | 336 h2v1_merged_upsample (j_decompress_ptr cinfo, |
| 337 » » JSAMPIMAGE input_buf, JDIMENSION in_row_group_ctr, | 337 JSAMPIMAGE input_buf, JDIMENSION in_row_group_ctr, |
| 338 » » JSAMPARRAY output_buf) | 338 JSAMPARRAY output_buf) |
| 339 { | 339 { |
| 340 switch (cinfo->out_color_space) { | 340 switch (cinfo->out_color_space) { |
| 341 case JCS_EXT_RGB: | 341 case JCS_EXT_RGB: |
| 342 extrgb_h2v1_merged_upsample_internal(cinfo, input_buf, in_row_group_ctr, | 342 extrgb_h2v1_merged_upsample_internal(cinfo, input_buf, in_row_group_ctr, |
| 343 output_buf); | 343 output_buf); |
| 344 break; | 344 break; |
| 345 case JCS_EXT_RGBX: | 345 case JCS_EXT_RGBX: |
| 346 case JCS_EXT_RGBA: | 346 case JCS_EXT_RGBA: |
| 347 extrgbx_h2v1_merged_upsample_internal(cinfo, input_buf, in_row_group_ctr, | 347 extrgbx_h2v1_merged_upsample_internal(cinfo, input_buf, in_row_group_ctr, |
| 348 output_buf); | 348 output_buf); |
| (...skipping 24 matching lines...) Expand all Loading... |
| 373 } | 373 } |
| 374 } | 374 } |
| 375 | 375 |
| 376 | 376 |
| 377 /* | 377 /* |
| 378 * Upsample and color convert for the case of 2:1 horizontal and 2:1 vertical. | 378 * Upsample and color convert for the case of 2:1 horizontal and 2:1 vertical. |
| 379 */ | 379 */ |
| 380 | 380 |
| 381 METHODDEF(void) | 381 METHODDEF(void) |
| 382 h2v2_merged_upsample (j_decompress_ptr cinfo, | 382 h2v2_merged_upsample (j_decompress_ptr cinfo, |
| 383 » » JSAMPIMAGE input_buf, JDIMENSION in_row_group_ctr, | 383 JSAMPIMAGE input_buf, JDIMENSION in_row_group_ctr, |
| 384 » » JSAMPARRAY output_buf) | 384 JSAMPARRAY output_buf) |
| 385 { | 385 { |
| 386 switch (cinfo->out_color_space) { | 386 switch (cinfo->out_color_space) { |
| 387 case JCS_EXT_RGB: | 387 case JCS_EXT_RGB: |
| 388 extrgb_h2v2_merged_upsample_internal(cinfo, input_buf, in_row_group_ctr, | 388 extrgb_h2v2_merged_upsample_internal(cinfo, input_buf, in_row_group_ctr, |
| 389 output_buf); | 389 output_buf); |
| 390 break; | 390 break; |
| 391 case JCS_EXT_RGBX: | 391 case JCS_EXT_RGBX: |
| 392 case JCS_EXT_RGBA: | 392 case JCS_EXT_RGBA: |
| 393 extrgbx_h2v2_merged_upsample_internal(cinfo, input_buf, in_row_group_ctr, | 393 extrgbx_h2v2_merged_upsample_internal(cinfo, input_buf, in_row_group_ctr, |
| 394 output_buf); | 394 output_buf); |
| (...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 429 #define PACK_SHORT_565_BE(r, g, b) (((r) & 0xF8) | ((g) >> 5) | \ | 429 #define PACK_SHORT_565_BE(r, g, b) (((r) & 0xF8) | ((g) >> 5) | \ |
| 430 (((g) << 11) & 0xE000) | \ | 430 (((g) << 11) & 0xE000) | \ |
| 431 (((b) << 5) & 0x1F00)) | 431 (((b) << 5) & 0x1F00)) |
| 432 | 432 |
| 433 #define PACK_TWO_PIXELS_LE(l, r) ((r << 16) | l) | 433 #define PACK_TWO_PIXELS_LE(l, r) ((r << 16) | l) |
| 434 #define PACK_TWO_PIXELS_BE(l, r) ((l << 16) | r) | 434 #define PACK_TWO_PIXELS_BE(l, r) ((l << 16) | r) |
| 435 | 435 |
| 436 #define PACK_NEED_ALIGNMENT(ptr) (((size_t)(ptr)) & 3) | 436 #define PACK_NEED_ALIGNMENT(ptr) (((size_t)(ptr)) & 3) |
| 437 | 437 |
| 438 #define WRITE_TWO_PIXELS_LE(addr, pixels) { \ | 438 #define WRITE_TWO_PIXELS_LE(addr, pixels) { \ |
| 439 ((INT16*)(addr))[0] = (pixels); \ | 439 ((INT16*)(addr))[0] = (INT16)(pixels); \ |
| 440 ((INT16*)(addr))[1] = (pixels) >> 16; \ | 440 ((INT16*)(addr))[1] = (INT16)((pixels) >> 16); \ |
| 441 } | 441 } |
| 442 #define WRITE_TWO_PIXELS_BE(addr, pixels) { \ | 442 #define WRITE_TWO_PIXELS_BE(addr, pixels) { \ |
| 443 ((INT16*)(addr))[1] = (pixels); \ | 443 ((INT16*)(addr))[1] = (INT16)(pixels); \ |
| 444 ((INT16*)(addr))[0] = (pixels) >> 16; \ | 444 ((INT16*)(addr))[0] = (INT16)((pixels) >> 16); \ |
| 445 } | 445 } |
| 446 | 446 |
| 447 #define DITHER_565_R(r, dither) ((r) + ((dither) & 0xFF)) | 447 #define DITHER_565_R(r, dither) ((r) + ((dither) & 0xFF)) |
| 448 #define DITHER_565_G(g, dither) ((g) + (((dither) & 0xFF) >> 1)) | 448 #define DITHER_565_G(g, dither) ((g) + (((dither) & 0xFF) >> 1)) |
| 449 #define DITHER_565_B(b, dither) ((b) + ((dither) & 0xFF)) | 449 #define DITHER_565_B(b, dither) ((b) + ((dither) & 0xFF)) |
| 450 | 450 |
| 451 | 451 |
| 452 /* Declarations for ordered dithering | 452 /* Declarations for ordered dithering |
| 453 * | 453 * |
| 454 * We use a 4x4 ordered dither array packed into 32 bits. This array is | 454 * We use a 4x4 ordered dither array packed into 32 bits. This array is |
| 455 * sufficent for dithering RGB888 to RGB565. | 455 * sufficent for dithering RGB888 to RGB565. |
| 456 */ | 456 */ |
| 457 | 457 |
| 458 #define DITHER_MASK 0x3 | 458 #define DITHER_MASK 0x3 |
| 459 #define DITHER_ROTATE(x) (((x) << 24) | (((x) >> 8) & 0x00FFFFFF)) | 459 #define DITHER_ROTATE(x) ((((x) & 0xFF) << 24) | (((x) >> 8) & 0x00FFFFFF)) |
| 460 static const INT32 dither_matrix[4] = { | 460 static const JLONG dither_matrix[4] = { |
| 461 0x0008020A, | 461 0x0008020A, |
| 462 0x0C040E06, | 462 0x0C040E06, |
| 463 0x030B0109, | 463 0x030B0109, |
| 464 0x0F070D05 | 464 0x0F070D05 |
| 465 }; | 465 }; |
| 466 | 466 |
| 467 | 467 |
| 468 /* Include inline routines for RGB565 conversion */ | 468 /* Include inline routines for RGB565 conversion */ |
| 469 | 469 |
| 470 #define PACK_SHORT_565 PACK_SHORT_565_LE | 470 #define PACK_SHORT_565 PACK_SHORT_565_LE |
| (...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 513 h2v1_merged_upsample_565 (j_decompress_ptr cinfo, | 513 h2v1_merged_upsample_565 (j_decompress_ptr cinfo, |
| 514 JSAMPIMAGE input_buf, JDIMENSION in_row_group_ctr, | 514 JSAMPIMAGE input_buf, JDIMENSION in_row_group_ctr, |
| 515 JSAMPARRAY output_buf) | 515 JSAMPARRAY output_buf) |
| 516 { | 516 { |
| 517 if (is_big_endian()) | 517 if (is_big_endian()) |
| 518 h2v1_merged_upsample_565_be(cinfo, input_buf, in_row_group_ctr, | 518 h2v1_merged_upsample_565_be(cinfo, input_buf, in_row_group_ctr, |
| 519 output_buf); | 519 output_buf); |
| 520 else | 520 else |
| 521 h2v1_merged_upsample_565_le(cinfo, input_buf, in_row_group_ctr, | 521 h2v1_merged_upsample_565_le(cinfo, input_buf, in_row_group_ctr, |
| 522 output_buf); | 522 output_buf); |
| 523 } | 523 } |
| 524 | 524 |
| 525 | 525 |
| 526 METHODDEF(void) | 526 METHODDEF(void) |
| 527 h2v1_merged_upsample_565D (j_decompress_ptr cinfo, | 527 h2v1_merged_upsample_565D (j_decompress_ptr cinfo, |
| 528 JSAMPIMAGE input_buf, JDIMENSION in_row_group_ctr, | 528 JSAMPIMAGE input_buf, JDIMENSION in_row_group_ctr, |
| 529 JSAMPARRAY output_buf) | 529 JSAMPARRAY output_buf) |
| 530 { | 530 { |
| 531 if (is_big_endian()) | 531 if (is_big_endian()) |
| 532 h2v1_merged_upsample_565D_be(cinfo, input_buf, in_row_group_ctr, | 532 h2v1_merged_upsample_565D_be(cinfo, input_buf, in_row_group_ctr, |
| 533 output_buf); | 533 output_buf); |
| (...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 573 * of this module; no safety checks are made here. | 573 * of this module; no safety checks are made here. |
| 574 */ | 574 */ |
| 575 | 575 |
| 576 GLOBAL(void) | 576 GLOBAL(void) |
| 577 jinit_merged_upsampler (j_decompress_ptr cinfo) | 577 jinit_merged_upsampler (j_decompress_ptr cinfo) |
| 578 { | 578 { |
| 579 my_upsample_ptr upsample; | 579 my_upsample_ptr upsample; |
| 580 | 580 |
| 581 upsample = (my_upsample_ptr) | 581 upsample = (my_upsample_ptr) |
| 582 (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE, | 582 (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE, |
| 583 » » » » SIZEOF(my_upsampler)); | 583 sizeof(my_upsampler)); |
| 584 cinfo->upsample = (struct jpeg_upsampler *) upsample; | 584 cinfo->upsample = (struct jpeg_upsampler *) upsample; |
| 585 upsample->pub.start_pass = start_pass_merged_upsample; | 585 upsample->pub.start_pass = start_pass_merged_upsample; |
| 586 upsample->pub.need_context_rows = FALSE; | 586 upsample->pub.need_context_rows = FALSE; |
| 587 | 587 |
| 588 upsample->out_row_width = cinfo->output_width * cinfo->out_color_components; | 588 upsample->out_row_width = cinfo->output_width * cinfo->out_color_components; |
| 589 | 589 |
| 590 if (cinfo->max_v_samp_factor == 2) { | 590 if (cinfo->max_v_samp_factor == 2) { |
| 591 upsample->pub.upsample = merged_2v_upsample; | 591 upsample->pub.upsample = merged_2v_upsample; |
| 592 if (jsimd_can_h2v2_merged_upsample()) | 592 if (jsimd_can_h2v2_merged_upsample()) |
| 593 upsample->upmethod = jsimd_h2v2_merged_upsample; | 593 upsample->upmethod = jsimd_h2v2_merged_upsample; |
| 594 else | 594 else |
| 595 upsample->upmethod = h2v2_merged_upsample; | 595 upsample->upmethod = h2v2_merged_upsample; |
| 596 if (cinfo->out_color_space == JCS_RGB565) { | 596 if (cinfo->out_color_space == JCS_RGB565) { |
| 597 if (cinfo->dither_mode != JDITHER_NONE) { | 597 if (cinfo->dither_mode != JDITHER_NONE) { |
| 598 upsample->upmethod = h2v2_merged_upsample_565D; | 598 upsample->upmethod = h2v2_merged_upsample_565D; |
| 599 } else { | 599 } else { |
| 600 upsample->upmethod = h2v2_merged_upsample_565; | 600 upsample->upmethod = h2v2_merged_upsample_565; |
| 601 } | 601 } |
| 602 } | 602 } |
| 603 /* Allocate a spare row buffer */ | 603 /* Allocate a spare row buffer */ |
| 604 upsample->spare_row = (JSAMPROW) | 604 upsample->spare_row = (JSAMPROW) |
| 605 (*cinfo->mem->alloc_large) ((j_common_ptr) cinfo, JPOOL_IMAGE, | 605 (*cinfo->mem->alloc_large) ((j_common_ptr) cinfo, JPOOL_IMAGE, |
| 606 » » (size_t) (upsample->out_row_width * SIZEOF(JSAMPLE))); | 606 (size_t) (upsample->out_row_width * sizeof(JSAMPLE))); |
| 607 } else { | 607 } else { |
| 608 upsample->pub.upsample = merged_1v_upsample; | 608 upsample->pub.upsample = merged_1v_upsample; |
| 609 if (jsimd_can_h2v1_merged_upsample()) | 609 if (jsimd_can_h2v1_merged_upsample()) |
| 610 upsample->upmethod = jsimd_h2v1_merged_upsample; | 610 upsample->upmethod = jsimd_h2v1_merged_upsample; |
| 611 else | 611 else |
| 612 upsample->upmethod = h2v1_merged_upsample; | 612 upsample->upmethod = h2v1_merged_upsample; |
| 613 if (cinfo->out_color_space == JCS_RGB565) { | 613 if (cinfo->out_color_space == JCS_RGB565) { |
| 614 if (cinfo->dither_mode != JDITHER_NONE) { | 614 if (cinfo->dither_mode != JDITHER_NONE) { |
| 615 upsample->upmethod = h2v1_merged_upsample_565D; | 615 upsample->upmethod = h2v1_merged_upsample_565D; |
| 616 } else { | 616 } else { |
| 617 upsample->upmethod = h2v1_merged_upsample_565; | 617 upsample->upmethod = h2v1_merged_upsample_565; |
| 618 } | 618 } |
| 619 } | 619 } |
| 620 /* No spare row needed */ | 620 /* No spare row needed */ |
| 621 upsample->spare_row = NULL; | 621 upsample->spare_row = NULL; |
| 622 } | 622 } |
| 623 | 623 |
| 624 build_ycc_rgb_table(cinfo); | 624 build_ycc_rgb_table(cinfo); |
| 625 } | 625 } |
| 626 | 626 |
| 627 #endif /* UPSAMPLE_MERGING_SUPPORTED */ | 627 #endif /* UPSAMPLE_MERGING_SUPPORTED */ |
| OLD | NEW |