Browse Source

Move resize.c to an algorithm-specific file so that we can implement

other resizing methods.

git-svn-id: file:///srv/caca.zoy.org/var/lib/svn/libpipi/trunk@4690 92316355-f0b4-4df1-b90c-862c8a59935f
master
sam 14 years ago
parent
commit
b72179aad9
4 changed files with 88 additions and 46 deletions
  1. +5
    -1
      pipi/Makefile.am
  2. +68
    -0
      pipi/crop.c
  3. +9
    -1
      pipi/libpipi.vcproj
  4. +6
    -44
      pipi/resample/bresenham.c

+ 5
- 1
pipi/Makefile.am View File

@@ -25,11 +25,12 @@ libpipi_la_SOURCES = \
codec.c \
stock.c \
colorstring.c \
resize.c \
crop.c \
dither.c \
accessors.c \
sequence.c \
$(codec_sources) \
$(resample_sources) \
$(paint_sources) \
$(render_sources) \
$(combine_sources) \
@@ -49,6 +50,9 @@ codec_libs =
codec_sources = \
codec/oric.c

resample_sources = \
resample/bresenham.c

paint_sources = \
paint/floodfill.c \
paint/line.c \


+ 68
- 0
pipi/crop.c View File

@@ -0,0 +1,68 @@
/*
* libpipi Pathetic image processing interface library
* Copyright (c) 2004-2009 Sam Hocevar <sam@hocevar.net>
* All Rights Reserved
*
* $Id$
*
* This library is free software. It comes without any warranty, to
* the extent permitted by applicable law. You can redistribute it
* and/or modify it under the terms of the Do What The Fuck You Want
* To Public License, Version 2, as published by Sam Hocevar. See
* http://sam.zoy.org/wtfpl/COPYING for more details.
*/

/*
* crop.c: image cropping functions
*/

#include "config.h"

#include <stdlib.h>
#include <string.h>

#include "pipi.h"
#include "pipi_internals.h"

pipi_image_t *pipi_crop(pipi_image_t *src, int w, int h, int dx, int dy)
{
float *srcdata, *dstdata;
pipi_image_t *dst;
pipi_pixels_t *srcp, *dstp;
int y, off, len;

srcp = pipi_get_pixels(src, PIPI_PIXELS_RGBA_F32);
srcdata = (float *)srcp->pixels;

dst = pipi_new(w, h);
dstp = pipi_get_pixels(dst, PIPI_PIXELS_RGBA_F32);
dstdata = (float *)dstp->pixels;

off = dx;
len = w;

if(dx < 0)
{
len += dx;
dx = 0;
}

if(dx + len > srcp->w)
len = srcp->w - dx;

if(len > 0)
{
for(y = 0; y < h; y++)
{
if(y + dy < 0 || y + dy >= srcp->h)
continue;

memcpy(dstdata + y * w * 4,
srcdata + ((y + dy) * srcp->w + dx) * 4,
len * 4 * sizeof(float));
}
}

return dst;
}


+ 9
- 1
pipi/libpipi.vcproj View File

@@ -239,7 +239,7 @@
>
</File>
<File
RelativePath=".\resize.c"
RelativePath=".\crop.c"
>
</File>
<File
@@ -270,6 +270,14 @@
>
</File>
</Filter>
<Filter
Name="resample"
>
<File
RelativePath=".\resample\bresenham.c"
>
</File>
</Filter>
<Filter
Name="combine"
>


pipi/resize.c → pipi/resample/bresenham.c View File

@@ -1,6 +1,6 @@
/*
* libpipi Pathetic image processing interface library
* Copyright (c) 2004-2008 Sam Hocevar <sam@zoy.org>
* Copyright (c) 2004-2009 Sam Hocevar <sam@hocevar.net>
* All Rights Reserved
*
* $Id$
@@ -13,7 +13,7 @@
*/

/*
* resize.c: image resizing functions
* bresenham.c: Bresenham image resizing functions
*/

#include "config.h"
@@ -24,6 +24,10 @@
#include "pipi.h"
#include "pipi_internals.h"

/* This is Bresenham resizing. I rediscovered it independently but it was
* actually first described in 1995 by Tim Kientzle in "Scaling Bitmaps
* with Bresenham". */

/* FIXME: the algorithm does not handle alpha components properly. Resulting
* alpha should be the mean alpha value of the neightbouring pixels, but
* the colour components should be weighted with the alpha value. */
@@ -123,45 +127,3 @@ pipi_image_t *pipi_resize(pipi_image_t *src, int w, int h)
return dst;
}

pipi_image_t *pipi_crop(pipi_image_t *src, int w, int h, int dx, int dy)
{
float *srcdata, *dstdata;
pipi_image_t *dst;
pipi_pixels_t *srcp, *dstp;
int y, off, len;

srcp = pipi_get_pixels(src, PIPI_PIXELS_RGBA_F32);
srcdata = (float *)srcp->pixels;

dst = pipi_new(w, h);
dstp = pipi_get_pixels(dst, PIPI_PIXELS_RGBA_F32);
dstdata = (float *)dstp->pixels;

off = dx;
len = w;

if(dx < 0)
{
len += dx;
dx = 0;
}

if(dx + len > srcp->w)
len = srcp->w - dx;

if(len > 0)
{
for(y = 0; y < h; y++)
{
if(y + dy < 0 || y + dy >= srcp->h)
continue;

memcpy(dstdata + y * w * 4,
srcdata + ((y + dy) * srcp->w + dx) * 4,
len * 4 * sizeof(float));
}
}

return dst;
}


Loading…
Cancel
Save