1 /* 2 * Small jpeg decoder library 3 * 4 * Copyright (c) 2006, Luc Saillard <luc (at) saillard.org> 5 * All rights reserved. 6 * Redistribution and use in source and binary forms, with or without 7 * modification, are permitted provided that the following conditions are met: 8 * 9 * - Redistributions of source code must retain the above copyright notice, 10 * this list of conditions and the following disclaimer. 11 * 12 * - Redistributions in binary form must reproduce the above copyright notice, 13 * this list of conditions and the following disclaimer in the documentation 14 * and/or other materials provided with the distribution. 15 * 16 * - Neither the name of the author nor the names of its contributors may be 17 * used to endorse or promote products derived from this software without 18 * specific prior written permission. 19 * 20 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" 21 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 22 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 23 * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE 24 * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 25 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 26 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 27 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 28 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 29 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 30 * POSSIBILITY OF SUCH DAMAGE. 31 * 32 */ 33 34 #include <stdio.h> 35 #include <stdlib.h> 36 #include <string.h> 37 #include <stdint.h> 38 39 #include "tinyjpeg.h" 40 #include "tinyjpeg-internal.h" 41 42 /** 43 * YCrCb -> Grey (1x1, 1x2) 44 * .---. 45 * | 1 | 46 * `---' 47 */ 48 static void YCrCB_to_Grey_1xN(struct jdec_private *priv, int sx, int sy) 49 { 50 const unsigned char *y; 51 unsigned char *p; 52 unsigned int i; 53 int offset_to_next_row; 54 55 p = priv->plane[0]; 56 y = priv->Y; 57 offset_to_next_row = priv->bytes_per_row[0]; 58 59 for (i = sy; i > 0; i--) { 60 memcpy(p, y, sx); 61 y += 8; 62 p += offset_to_next_row; 63 } 64 } 65 66 /** 67 * YCrCb -> Grey (2x1, 2x2) 68 * .-------. 69 * | 1 | 2 | 70 * `-------' 71 */ 72 static void YCrCB_to_Grey_2xN(struct jdec_private *priv, int sx, int sy) 73 { 74 const unsigned char *y; 75 unsigned char *p; 76 unsigned int i; 77 int offset_to_next_row; 78 79 p = priv->plane[0]; 80 y = priv->Y; 81 offset_to_next_row = priv->bytes_per_row[0]; 82 83 for (i = sy; i > 0; i--) { 84 memcpy(p, y, sx); 85 y += 16; 86 p += offset_to_next_row; 87 } 88 } 89 90 static int initialize_grey(struct jdec_private *priv, 91 unsigned int *bytes_per_blocklines, 92 unsigned int *bytes_per_mcu) 93 { 94 if (!priv->bytes_per_row[0]) 95 priv->bytes_per_row[0] = priv->width; 96 if (!priv->components[0]) 97 priv->components[0] = malloc(priv->height * priv->bytes_per_row[0]); 98 99 bytes_per_blocklines[0] = priv->bytes_per_row[0] << 3; 100 bytes_per_mcu[0] = 8; 101 102 return !priv->components[0]; 103 } 104 105 static const struct tinyjpeg_colorspace format_grey = 106 { 107 { 108 YCrCB_to_Grey_1xN, 109 YCrCB_to_Grey_1xN, 110 YCrCB_to_Grey_2xN, 111 YCrCB_to_Grey_2xN, 112 }, 113 tinyjpeg_decode_mcu_1comp_table, 114 initialize_grey 115 }; 116 117 const tinyjpeg_colorspace_t TINYJPEG_FMT_GREY = &format_grey; 118