Subversion Repositories Kolibri OS

Rev

Blame | Last modification | View Log | RSS feed

  1. /*
  2.  * PNG image format
  3.  * Copyright (c) 2003 Fabrice Bellard
  4.  *
  5.  * This file is part of FFmpeg.
  6.  *
  7.  * FFmpeg is free software; you can redistribute it and/or
  8.  * modify it under the terms of the GNU Lesser General Public
  9.  * License as published by the Free Software Foundation; either
  10.  * version 2.1 of the License, or (at your option) any later version.
  11.  *
  12.  * FFmpeg is distributed in the hope that it will be useful,
  13.  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  14.  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
  15.  * Lesser General Public License for more details.
  16.  *
  17.  * You should have received a copy of the GNU Lesser General Public
  18.  * License along with FFmpeg; if not, write to the Free Software
  19.  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
  20.  */
  21. #include "avcodec.h"
  22. #include "png.h"
  23.  
  24. /* Mask to determine which y pixels are valid in a pass */
  25. const uint8_t ff_png_pass_ymask[NB_PASSES] = {
  26.     0x80, 0x80, 0x08, 0x88, 0x22, 0xaa, 0x55,
  27. };
  28.  
  29. /* minimum x value */
  30. static const uint8_t ff_png_pass_xmin[NB_PASSES] = {
  31.     0, 4, 0, 2, 0, 1, 0
  32. };
  33.  
  34. /* x shift to get row width */
  35. static const uint8_t ff_png_pass_xshift[NB_PASSES] = {
  36.     3, 3, 2, 2, 1, 1, 0
  37. };
  38.  
  39. void *ff_png_zalloc(void *opaque, unsigned int items, unsigned int size)
  40. {
  41.     return av_mallocz_array(items, size);
  42. }
  43.  
  44. void ff_png_zfree(void *opaque, void *ptr)
  45. {
  46.     av_free(ptr);
  47. }
  48.  
  49. int ff_png_get_nb_channels(int color_type)
  50. {
  51.     int channels;
  52.     channels = 1;
  53.     if ((color_type & (PNG_COLOR_MASK_COLOR | PNG_COLOR_MASK_PALETTE)) ==
  54.         PNG_COLOR_MASK_COLOR)
  55.         channels = 3;
  56.     if (color_type & PNG_COLOR_MASK_ALPHA)
  57.         channels++;
  58.     return channels;
  59. }
  60.  
  61. /* compute the row size of an interleaved pass */
  62. int ff_png_pass_row_size(int pass, int bits_per_pixel, int width)
  63. {
  64.     int shift, xmin, pass_width;
  65.  
  66.     xmin = ff_png_pass_xmin[pass];
  67.     if (width <= xmin)
  68.         return 0;
  69.     shift = ff_png_pass_xshift[pass];
  70.     pass_width = (width - xmin + (1 << shift) - 1) >> shift;
  71.     return (pass_width * bits_per_pixel + 7) >> 3;
  72. }
  73.