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