#include "image.h"
#include "imagei.h"
-#include "io.h"
/*
=head1 NAME
i_img *
i_img_empty_ch(i_img *im,int x,int y,int ch) {
+ int bytes;
+
mm_log((1,"i_img_empty_ch(*im %p, x %d, y %d, ch %d)\n", im, x, y, ch));
+
+ if (x < 1 || y < 1) {
+ i_push_error(0, "Image sizes must be positive");
+ return NULL;
+ }
+ if (ch < 1 || ch > MAXCHANNELS) {
+ i_push_errorf(0, "channels must be between 1 and %d", MAXCHANNELS);
+ return NULL;
+ }
+ /* check this multiplication doesn't overflow */
+ bytes = x*y*ch;
+ if (bytes / y / ch != x) {
+ i_push_errorf(0, "integer overflow calculating image allocation");
+ return NULL;
+ }
+
if (im == NULL)
if ( (im=mymalloc(sizeof(i_img))) == NULL)
m_fatal(2,"malloc() error\n");
im->ysize = y;
im->channels = ch;
im->ch_mask = MAXINT;
- im->bytes=x*y*im->channels;
- if ( (im->idata=mymalloc(im->bytes)) == NULL) m_fatal(2,"malloc() error\n");
+ im->bytes=bytes;
+ if ( (im->idata=mymalloc(im->bytes)) == NULL)
+ m_fatal(2,"malloc() error\n");
memset(im->idata,0,(size_t)im->bytes);
im->ext_data = NULL;
}
-
-
-
-
-
-
-
-i_img*
-i_scaleaxis_3ch_8bit(i_img *im, int size, int Axis) {
-
- int i, j;
- int iEnd, jEnd;
-
- int hsize, vsize;
-
- short psave;
- unsigned long *pixels;
- i_color val;
- i_img *new_img;
-
- mm_log((1,"i_scaleaxis_3ch_8bit(im %p, size %d,Axis %d)\n",im, size, Axis));
-
- if (Axis == XAXIS) {
- hsize = size;
- vsize = im->ysize;
-
- jEnd = hsize;
- iEnd = vsize;
- pixels = mymalloc(sizeof(*pixels) * im->xsize);
- } else {
- hsize = im->xsize;
- vsize = size;
-
- jEnd = vsize;
- iEnd = hsize;
- pixels = mymalloc(sizeof(*pixels) * im->ysize);
- }
-
- new_img = i_img_empty_ch(NULL, hsize, vsize, im->channels);
-
-
- if (Axis == XAXIS) {
-
- for (i=0; i<iEnd; i++) {
- int end = im->xsize;
-
- for(j=0; j<im->xsize; j++) {
- i_gpix(im, j, i, &val);
- pixels[j] = (val.rgba.r<<24) | (val.rgba.g<<16) | (val.rgba.b<<8) | (val.rgba.a<<0);
- }
-
- /* printf("jEnd = %d, end = %d\n", jEnd, end); */
- while ((end+1)/2>=size) {
- int lend = end/2;
- end = (end+1) / 2;
-
- for(j=0; j<lend; j++) {
- unsigned long a = pixels[2*j];
- unsigned long b = pixels[2*j+1];
- pixels[j] = (((a ^ b) & 0xfefefefeUL) >> 1) + (a & b);
- }
- if (end>lend) {
- pixels[j] = pixels[2*j];
- j++;
- }
- }
-
- printf("end = %d size = %d\n", end, size);
-
- /* Replace this with Bresenham later */
- for(j=0; j<size; j++) {
- float f = i;
- /* if ((i*size)/end <) */
- unsigned long t = pixels[j];
- val.rgba.r = (t >> 24) & 0xff;
- val.rgba.g = (t >> 16) & 0xff;
- val.rgba.b = (t >> 8) & 0xff;
- val.rgba.a = t & 0xff;
- i_ppix(new_img, j, i, &val);
- }
- }
- }
-
- return new_img;
-}
-
-
-
-
-
-
-
/*
=item i_scaleaxis(im, value, axis)
if (Axis == XAXIS) {
- return i_scaleaxis_3ch_8bit(im, (int)(0.5+im->xsize*Value), Axis);
-
hsize = (int)(0.5 + im->xsize * Value);
+ if (hsize < 1) {
+ hsize = 1;
+ Value = 1.0 / im->xsize;
+ }
vsize = im->ysize;
jEnd = hsize;
hsize = im->xsize;
vsize = (int)(0.5 + im->ysize * Value);
+ if (vsize < 1) {
+ vsize = 1;
+ Value = 1.0 / im->ysize;
+ }
+
jEnd = vsize;
iEnd = hsize;
}
mm_log((1,"i_scale_nn(im 0x%x,scx %.2f,scy %.2f)\n",im,scx,scy));
nxsize = (int) ((float) im->xsize * scx);
+ if (nxsize < 1) {
+ nxsize = 1;
+ scx = 1 / im->xsize;
+ }
nysize = (int) ((float) im->ysize * scy);
+ if (nysize < 1) {
+ nysize = 1;
+ scy = 1 / im->ysize;
+ }
new_img=i_img_empty_ch(NULL,nxsize,nysize,im->channels);
/*
=item i_test_format_probe(io_glue *data, int length)
-Cleans up the write buffer.
-
-Will flush any left-over data if I<flush> is non-zero.
-
-Returns non-zero if flush is zero or if info->cb() returns non-zero.
-
-Return zero only if flush is non-zero and info->cb() returns zero.
-ie. if it fails.
+Check the beginning of the supplied file for a 'magic number'
=cut
*/