blob: 2991c00862694162286ce6a41574dbc89902acc6 [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
/**
* @author Oleg V. Khaschansky
*
*/
#ifndef _Included_PNGDecoder
#define _Included_PNGDecoder
#include <stdlib.h> // Strange because it's already included in pngconf.h, but it's needed
//#include <setjmp.h>
#include "png.h"
#include "org_apache_harmony_awt_gl_image_PngDecoder.h"
#include "exceptions.h"
// Define "boolean" as int if not defined
#ifndef __RPCNDR_H__ // don't redefine if rpcndr.h already defined it
typedef int boolean;
#endif
#ifndef FALSE
#define FALSE 0
#endif
#ifndef TRUE
#define TRUE 1
#endif
// Field ids
jfieldID img_PNG_imageWidthID;
jfieldID img_PNG_imageHeightID;
jfieldID img_PNG_colorTypeID;
jfieldID img_PNG_bitDepthID;
jfieldID img_PNG_cmapID;
jfieldID img_PNG_updateFromScanlineID;
jfieldID img_PNG_numScanlinesID;
jfieldID img_PNG_intOutID;
jfieldID img_PNG_byteOutID;
jmethodID img_PNG_returnHeaderID;
typedef struct png_decoder_info_tag {
png_structp png_ptr;
png_infop info_ptr;
unsigned char *inputBuffer;
png_uint_32 rowbytes; // Bytes for one row of data
png_uint_32 width;
png_uint_32 height;
int channels;
int bitDepth;
int colorType;
unsigned char *imageData;
boolean doneDecoding;
int updateFromScanline; // Current row
png_uint_32 numScanlines; // How much we decoded during this call of processData
// JNI-related vars
JNIEnv *env;
jobject obj;
jarray jImageData;
jarray jInputData;
// Nonlocal goto - only way to deal with errors in libpng...
jmp_buf jmpBuf;
} png_decoder_info;
typedef png_decoder_info* png_decoder_info_ptr;
void gl_error_fn(png_structp png_ptr, png_const_charp error_msg);
void gl_warning_fn(png_structp png_ptr, png_const_charp warning_msg);
void gl_info_callback(png_structp png_ptr, png_infop info);
void gl_end_callback(png_structp png_ptr, png_infop info);
void gl_row_callback(
png_structp png_ptr,
png_bytep new_row,
png_uint_32 row_num,
int pass);
png_decoder_info_ptr initPng();
void processData(png_decoder_info_ptr decoderInfo, png_bytep buffer, png_uint_32 length);
void destroyPng(png_decoder_info_ptr *decoderInfo);
void releaseArrays(png_decoder_info_ptr decoderInfo);
#endif