home *** CD-ROM | disk | FTP | other *** search
/ AmigActive 6 / AACD06.ISO / AACD / Programming / ImageManager / Examples / AlphaBlend.c < prev    next >
C/C++ Source or Header  |  2000-01-27  |  7KB  |  257 lines

  1. #include <math.h>
  2. #include <stdio.h>
  3. #include <proto/exec.h>
  4. #include <proto/cybergraphics.h>
  5. #include <proto/graphics.h>
  6. #include <proto/imagemanager.h>
  7. #include <proto/intuition.h>
  8. #include <proto/utility.h>
  9. #include <exec/memory.h>
  10. #include <libraries/cybergraphics.h>
  11.  
  12. #ifndef REG
  13. #define REG(x) register __ ## x
  14. #endif
  15.  
  16. struct Library *ImageManagerBase, *CyberGfxBase;
  17. VOID _INIT_7_CGX () { CyberGfxBase = OpenLibrary("cybergraphics.library", 0); }
  18. VOID _EXIT_7_CGX () { CloseLibrary(CyberGfxBase); }
  19.  
  20. struct ColourEntry
  21. {
  22.     UBYTE R, G, B, A;
  23.  
  24.     VOID Init (ULONG *table)
  25.     {
  26.         R = *table++ >> 24; G = *table++ >> 24; B = *table >> 24;
  27.     }
  28.  
  29.     VOID Mix (UWORD blend, struct ColourEntry &other)
  30.     {
  31.         UWORD i_blend = (1<<16)-1 - blend;
  32.         R = (R * i_blend + other.R * blend) >> 16;
  33.         G = (G * i_blend + other.G * blend) >> 16;
  34.         B = (B * i_blend + other.B * blend) >> 16;
  35.     }
  36. };
  37.  
  38. struct InstanceData
  39. {
  40.     ULONG Height;
  41.     struct Window **Win;
  42.     struct ColourEntry *RGBBuffer, Palette[256], *Dst;
  43.     UBYTE *Sinus;
  44.     struct RastPort TmpRP;
  45.     BOOL LowColour;
  46. };
  47.  
  48. #define IMA_MyClass_WindowPnt (TAG_USER+0x100000)
  49.  
  50. ULONG Dispatcher (REG(a0) struct IClass *cl, REG(a2) Object *obj, REG(a1) Msg msg)
  51. {
  52.     ULONG result = FALSE;
  53.     struct InstanceData *data = (InstanceData *)INST_DATA(cl, obj);
  54.  
  55.     switch(msg->MethodID)
  56.     {
  57.         case OM_NEW:
  58.         {
  59.             if(obj = (Object *)(result = DoSuperMethodA(cl, obj, msg)))
  60.             {
  61.                 data = (InstanceData *)INST_DATA(cl, obj);
  62.                 data->Win = (Window **)GetTagData(IMA_MyClass_WindowPnt, NULL, ((opSet *)msg)->ops_AttrList);
  63.             }
  64.         }
  65.         break;
  66.  
  67.         case IMM_NewFrame:
  68.         {
  69.             struct IMP_NewFrame *nmsg = (IMP_NewFrame *)msg;
  70.  
  71.             ULONG width = nmsg->Width;
  72.             data->Height = nmsg->Height;
  73.  
  74.             result = DoSuperMethodA(cl, obj, msg);
  75.  
  76.             if(data->Sinus = new UBYTE [width])
  77.             {
  78.                 for(ULONG x = 0; x < width; x++)
  79.                     data->Sinus[x] = 255 * sin(((DOUBLE)x) * PI / ((DOUBLE)width));
  80.  
  81.                 data->RGBBuffer = new ColourEntry [width];
  82.                 if(!CyberGfxBase || GetBitMapAttr((*data->Win)->RPort->BitMap, BMA_DEPTH) <= 8)
  83.                 {
  84.                     data->LowColour = TRUE;
  85.  
  86.                     data->TmpRP = *(*data->Win)->RPort;
  87.                     data->TmpRP.Layer = NULL;
  88.                     data->TmpRP.BitMap = AllocBitMap((width+15) & ~15, 1, 8, 0L, NULL);
  89.  
  90.                     struct ColorMap *cmap = (*data->Win)->WScreen->ViewPort.ColorMap;
  91.                     for(ULONG col = 0; col < 256; col++)
  92.                     {
  93.                         ULONG table[3];
  94.                         GetRGB32(cmap, col, 1, table);
  95.                         data->Palette[col].Init(table);
  96.                     }
  97.                 }
  98.  
  99. //                if(data->RGBBuffer && (!data->LowColour || data->TmpRP.BitMap))
  100.             }
  101.         }
  102.         break;
  103.  
  104.         case IMM_Abort:
  105.         case IMM_EndFrame:
  106.         {
  107.             delete data->Sinus;
  108.             delete data->RGBBuffer;
  109.             FreeBitMap(data->TmpRP.BitMap);
  110.             result = DoSuperMethodA(cl, obj, msg);
  111.         }
  112.         break;
  113.  
  114.         case IMM_ReceiveData:
  115.         {
  116.             struct IMP_ReceiveData *rmsg = (IMP_ReceiveData *)msg;
  117.             if(rmsg->Pixels.Flags & IMF_ReceiveData_Draft)
  118.             {
  119.                 result = TRUE;
  120.             }
  121.             else
  122.             {
  123.                 ULONG width = rmsg->Pixels.Width, y = rmsg->Pixels.Y;
  124.                 rmsg->Pixels.Height = 1;
  125.                 struct Window *win = *data->Win;
  126.  
  127.                 if(data->LowColour)
  128.                 {
  129.                     UBYTE *store = ((UBYTE *)data->RGBBuffer)+3*width;
  130.                     ReadPixelLine8(win->RPort, win->BorderLeft, win->BorderTop+y, width, store, &data->TmpRP);
  131.  
  132.                     ULONG *rgb = (ULONG *)data->RGBBuffer, *palette = (ULONG *)data->Palette;
  133.                     for(ULONG x = 0; x < width; x++)
  134.                         *rgb++ = palette[store[x]];
  135.                 }
  136.                 else
  137.                 {
  138.                     ReadPixelArray(data->RGBBuffer, 0, 0, 0, win->RPort, win->BorderLeft, win->BorderTop+y, width, 1, RECTFMT_RGBA);
  139.                 }
  140.  
  141.                 struct ColourEntry *buf = (ColourEntry *)rmsg->Pixels.RGBA;
  142.                 UWORD y_blend = 255 * sin(((DOUBLE)y) * PI / ((DOUBLE)data->Height));
  143.                 for(ULONG x = 0; x < width; x++)
  144.                     data->RGBBuffer[x].Mix(y_blend * data->Sinus[x], buf[x]);
  145.                 rmsg->Pixels.RGBA = (ULONG *)data->RGBBuffer;
  146.  
  147.                 result = DoSuperMethodA(cl, obj, msg);
  148.             }
  149.         }
  150.         break;
  151.  
  152.         default:
  153.             result = DoSuperMethodA(cl, obj, msg);
  154.         break;
  155.     }
  156.     return result;
  157. }
  158.  
  159. ULONG MyHookCode (REG(a0) struct Hook *hook, REG(a1) struct IMP_NewFrame *msg, REG(a2) Object *obj)
  160. {
  161.     ULONG result = FALSE;
  162.     switch(msg->MethodID)
  163.     {
  164.         case IMM_NewFrame:
  165.         {
  166.             struct Window *win;
  167.             struct Screen *scr = (Screen *)hook->h_Data;
  168.             if(hook->h_Data = win = OpenWindowTags(NULL, WA_Title, hook->h_SubEntry, WA_PubScreen, scr, WA_Activate, TRUE, WA_IDCMP, IDCMP_CLOSEWINDOW, WA_CloseGadget, TRUE, WA_DragBar, TRUE, WA_DepthGadget, TRUE, WA_InnerWidth, msg->Width, WA_InnerHeight, msg->Height, WA_BackFill, LAYERS_NOBACKFILL, TAG_DONE))
  169.             {
  170.                 Object *raster;
  171.                 if(GetAttr(IMA_Next, obj, (ULONG *)&raster), raster)
  172.                     SetAttrs(raster, IMA_Raster_RastPort, win->RPort, IMA_Raster_Left, win->BorderLeft, IMA_Raster_Top, win->BorderTop, TAG_DONE);
  173.                 result = TRUE;
  174.             }
  175.             UnlockPubScreen(NULL, scr);
  176.         }
  177.         break;
  178.  
  179.         case IMM_ReceiveData:
  180.         {
  181.             struct Window *win = (Window *)hook->h_Data;
  182.             result = !(SetSignal(0L, 0L) & (1 << win->UserPort->mp_SigBit));
  183.         }
  184.         break;
  185.     }
  186.     return result;
  187. }
  188.  
  189. int main (int argc, char **argv)
  190. {
  191.     if(ImageManagerBase = OpenLibrary("ImageManager.library", 1))
  192.     {
  193.         STRPTR filename = argc == 2 ? argv[1] : "Download:/«99.03.02»/001_ScrollBarGrab.PNG";
  194.  
  195.         struct IClass *myclass, *superclass = IM_GetClass("Link");
  196.         if(superclass && (myclass = MakeClass(NULL, NULL, superclass, sizeof(InstanceData), 0L)))
  197.         {
  198.             myclass->cl_Dispatcher.h_Entry = (HOOKFUNC)Dispatcher;
  199.  
  200.             struct Screen *scr = LockPubScreen(NULL);
  201.             struct Hook MyHook = { { NULL, NULL }, (HOOKFUNC)MyHookCode, (HOOKFUNC)FilePart(filename), scr };
  202.  
  203.             Object **objects = IM_CreateChain(0L,
  204.  
  205.                 IMC_NewObject, "File",
  206.                     TAG_DONE,
  207.                 IMC_NewObject, "Decoder",
  208.                     TAG_DONE,
  209.                 IMC_NewObject, "ScaleX",
  210.                     IMA_ScaleX_Width, 800,
  211.                     TAG_DONE,
  212.                 IMC_NewObject, "ScaleY",
  213.                     IMA_ScaleY_Height, 600,
  214.                     TAG_DONE,
  215.                 IMC_CustomObject, myclass,
  216.                     IMA_MyClass_WindowPnt, &MyHook.h_Data,
  217.                     TAG_DONE,
  218.                 IMC_NewObject, "Container",
  219.                     IMA_Container_Screen, scr,
  220.                     TAG_DONE,
  221.                 IMC_NewObject, "Probe",
  222.                     IMA_Probe_NewFrameHook, &MyHook,
  223.                     IMA_Probe_ReceiveDataHook, &MyHook,
  224.                     TAG_DONE,
  225.                 IMC_NewObject, "Raster",
  226.                     TAG_DONE,
  227.  
  228.                 IMC_EndChain);
  229.  
  230.             if(objects)
  231.             {
  232.                 DoMethod(objects[0], IMM_File_Load, filename);
  233.  
  234.                 struct Window *win = (Window *)MyHook.h_Data;
  235.                 if(win && ((APTR)win != (APTR)scr))
  236.                 {
  237.                     WaitPort(win->UserPort);
  238.                     CloseWindow(win);
  239.                 }
  240.                 else
  241.                 {
  242.                     UnlockPubScreen(NULL, scr);
  243.                 }
  244.  
  245.                 IM_DeleteChain(objects);
  246.             }
  247.             FreeClass(myclass);
  248.         }
  249.         IM_FreeClass(superclass);
  250.  
  251.         CloseLibrary(ImageManagerBase);
  252.     }
  253.     return 0;
  254. }
  255.  
  256. void wbmain (struct WBStartup *) { ; }
  257.