From 07342f6e7cf83fbf6707ec370c22431e98b62fd7 Mon Sep 17 00:00:00 2001 From: "Steinar H. Gunderson" Date: Sat, 12 Jul 2008 23:19:00 +0200 Subject: [PATCH] Add some useful functions for the Perl module. --- libqscale.c | 31 +++++++++++++++++++++++++++++++ libqscale.h | 1 + qscale.i | 6 ++++++ 3 files changed, 38 insertions(+) diff --git a/libqscale.c b/libqscale.c index c02aa1a..c26a441 100644 --- a/libqscale.c +++ b/libqscale.c @@ -19,6 +19,7 @@ #include #include #include +#include #include #include "libqscale.h" @@ -479,6 +480,36 @@ static void vscale(unsigned char *pix, float *npix, unsigned w, unsigned h, unsi } } +qscale_img *qscale_clone(const qscale_img *img) +{ + qscale_img *dst = (qscale_img *)malloc(sizeof(qscale_img)); + if (dst == NULL) { + return NULL; + } + + *dst = *img; + + unsigned dstride0 = (dst->w0 + DCTSIZE-1) & ~(DCTSIZE-1); + unsigned dstride1 = (dst->w1 + DCTSIZE-1) & ~(DCTSIZE-1); + unsigned dstride2 = (dst->w2 + DCTSIZE-1) & ~(DCTSIZE-1); + + /* FIXME: handle out-of-memory gracefully */ + { + dst->data_y = (unsigned char *)malloc(dst->h0 * dstride0); + memcpy(dst->data_y, img->data_y, dst->h0 * dstride0); + } + { + dst->data_cb = (unsigned char *)malloc(dst->h1 * dstride1); + memcpy(dst->data_cb, img->data_cb, dst->h0 * dstride0); + } + { + dst->data_cr = (unsigned char *)malloc(dst->h1 * dstride1); + memcpy(dst->data_cr, img->data_cr, dst->h0 * dstride0); + } + + return dst; +} + qscale_img *qscale_scale(qscale_img *src, unsigned width, unsigned height, unsigned samp_h0, unsigned samp_v0, unsigned samp_h1, unsigned samp_v1, unsigned samp_h2, unsigned samp_v2, enum qscale_scaling_filter scaling_filter) { qscale_img *dst = (qscale_img *)malloc(sizeof(qscale_img)); diff --git a/libqscale.h b/libqscale.h index bd5cbe3..fd9b22f 100644 --- a/libqscale.h +++ b/libqscale.h @@ -35,6 +35,7 @@ qscale_img *qscale_load_jpeg_from_stdio(FILE *file); int qscale_save_jpeg(const qscale_img *img, const char *filename, unsigned jpeg_quality, enum qscale_jpeg_mode jpeg_mode); int qscale_save_jpeg_to_stdio(const qscale_img *img, FILE *file, unsigned jpeg_quality, enum qscale_jpeg_mode jpeg_mode); +qscale_img *qscale_clone(const qscale_img *img); qscale_img *qscale_scale(qscale_img *src, unsigned width, unsigned height, unsigned samp_h0, unsigned samp_v0, unsigned samp_h1, unsigned samp_v1, unsigned samp_h2, unsigned samp_v2, enum qscale_scaling_filter scaling_filter); void qscale_destroy(qscale_img *img); diff --git a/qscale.i b/qscale.i index 09fba83..2da063e 100644 --- a/qscale.i +++ b/qscale.i @@ -2,5 +2,11 @@ %{ #include "libqscale.h" + +int qscale_is_invalid(qscale_img *img) { + return (img == NULL); +} %} %include "libqscale.h" + +int qscale_is_invalid(qscale_img *img); -- 2.39.2