/*
	Data for "ball" Image
*/
#include <stdio.h>
#include <stdlib.h>

#include <clib/exec_protos.h>
#include <clib/intuition_protos.h>
#include <clib/graphics_protos.h>

#include <pragmas/exec_pragmas.h>
#include <pragmas/intuition_pragmas.h>
#include <pragmas/graphics_pragmas.h>

#include <exec/types.h>
#include <intuition/intuition.h>
#include <intuition/intuitionbase.h>

#include <graphics/gfx.h>

#include "BlueBall.h"
#include "GreenBall.h"
#include "RedBall.h"
#include "BallMaske.h"

ULONG BallPaletteRGB32[768] =
{
	0x95555555,0x95555555,0x95555555,
	0x00000000,0x00000000,0x00000000,
	0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF,
	0x3BBBBBBB,0x67777777,0xA2222222,
	0x7BBBBBBB,0x7BBBBBBB,0x7BBBBBBB,
	0xAFFFFFFF,0xAFFFFFFF,0xAFFFFFFF,
	0xAAAAAAAA,0x90000000,0x7CCCCCCC,
	0xFFFFFFFF,0xA9999999,0x97777777,
	0x66666666,0x22222222,0x00000000,
	0xEEEEEEEE,0x55555555,0x00000000,
	0x99999999,0xFFFFFFFF,0x11111111,
	0xEEEEEEEE,0xBBBBBBBB,0x00000000,
	0x55555555,0x55555555,0xFFFFFFFF,
	0x99999999,0x22222222,0xFFFFFFFF,
	0x00000000,0xFFFFFFFF,0x88888888,
	0xCCCCCCCC,0xCCCCCCCC,0xCCCCCCCC,
	0x00000000,0x00000000,0x00000000,
	0xEEEEEEEE,0x44444444,0x44444444,
	0x00000000,0x00000000,0x00000000,
	0xEEEEEEEE,0xEEEEEEEE,0xCCCCCCCC,
	0x44444444,0x44444444,0x44444444,
	0x55555555,0x55555555,0x55555555,
	0x66666666,0x66666666,0x66666666,
	0x77777777,0x77777777,0x77777777,
	0x88888888,0x88888888,0x88888888,
	0x99999999,0x99999999,0x99999999,
	0xAAAAAAAA,0xAAAAAAAA,0xAAAAAAAA,
	0xBBBBBBBB,0xBBBBBBBB,0xBBBBBBBB,
	0xCCCCCCCC,0xCCCCCCCC,0xCCCCCCCC,
	0xDDDDDDDD,0xDDDDDDDD,0xDDDDDDDD,
	0xEEEEEEEE,0xEEEEEEEE,0xEEEEEEEE,
	0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF,
	0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF,
	0x88888888,0x88888888,0x88888888,
	0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF,
	0xCCCCCCCC,0xCCCCCCCC,0xCCCCCCCC,
	0x44444444,0x44444444,0x44444444,
	0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF,
	0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF,
	0x88888888,0xFFFFFFFF,0xFFFFFFFF,
	0x44444444,0x88888888,0x88888888,
	0xCCCCCCCC,0xFFFFFFFF,0xFFFFFFFF,
	0x66666666,0xCCCCCCCC,0xCCCCCCCC,
	0x22222222,0x44444444,0x44444444,
	0xAAAAAAAA,0xFFFFFFFF,0xFFFFFFFF,
	0xEEEEEEEE,0xFFFFFFFF,0xFFFFFFFF,
	0xCCCCCCCC,0xFFFFFFFF,0xFFFFFFFF,
	0x66666666,0x88888888,0x88888888,
	0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF,
	0x99999999,0xCCCCCCCC,0xCCCCCCCC,
	0x33333333,0x44444444,0x44444444,
	0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF,
	0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF,
	0x44444444,0xFFFFFFFF,0xFFFFFFFF,
	0x22222222,0x88888888,0x88888888,
	0x66666666,0xFFFFFFFF,0xFFFFFFFF,
	0x33333333,0xCCCCCCCC,0xCCCCCCCC,
	0x11111111,0x44444444,0x44444444,
	0x55555555,0xFFFFFFFF,0xFFFFFFFF,
	0x77777777,0xFFFFFFFF,0xFFFFFFFF,
	0xFFFFFFFF,0x88888888,0xFFFFFFFF,
	0x88888888,0x44444444,0x88888888,
	0xFFFFFFFF,0xCCCCCCCC,0xFFFFFFFF,
	0xCCCCCCCC,0x66666666,0xCCCCCCCC,
	0x44444444,0x22222222,0x44444444,
	0xFFFFFFFF,0xAAAAAAAA,0xFFFFFFFF,
	0xFFFFFFFF,0xEEEEEEEE,0xFFFFFFFF,
	0x88888888,0x88888888,0xFFFFFFFF,
	0x44444444,0x44444444,0x88888888,
	0xCCCCCCCC,0xCCCCCCCC,0xFFFFFFFF,
	0x66666666,0x66666666,0xCCCCCCCC,
	0x22222222,0x22222222,0x44444444,
	0x00000000,0xF0000000,0xC0000000,
	0x00000000,0xF0000000,0xD0000000,
	0x10000000,0xF0000000,0x00000000,
	0x10000000,0x20000000,0x00000000,
	0x20000000,0x40000000,0x00000000,
	0x20000000,0x20000000,0x00000000,
	0x20000000,0xF0000000,0x00000000,
	0x30000000,0xF0000000,0x00000000,
	0x40000000,0x10000000,0x00000000,
	0x40000000,0x20000000,0x00000000,
	0x40000000,0x30000000,0x00000000,
	0x50000000,0x20000000,0x00000000,
	0x50000000,0x30000000,0x00000000,
	0x50000000,0x40000000,0x00000000,
	0x50000000,0x50000000,0x00000000,
	0x50000000,0xF0000000,0x00000000,
	0x40000000,0xF0000000,0x00000000,
	0x50000000,0xB0000000,0x00000000,
	0x40000000,0xD0000000,0x00000000,
	0x60000000,0xD0000000,0x00000000,
	0x60000000,0x70000000,0x00000000,
	0x70000000,0xF0000000,0x00000000,
	0x80000000,0xA0000000,0x00000000,
	0x90000000,0x40000000,0x00000000,
	0x90000000,0x50000000,0x00000000,
	0x90000000,0x60000000,0x00000000,
	0x90000000,0x80000000,0x00000000,
	0x90000000,0xF0000000,0x00000000,
	0xA0000000,0xF0000000,0x00000000,
	0xA0000000,0x40000000,0x00000000,
	0x70000000,0x30000000,0x00000000,
	0x70000000,0xB0000000,0x00000000,
	0xA0000000,0x50000000,0x00000000,
	0x80000000,0xF0000000,0x00000000,
	0xA0000000,0x80000000,0x00000000,
	0xB0000000,0x50000000,0x00000000,
	0xB0000000,0xB0000000,0x00000000,
	0xB0000000,0x70000000,0x00000000,
	0xB0000000,0x80000000,0x00000000,
	0xD0000000,0xF0000000,0x00000000,
	0xD0000000,0x50000000,0x00000000,
	0xD0000000,0x70000000,0x00000000,
	0xD0000000,0x90000000,0x00000000,
	0xE0000000,0xF0000000,0x00000000,
	0xF0000000,0x60000000,0x00000000,
	0xF0000000,0x70000000,0x00000000,
	0xF0000000,0x90000000,0x00000000,
	0xF0000000,0xA0000000,0x00000000,
	0xF0000000,0xD0000000,0x00000000,
	0xB0000000,0xA0000000,0x00000000,
	0xF0000000,0xC0000000,0x00000000,
	0xF0000000,0xE0000000,0x00000000,
	0xD0000000,0xB0000000,0x00000000,
	0xF0000000,0x80000000,0xF0000000,
	0xB0000000,0xF0000000,0x00000000,
	0xB0000000,0x40000000,0x00000000,
	0x10000000,0x40000000,0x40000000,
	0x30000000,0xC0000000,0xC0000000,
	0xB0000000,0x60000000,0x00000000,
	0x20000000,0x80000000,0x80000000,
	0x40000000,0xF0000000,0xF0000000,
	0x90000000,0xC0000000,0xC0000000,
	0x60000000,0x80000000,0x80000000,
	0xC0000000,0xF0000000,0x00000000,
	0x20000000,0x70000000,0x00000000,
	0x10000000,0xB0000000,0x00000000,
	0x20000000,0x10000000,0x00000000,
	0x80000000,0xF0000000,0xF0000000,
	0x90000000,0x20000000,0xF0000000,
	0x60000000,0xF0000000,0x00000000,
	0xE0000000,0x50000000,0x00000000,
	0x00000000,0xF0000000,0xB0000000,
	0x00000000,0xF0000000,0x80000000,
	0x00000000,0x40000000,0x90000000,
	0x90000000,0x50000000,0xA0000000,
	0x00000000,0xF0000000,0xA0000000,
	0xF0000000,0xF0000000,0x00000000,
	0xC0000000,0x20000000,0x00000000,
	0x00000000,0xA0000000,0xD0000000,
	0x00000000,0xA0000000,0x50000000,
	0x00000000,0xF0000000,0x50000000,
	0xE0000000,0xA0000000,0x40000000,
	0x00000000,0xC0000000,0x00000000,
	0xF0000000,0x80000000,0x00000000,
	0xF0000000,0x00000000,0xF0000000,
	0x00000000,0xF0000000,0x60000000,
	0x80000000,0x80000000,0x00000000,
	0x00000000,0x40000000,0x20000000,
	0x00000000,0xF0000000,0x70000000,
	0x00000000,0x40000000,0x30000000,
	0x00000000,0x40000000,0x50000000,
	0x00000000,0x40000000,0x70000000,
	0x00000000,0x50000000,0x50000000,
	0x00000000,0x50000000,0x30000000,
	0x00000000,0x60000000,0xA0000000,
	0x00000000,0x60000000,0xB0000000,
	0x00000000,0x70000000,0x90000000,
	0x00000000,0x70000000,0xA0000000,
	0x00000000,0x70000000,0xD0000000,
	0x00000000,0x70000000,0x00000000,
	0x00000000,0x70000000,0x40000000,
	0x00000000,0x80000000,0xB0000000,
	0x00000000,0x80000000,0x90000000,
	0x00000000,0x80000000,0xF0000000,
	0x00000000,0x90000000,0xF0000000,
	0x00000000,0xA0000000,0xB0000000,
	0x00000000,0xA0000000,0xF0000000,
	0x00000000,0xA0000000,0x80000000,
	0x00000000,0xB0000000,0xF0000000,
	0x00000000,0xB0000000,0x10000000,
	0x00000000,0xB0000000,0x40000000,
	0x00000000,0xB0000000,0xD0000000,
	0x00000000,0xB0000000,0x80000000,
	0x00000000,0xB0000000,0x90000000,
	0x00000000,0xC0000000,0xF0000000,
	0x00000000,0xC0000000,0xD0000000,
	0x00000000,0xD0000000,0xF0000000,
	0x00000000,0xD0000000,0x10000000,
	0x00000000,0xD0000000,0x40000000,
	0x00000000,0xD0000000,0xB0000000,
	0x00000000,0xE0000000,0xF0000000,
	0x00000000,0xF0000000,0xE0000000,
	0x00000000,0xF0000000,0xF0000000,
	0x00000000,0xF0000000,0x00000000,
	0x00000000,0xF0000000,0x10000000,
	0x00000000,0xF0000000,0x20000000,
	0x00000000,0x50000000,0xB0000000,
	0x00000000,0xF0000000,0x30000000,
	0x00000000,0x30000000,0x50000000,
	0x00000000,0x20000000,0x00000000,
	0xA0000000,0xB0000000,0x10000000,
	0x00000000,0x00000000,0x80000000,
	0x20000000,0x50000000,0x90000000,
	0x40000000,0xF0000000,0x30000000,
	0x00000000,0xF0000000,0x40000000,
	0x00000000,0xF0000000,0x90000000,
	0x90000000,0x60000000,0x30000000,
	0x70000000,0x00000000,0x70000000,
	0x40000000,0x40000000,0x10000000,
	0x50000000,0x10000000,0x00000000,
	0xA0000000,0x90000000,0x80000000,
	0xC0000000,0xA0000000,0x70000000,
	0x90000000,0x80000000,0x60000000,
	0xA0000000,0x90000000,0x60000000,
	0xA0000000,0xA0000000,0x90000000,
	0xF0000000,0xE0000000,0xA0000000,
	0x60000000,0xA0000000,0x60000000,
	0x50000000,0x70000000,0xB0000000,
	0x10000000,0x40000000,0xA0000000,
	0x30000000,0x60000000,0xC0000000,
	0x20000000,0x40000000,0x80000000,
	0xC0000000,0xF0000000,0xF0000000,
	0xE0000000,0xE0000000,0xE0000000,
	0xB0000000,0xB0000000,0xB0000000,
	0x50000000,0x50000000,0x50000000,
	0x60000000,0x80000000,0xB0000000,
	0x30000000,0x70000000,0x50000000,
	0xC0000000,0x30000000,0xB0000000,
	0xB0000000,0x30000000,0x20000000,
	0x30000000,0x30000000,0x30000000,
	0xC0000000,0xC0000000,0xC0000000,
	0x30000000,0x80000000,0x30000000,
	0xF0000000,0xB0000000,0x00000000,
	0xD0000000,0x30000000,0x30000000,
	0xD0000000,0xB0000000,0x40000000,
	0xF0000000,0x50000000,0x50000000,
	0x00000000,0x40000000,0xA0000000,
	0x50000000,0x80000000,0xB0000000,
	0x60000000,0x60000000,0x60000000,
	0x00000000,0x60000000,0x90000000,
	0x80000000,0x80000000,0x80000000,
	0x90000000,0xA0000000,0xC0000000,
	0x80000000,0x90000000,0xB0000000,
	0x70000000,0x80000000,0xA0000000,
	0x60000000,0x70000000,0x90000000,
	0x50000000,0x60000000,0x80000000,
	0x40000000,0x50000000,0x70000000,
	0xE0000000,0xB0000000,0x90000000,
	0xF0000000,0xD0000000,0xB0000000,
	0xC0000000,0x90000000,0x70000000,
	0x7BBBBBBB,0x7BBBBBBB,0x7BBBBBBB,
	0xAFFFFFFF,0xAFFFFFFF,0xAFFFFFFF,
	0xAAAAAAAA,0x90000000,0x7CCCCCCC,
	0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF
};


