mirror of
https://github.com/michaelrsweet/pdfio.git
synced 2025-02-18 18:02:51 +01:00
Save work on streams.
This commit is contained in:
parent
d2a0484d93
commit
c61d6ad686
@ -197,10 +197,12 @@ _pdfioObjLoad(pdfio_obj_t *obj) // I - Object
|
|||||||
//
|
//
|
||||||
|
|
||||||
pdfio_stream_t * // O - Stream or `NULL` on error
|
pdfio_stream_t * // O - Stream or `NULL` on error
|
||||||
pdfioObjOpenStream(pdfio_obj_t *obj) // I - Object
|
pdfioObjOpenStream(pdfio_obj_t *obj, // I - Object
|
||||||
|
bool decode) // I - Decode/decompress data?
|
||||||
{
|
{
|
||||||
// TODO: Implement me
|
// TODO: Implement me
|
||||||
(void)obj;
|
(void)obj;
|
||||||
|
(void)decode;
|
||||||
|
|
||||||
return (NULL);
|
return (NULL);
|
||||||
}
|
}
|
||||||
|
@ -224,7 +224,9 @@ extern bool _pdfioFileWrite(pdfio_file_t *pdf, const void *buffer, size_t bytes
|
|||||||
extern void _pdfioObjDelete(pdfio_obj_t *obj) PDFIO_INTERNAL;
|
extern void _pdfioObjDelete(pdfio_obj_t *obj) PDFIO_INTERNAL;
|
||||||
extern bool _pdfioObjLoad(pdfio_obj_t *obj) PDFIO_INTERNAL;
|
extern bool _pdfioObjLoad(pdfio_obj_t *obj) PDFIO_INTERNAL;
|
||||||
|
|
||||||
|
extern pdfio_stream_t *_pdfioStreamCreate(pdfio_obj_t *obj, pdfio_filter_t compression) PDFIO_INTERNAL;
|
||||||
extern void _pdfioStreamDelete(pdfio_stream_t *st) PDFIO_INTERNAL;
|
extern void _pdfioStreamDelete(pdfio_stream_t *st) PDFIO_INTERNAL;
|
||||||
|
extern pdfio_stream_t *_pdfioStreamOpen(pdfio_obj_t *obj, bool decode) PDFIO_INTERNAL;
|
||||||
|
|
||||||
extern bool _pdfioStringIsAllocated(pdfio_file_t *pdf, const char *s) PDFIO_INTERNAL;
|
extern bool _pdfioStringIsAllocated(pdfio_file_t *pdf, const char *s) PDFIO_INTERNAL;
|
||||||
|
|
||||||
|
104
pdfio-stream.c
104
pdfio-stream.c
@ -27,6 +27,25 @@ pdfioStreamClose(pdfio_stream_t *st) // I - Stream
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
//
|
||||||
|
// '_pdfioStreamCreate()' - Create a stream for writing.
|
||||||
|
//
|
||||||
|
// Note: pdfioObjCreateStream handles writing the object and its dictionary.
|
||||||
|
//
|
||||||
|
|
||||||
|
pdfio_stream_t * // O - Stream or `NULL` on error
|
||||||
|
_pdfioStreamCreate(
|
||||||
|
pdfio_obj_t *obj, // I - Object
|
||||||
|
pdfio_filter_t compression) // I - Compression to apply
|
||||||
|
{
|
||||||
|
// TODO: Implement me
|
||||||
|
(void)obj;
|
||||||
|
(void)compression;
|
||||||
|
|
||||||
|
return (NULL);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
//
|
//
|
||||||
// 'pdfioStreamConsume()' - Consume bytes from the stream.
|
// 'pdfioStreamConsume()' - Consume bytes from the stream.
|
||||||
//
|
//
|
||||||
@ -76,6 +95,91 @@ pdfioStreamGetToken(
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
//
|
||||||
|
// '_pdfioStreamOpen()' - Create a stream for reading.
|
||||||
|
//
|
||||||
|
// Note: pdfioObjOpenStream handles loading the object's dictionary and
|
||||||
|
// getting the start of the stream data.
|
||||||
|
//
|
||||||
|
|
||||||
|
pdfio_stream_t * // O - Stream or `NULL` on error
|
||||||
|
_pdfioStreamOpen(pdfio_obj_t *obj, // I - Object
|
||||||
|
bool decode) // I - Decode/decompress the stream?
|
||||||
|
{
|
||||||
|
pdfio_stream_t *st; // Stream
|
||||||
|
|
||||||
|
|
||||||
|
// Allocate a new stream object...
|
||||||
|
if ((st = (pdfio_stream_t *)calloc(1, sizeof(pdfio_stream_t))) == NULL)
|
||||||
|
{
|
||||||
|
_pdfioFileError(obj->pdf, "Unable to allocate memory for a stream.");
|
||||||
|
return (NULL);
|
||||||
|
}
|
||||||
|
|
||||||
|
st->pdf = obj->pdf;
|
||||||
|
st->obj = obj;
|
||||||
|
|
||||||
|
_pdfioFileSeek(st->pdf, obj->stream_offset, SEEK_SET);
|
||||||
|
|
||||||
|
if (decode)
|
||||||
|
{
|
||||||
|
// Try to decode/decompress the contents of this object...
|
||||||
|
pdfio_dict_t *dict = pdfioObjGetDict(obj);
|
||||||
|
// Object dictionary
|
||||||
|
const char *filter = pdfioDictGetName(dict, "Filter");
|
||||||
|
// Filter value
|
||||||
|
|
||||||
|
if (!filter)
|
||||||
|
{
|
||||||
|
// No single filter name, do we have a compound filter?
|
||||||
|
if (pdfioDictGetArray(dict, "Filter"))
|
||||||
|
{
|
||||||
|
// TODO: Implement compound filters...
|
||||||
|
_pdfioFileError(st->pdf, "Unsupported compound stream filter.");
|
||||||
|
free(st);
|
||||||
|
return (NULL);
|
||||||
|
}
|
||||||
|
|
||||||
|
// No filter, read as-is...
|
||||||
|
st->filter = PDFIO_FILTER_NONE;
|
||||||
|
}
|
||||||
|
else if (!strcmp(filter, "FlateDecode"))
|
||||||
|
{
|
||||||
|
// Flate compression
|
||||||
|
int bpc = (int)pdfioDictGetNumber(dict, "BitsPerComponent");
|
||||||
|
// Bits per component
|
||||||
|
int colors = (int)pdfioDictGetNumber(dict, "Colors");
|
||||||
|
// Number of colors
|
||||||
|
int columns = (int)pdfioDictGetNumber(dict, "Columns");
|
||||||
|
// Number of columns
|
||||||
|
int predictor = (int)pdfioDictGetNumber(dict, "Predictor");
|
||||||
|
// Predictory value, if any
|
||||||
|
|
||||||
|
st->filter = PDFIO_FILTER_FLATE;
|
||||||
|
}
|
||||||
|
else if (!strcmp(filter, "LZWDecode"))
|
||||||
|
{
|
||||||
|
// LZW compression
|
||||||
|
st->filter = PDFIO_FILTER_LZW;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
// Something else we don't support
|
||||||
|
_pdfioFileError(st->pdf, "Unsupported stream filter '/%s'.", filter);
|
||||||
|
free(st);
|
||||||
|
return (NULL);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
// Just return the stream data as-is...
|
||||||
|
st->filter = PDFIO_FILTER_NONE;
|
||||||
|
}
|
||||||
|
|
||||||
|
return (st);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
//
|
//
|
||||||
// 'pdfioStreamPeek()' - Peek at data in a stream.
|
// 'pdfioStreamPeek()' - Peek at data in a stream.
|
||||||
//
|
//
|
||||||
|
13
pdfio.h
13
pdfio.h
@ -58,7 +58,16 @@ typedef bool (*pdfio_error_cb_t)(pdfio_file_t *pdf, const char *message, void *d
|
|||||||
typedef enum pdfio_filter_e // Compression/decompression filters for streams
|
typedef enum pdfio_filter_e // Compression/decompression filters for streams
|
||||||
{
|
{
|
||||||
PDFIO_FILTER_NONE, // No filter
|
PDFIO_FILTER_NONE, // No filter
|
||||||
PDFIO_FILTER_FLATE // Flate filter
|
PDFIO_FILTER_ASCIIHEX, // ASCIIHexDecode filter (reading only)
|
||||||
|
PDFIO_FILTER_ASCII85, // ASCII85Decode filter (reading only)
|
||||||
|
PDFIO_FILTER_CCITTFAX, // CCITTFaxDecode filter
|
||||||
|
PDFIO_FILTER_CRYPT, // Encryption filter
|
||||||
|
PDFIO_FILTER_DCT, // DCTDecode (JPEG) filter
|
||||||
|
PDFIO_FILTER_FLATE, // FlateDecode filter
|
||||||
|
PDFIO_FILTER_JBIG2, // JBIG2Decode filter
|
||||||
|
PDFIO_FILTER_JPX, // JPXDecode filter (reading only)
|
||||||
|
PDFIO_FILTER_LZW, // LZWDecode filter (reading only)
|
||||||
|
PDFIO_FILTER_RUNLENGTH, // RunLengthDecode filter (reading only)
|
||||||
} pdfio_filter_t;
|
} pdfio_filter_t;
|
||||||
typedef struct _pdfio_obj_s pdfio_obj_t;// Numbered object in PDF file
|
typedef struct _pdfio_obj_s pdfio_obj_t;// Numbered object in PDF file
|
||||||
typedef struct pdfio_rect_s // PDF rectangle
|
typedef struct pdfio_rect_s // PDF rectangle
|
||||||
@ -157,7 +166,7 @@ extern pdfio_dict_t *pdfioObjGetDict(pdfio_obj_t *obj) PDFIO_PUBLIC;
|
|||||||
extern unsigned short pdfioObjGetGeneration(pdfio_obj_t *obj) PDFIO_PUBLIC;
|
extern unsigned short pdfioObjGetGeneration(pdfio_obj_t *obj) PDFIO_PUBLIC;
|
||||||
extern size_t pdfioObjGetNumber(pdfio_obj_t *obj) PDFIO_PUBLIC;
|
extern size_t pdfioObjGetNumber(pdfio_obj_t *obj) PDFIO_PUBLIC;
|
||||||
extern const char *pdfioObjGetType(pdfio_obj_t *obj) PDFIO_PUBLIC;
|
extern const char *pdfioObjGetType(pdfio_obj_t *obj) PDFIO_PUBLIC;
|
||||||
extern pdfio_stream_t *pdfioObjOpenStream(pdfio_obj_t *obj) PDFIO_PUBLIC;
|
extern pdfio_stream_t *pdfioObjOpenStream(pdfio_obj_t *obj, bool decode) PDFIO_PUBLIC;
|
||||||
|
|
||||||
extern pdfio_obj_t *pdfioPageCopy(pdfio_file_t *pdf, pdfio_obj_t *src) PDFIO_PUBLIC;
|
extern pdfio_obj_t *pdfioPageCopy(pdfio_file_t *pdf, pdfio_obj_t *src) PDFIO_PUBLIC;
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user