1893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project/*
2893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project *  pnm2png.c --- conversion from PBM/PGM/PPM-file to PNG-file
3893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project *  copyright (C) 1999 by Willem van Schaik <willem@schaik.com>
4893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project *
5893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project *  version 1.0 - 1999.10.15 - First version.
6893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project *
7893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project *  Permission to use, copy, modify, and distribute this software and
8893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project *  its documentation for any purpose and without fee is hereby granted,
9893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project *  provided that the above copyright notice appear in all copies and
10893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project *  that both that copyright notice and this permission notice appear in
11893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project *  supporting documentation. This software is provided "as is" without
12893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project *  express or implied warranty.
13893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project */
14893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
15893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#include <stdio.h>
16893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#include <stdlib.h>
17893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#ifdef __TURBOC__
18893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#include <mem.h>
19893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#include <fcntl.h>
20893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif
21893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
22893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#ifndef BOOL
23893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#define BOOL unsigned char
24893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif
25893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#ifndef TRUE
26893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#define TRUE (BOOL) 1
27893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif
28893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#ifndef FALSE
29893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#define FALSE (BOOL) 0
30893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif
31893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
32893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#define STDIN  0
33893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#define STDOUT 1
34893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#define STDERR 2
35893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
36893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project/* to make pnm2png verbose so we can find problems (needs to be before png.h) */
37893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#ifndef PNG_DEBUG
38893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#define PNG_DEBUG 0
39893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif
40893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
41893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#include "png.h"
42893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
43893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project/* Define png_jmpbuf() in case we are using a pre-1.0.6 version of libpng */
44893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#ifndef png_jmpbuf
45893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#  define png_jmpbuf(png_ptr) ((png_ptr)->jmpbuf)
46893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif
47893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
48893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project/* function prototypes */
49893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
50893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projectint  main (int argc, char *argv[]);
51893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projectvoid usage ();
52893912bfc2683463dc3e2c445336752d012563d3The Android Open Source ProjectBOOL pnm2png (FILE *pnm_file, FILE *png_file, FILE *alpha_file, BOOL interlace, BOOL alpha);
53893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projectvoid get_token(FILE *pnm_file, char *token);
54893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projectpng_uint_32 get_data (FILE *pnm_file, int depth);
55893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projectpng_uint_32 get_value (FILE *pnm_file, int depth);
56893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
57893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project/*
58893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project *  main
59893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project */
60893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
61893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projectint main(int argc, char *argv[])
62893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project{
63893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project  FILE *fp_rd = stdin;
64893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project  FILE *fp_al = NULL;
65893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project  FILE *fp_wr = stdout;
66893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project  BOOL interlace = FALSE;
67893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project  BOOL alpha = FALSE;
68893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project  int argi;
69893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
70893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project  for (argi = 1; argi < argc; argi++)
71893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project  {
72893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project    if (argv[argi][0] == '-')
73893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project    {
74893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      switch (argv[argi][1])
75893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      {
76893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project        case 'i':
77893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project          interlace = TRUE;
78893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project          break;
79893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project        case 'a':
80893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project          alpha = TRUE;
81893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project          argi++;
82893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project          if ((fp_al = fopen (argv[argi], "rb")) == NULL)
83893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project          {
84893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project            fprintf (stderr, "PNM2PNG\n");
85893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project            fprintf (stderr, "Error:  alpha-channel file %s does not exist\n",
86893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project               argv[argi]);
87893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project            exit (1);
88893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project          }
89893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project          break;
90893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project        case 'h':
91893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project        case '?':
92893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project          usage();
93893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project          exit(0);
94893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project          break;
95893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project        default:
96893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project          fprintf (stderr, "PNM2PNG\n");
97893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project          fprintf (stderr, "Error:  unknown option %s\n", argv[argi]);
98893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project          usage();
99893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project          exit(1);
100893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project          break;
101893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      } /* end switch */
102893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project    }
103893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project    else if (fp_rd == stdin)
104893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project    {
105893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      if ((fp_rd = fopen (argv[argi], "rb")) == NULL)
106893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      {
107893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project        fprintf (stderr, "PNM2PNG\n");
108893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project        fprintf (stderr, "Error:  file %s does not exist\n", argv[argi]);
109893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project        exit (1);
110893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      }
111893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project    }
112893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project    else if (fp_wr == stdout)
113893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project    {
114893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      if ((fp_wr = fopen (argv[argi], "wb")) == NULL)
115893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      {
116893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project        fprintf (stderr, "PNM2PNG\n");
117893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project        fprintf (stderr, "Error:  can not create PNG-file %s\n", argv[argi]);
118893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project        exit (1);
119893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      }
120893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project    }
121893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project    else
122893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project    {
123893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      fprintf (stderr, "PNM2PNG\n");
124893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      fprintf (stderr, "Error:  too many parameters\n");
125893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      usage();
126893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      exit (1);
127893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project    }
128893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project  } /* end for */
129893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
130893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#ifdef __TURBOC__
131893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project  /* set stdin/stdout to binary, we're reading the PNM always! in binary format */
132893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project  if (fp_rd == stdin)
133893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project  {
134893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project    setmode (STDIN, O_BINARY);
135893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project  }
136893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project  if (fp_wr == stdout)
137893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project  {
138893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project    setmode (STDOUT, O_BINARY);
139893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project  }
140893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif
141893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
142893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project  /* call the conversion program itself */
143893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project  if (pnm2png (fp_rd, fp_wr, fp_al, interlace, alpha) == FALSE)
144893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project  {
145893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project    fprintf (stderr, "PNM2PNG\n");
146893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project    fprintf (stderr, "Error:  unsuccessful converting to PNG-image\n");
147893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project    exit (1);
148893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project  }
149893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
150893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project  /* close input file */
151893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project  fclose (fp_rd);
152893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project  /* close output file */
153893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project  fclose (fp_wr);
154893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project  /* close alpha file */
155893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project  if (alpha)
156893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project    fclose (fp_al);
157893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
158893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project  return 0;
159893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project}
160893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
161893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project/*
162893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project *  usage
163893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project */
164893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
165893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projectvoid usage()
166893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project{
167893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project  fprintf (stderr, "PNM2PNG\n");
168893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project  fprintf (stderr, "   by Willem van Schaik, 1999\n");
169893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#ifdef __TURBOC__
170893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project  fprintf (stderr, "   for Turbo-C and Borland-C compilers\n");
171893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#else
172893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project  fprintf (stderr, "   for Linux (and Unix) compilers\n");
173893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif
174893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project  fprintf (stderr, "Usage:  pnm2png [options] <file>.<pnm> [<file>.png]\n");
175893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project  fprintf (stderr, "   or:  ... | pnm2png [options]\n");
176893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project  fprintf (stderr, "Options:\n");
177893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project  fprintf (stderr, "   -i[nterlace]   write png-file with interlacing on\n");
178893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project  fprintf (stderr, "   -a[lpha] <file>.pgm read PNG alpha channel as pgm-file\n");
179893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project  fprintf (stderr, "   -h | -?  print this help-information\n");
180893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project}
181893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
182893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project/*
183893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project *  pnm2png
184893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project */
185893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
186893912bfc2683463dc3e2c445336752d012563d3The Android Open Source ProjectBOOL pnm2png (FILE *pnm_file, FILE *png_file, FILE *alpha_file, BOOL interlace, BOOL alpha)
187893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project{
188893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project  png_struct    *png_ptr = NULL;
189893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project  png_info      *info_ptr = NULL;
190893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project  png_byte      *png_pixels = NULL;
191893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project  png_byte      **row_pointers = NULL;
192893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project  png_byte      *pix_ptr = NULL;
193893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project  png_uint_32   row_bytes;
194893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
195893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project  char          type_token[16];
196893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project  char          width_token[16];
197893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project  char          height_token[16];
198893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project  char          maxval_token[16];
199893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project  int           color_type;
200893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project  png_uint_32   width, alpha_width;
201893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project  png_uint_32   height, alpha_height;
202893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project  png_uint_32   maxval;
203893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project  int           bit_depth = 0;
204893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project  int           channels;
205893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project  int           alpha_depth = 0;
206893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project  int           alpha_present;
207893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project  int           row, col;
208893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project  BOOL          raw, alpha_raw = FALSE;
209893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project  png_uint_32   tmp16;
210893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project  int           i;
211893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
212893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project  /* read header of PNM file */
213893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
214893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project  get_token(pnm_file, type_token);
215893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project  if (type_token[0] != 'P')
216893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project  {
217893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project    return FALSE;
218893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project  }
219893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project  else if ((type_token[1] == '1') || (type_token[1] == '4'))
220893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project  {
221893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project    raw = (type_token[1] == '4');
222893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project    color_type = PNG_COLOR_TYPE_GRAY;
223893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project    bit_depth = 1;
224893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project  }
225893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project  else if ((type_token[1] == '2') || (type_token[1] == '5'))
226893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project  {
227893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project    raw = (type_token[1] == '5');
228893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project    color_type = PNG_COLOR_TYPE_GRAY;
229893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project    get_token(pnm_file, width_token);
230893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project    sscanf (width_token, "%lu", &width);
231893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project    get_token(pnm_file, height_token);
232893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project    sscanf (height_token, "%lu", &height);
233893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project    get_token(pnm_file, maxval_token);
234893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project    sscanf (maxval_token, "%lu", &maxval);
235893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project    if (maxval <= 1)
236893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      bit_depth = 1;
237893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project    else if (maxval <= 3)
238893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      bit_depth = 2;
239893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project    else if (maxval <= 15)
240893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      bit_depth = 4;
241893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project    else if (maxval <= 255)
242893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      bit_depth = 8;
243893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project    else /* if (maxval <= 65535) */
244893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      bit_depth = 16;
245893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project  }
246893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project  else if ((type_token[1] == '3') || (type_token[1] == '6'))
247893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project  {
248893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project    raw = (type_token[1] == '6');
249893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project    color_type = PNG_COLOR_TYPE_RGB;
250893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project    get_token(pnm_file, width_token);
251893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project    sscanf (width_token, "%lu", &width);
252893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project    get_token(pnm_file, height_token);
253893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project    sscanf (height_token, "%lu", &height);
254893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project    get_token(pnm_file, maxval_token);
255893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project    sscanf (maxval_token, "%lu", &maxval);
256893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project    if (maxval <= 1)
257893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      bit_depth = 1;
258893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project    else if (maxval <= 3)
259893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      bit_depth = 2;
260893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project    else if (maxval <= 15)
261893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      bit_depth = 4;
262893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project    else if (maxval <= 255)
263893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      bit_depth = 8;
264893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project    else /* if (maxval <= 65535) */
265893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      bit_depth = 16;
266893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project  }
267893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project  else
268893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project  {
269893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project    return FALSE;
270893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project  }
271893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
272893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project  /* read header of PGM file with alpha channel */
273893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
274893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project  if (alpha)
275893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project  {
276893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project    if (color_type == PNG_COLOR_TYPE_GRAY)
277893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      color_type = PNG_COLOR_TYPE_GRAY_ALPHA;
278893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project    if (color_type == PNG_COLOR_TYPE_RGB)
279893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      color_type = PNG_COLOR_TYPE_RGB_ALPHA;
280893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
281893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project    get_token(alpha_file, type_token);
282893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project    if (type_token[0] != 'P')
283893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project    {
284893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      return FALSE;
285893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project    }
286893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project    else if ((type_token[1] == '2') || (type_token[1] == '5'))
287893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project    {
288893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      alpha_raw = (type_token[1] == '5');
289893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      get_token(alpha_file, width_token);
290893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      sscanf (width_token, "%lu", &alpha_width);
291893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      if (alpha_width != width)
292893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project        return FALSE;
293893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      get_token(alpha_file, height_token);
294893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      sscanf (height_token, "%lu", &alpha_height);
295893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      if (alpha_height != height)
296893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project        return FALSE;
297893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      get_token(alpha_file, maxval_token);
298893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      sscanf (maxval_token, "%lu", &maxval);
299893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      if (maxval <= 1)
300893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project        alpha_depth = 1;
301893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      else if (maxval <= 3)
302893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project        alpha_depth = 2;
303893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      else if (maxval <= 15)
304893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project        alpha_depth = 4;
305893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      else if (maxval <= 255)
306893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project        alpha_depth = 8;
307893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      else /* if (maxval <= 65535) */
308893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project        alpha_depth = 16;
309893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      if (alpha_depth != bit_depth)
310893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project        return FALSE;
311893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project    }
312893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project    else
313893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project    {
314893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      return FALSE;
315893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project    }
316893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project  } /* end if alpha */
317893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
318893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project  /* calculate the number of channels and store alpha-presence */
319893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project  if (color_type == PNG_COLOR_TYPE_GRAY)
320893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project    channels = 1;
321893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project  else if (color_type == PNG_COLOR_TYPE_GRAY_ALPHA)
322893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project    channels = 2;
323893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project  else if (color_type == PNG_COLOR_TYPE_RGB)
324893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project    channels = 3;
325893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project  else if (color_type == PNG_COLOR_TYPE_RGB_ALPHA)
326893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project    channels = 4;
327893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project  else
328893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project    channels = 0; /* should not happen */
329893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
330893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project  alpha_present = (channels - 1) % 2;
331893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
332893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project  /* row_bytes is the width x number of channels x (bit-depth / 8) */
333893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project  row_bytes = width * channels * ((bit_depth <= 8) ? 1 : 2);
334893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
335893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project  if ((png_pixels = (png_byte *) malloc (row_bytes * height * sizeof (png_byte))) == NULL)
336893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project    return FALSE;
337893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
338893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project  /* read data from PNM file */
339893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project  pix_ptr = png_pixels;
340893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
341893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project  for (row = 0; row < height; row++)
342893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project  {
343893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project    for (col = 0; col < width; col++)
344893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project    {
345893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      for (i = 0; i < (channels - alpha_present); i++)
346893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      {
347893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project        if (raw)
348893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project          *pix_ptr++ = get_data (pnm_file, bit_depth);
349893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project        else
350893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project          if (bit_depth <= 8)
351893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project            *pix_ptr++ = get_value (pnm_file, bit_depth);
352893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project          else
353893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project          {
354893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project            tmp16 = get_value (pnm_file, bit_depth);
355893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project            *pix_ptr = (png_byte) ((tmp16 >> 8) & 0xFF);
356893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project            pix_ptr++;
357893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project            *pix_ptr = (png_byte) (tmp16 & 0xFF);
358893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project            pix_ptr++;
359893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project          }
360893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      }
361893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
362893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      if (alpha) /* read alpha-channel from pgm file */
363893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      {
364893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project        if (alpha_raw)
365893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project          *pix_ptr++ = get_data (alpha_file, alpha_depth);
366893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project        else
367893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project          if (alpha_depth <= 8)
368893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project            *pix_ptr++ = get_value (alpha_file, bit_depth);
369893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project          else
370893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project          {
371893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project            tmp16 = get_value (alpha_file, bit_depth);
372893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project            *pix_ptr++ = (png_byte) ((tmp16 >> 8) & 0xFF);
373893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project            *pix_ptr++ = (png_byte) (tmp16 & 0xFF);
374893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project          }
375893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      } /* if alpha */
376893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
377893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project    } /* end for col */
378893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project  } /* end for row */
379893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
380893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project  /* prepare the standard PNG structures */
381893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project  png_ptr = png_create_write_struct (PNG_LIBPNG_VER_STRING, NULL, NULL, NULL);
382893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project  if (!png_ptr)
383893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project  {
384893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project    return FALSE;
385893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project  }
386893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project  info_ptr = png_create_info_struct (png_ptr);
387893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project  if (!info_ptr)
388893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project  {
389893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project    png_destroy_write_struct (&png_ptr, (png_infopp) NULL);
390893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project    return FALSE;
391893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project  }
392893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
393893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project  /* setjmp() must be called in every function that calls a PNG-reading libpng function */
394893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project  if (setjmp (png_jmpbuf(png_ptr)))
395893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project  {
396893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project    png_destroy_write_struct (&png_ptr, (png_infopp) NULL);
397893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project    return FALSE;
398893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project  }
399893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
400893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project  /* initialize the png structure */
401893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project  png_init_io (png_ptr, png_file);
402893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
403893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project  /* we're going to write more or less the same PNG as the input file */
404893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project  png_set_IHDR (png_ptr, info_ptr, width, height, bit_depth, color_type,
405893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project    (!interlace) ? PNG_INTERLACE_NONE : PNG_INTERLACE_ADAM7,
406893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project    PNG_COMPRESSION_TYPE_BASE, PNG_FILTER_TYPE_BASE);
407893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
408893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project  /* write the file header information */
409893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project  png_write_info (png_ptr, info_ptr);
410893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
411893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project  /* if needed we will allocate memory for an new array of row-pointers */
412893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project  if (row_pointers == (unsigned char**) NULL)
413893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project  {
414893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project    if ((row_pointers = (png_byte **) malloc (height * sizeof (png_bytep))) == NULL)
415893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project    {
416893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      png_destroy_write_struct (&png_ptr, (png_infopp) NULL);
417893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      return FALSE;
418893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project    }
419893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project  }
420893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
421893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project  /* set the individual row_pointers to point at the correct offsets */
422893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project  for (i = 0; i < (height); i++)
423893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project    row_pointers[i] = png_pixels + i * row_bytes;
424893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
425893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project  /* write out the entire image data in one call */
426893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project  png_write_image (png_ptr, row_pointers);
427893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
428893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project  /* write the additional chuncks to the PNG file (not really needed) */
429893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project  png_write_end (png_ptr, info_ptr);
430893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
431893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project  /* clean up after the write, and free any memory allocated */
432893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project  png_destroy_write_struct (&png_ptr, (png_infopp) NULL);
433893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
434893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project  if (row_pointers != (unsigned char**) NULL)
435893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project    free (row_pointers);
436893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project  if (png_pixels != (unsigned char*) NULL)
437893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project    free (png_pixels);
438893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
439893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project  return TRUE;
440893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project} /* end of pnm2png */
441893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
442893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project/*
443893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project * get_token() - gets the first string after whitespace
444893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project */
445893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
446893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projectvoid get_token(FILE *pnm_file, char *token)
447893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project{
448893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project  int i = 0;
449893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
450893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project  /* remove white-space */
451893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project  do
452893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project  {
453893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project    token[i] = (unsigned char) fgetc (pnm_file);
454893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project  }
455893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project  while ((token[i] == '\n') || (token[i] == '\r') || (token[i] == ' '));
456893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
457893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project  /* read string */
458893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project  do
459893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project  {
460893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project    i++;
461893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project    token[i] = (unsigned char) fgetc (pnm_file);
462893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project  }
463893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project  while ((token[i] != '\n') && (token[i] != '\r') && (token[i] != ' '));
464893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
465893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project  token[i] = '\0';
466893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
467893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project  return;
468893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project}
469893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
470893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project/*
471893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project * get_data() - takes first byte and converts into next pixel value,
472893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project *        taking as much bits as defined by bit-depth and
473893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project *        using the bit-depth to fill up a byte (0Ah -> AAh)
474893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project */
475893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
476893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projectpng_uint_32 get_data (FILE *pnm_file, int depth)
477893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project{
478893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project  static int bits_left = 0;
479893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project  static int old_value = 0;
480893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project  static int mask = 0;
481893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project  int i;
482893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project  png_uint_32 ret_value;
483893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
484893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project  if (mask == 0)
485893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project    for (i = 0; i < depth; i++)
486893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      mask = (mask >> 1) | 0x80;
487893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
488893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project  if (bits_left <= 0)
489893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project  {
490893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project    old_value = fgetc (pnm_file);
491893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project    bits_left = 8;
492893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project  }
493893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
494893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project  ret_value = old_value & mask;
495893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project  for (i = 1; i < (8 / depth); i++)
496893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project    ret_value = ret_value || (ret_value >> depth);
497893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
498893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project  old_value = (old_value << depth) & 0xFF;
499893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project  bits_left -= depth;
500893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
501893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project  return ret_value;
502893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project}
503893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
504893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project/*
505893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project * get_value() - takes first (numeric) string and converts into number,
506893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project *         using the bit-depth to fill up a byte (0Ah -> AAh)
507893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project */
508893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
509893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projectpng_uint_32 get_value (FILE *pnm_file, int depth)
510893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project{
511893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project  static png_uint_32 mask = 0;
512893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project  png_byte token[16];
513893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project  png_uint_32 ret_value;
514893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project  int i = 0;
515893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
516893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project  if (mask == 0)
517893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project    for (i = 0; i < depth; i++)
518893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      mask = (mask << 1) | 0x01;
519893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
520893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project  get_token (pnm_file, (char *) token);
521893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project  sscanf ((const char *) token, "%lu", &ret_value);
522893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
523893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project  ret_value &= mask;
524893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
525893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project  if (depth < 8)
526893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project    for (i = 0; i < (8 / depth); i++)
527893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      ret_value = (ret_value << depth) || ret_value;
528893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
529893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project  return ret_value;
530893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project}
531893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
532893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project/* end of source */
533893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
534