Image-JPEG-Size

 view release on metacpan or  search on metacpan

Size.xs  view on Meta::CPAN

            || 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 )