home *** CD-ROM | disk | FTP | other *** search
/ AmigActive 6 / AACD06.ISO / AACD / Programming / ImageManager / Examples / Fractal.c < prev    next >
C/C++ Source or Header  |  1999-10-12  |  2KB  |  70 lines

  1. #include <proto/exec.h>
  2. #include <proto/imagemanager.h>
  3. #include <proto/intuition.h>
  4.  
  5. struct Library *ImageManagerBase;
  6.  
  7. #define WIDTH    320
  8. #define HEIGHT    240
  9.  
  10. VOID DrawMandelbrot (Object *obj, ULONG sigmask)
  11. {
  12.     static ULONG Buffer[WIDTH];
  13.     for(LONG y = 0; y < HEIGHT; y++)
  14.     {
  15.         ULONG *buf = Buffer, *end = &Buffer[WIDTH];
  16.  
  17.         FLOAT sy = ((FLOAT)y - HEIGHT/2.0) / (((FLOAT)HEIGHT)/2.4);
  18.         FLOAT x = -2.1, x_step = 3.0 / WIDTH, rx, ry;
  19.  
  20.         while(buf < end)
  21.         {
  22.             rx = ry = 0.0;
  23.  
  24.             FLOAT y2 = ry*ry;
  25.             for(ULONG i = 0; i < 20; i++)
  26.             {
  27.                 FLOAT rx2 = rx*rx - y2 + x;
  28.                 ry = rx*ry * 2.0 + sy;
  29.  
  30.                 if(rx2*rx2 + (y2 = ry*ry) > 3.0)
  31.                     break;
  32.  
  33.                 rx = rx2;
  34.             }
  35.  
  36.             *buf++ = (i % 20) * 0x0D000600;
  37.             x += x_step;
  38.         }
  39.  
  40.         if(!DoMethod(obj, IMM_ReceiveData, IMV_ReceiveData_Type_Pixels, Buffer, WIDTH, y, 1, 0L, NULL) || SetSignal(0L, 0L) & sigmask)
  41.             break;
  42.     }
  43. }
  44.  
  45. VOID main ()
  46. {
  47.     if(ImageManagerBase = OpenLibrary("ImageManager.library", 1))
  48.     {
  49.         struct Window *win = OpenWindowTags(NULL, WA_Activate, TRUE, WA_IDCMP, IDCMP_CLOSEWINDOW, WA_CloseGadget, TRUE, WA_DragBar, TRUE, WA_DepthGadget, TRUE, WA_InnerWidth, WIDTH, WA_InnerHeight, HEIGHT, TAG_DONE);
  50.  
  51.         Object *container, *raster;
  52.         if(raster = IM_NewObject("Raster", IMA_Raster_RastPort, win->RPort, IMA_Raster_OffsetX, win->BorderLeft, IMA_Raster_OffsetY, win->BorderTop, TAG_DONE))
  53.         {
  54.             if(container = IM_NewObject("Container", IMA_Next, raster, IMA_Container_Screen, win->WScreen, TAG_DONE))
  55.             {
  56.                 if(DoMethod(container, IMM_NewFrame, WIDTH, HEIGHT, NULL))
  57.                 {
  58.                     DrawMandelbrot(container, 1 << win->UserPort->mp_SigBit);
  59.                     DoMethod(container, IMM_EndFrame, WIDTH, HEIGHT);
  60.                 }
  61.  
  62.                 WaitPort(win->UserPort);
  63.                 IM_DisposeObject(container);
  64.             }
  65.             IM_DisposeObject(raster);
  66.         }
  67.         CloseWindow(win);
  68.         CloseLibrary(ImageManagerBase);
  69.     }
  70. }