]> git.sesse.net Git - qscale/commitdiff
Add some useful functions for the Perl module.
authorSteinar H. Gunderson <sesse@debian.org>
Sat, 12 Jul 2008 21:19:00 +0000 (23:19 +0200)
committerSteinar H. Gunderson <sesse@debian.org>
Sat, 12 Jul 2008 21:19:00 +0000 (23:19 +0200)
libqscale.c
libqscale.h
qscale.i

index c02aa1a58ee685471f2a0fa31157341ea363432c..c26a4418e91746bf337d7552cd6dc9fc513ce4b6 100644 (file)
@@ -19,6 +19,7 @@
 #include <math.h>
 #include <stdio.h>
 #include <stdlib.h>
+#include <string.h>
 #include <malloc.h>
 
 #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));
index bd5cbe30ef08d5b74496035c4204248162254c54..fd9b22f9a60930ff358d3d375b4c22fa63740c5b 100644 (file)
@@ -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);
 
index 09fba8307cb616d610ec59da01c07da9e197512c..2da063e5264a76a26e697e30d6260171fc5e9d49 100644 (file)
--- 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);