other resizing methods. git-svn-id: file:///srv/caca.zoy.org/var/lib/svn/libpipi/trunk@4690 92316355-f0b4-4df1-b90c-862c8a59935fmaster
@@ -25,11 +25,12 @@ libpipi_la_SOURCES = \ | |||||
codec.c \ | codec.c \ | ||||
stock.c \ | stock.c \ | ||||
colorstring.c \ | colorstring.c \ | ||||
resize.c \ | crop.c \ | ||||
dither.c \ | dither.c \ | ||||
accessors.c \ | accessors.c \ | ||||
sequence.c \ | sequence.c \ | ||||
$(codec_sources) \ | $(codec_sources) \ | ||||
$(resample_sources) \ | |||||
$(paint_sources) \ | $(paint_sources) \ | ||||
$(render_sources) \ | $(render_sources) \ | ||||
$(combine_sources) \ | $(combine_sources) \ | ||||
@@ -49,6 +50,9 @@ codec_libs = | |||||
codec_sources = \ | codec_sources = \ | ||||
codec/oric.c | codec/oric.c | ||||
resample_sources = \ | |||||
resample/bresenham.c | |||||
paint_sources = \ | paint_sources = \ | ||||
paint/floodfill.c \ | paint/floodfill.c \ | ||||
paint/line.c \ | paint/line.c \ | ||||
@@ -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; | |||||
} | |||||
@@ -239,7 +239,7 @@ | |||||
> | > | ||||
</File> | </File> | ||||
<File | <File | ||||
RelativePath=".\resize.c" | RelativePath=".\crop.c" | ||||
> | > | ||||
</File> | </File> | ||||
<File | <File | ||||
@@ -270,6 +270,14 @@ | |||||
> | > | ||||
</File> | </File> | ||||
</Filter> | </Filter> | ||||
<Filter | |||||
Name="resample" | |||||
> | |||||
<File | |||||
RelativePath=".\resample\bresenham.c" | |||||
> | |||||
</File> | |||||
</Filter> | |||||
<Filter | <Filter | ||||
Name="combine" | Name="combine" | ||||
> | > | ||||
@@ -1,6 +1,6 @@ | |||||
/* | /* | ||||
* libpipi Pathetic image processing interface library | * 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 | * All Rights Reserved | ||||
* | * | ||||
* $Id$ | * $Id$ | ||||
@@ -13,7 +13,7 @@ | |||||
*/ | */ | ||||
/* | /* | ||||
* resize.c: image resizing functions | * bresenham.c: Bresenham image resizing functions | ||||
*/ | */ | ||||
#include "config.h" | #include "config.h" | ||||
@@ -24,6 +24,10 @@ | |||||
#include "pipi.h" | #include "pipi.h" | ||||
#include "pipi_internals.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 | /* FIXME: the algorithm does not handle alpha components properly. Resulting | ||||
* alpha should be the mean alpha value of the neightbouring pixels, but | * alpha should be the mean alpha value of the neightbouring pixels, but | ||||
* the colour components should be weighted with the alpha value. */ | * 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; | 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; | |||||
} | |||||