#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <magick/api.h>

int main(void) {
    unsigned int *pixdata;
    unsigned int *apixdata;

    PixelPacket color;

    ExceptionInfo im_exception;
    GetExceptionInfo(&im_exception);

    Image *base_img = NULL;
    Image *alpha_img = NULL;
    ImageInfo *base_image_info = CloneImageInfo((ImageInfo *) NULL);
    ImageInfo *alpha_image_info = CloneImageInfo((ImageInfo *) NULL);
    DrawInfo *base_di = NULL;
    DrawInfo *alpha_di = NULL;

    char prim[1024];

    pixdata = (unsigned int *) malloc(sizeof(unsigned int) *
                                      (128 * 128));
    apixdata = (unsigned int *) malloc(sizeof(unsigned int) *
                                      (128 * 128));

    base_img = ConstituteImage(128, 128, "RGBA", CharPixel, 
                               pixdata, &im_exception);
    if (base_img == (Image *) NULL) {
        fprintf(stderr, "Imagemagick error:\n");
        MagickError(im_exception.severity, im_exception.reason,
                    im_exception.description);
        exit(1);
    }

    alpha_img = ConstituteImage(128, 128, "I", CharPixel, 
                                apixdata, &im_exception);
    if (alpha_img == (Image *) NULL) {
        fprintf(stderr, "Imagemagick error:\n");
        MagickError(im_exception.severity, im_exception.reason,
                    im_exception.description);
        exit(1);
    }

    alpha_img->matte = (MagickBooleanType) false;

    base_di = CloneDrawInfo(base_image_info, NULL);
    alpha_di = CloneDrawInfo(alpha_image_info, NULL);

    // 1
    QueryColorDatabase("#FFFFFF", &color, &im_exception);
    if (im_exception.severity != UndefinedException) {
        CatchException(&im_exception);
        exit(1);
    }
    alpha_di->fill = color;
    
    snprintf(prim, 1024, "fill-opacity 100%% rectangle 10,10 118,118");
    alpha_di->primitive = prim;

    DrawImage(alpha_img, alpha_di);
    if (im_exception.severity != UndefinedException) {
        CatchException(&im_exception);
        exit(1);
    }
   
    // 2
    QueryColorDatabase("#AAAAAA", &color, &im_exception);
    if (im_exception.severity != UndefinedException) {
        CatchException(&im_exception);
        exit(1);
    }
    alpha_di->fill = color;
    
    snprintf(prim, 1024, "fill-opacity 100%% rectangle 30,30 98,98");
    alpha_di->primitive = prim;

    DrawImage(alpha_img, alpha_di);
    if (im_exception.severity != UndefinedException) {
        CatchException(&im_exception);
        exit(1);
    }

    // Base image 
    QueryColorDatabase("#FF0000", &color, &im_exception);
    if (im_exception.severity != UndefinedException) {
        CatchException(&im_exception);
        exit(1);
    }
    base_di->fill = color;
    
    snprintf(prim, 1024, "fill-opacity 100%% rectangle 0,0 128,128");
    base_di->primitive = prim;

    DrawImage(base_img, base_di);
    if (im_exception.severity != UndefinedException) {
        CatchException(&im_exception);
        exit(1);
    }

    CompositeImage(base_img, CopyOpacityCompositeOp, alpha_img, 0, 0);
    
    strcpy(base_image_info->filename, "foo.png");
    strcpy(base_img->filename, "foo.png");

    WriteImage(base_image_info, base_img);
    DestroyImage(base_img);
    DestroyImage(alpha_img);
    DestroyMagick();
    
}

