blob: 57775c43a1db6a790f1da5309c098c3cd0350898 [file] [log] [blame]
/* -*- C++ -*-
* File: libraw.h
* Copyright 2008-2009 LibRaw LLC (info@libraw.org)
* Created: Sat Mar 8, 2008
*
* LibRaw (Lite) C++ interface
*
This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public
License as published by the Free Software Foundation; either
version 2.1 of the License, or (at your option) any later version.
This library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public
License along with this library; if not, write to the Free Software
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
#ifndef _LIBRAW_CLASS_H
#define _LIBRAW_CLASS_H
#include <limits.h>
#include <memory.h>
#include <stdio.h>
#include <stdlib.h>
#include "libraw_datastream.h"
#include "libraw_types.h"
#include "libraw_const.h"
#include "libraw_internal.h"
#include "libraw_alloc.h"
#ifdef __cplusplus
extern "C"
{
#endif
DllDef const char *libraw_strerror(int errorcode);
DllDef const char *libraw_strprogress(enum LibRaw_progress);
/* LibRaw C API */
DllDef libraw_data_t *libraw_init(unsigned int flags);
DllDef int libraw_open_file(libraw_data_t*, const char *);
DllDef int libraw_open_buffer(libraw_data_t*, void * buffer, size_t size);
DllDef int libraw_unpack(libraw_data_t*);
DllDef int libraw_unpack_thumb(libraw_data_t*);
DllDef void libraw_recycle(libraw_data_t*);
DllDef void libraw_close(libraw_data_t*);
/* version helpers */
DllDef const char* libraw_version();
DllDef int libraw_versionNumber();
/* Camera list */
DllDef const char** libraw_cameraList();
DllDef int libraw_cameraCount();
DllDef void libraw_set_memerror_handler(libraw_data_t*, memory_callback cb, void *datap);
DllDef void libraw_set_dataerror_handler(libraw_data_t*,data_callback func,void *datap);
DllDef void libraw_set_progress_handler(libraw_data_t*,progress_callback cb,void *datap);
DllDef const char * libraw_unpack_function_name(libraw_data_t* lr);
/* DCRAW compatibility */
DllDef int libraw_adjust_sizes_info_only(libraw_data_t*);
DllDef int libraw_dcraw_document_mode_processing(libraw_data_t*);
DllDef int libraw_dcraw_ppm_tiff_writer(libraw_data_t* lr,const char *filename);
DllDef int libraw_dcraw_thumb_writer(libraw_data_t* lr,const char *fname);
DllDef int libraw_dcraw_process(libraw_data_t* lr);
DllDef libraw_processed_image_t* dcraw_make_mem_image(libraw_data_t* lr, int *errc);
DllDef libraw_processed_image_t* dcraw_make_mem_thumb(libraw_data_t* lr, int *errc);
#ifdef __cplusplus
}
#endif
#ifdef __cplusplus
class DllDef LibRaw
{
public:
libraw_data_t imgdata;
int verbose;
LibRaw(unsigned int flags = LIBRAW_OPTIONS_NONE);
libraw_output_params_t* output_params_ptr() { return &imgdata.params;}
int open_file(const char *fname);
int open_buffer(void *buffer, size_t size);
int open_datastream(LibRaw_abstract_datastream *);
int unpack(void);
int unpack_thumb(void);
int adjust_sizes_info_only(void);
void set_memerror_handler( memory_callback cb,void *data) {callbacks.memcb_data = data; callbacks.mem_cb = cb; }
void set_dataerror_handler(data_callback func, void *data) { callbacks.datacb_data = data; callbacks.data_cb = func;}
void set_progress_handler(progress_callback pcb, void *data) { callbacks.progresscb_data = data; callbacks.progress_cb = pcb;}
/* helpers */
static const char* version() { return LIBRAW_VERSION_STR;}
static int versionNumber() { return LIBRAW_VERSION; }
static const char** cameraList();
static int cameraCount();
static const char* strprogress(enum LibRaw_progress);
static const char* strerror(int p) { return libraw_strerror(p);}
/* dcraw emulation */
int dcraw_document_mode_processing();
int dcraw_ppm_tiff_writer(const char *filename);
int dcraw_thumb_writer(const char *fname);
int dcraw_process(void);
/* memory writers */
libraw_processed_image_t* dcraw_make_mem_image(int *errcode=NULL);
libraw_processed_image_t* dcraw_make_mem_thumb(int *errcode=NULL);
/* free all internal data structures */
void recycle();
~LibRaw(void) { recycle(); delete tls; }
int FC(int row,int col) { return (imgdata.idata.filters >> ((((row) << 1 & 14) + ((col) & 1)) << 1) & 3);}
int fc (int row, int col);
int add_masked_borders_to_bitmap();
const char *unpack_function_name();
private:
void* malloc(size_t t);
void* calloc(size_t n,size_t t);
void free(void *p);
void merror (void *ptr, const char *where);
void derror();
LibRaw_TLS *tls;
libraw_internal_data_t libraw_internal_data;
decode first_decode[2048], *second_decode, *free_decode;
tiff_ifd_t tiff_ifd[10];
libraw_memmgr memmgr;
libraw_callbacks_t callbacks;
LibRaw_constants rgb_constants;
void (LibRaw:: *write_thumb)(FILE *);
void (LibRaw:: *write_fun)(FILE *);
void (LibRaw:: *load_raw)();
void (LibRaw:: *thumb_load_raw)();
void kodak_thumb_loader();
void write_thumb_ppm_tiff(FILE *);
void identify();
void write_ppm_tiff (FILE *ofp);
void convert_to_rgb();
void kodak_ycbcr_load_raw();
void remove_zeroes();
#ifndef NO_LCMS
void apply_profile(char*,char*);
#endif
void pre_interpolate();
void border_interpolate (int border);
void lin_interpolate();
void vng_interpolate();
void ppg_interpolate();
void ahd_interpolate();
void bad_pixels(char*);
void subtract(char*);
void hat_transform (float *temp, float *base, int st, int size, int sc);
void wavelet_denoise();
void scale_colors();
void median_filter ();
void blend_highlights();
void recover_highlights();
void fuji_rotate();
void stretch();
void jpeg_thumb_writer (FILE *tfp,char *thumb,int thumb_length);
void jpeg_thumb (FILE *tfp);
void ppm_thumb (FILE *tfp);
void layer_thumb (FILE *tfp);
void rollei_thumb (FILE *tfp);
void kodak_thumb_load_raw();
unsigned get4();
int flip_index (int row, int col);
void gamma_lut(ushort lut[0x10000]);
#ifdef LIBRAW_LIBRARY_BUILD
#include "internal/libraw_internal_funcs.h"
#endif
};
#ifdef LIBRAW_LIBRARY_BUILD
#define RUN_CALLBACK(stage,iter,expect) if(callbacks.progress_cb) { \
int rr = (*callbacks.progress_cb)(callbacks.progresscb_data,stage,iter,expect); \
if(rr!=0) throw LIBRAW_EXCEPTION_CANCELLED_BY_CALLBACK; \
}
#endif
#endif /* __cplusplus */
#endif /* _LIBRAW_CLASS_H */