Image-JPEG-Size
view release on metacpan or search on metacpan
|| SvTYPE( (optsv = SvRV(options)) ) != SVt_PVHV) {
croak("Options must be a hash ref");
}
opthv = (HV *) optsv;
if ((svp = hv_fetchs(opthv, "error", FALSE))) {
error_mgr.on_error = parse_action(aTHX_ *svp, "error");
}
else {
error_mgr.on_error = FATAL;
}
if ((svp = hv_fetchs(opthv, "warning", FALSE))) {
error_mgr.on_warning = parse_action(aTHX_ *svp, "warning");
}
else {
error_mgr.on_warning = WARN;
}
Newxc(self, 1, struct sizer, struct sizer);
self->error_mgr = error_mgr;
CLEAR_ERRORS(&self->error_mgr);
self->cinfo.err = jpeg_std_error(&self->error_mgr.base);
self->error_mgr.base.error_exit = my_error_exit;
self->error_mgr.base.emit_message = my_emit_message;
self->error_mgr.base.output_message = my_output_message;
/* Recovery point for errors in creating the decompressor */
if (setjmp(self->error_mgr.jmp_buffer)) {
char error[JMSG_LENGTH_MAX];
my_strlcpy(error, LAST_ERROR(&self->error_mgr), sizeof error);
jpeg_destroy_decompress(&self->cinfo);
Safefree(self);
croak("%s", error);
}
jpeg_create_decompress(&self->cinfo);
RETVAL = self;
OUTPUT:
RETVAL
void
_destroy(self)
Image::JPEG::Size self
CODE:
jpeg_destroy_decompress(&self->cinfo);
Safefree(self);
void
file_dimensions(self, filename)
Image::JPEG::Size self
char *filename
INIT:
FILE *f;
JDIMENSION width = 0, height = 0;
int longjmp_reason;
PPCODE:
f = fopen(filename, "rb");
if (!f) {
croak("Can't open %s: %s", filename, strerror(errno));
}
CLEAR_ERRORS(&self->error_mgr);
if ((longjmp_reason = setjmp(self->error_mgr.jmp_buffer))) {
fclose(f);
if (longjmp_reason == WARN || self->error_mgr.on_error == FATAL) {
jpeg_abort_decompress(&self->cinfo);
croak("%s", LAST_ERROR(&self->error_mgr));
}
else if (self->error_mgr.on_error == WARN) {
warn("%s", LAST_ERROR(&self->error_mgr));
}
}
else {
jpeg_stdio_src(&self->cinfo, f);
jpeg_read_header(&self->cinfo, 1);
width = self->cinfo.image_width;
height = self->cinfo.image_height;
fclose(f);
}
jpeg_abort_decompress(&self->cinfo);
EXTEND(SP, 2);
mPUSHu(width);
mPUSHu(height);
( run in 1.870 second using v1.01-cache-2.11-cpan-71847e10f99 )