// Convert it:

extern void __asm CopyPlane2Chunky(register __a2 APTR planes,register __a3 APTR chunky,
                                   register __d6 WORD depth,register __d7 long BMSize);
struct Library *GfxBase = NULL;
struct IntuitionBase *IntuitionBase = NULL;
USHORT class;	/* Intu event class */
USHORT code;	/* Intu event code */
struct IntuiMessage *message;

#define PLANESIZE    128
#define IMAGE_WIDTH  32  
#define IMAGE_HEIGHT 32
#define IMAGE_DEPTH  8   // 8 planes

void main()
{
    FILE *fdata;
    int idx;
    int i,w,h;
    UBYTE *buffer;
    UBYTE *ChunkyData;
    UBYTE *Planes[8];
    char *Name[]  = { "RedBall","GreenBall", "BlueBall" };
    UBYTE *Image,*ImageArray[] = { (UBYTE*)RedBallData, (UBYTE*)GreenBallData, (UBYTE*)BlueBallData };
    UBYTE pens[256],pen,black;
    ULONG pixels;
    struct Window *win;
    ULONG sig,bits;
    BOOL out = FALSE;
    struct RastPort tmpRastPort;
    struct BitMap *RedBall,*GreenBall,*BlueBall,*MaskBall,*MaskBuffer;
    struct BitMap *BitMaps[3];

    if ((GfxBase = OpenLibrary("graphics.library",0)) &&
        (IntuitionBase = (struct IntuitionBase*)OpenLibrary("intuition.library",0)))
    {
        if (win = OpenWindowTags(NULL,
                                WA_Title, "Check this out!",
                                WA_AutoAdjust,TRUE,
                                WA_InnerWidth,  640,
                                WA_InnerHeight, 400,
                                WA_MaxWidth,2000,
                                WA_MaxHeight,2000,
                                WA_MinWidth,10,
                                WA_MinHeight,10,
                                WA_DragBar, TRUE,
                                WA_CloseGadget, TRUE,
                                WA_DepthGadget,TRUE,
                                WA_Borderless,  FALSE,
                                WA_GimmeZeroZero, TRUE,
                                WA_SimpleRefresh, TRUE,
//                                WA_SmartRefresh, TRUE,
                                WA_SizeGadget,TRUE,
                                WA_IDCMP,IDCMP_CLOSEWINDOW | IDCMP_NEWSIZE,
                                TAG_DONE))
            {
                black = ObtainBestPen(win->WScreen->ViewPort.ColorMap,0,0,0,TAG_DONE);
                SetAPen(win->RPort,black);
                RectFill(win->RPort,0,0,win->Width,win->Height);

                printf("Obtaining pens...");
                for (idx = 0 , pen = 0; idx < 768; pen++,idx += 3)
                {
                    pens[pen] = ObtainBestPen(win->WScreen->ViewPort.ColorMap,
                            BallPaletteRGB32[idx + 0],
                            BallPaletteRGB32[idx + 1],
                            BallPaletteRGB32[idx + 2],
                            OBP_Precision,PRECISION_EXACT,
                            TAG_DONE);
               }
               puts("done.");
            }
    }

    // the Mask is a window friend
    MaskBall   = AllocBitMap(MASK_WIDTH,MASK_HEIGHT,MASK_DEPTH,BMF_MINPLANES,win->RPort->BitMap);
    // but I have to convert it first - WITHOUT MAPPING !!
    MaskBuffer = AllocBitMap(MASK_WIDTH,MASK_HEIGHT,MASK_DEPTH,BMF_MINPLANES,NULL);

    // the source array is WORD aligned, therefore I have PLANESIZE/2 here !
    MaskBuffer->Planes[0] = (PLANEPTR)&BallMaskeData[0*(PLANESIZE>>1)];
    MaskBuffer->Planes[1] = (PLANEPTR)&BallMaskeData[1*(PLANESIZE>>1)];
    MaskBuffer->Planes[2] = (PLANEPTR)&BallMaskeData[2*(PLANESIZE>>1)];
    MaskBuffer->Planes[3] = (PLANEPTR)&BallMaskeData[3*(PLANESIZE>>1)];
    MaskBuffer->Planes[4] = (PLANEPTR)&BallMaskeData[4*(PLANESIZE>>1)];
    MaskBuffer->Planes[5] = (PLANEPTR)&BallMaskeData[5*(PLANESIZE>>1)];
    MaskBuffer->Planes[6] = (PLANEPTR)&BallMaskeData[6*(PLANESIZE>>1)];
    MaskBuffer->Planes[7] = (PLANEPTR)&BallMaskeData[7*(PLANESIZE>>1)];

    // now convert the bitmap into a window friend format
    BltBitMap(MaskBuffer,0,0,MaskBall,0,0,MASK_WIDTH,MASK_HEIGHT,0xC0,0xff,0);
    // wait for the blitter
    WaitBlit();
    // and free the buffer again
    FreeBitMap(MaskBuffer);

    WaitTOF();
    BltBitMapRastPort(MaskBall,0,0,win->RPort,0,0,MASK_WIDTH,MASK_HEIGHT,0x60);
    WaitTOF();
    WaitBlit();
    BltBitMapRastPort(MaskBall,0,0,win->RPort,32,0,MASK_WIDTH,MASK_HEIGHT,0x60);
    WaitTOF();
    WaitBlit();
    BltBitMapRastPort(MaskBall,0,0,win->RPort,64,0,MASK_WIDTH,MASK_HEIGHT,0x60);
    WaitTOF();
    
    RedBall   = AllocBitMap(RED_WIDTH,RED_HEIGHT,RED_DEPTH,0,win->RPort->BitMap);
    GreenBall = AllocBitMap(GREEN_WIDTH,GREEN_HEIGHT,GREEN_DEPTH,0,win->RPort->BitMap);
    BlueBall  = AllocBitMap(BLUE_WIDTH,BLUE_HEIGHT,BLUE_DEPTH,0,win->RPort->BitMap);

    // we clone the windows rastport and set the layer to NULL
    CopyMem(win->RPort,&tmpRastPort,sizeof(struct RastPort));
    tmpRastPort.Layer = NULL;
    BitMaps[0] = RedBall;
    BitMaps[1] = GreenBall;
    BitMaps[2] = BlueBall;

// --------

    // we need a chunky buffer, we need it only once because of the same size
    if (!(ChunkyData = AllocVec(IMAGE_WIDTH * IMAGE_HEIGHT, 0))) return;

    for (i = 0; i < 3 ; i++) // 2 images
    { 
        Image = ImageArray[i];
        Planes[0] = (PLANEPTR)&Image[0*PLANESIZE];
        Planes[1] = (PLANEPTR)&Image[1*PLANESIZE];
        Planes[2] = (PLANEPTR)&Image[2*PLANESIZE];
        Planes[3] = (PLANEPTR)&Image[3*PLANESIZE];
        Planes[4] = (PLANEPTR)&Image[4*PLANESIZE];
        Planes[5] = (PLANEPTR)&Image[5*PLANESIZE];
        Planes[6] = (PLANEPTR)&Image[6*PLANESIZE];
        Planes[7] = (PLANEPTR)&Image[7*PLANESIZE];
    
        printf("Converting plane to chunky ...");
        fflush(stdout);

        // I use my own chunky converter.
        // well, this thing is really old, but does it's job...also there is something wrong...
        buffer = ChunkyData;
        CopyPlane2Chunky(&Planes,buffer,IMAGE_DEPTH, PLANESIZE); // 2*wordsize = bytesize
        puts("done.");

        // look what we've done:
        if (win)
        {
            // now we remap the chunky ball to the windows colors
            printf("remapping image..");
            pixels = IMAGE_WIDTH * IMAGE_HEIGHT;
            while (pixels--)
            {
                pen = (ChunkyData[pixels]);
                ChunkyData[pixels] = pens[pen];
            }
            puts("done");
            // here we convert the remaped chunky image to a friend bitmap of the window
            // we use a temporary rastport here where we install the previous allocated
            // ball bitmaps. We use WriteChunkyPixels() here, so it will be converted
            // to the correct format ! This could also be a chunky format !
            tmpRastPort.BitMap = BitMaps[i];
            WriteChunkyPixels(&tmpRastPort,0,0,IMAGE_WIDTH-1,IMAGE_HEIGHT-1,ChunkyData,IMAGE_WIDTH);

            // check out if we are really there
            BltBitMapRastPort(BitMaps[i],0,0,win->RPort,i*IMAGE_WIDTH,0,IMAGE_WIDTH,IMAGE_HEIGHT,0x80);
        }
    }
    printf("finished.\n");

    // we don't need the chunky puffer any more, so dispose it
    if (ChunkyData)  FreeVec(ChunkyData);

    if (win) 
    {
        sig = (1L<<win->UserPort->mp_SigBit);
        while (!out)
        {
            bits = Wait(sig);
    	    if (bits)
           	{
    	        if (message = (struct IntuiMessage *)GetMsg(win->UserPort))
       	    	{
        	        class = message->Class;
	                code  = message->Code;
        	        ReplyMsg((struct Message *)message);
                    switch(class)
        	        {
   	        		    case CLOSEWINDOW:
                            out = TRUE;
                            break;
		    	        case NEWSIZE:
                            RectFill(win->RPort,0,0,win->Width,win->Height);
                            break;
                        default :
                            break;
           		    }
                }
            }
        }
        CloseWindow(win);
    }
    // now we want to free the bitmaps again
    if (RedBall)   FreeBitMap(RedBall);
    if (GreenBall) FreeBitMap(GreenBall);
    if (BlueBall)  FreeBitMap(BlueBall);
    if (MaskBall)  FreeBitMap(MaskBall);


    if (GfxBase) CloseLibrary(GfxBase);
    if (IntuitionBase) CloseLibrary(IntuitionBase);

    exit(0);
}
