Path: blob/master/thirdparty/libjpeg-turbo/src/jdcol565.c
9904 views
/*1* jdcol565.c2*3* This file was part of the Independent JPEG Group's software:4* Copyright (C) 1991-1997, Thomas G. Lane.5* Modifications:6* Copyright (C) 2013, Linaro Limited.7* Copyright (C) 2014-2015, 2022, D. R. Commander.8* For conditions of distribution and use, see the accompanying README.ijg9* file.10*11* This file contains output colorspace conversion routines.12*/1314/* This file is included by jdcolor.c */151617INLINE18LOCAL(void)19ycc_rgb565_convert_internal(j_decompress_ptr cinfo, _JSAMPIMAGE input_buf,20JDIMENSION input_row, _JSAMPARRAY output_buf,21int num_rows)22{23#if BITS_IN_JSAMPLE != 1624my_cconvert_ptr cconvert = (my_cconvert_ptr)cinfo->cconvert;25register int y, cb, cr;26register _JSAMPROW outptr;27register _JSAMPROW inptr0, inptr1, inptr2;28register JDIMENSION col;29JDIMENSION num_cols = cinfo->output_width;30/* copy these pointers into registers if possible */31register _JSAMPLE *range_limit = (_JSAMPLE *)cinfo->sample_range_limit;32register int *Crrtab = cconvert->Cr_r_tab;33register int *Cbbtab = cconvert->Cb_b_tab;34register JLONG *Crgtab = cconvert->Cr_g_tab;35register JLONG *Cbgtab = cconvert->Cb_g_tab;36SHIFT_TEMPS3738while (--num_rows >= 0) {39JLONG rgb;40unsigned int r, g, b;41inptr0 = input_buf[0][input_row];42inptr1 = input_buf[1][input_row];43inptr2 = input_buf[2][input_row];44input_row++;45outptr = *output_buf++;4647if (PACK_NEED_ALIGNMENT(outptr)) {48y = *inptr0++;49cb = *inptr1++;50cr = *inptr2++;51r = range_limit[y + Crrtab[cr]];52g = range_limit[y + ((int)RIGHT_SHIFT(Cbgtab[cb] + Crgtab[cr],53SCALEBITS))];54b = range_limit[y + Cbbtab[cb]];55rgb = PACK_SHORT_565(r, g, b);56*(INT16 *)outptr = (INT16)rgb;57outptr += 2;58num_cols--;59}60for (col = 0; col < (num_cols >> 1); col++) {61y = *inptr0++;62cb = *inptr1++;63cr = *inptr2++;64r = range_limit[y + Crrtab[cr]];65g = range_limit[y + ((int)RIGHT_SHIFT(Cbgtab[cb] + Crgtab[cr],66SCALEBITS))];67b = range_limit[y + Cbbtab[cb]];68rgb = PACK_SHORT_565(r, g, b);6970y = *inptr0++;71cb = *inptr1++;72cr = *inptr2++;73r = range_limit[y + Crrtab[cr]];74g = range_limit[y + ((int)RIGHT_SHIFT(Cbgtab[cb] + Crgtab[cr],75SCALEBITS))];76b = range_limit[y + Cbbtab[cb]];77rgb = PACK_TWO_PIXELS(rgb, PACK_SHORT_565(r, g, b));7879WRITE_TWO_ALIGNED_PIXELS(outptr, rgb);80outptr += 4;81}82if (num_cols & 1) {83y = *inptr0;84cb = *inptr1;85cr = *inptr2;86r = range_limit[y + Crrtab[cr]];87g = range_limit[y + ((int)RIGHT_SHIFT(Cbgtab[cb] + Crgtab[cr],88SCALEBITS))];89b = range_limit[y + Cbbtab[cb]];90rgb = PACK_SHORT_565(r, g, b);91*(INT16 *)outptr = (INT16)rgb;92}93}94#else95ERREXIT(cinfo, JERR_CONVERSION_NOTIMPL);96#endif97}9899100INLINE101LOCAL(void)102ycc_rgb565D_convert_internal(j_decompress_ptr cinfo, _JSAMPIMAGE input_buf,103JDIMENSION input_row, _JSAMPARRAY output_buf,104int num_rows)105{106#if BITS_IN_JSAMPLE != 16107my_cconvert_ptr cconvert = (my_cconvert_ptr)cinfo->cconvert;108register int y, cb, cr;109register _JSAMPROW outptr;110register _JSAMPROW inptr0, inptr1, inptr2;111register JDIMENSION col;112JDIMENSION num_cols = cinfo->output_width;113/* copy these pointers into registers if possible */114register _JSAMPLE *range_limit = (_JSAMPLE *)cinfo->sample_range_limit;115register int *Crrtab = cconvert->Cr_r_tab;116register int *Cbbtab = cconvert->Cb_b_tab;117register JLONG *Crgtab = cconvert->Cr_g_tab;118register JLONG *Cbgtab = cconvert->Cb_g_tab;119JLONG d0 = dither_matrix[cinfo->output_scanline & DITHER_MASK];120SHIFT_TEMPS121122while (--num_rows >= 0) {123JLONG rgb;124unsigned int r, g, b;125126inptr0 = input_buf[0][input_row];127inptr1 = input_buf[1][input_row];128inptr2 = input_buf[2][input_row];129input_row++;130outptr = *output_buf++;131if (PACK_NEED_ALIGNMENT(outptr)) {132y = *inptr0++;133cb = *inptr1++;134cr = *inptr2++;135r = range_limit[DITHER_565_R(y + Crrtab[cr], d0)];136g = range_limit[DITHER_565_G(y +137((int)RIGHT_SHIFT(Cbgtab[cb] + Crgtab[cr],138SCALEBITS)), d0)];139b = range_limit[DITHER_565_B(y + Cbbtab[cb], d0)];140rgb = PACK_SHORT_565(r, g, b);141*(INT16 *)outptr = (INT16)rgb;142outptr += 2;143num_cols--;144}145for (col = 0; col < (num_cols >> 1); col++) {146y = *inptr0++;147cb = *inptr1++;148cr = *inptr2++;149r = range_limit[DITHER_565_R(y + Crrtab[cr], d0)];150g = range_limit[DITHER_565_G(y +151((int)RIGHT_SHIFT(Cbgtab[cb] + Crgtab[cr],152SCALEBITS)), d0)];153b = range_limit[DITHER_565_B(y + Cbbtab[cb], d0)];154d0 = DITHER_ROTATE(d0);155rgb = PACK_SHORT_565(r, g, b);156157y = *inptr0++;158cb = *inptr1++;159cr = *inptr2++;160r = range_limit[DITHER_565_R(y + Crrtab[cr], d0)];161g = range_limit[DITHER_565_G(y +162((int)RIGHT_SHIFT(Cbgtab[cb] + Crgtab[cr],163SCALEBITS)), d0)];164b = range_limit[DITHER_565_B(y + Cbbtab[cb], d0)];165d0 = DITHER_ROTATE(d0);166rgb = PACK_TWO_PIXELS(rgb, PACK_SHORT_565(r, g, b));167168WRITE_TWO_ALIGNED_PIXELS(outptr, rgb);169outptr += 4;170}171if (num_cols & 1) {172y = *inptr0;173cb = *inptr1;174cr = *inptr2;175r = range_limit[DITHER_565_R(y + Crrtab[cr], d0)];176g = range_limit[DITHER_565_G(y +177((int)RIGHT_SHIFT(Cbgtab[cb] + Crgtab[cr],178SCALEBITS)), d0)];179b = range_limit[DITHER_565_B(y + Cbbtab[cb], d0)];180rgb = PACK_SHORT_565(r, g, b);181*(INT16 *)outptr = (INT16)rgb;182}183}184#else185ERREXIT(cinfo, JERR_CONVERSION_NOTIMPL);186#endif187}188189190INLINE191LOCAL(void)192rgb_rgb565_convert_internal(j_decompress_ptr cinfo, _JSAMPIMAGE input_buf,193JDIMENSION input_row, _JSAMPARRAY output_buf,194int num_rows)195{196register _JSAMPROW outptr;197register _JSAMPROW inptr0, inptr1, inptr2;198register JDIMENSION col;199JDIMENSION num_cols = cinfo->output_width;200SHIFT_TEMPS201202while (--num_rows >= 0) {203JLONG rgb;204unsigned int r, g, b;205206inptr0 = input_buf[0][input_row];207inptr1 = input_buf[1][input_row];208inptr2 = input_buf[2][input_row];209input_row++;210outptr = *output_buf++;211if (PACK_NEED_ALIGNMENT(outptr)) {212r = *inptr0++;213g = *inptr1++;214b = *inptr2++;215rgb = PACK_SHORT_565(r, g, b);216*(INT16 *)outptr = (INT16)rgb;217outptr += 2;218num_cols--;219}220for (col = 0; col < (num_cols >> 1); col++) {221r = *inptr0++;222g = *inptr1++;223b = *inptr2++;224rgb = PACK_SHORT_565(r, g, b);225226r = *inptr0++;227g = *inptr1++;228b = *inptr2++;229rgb = PACK_TWO_PIXELS(rgb, PACK_SHORT_565(r, g, b));230231WRITE_TWO_ALIGNED_PIXELS(outptr, rgb);232outptr += 4;233}234if (num_cols & 1) {235r = *inptr0;236g = *inptr1;237b = *inptr2;238rgb = PACK_SHORT_565(r, g, b);239*(INT16 *)outptr = (INT16)rgb;240}241}242}243244245INLINE246LOCAL(void)247rgb_rgb565D_convert_internal(j_decompress_ptr cinfo, _JSAMPIMAGE input_buf,248JDIMENSION input_row, _JSAMPARRAY output_buf,249int num_rows)250{251register _JSAMPROW outptr;252register _JSAMPROW inptr0, inptr1, inptr2;253register JDIMENSION col;254register _JSAMPLE *range_limit = (_JSAMPLE *)cinfo->sample_range_limit;255JDIMENSION num_cols = cinfo->output_width;256JLONG d0 = dither_matrix[cinfo->output_scanline & DITHER_MASK];257SHIFT_TEMPS258259while (--num_rows >= 0) {260JLONG rgb;261unsigned int r, g, b;262263inptr0 = input_buf[0][input_row];264inptr1 = input_buf[1][input_row];265inptr2 = input_buf[2][input_row];266input_row++;267outptr = *output_buf++;268if (PACK_NEED_ALIGNMENT(outptr)) {269r = range_limit[DITHER_565_R(*inptr0++, d0)];270g = range_limit[DITHER_565_G(*inptr1++, d0)];271b = range_limit[DITHER_565_B(*inptr2++, d0)];272rgb = PACK_SHORT_565(r, g, b);273*(INT16 *)outptr = (INT16)rgb;274outptr += 2;275num_cols--;276}277for (col = 0; col < (num_cols >> 1); col++) {278r = range_limit[DITHER_565_R(*inptr0++, d0)];279g = range_limit[DITHER_565_G(*inptr1++, d0)];280b = range_limit[DITHER_565_B(*inptr2++, d0)];281d0 = DITHER_ROTATE(d0);282rgb = PACK_SHORT_565(r, g, b);283284r = range_limit[DITHER_565_R(*inptr0++, d0)];285g = range_limit[DITHER_565_G(*inptr1++, d0)];286b = range_limit[DITHER_565_B(*inptr2++, d0)];287d0 = DITHER_ROTATE(d0);288rgb = PACK_TWO_PIXELS(rgb, PACK_SHORT_565(r, g, b));289290WRITE_TWO_ALIGNED_PIXELS(outptr, rgb);291outptr += 4;292}293if (num_cols & 1) {294r = range_limit[DITHER_565_R(*inptr0, d0)];295g = range_limit[DITHER_565_G(*inptr1, d0)];296b = range_limit[DITHER_565_B(*inptr2, d0)];297rgb = PACK_SHORT_565(r, g, b);298*(INT16 *)outptr = (INT16)rgb;299}300}301}302303304INLINE305LOCAL(void)306gray_rgb565_convert_internal(j_decompress_ptr cinfo, _JSAMPIMAGE input_buf,307JDIMENSION input_row, _JSAMPARRAY output_buf,308int num_rows)309{310register _JSAMPROW inptr, outptr;311register JDIMENSION col;312JDIMENSION num_cols = cinfo->output_width;313314while (--num_rows >= 0) {315JLONG rgb;316unsigned int g;317318inptr = input_buf[0][input_row++];319outptr = *output_buf++;320if (PACK_NEED_ALIGNMENT(outptr)) {321g = *inptr++;322rgb = PACK_SHORT_565(g, g, g);323*(INT16 *)outptr = (INT16)rgb;324outptr += 2;325num_cols--;326}327for (col = 0; col < (num_cols >> 1); col++) {328g = *inptr++;329rgb = PACK_SHORT_565(g, g, g);330g = *inptr++;331rgb = PACK_TWO_PIXELS(rgb, PACK_SHORT_565(g, g, g));332WRITE_TWO_ALIGNED_PIXELS(outptr, rgb);333outptr += 4;334}335if (num_cols & 1) {336g = *inptr;337rgb = PACK_SHORT_565(g, g, g);338*(INT16 *)outptr = (INT16)rgb;339}340}341}342343344INLINE345LOCAL(void)346gray_rgb565D_convert_internal(j_decompress_ptr cinfo, _JSAMPIMAGE input_buf,347JDIMENSION input_row, _JSAMPARRAY output_buf,348int num_rows)349{350register _JSAMPROW inptr, outptr;351register JDIMENSION col;352register _JSAMPLE *range_limit = (_JSAMPLE *)cinfo->sample_range_limit;353JDIMENSION num_cols = cinfo->output_width;354JLONG d0 = dither_matrix[cinfo->output_scanline & DITHER_MASK];355356while (--num_rows >= 0) {357JLONG rgb;358unsigned int g;359360inptr = input_buf[0][input_row++];361outptr = *output_buf++;362if (PACK_NEED_ALIGNMENT(outptr)) {363g = *inptr++;364g = range_limit[DITHER_565_R(g, d0)];365rgb = PACK_SHORT_565(g, g, g);366*(INT16 *)outptr = (INT16)rgb;367outptr += 2;368num_cols--;369}370for (col = 0; col < (num_cols >> 1); col++) {371g = *inptr++;372g = range_limit[DITHER_565_R(g, d0)];373rgb = PACK_SHORT_565(g, g, g);374d0 = DITHER_ROTATE(d0);375376g = *inptr++;377g = range_limit[DITHER_565_R(g, d0)];378rgb = PACK_TWO_PIXELS(rgb, PACK_SHORT_565(g, g, g));379d0 = DITHER_ROTATE(d0);380381WRITE_TWO_ALIGNED_PIXELS(outptr, rgb);382outptr += 4;383}384if (num_cols & 1) {385g = *inptr;386g = range_limit[DITHER_565_R(g, d0)];387rgb = PACK_SHORT_565(g, g, g);388*(INT16 *)outptr = (INT16)rgb;389}390}391}392393394