Home | History | Annotate | Download | only in jpeg
      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