0,0 → 1,177 |
/* |
jbig2dec |
|
Copyright (C) 2002 Artifex Software, Inc. |
|
This software is distributed under license and may not |
be copied, modified or distributed except as expressly |
authorized under the terms of the license contained in |
the file LICENSE in this distribution. |
|
For further licensing information refer to http://artifex.com/ or |
contact Artifex Software, Inc., 7 Mt. Lassen Drive - Suite A-134, |
San Rafael, CA 94903, U.S.A., +1(415)492-9861. |
*/ |
|
/* library internals */ |
|
typedef uint8_t byte; |
typedef int bool; |
|
#ifndef TRUE |
#define TRUE 1 |
#endif |
#ifndef FALSE |
#define FALSE 0 |
#endif |
|
#ifndef NULL |
#define NULL ((void*)0) |
#endif |
|
typedef enum { |
JBIG2_FILE_HEADER, |
JBIG2_FILE_SEQUENTIAL_HEADER, |
JBIG2_FILE_SEQUENTIAL_BODY, |
JBIG2_FILE_RANDOM_HEADERS, |
JBIG2_FILE_RANDOM_BODIES, |
JBIG2_FILE_EOF |
} Jbig2FileState; |
|
struct _Jbig2Ctx { |
Jbig2Allocator *allocator; |
Jbig2Options options; |
const Jbig2Ctx *global_ctx; |
Jbig2ErrorCallback error_callback; |
void *error_callback_data; |
|
byte *buf; |
size_t buf_size; |
unsigned int buf_rd_ix; |
unsigned int buf_wr_ix; |
|
Jbig2FileState state; |
|
uint8_t file_header_flags; |
int32_t n_pages; |
|
int n_segments_max; |
Jbig2Segment **segments; |
int n_segments; /* index of last segment header parsed */ |
int segment_index; /* index of last segment body parsed */ |
|
/* list of decoded pages, including the one in progress, |
currently stored as a contiguous, 0-indexed array. */ |
int current_page; |
int max_page_index; |
Jbig2Page *pages; |
}; |
|
int32_t |
jbig2_get_int32 (const byte *buf); |
|
int16_t |
jbig2_get_int16 (const byte *buf); |
|
/* dynamic memory management */ |
void * |
jbig2_alloc (Jbig2Allocator *allocator, size_t size); |
|
void |
jbig2_free (Jbig2Allocator *allocator, void *p); |
|
void * |
jbig2_realloc (Jbig2Allocator *allocator, void *p, size_t size); |
|
#define jbig2_new(ctx, t, size) ((t *)jbig2_alloc(ctx->allocator, (size) * sizeof(t))) |
|
#define jbig2_renew(ctx, p, t, size) ((t *)jbig2_realloc(ctx->allocator, (p), (size) * sizeof(t))) |
|
int |
jbig2_error (Jbig2Ctx *ctx, Jbig2Severity severity, int32_t seg_idx, |
const char *fmt, ...); |
|
/* the page structure handles decoded page |
results. it's allocated by a 'page info' |
segement and marked complete by an 'end of page' |
segment. |
*/ |
typedef enum { |
JBIG2_PAGE_FREE, |
JBIG2_PAGE_NEW, |
JBIG2_PAGE_COMPLETE, |
JBIG2_PAGE_RETURNED, |
JBIG2_PAGE_RELEASED |
} Jbig2PageState; |
|
struct _Jbig2Page { |
Jbig2PageState state; |
uint32_t number; |
uint32_t height, width; /* in pixels */ |
uint32_t x_resolution, |
y_resolution; /* in pixels per meter */ |
uint16_t stripe_size; |
bool striped; |
int end_row; |
uint8_t flags; |
Jbig2Image *image; |
}; |
|
int jbig2_page_info (Jbig2Ctx *ctx, Jbig2Segment *segment, const uint8_t *segment_data); |
int jbig2_end_of_stripe(Jbig2Ctx *ctx, Jbig2Segment *segment, const uint8_t *segment_data); |
int jbig2_end_of_page(Jbig2Ctx *ctx, Jbig2Segment *segment, const uint8_t *segment_data); |
int jbig2_extension_segment(Jbig2Ctx *ctx, Jbig2Segment *segment, const uint8_t *segment_data); |
|
typedef enum { |
JBIG2_COMPOSE_OR = 0, |
JBIG2_COMPOSE_AND = 1, |
JBIG2_COMPOSE_XOR = 2, |
JBIG2_COMPOSE_XNOR = 3, |
JBIG2_COMPOSE_REPLACE = 4 |
} Jbig2ComposeOp; |
|
int jbig2_image_compose(Jbig2Ctx *ctx, Jbig2Image *dst, Jbig2Image *src, int x, int y, Jbig2ComposeOp op); |
int jbig2_page_add_result(Jbig2Ctx *ctx, Jbig2Page *page, Jbig2Image *src, int x, int y, Jbig2ComposeOp op); |
|
/* region segment info */ |
|
typedef struct { |
int32_t width; |
int32_t height; |
int32_t x; |
int32_t y; |
Jbig2ComposeOp op; |
uint8_t flags; |
} Jbig2RegionSegmentInfo; |
|
void jbig2_get_region_segment_info(Jbig2RegionSegmentInfo *info, const uint8_t *segment_data); |
int jbig2_text_region(Jbig2Ctx *ctx, Jbig2Segment *segment, const uint8_t *segment_data); |
|
/* 7.4 */ |
int jbig2_immediate_generic_region(Jbig2Ctx *ctx, Jbig2Segment *segment, |
const uint8_t *segment_data); |
int jbig2_refinement_region(Jbig2Ctx *ctx, Jbig2Segment *segment, |
const byte *segment_data); |
|
int jbig2_pattern_dictionary(Jbig2Ctx *ctx, Jbig2Segment *segment, |
const byte *segment_data); |
int jbig2_halftone_region(Jbig2Ctx *ctx, Jbig2Segment *segment, |
const byte *segment_data); |
|
|
/* The word stream design is a compromise between simplicity and |
trying to amortize the number of method calls. Each ::get_next_word |
invocation pulls 4 bytes from the stream, packed big-endian into a |
32 bit word. The offset argument is provided as a convenience. It |
begins at 0 and increments by 4 for each successive invocation. */ |
typedef struct _Jbig2WordStream Jbig2WordStream; |
|
struct _Jbig2WordStream { |
uint32_t (*get_next_word) (Jbig2WordStream *self, int offset); |
}; |
|
Jbig2WordStream * |
jbig2_word_stream_buf_new(Jbig2Ctx *ctx, const byte *data, size_t size); |
|
void |
jbig2_word_stream_buf_free(Jbig2Ctx *ctx, Jbig2WordStream *ws); |