19f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project/* 29f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * wrgif.c 39f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * 49f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * Copyright (C) 1991-1997, Thomas G. Lane. 59f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * This file is part of the Independent JPEG Group's software. 69f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * For conditions of distribution and use, see the accompanying README file. 79f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * 89f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * This file contains routines to write output images in GIF format. 99f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * 109f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project ************************************************************************** 119f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * NOTE: to avoid entanglements with Unisys' patent on LZW compression, * 129f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * this code has been modified to output "uncompressed GIF" files. * 139f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * There is no trace of the LZW algorithm in this file. * 149f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project ************************************************************************** 159f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * 169f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * These routines may need modification for non-Unix environments or 179f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * specialized applications. As they stand, they assume output to 189f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * an ordinary stdio stream. 199f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project */ 209f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 219f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project/* 229f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * This code is loosely based on ppmtogif from the PBMPLUS distribution 239f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * of Feb. 1991. That file contains the following copyright notice: 249f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * Based on GIFENCODE by David Rowley <mgardi@watdscu.waterloo.edu>. 259f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * Lempel-Ziv compression based on "compress" by Spencer W. Thomas et al. 269f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * Copyright (C) 1989 by Jef Poskanzer. 279f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * Permission to use, copy, modify, and distribute this software and its 289f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * documentation for any purpose and without fee is hereby granted, provided 299f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * that the above copyright notice appear in all copies and that both that 309f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * copyright notice and this permission notice appear in supporting 319f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * documentation. This software is provided "as is" without express or 329f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * implied warranty. 339f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * 349f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * We are also required to state that 359f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * "The Graphics Interchange Format(c) is the Copyright property of 369f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * CompuServe Incorporated. GIF(sm) is a Service Mark property of 379f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * CompuServe Incorporated." 389f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project */ 399f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 409f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project#include "cdjpeg.h" /* Common decls for cjpeg/djpeg applications */ 419f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 429f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project#ifdef GIF_SUPPORTED 439f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 449f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 459f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project/* Private version of data destination object */ 469f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 479f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Projecttypedef struct { 489f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project struct djpeg_dest_struct pub; /* public fields */ 499f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 509f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project j_decompress_ptr cinfo; /* back link saves passing separate parm */ 519f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 529f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project /* State for packing variable-width codes into a bitstream */ 539f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project int n_bits; /* current number of bits/code */ 549f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project int maxcode; /* maximum code, given n_bits */ 559f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project INT32 cur_accum; /* holds bits not yet output */ 569f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project int cur_bits; /* # of bits in cur_accum */ 579f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 589f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project /* State for GIF code assignment */ 599f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project int ClearCode; /* clear code (doesn't change) */ 609f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project int EOFCode; /* EOF code (ditto) */ 619f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project int code_counter; /* counts output symbols */ 629f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 639f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project /* GIF data packet construction buffer */ 649f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project int bytesinpkt; /* # of bytes in current packet */ 659f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project char packetbuf[256]; /* workspace for accumulating packet */ 669f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 679f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project} gif_dest_struct; 689f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 699f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Projecttypedef gif_dest_struct * gif_dest_ptr; 709f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 719f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project/* Largest value that will fit in N bits */ 729f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project#define MAXCODE(n_bits) ((1 << (n_bits)) - 1) 739f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 749f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 759f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project/* 769f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * Routines to package finished data bytes into GIF data blocks. 779f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * A data block consists of a count byte (1..255) and that many data bytes. 789f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project */ 799f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 809f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source ProjectLOCAL(void) 819f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Projectflush_packet (gif_dest_ptr dinfo) 829f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project/* flush any accumulated data */ 839f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project{ 849f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project if (dinfo->bytesinpkt > 0) { /* never write zero-length packet */ 859f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project dinfo->packetbuf[0] = (char) dinfo->bytesinpkt++; 869f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project if (JFWRITE(dinfo->pub.output_file, dinfo->packetbuf, dinfo->bytesinpkt) 879f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project != (size_t) dinfo->bytesinpkt) 889f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project ERREXIT(dinfo->cinfo, JERR_FILE_WRITE); 899f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project dinfo->bytesinpkt = 0; 909f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project } 919f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project} 929f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 939f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 949f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project/* Add a character to current packet; flush to disk if necessary */ 959f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project#define CHAR_OUT(dinfo,c) \ 969f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project { (dinfo)->packetbuf[++(dinfo)->bytesinpkt] = (char) (c); \ 979f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project if ((dinfo)->bytesinpkt >= 255) \ 989f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project flush_packet(dinfo); \ 999f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project } 1009f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 1019f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 1029f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project/* Routine to convert variable-width codes into a byte stream */ 1039f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 1049f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source ProjectLOCAL(void) 1059f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Projectoutput (gif_dest_ptr dinfo, int code) 1069f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project/* Emit a code of n_bits bits */ 1079f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project/* Uses cur_accum and cur_bits to reblock into 8-bit bytes */ 1089f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project{ 1099f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project dinfo->cur_accum |= ((INT32) code) << dinfo->cur_bits; 1109f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project dinfo->cur_bits += dinfo->n_bits; 1119f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 1129f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project while (dinfo->cur_bits >= 8) { 1139f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project CHAR_OUT(dinfo, dinfo->cur_accum & 0xFF); 1149f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project dinfo->cur_accum >>= 8; 1159f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project dinfo->cur_bits -= 8; 1169f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project } 1179f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project} 1189f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 1199f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 1209f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project/* The pseudo-compression algorithm. 1219f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * 1229f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * In this module we simply output each pixel value as a separate symbol; 1239f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * thus, no compression occurs. In fact, there is expansion of one bit per 1249f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * pixel, because we use a symbol width one bit wider than the pixel width. 1259f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * 1269f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * GIF ordinarily uses variable-width symbols, and the decoder will expect 1279f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * to ratchet up the symbol width after a fixed number of symbols. 1289f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * To simplify the logic and keep the expansion penalty down, we emit a 1299f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * GIF Clear code to reset the decoder just before the width would ratchet up. 1309f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * Thus, all the symbols in the output file will have the same bit width. 1319f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * Note that emitting the Clear codes at the right times is a mere matter of 1329f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * counting output symbols and is in no way dependent on the LZW patent. 1339f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * 1349f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * With a small basic pixel width (low color count), Clear codes will be 1359f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * needed very frequently, causing the file to expand even more. So this 1369f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * simplistic approach wouldn't work too well on bilevel images, for example. 1379f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * But for output of JPEG conversions the pixel width will usually be 8 bits 1389f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * (129 to 256 colors), so the overhead added by Clear symbols is only about 1399f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * one symbol in every 256. 1409f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project */ 1419f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 1429f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source ProjectLOCAL(void) 1439f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Projectcompress_init (gif_dest_ptr dinfo, int i_bits) 1449f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project/* Initialize pseudo-compressor */ 1459f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project{ 1469f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project /* init all the state variables */ 1479f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project dinfo->n_bits = i_bits; 1489f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project dinfo->maxcode = MAXCODE(dinfo->n_bits); 1499f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project dinfo->ClearCode = (1 << (i_bits - 1)); 1509f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project dinfo->EOFCode = dinfo->ClearCode + 1; 1519f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project dinfo->code_counter = dinfo->ClearCode + 2; 1529f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project /* init output buffering vars */ 1539f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project dinfo->bytesinpkt = 0; 1549f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project dinfo->cur_accum = 0; 1559f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project dinfo->cur_bits = 0; 1569f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project /* GIF specifies an initial Clear code */ 1579f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project output(dinfo, dinfo->ClearCode); 1589f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project} 1599f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 1609f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 1619f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source ProjectLOCAL(void) 1629f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Projectcompress_pixel (gif_dest_ptr dinfo, int c) 1639f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project/* Accept and "compress" one pixel value. 1649f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * The given value must be less than n_bits wide. 1659f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project */ 1669f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project{ 1679f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project /* Output the given pixel value as a symbol. */ 1689f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project output(dinfo, c); 1699f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project /* Issue Clear codes often enough to keep the reader from ratcheting up 1709f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * its symbol size. 1719f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project */ 1729f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project if (dinfo->code_counter < dinfo->maxcode) { 1739f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project dinfo->code_counter++; 1749f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project } else { 1759f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project output(dinfo, dinfo->ClearCode); 1769f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project dinfo->code_counter = dinfo->ClearCode + 2; /* reset the counter */ 1779f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project } 1789f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project} 1799f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 1809f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 1819f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source ProjectLOCAL(void) 1829f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Projectcompress_term (gif_dest_ptr dinfo) 1839f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project/* Clean up at end */ 1849f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project{ 1859f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project /* Send an EOF code */ 1869f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project output(dinfo, dinfo->EOFCode); 1879f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project /* Flush the bit-packing buffer */ 1889f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project if (dinfo->cur_bits > 0) { 1899f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project CHAR_OUT(dinfo, dinfo->cur_accum & 0xFF); 1909f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project } 1919f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project /* Flush the packet buffer */ 1929f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project flush_packet(dinfo); 1939f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project} 1949f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 1959f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 1969f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project/* GIF header construction */ 1979f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 1989f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 1999f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source ProjectLOCAL(void) 2009f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Projectput_word (gif_dest_ptr dinfo, unsigned int w) 2019f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project/* Emit a 16-bit word, LSB first */ 2029f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project{ 2039f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project putc(w & 0xFF, dinfo->pub.output_file); 2049f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project putc((w >> 8) & 0xFF, dinfo->pub.output_file); 2059f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project} 2069f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 2079f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 2089f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source ProjectLOCAL(void) 2099f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Projectput_3bytes (gif_dest_ptr dinfo, int val) 2109f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project/* Emit 3 copies of same byte value --- handy subr for colormap construction */ 2119f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project{ 2129f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project putc(val, dinfo->pub.output_file); 2139f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project putc(val, dinfo->pub.output_file); 2149f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project putc(val, dinfo->pub.output_file); 2159f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project} 2169f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 2179f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 2189f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source ProjectLOCAL(void) 2199f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Projectemit_header (gif_dest_ptr dinfo, int num_colors, JSAMPARRAY colormap) 2209f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project/* Output the GIF file header, including color map */ 2219f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project/* If colormap==NULL, synthesize a gray-scale colormap */ 2229f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project{ 2239f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project int BitsPerPixel, ColorMapSize, InitCodeSize, FlagByte; 2249f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project int cshift = dinfo->cinfo->data_precision - 8; 2259f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project int i; 2269f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 2279f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project if (num_colors > 256) 2289f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project ERREXIT1(dinfo->cinfo, JERR_TOO_MANY_COLORS, num_colors); 2299f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project /* Compute bits/pixel and related values */ 2309f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project BitsPerPixel = 1; 2319f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project while (num_colors > (1 << BitsPerPixel)) 2329f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project BitsPerPixel++; 2339f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project ColorMapSize = 1 << BitsPerPixel; 2349f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project if (BitsPerPixel <= 1) 2359f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project InitCodeSize = 2; 2369f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project else 2379f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project InitCodeSize = BitsPerPixel; 2389f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project /* 2399f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * Write the GIF header. 2409f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * Note that we generate a plain GIF87 header for maximum compatibility. 2419f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project */ 2429f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project putc('G', dinfo->pub.output_file); 2439f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project putc('I', dinfo->pub.output_file); 2449f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project putc('F', dinfo->pub.output_file); 2459f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project putc('8', dinfo->pub.output_file); 2469f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project putc('7', dinfo->pub.output_file); 2479f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project putc('a', dinfo->pub.output_file); 2489f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project /* Write the Logical Screen Descriptor */ 2499f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project put_word(dinfo, (unsigned int) dinfo->cinfo->output_width); 2509f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project put_word(dinfo, (unsigned int) dinfo->cinfo->output_height); 2519f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project FlagByte = 0x80; /* Yes, there is a global color table */ 2529f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project FlagByte |= (BitsPerPixel-1) << 4; /* color resolution */ 2539f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project FlagByte |= (BitsPerPixel-1); /* size of global color table */ 2549f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project putc(FlagByte, dinfo->pub.output_file); 2559f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project putc(0, dinfo->pub.output_file); /* Background color index */ 2569f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project putc(0, dinfo->pub.output_file); /* Reserved (aspect ratio in GIF89) */ 2579f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project /* Write the Global Color Map */ 2589f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project /* If the color map is more than 8 bits precision, */ 2599f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project /* we reduce it to 8 bits by shifting */ 2609f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project for (i=0; i < ColorMapSize; i++) { 2619f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project if (i < num_colors) { 2629f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project if (colormap != NULL) { 2639f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project if (dinfo->cinfo->out_color_space == JCS_RGB) { 2649f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project /* Normal case: RGB color map */ 2659f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project putc(GETJSAMPLE(colormap[0][i]) >> cshift, dinfo->pub.output_file); 2669f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project putc(GETJSAMPLE(colormap[1][i]) >> cshift, dinfo->pub.output_file); 2679f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project putc(GETJSAMPLE(colormap[2][i]) >> cshift, dinfo->pub.output_file); 2689f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project } else { 2699f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project /* Grayscale "color map": possible if quantizing grayscale image */ 2709f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project put_3bytes(dinfo, GETJSAMPLE(colormap[0][i]) >> cshift); 2719f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project } 2729f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project } else { 2739f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project /* Create a gray-scale map of num_colors values, range 0..255 */ 2749f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project put_3bytes(dinfo, (i * 255 + (num_colors-1)/2) / (num_colors-1)); 2759f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project } 2769f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project } else { 2779f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project /* fill out the map to a power of 2 */ 2789f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project put_3bytes(dinfo, 0); 2799f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project } 2809f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project } 2819f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project /* Write image separator and Image Descriptor */ 2829f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project putc(',', dinfo->pub.output_file); /* separator */ 2839f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project put_word(dinfo, 0); /* left/top offset */ 2849f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project put_word(dinfo, 0); 2859f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project put_word(dinfo, (unsigned int) dinfo->cinfo->output_width); /* image size */ 2869f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project put_word(dinfo, (unsigned int) dinfo->cinfo->output_height); 2879f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project /* flag byte: not interlaced, no local color map */ 2889f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project putc(0x00, dinfo->pub.output_file); 2899f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project /* Write Initial Code Size byte */ 2909f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project putc(InitCodeSize, dinfo->pub.output_file); 2919f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 2929f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project /* Initialize for "compression" of image data */ 2939f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project compress_init(dinfo, InitCodeSize+1); 2949f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project} 2959f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 2969f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 2979f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project/* 2989f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * Startup: write the file header. 2999f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project */ 3009f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 3019f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source ProjectMETHODDEF(void) 3029f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Projectstart_output_gif (j_decompress_ptr cinfo, djpeg_dest_ptr dinfo) 3039f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project{ 3049f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project gif_dest_ptr dest = (gif_dest_ptr) dinfo; 3059f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 3069f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project if (cinfo->quantize_colors) 3079f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project emit_header(dest, cinfo->actual_number_of_colors, cinfo->colormap); 3089f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project else 3099f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project emit_header(dest, 256, (JSAMPARRAY) NULL); 3109f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project} 3119f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 3129f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 3139f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project/* 3149f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * Write some pixel data. 3159f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * In this module rows_supplied will always be 1. 3169f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project */ 3179f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 3189f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source ProjectMETHODDEF(void) 3199f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Projectput_pixel_rows (j_decompress_ptr cinfo, djpeg_dest_ptr dinfo, 3209f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project JDIMENSION rows_supplied) 3219f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project{ 3229f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project gif_dest_ptr dest = (gif_dest_ptr) dinfo; 3239f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project register JSAMPROW ptr; 3249f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project register JDIMENSION col; 3259f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 3269f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project ptr = dest->pub.buffer[0]; 3279f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project for (col = cinfo->output_width; col > 0; col--) { 3289f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project compress_pixel(dest, GETJSAMPLE(*ptr++)); 3299f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project } 3309f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project} 3319f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 3329f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 3339f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project/* 3349f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * Finish up at the end of the file. 3359f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project */ 3369f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 3379f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source ProjectMETHODDEF(void) 3389f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Projectfinish_output_gif (j_decompress_ptr cinfo, djpeg_dest_ptr dinfo) 3399f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project{ 3409f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project gif_dest_ptr dest = (gif_dest_ptr) dinfo; 3419f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 3429f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project /* Flush "compression" mechanism */ 3439f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project compress_term(dest); 3449f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project /* Write a zero-length data block to end the series */ 3459f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project putc(0, dest->pub.output_file); 3469f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project /* Write the GIF terminator mark */ 3479f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project putc(';', dest->pub.output_file); 3489f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project /* Make sure we wrote the output file OK */ 3499f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project fflush(dest->pub.output_file); 3509f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project if (ferror(dest->pub.output_file)) 3519f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project ERREXIT(cinfo, JERR_FILE_WRITE); 3529f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project} 3539f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 3549f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 3559f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project/* 3569f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * The module selection routine for GIF format output. 3579f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project */ 3589f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 3599f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source ProjectGLOBAL(djpeg_dest_ptr) 3609f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Projectjinit_write_gif (j_decompress_ptr cinfo) 3619f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project{ 3629f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project gif_dest_ptr dest; 3639f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 3649f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project /* Create module interface object, fill in method pointers */ 3659f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project dest = (gif_dest_ptr) 3669f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE, 3679f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project SIZEOF(gif_dest_struct)); 3689f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project dest->cinfo = cinfo; /* make back link for subroutines */ 3699f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project dest->pub.start_output = start_output_gif; 3709f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project dest->pub.put_pixel_rows = put_pixel_rows; 3719f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project dest->pub.finish_output = finish_output_gif; 3729f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 3739f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project if (cinfo->out_color_space != JCS_GRAYSCALE && 3749f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project cinfo->out_color_space != JCS_RGB) 3759f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project ERREXIT(cinfo, JERR_GIF_COLORSPACE); 3769f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 3779f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project /* Force quantization if color or if > 8 bits input */ 3789f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project if (cinfo->out_color_space != JCS_GRAYSCALE || cinfo->data_precision > 8) { 3799f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project /* Force quantization to at most 256 colors */ 3809f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project cinfo->quantize_colors = TRUE; 3819f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project if (cinfo->desired_number_of_colors > 256) 3829f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project cinfo->desired_number_of_colors = 256; 3839f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project } 3849f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 3859f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project /* Calculate output image dimensions so we can allocate space */ 3869f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project jpeg_calc_output_dimensions(cinfo); 3879f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 3889f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project if (cinfo->output_components != 1) /* safety check: just one component? */ 3899f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project ERREXIT(cinfo, JERR_GIF_BUG); 3909f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 3919f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project /* Create decompressor output buffer. */ 3929f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project dest->pub.buffer = (*cinfo->mem->alloc_sarray) 3939f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project ((j_common_ptr) cinfo, JPOOL_IMAGE, cinfo->output_width, (JDIMENSION) 1); 3949f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project dest->pub.buffer_height = 1; 3959f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 3969f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project return (djpeg_dest_ptr) dest; 3979f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project} 3989f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 3999f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project#endif /* GIF_SUPPORTED */ 400