diff options
Diffstat (limited to 'cpetpet.c')
| -rw-r--r-- | cpetpet.c | 74 |
1 files changed, 74 insertions, 0 deletions
diff --git a/cpetpet.c b/cpetpet.c new file mode 100644 index 0000000..668116a --- /dev/null +++ b/cpetpet.c @@ -0,0 +1,74 @@ +#include <stdarg.h> +#include <stdio.h> + +#include <MagickWand/MagickWand.h> +#include <MagickWand/magick-image.h> +#include <MagickCore/resample.h> +#include <MagickCore/composite.h> +#include <MagickWand/pixel-wand.h> +#include <MagickCore/layer.h> + +#include "config.h" + + +int main(int argc, char **argv) +{ + MagickWand *result, *concat, *hand, *avatar, *edited; + PixelWand *empty; + char filenamebuf[128]; + double squeeze; + double width, height; + double offset_x, offset_y; + + MagickWandGenesis(); + + empty = NewPixelWand(); + + result = NewMagickWand(); + concat = NewMagickWand(); + avatar = NewMagickWand(); + concat = NewMagickWand(); + hand = NewMagickWand(); + + PixelSetColor(empty, "none"); + + MagickSetImageDispose(result, BackgroundDispose); + + MagickReadImage(avatar, "naki.png"); + MagickResizeImage(avatar, 128, 128, Lanczos2Filter); + + for (int i = 0; i < FRAMES; ++i) + { + squeeze = (i < FRAMES/2) ? i : FRAMES - i; + width = 0.8 + squeeze * 0.02; + height = 0.8 - squeeze * 0.05; + offset_x = (1 - width) * 0.5 + 0.1; + offset_y = (1 - height) - 0.08; + snprintf(filenamebuf, sizeof(filenamebuf), SHAREDIR "/pet%d.gif", i); + + edited = CloneMagickWand(avatar); + MagickNewImage(concat, MagickGetImageWidth(avatar), MagickGetImageHeight(avatar), empty); + MagickSetImageDispose(concat, BackgroundDispose); + MagickSetImageDelay(concat, 2); + MagickResizeImage(edited, (double)MagickGetImageWidth(avatar)*width, (double)MagickGetImageHeight(avatar)*height, Lanczos2Filter); + MagickReadImage(hand, filenamebuf); + + MagickCompositeImage(concat, edited, OverCompositeOp, MagickTrue, MagickGetImageWidth(concat)*offset_x, MagickGetImageHeight(concat)*offset_y); + MagickCompositeImage(concat, hand, OverCompositeOp, MagickTrue, 0, 0); + MagickAddImage(result, concat); + + ClearMagickWand(concat); + ClearMagickWand(hand); + } + MagickWriteImages(result, "petpet.gif", MagickTrue); + + DestroyMagickWand(result); + DestroyMagickWand(concat); + DestroyMagickWand(avatar); + DestroyMagickWand(edited); + DestroyMagickWand(hand); + + DestroyPixelWand(empty); + + MagickWandTerminus(); +} |