home *** CD-ROM | disk | FTP | other *** search
/ Frozen Fish 1: Amiga / FrozenFish-Apr94.iso / bbs / alib / d1xx / d136 / iff2pcs.lha / Iff2Pcs / Source / pzmain.c < prev    next >
C/C++ Source or Header  |  1988-03-19  |  7KB  |  227 lines

  1. #include "pz.h"
  2. #include "smalliff.h"
  3.  
  4. /* IFF2PCS, main() and various other routines...
  5. ** IFF2PCS (c)1987 Ali T. Ozer
  6. ** Nov 1987
  7. */
  8. struct Library *IntuitionBase, *GfxBase, *LayersBase;
  9.  
  10. PicInfoStruct      pic;
  11. struct Screen     *scr0;
  12. struct FileHandle *fp, *ParseArgs ();
  13.  
  14. int runningfromcli;
  15.  
  16. extern struct Menu pzmenu;
  17. int textcolor, bordercolor, normcolor, nonzerocolor;
  18. int puzpn, puzdepth;   /* These are the parameters for a piece */
  19. int picx, picy;        /* Where the picture is */
  20. int picw, pich;        /* The size of the picture */
  21.  
  22. struct BitMap picbm;  /* All plane pointers start as NULL */
  23.  
  24. /* Panic puts up a requester with a single "Sigh..." box. The string
  25. ** provided in "reason" is printed in the body of the  requester. 
  26. ** If user hits "Retry," then Panic returns. Else it exits.
  27. */
  28. void Panic (reason)
  29. UBYTE *reason;
  30. {
  31.   static struct IntuiText negtxt  = {0,1,COMPLEMENT,4,4,NULL,(UBYTE *)"Sigh...",NULL};
  32.   static struct IntuiText bodytxt = {0,1,COMPLEMENT,10,6,NULL,NULL,NULL};
  33.  
  34.   if (reason) {
  35.     if (runningfromcli == true) puts (reason);
  36.     else {
  37.       bodytxt.IText = reason;
  38.       WBenchToFront ();
  39.       if (AutoRequest (NULL, &bodytxt, NULL, &negtxt, 0L, 0L, 
  40.                              (long)(Max(Min(strlen(reason)*10+50,625),200)),
  41.                              54L) == TRUE) return;
  42.     }
  43.   };
  44.   CleanUp ();
  45.   exit (5);
  46. }
  47.  
  48.  
  49. CleanUp ()
  50. {
  51.   FreePzMenu ();  
  52.  
  53.   FreeBM (&picbm);
  54.  
  55.   if (pic.rawsource) FreeMem (pic.rawsource, pic.rawsourcesize);
  56.  
  57.   if (scr0) {
  58.     if (scr0->FirstWindow) {
  59.     /*if (scr0->FirstWindow->MenuStrip) ClearMenuStrip (scr0->FirstWindow);*/
  60.       CloseWindow (scr0->FirstWindow);  /* Assume only 1 */
  61.     };
  62.     CloseScreen  (scr0);
  63.   };
  64.  
  65.   if (LayersBase)        CloseLibrary (LayersBase);
  66.   if (GfxBase)           CloseLibrary (GfxBase);
  67.   if (IntuitionBase)     CloseLibrary (IntuitionBase);
  68. }
  69.  
  70. int Min ();
  71. int Max ();
  72.  
  73. struct TextAttr NormalFontDesc = {(STRPTR)"topaz.font", 8, 0, 0};
  74.  
  75. struct Screen *OpenPictureScreen (pic, borderpen, detailpen)
  76. PicInfoStruct *pic;
  77. int borderpen, detailpen;
  78. {
  79.   struct NewScreen ns;
  80.   struct NewWindow nw;
  81.  
  82.   setmem (&ns, sizeof(ns), 0);
  83.   setmem (&nw, sizeof(nw), 0);
  84.  
  85.   ns.DefaultTitle  = (UBYTE *)PROGNAME;
  86.   ns.Font = &NormalFontDesc;
  87.   ns.Width  = nw.Width  = 
  88.        ((struct GfxBase *)GfxBase)->NormalDisplayColumns;    /* pic->bmhd.w; */
  89.   ns.Height = nw.Height =
  90.        ((struct GfxBase *)GfxBase)->NormalDisplayRows * 2; /* pic->bmhd.h; */
  91.   ns.DetailPen = nw.DetailPen = detailpen; 
  92.   ns.BlockPen  = nw.BlockPen  = borderpen;  
  93.   ns.Depth  = pic->bmhd.nPlanes;  
  94.   ns.Type   = nw.Type   = CUSTOMSCREEN;
  95.   nw.Flags  = SMART_REFRESH | BORDERLESS | BACKDROP | RMBTRAP | ACTIVATE;
  96.   nw.IDCMPFlags = MOUSEBUTTONS | MOUSEMOVE | GADGETUP /*| MENUPICK*/;
  97.   ns.ViewModes  = HIRES | LACE;  /* pic->viewmodes; */
  98.   if (nw.Screen = OpenScreen (&ns)) {
  99.     if (OpenWindow (&nw)) return (nw.Screen);
  100.     else CloseScreen (nw.Screen);
  101.   } else {   /* Try with a smaller screen and see if we can open that. */
  102.     ns.Width  = nw.Width  = 640;
  103.     ns.Height = nw.Height = 400;
  104.     if (nw.Screen = OpenScreen (&ns)) {
  105.       if (OpenWindow (&nw)) return (nw.Screen);
  106.       else CloseScreen (nw.Screen);
  107.     }
  108.   }
  109.   return (NULL);
  110. }
  111.  
  112. /* Macros to extract the color components from a 12-bit RGB color value */
  113. #define RED(c)   ((c & 0x0F00) >> 8)
  114. #define GREEN(c) ((c & 0x00F0) >> 4)
  115. #define BLUE(c)  (c & 0x000F)
  116.  
  117. /* Follows the 11% Blue, 30% Red, 59% Green rule, returns a number 0..15 */
  118. UWORD RGBtoGray (c)
  119. UWORD c;
  120. {
  121.   return (((RED(c) * 77) + (GREEN(c) * 151) + (BLUE(c) * 28)) >> 4);
  122. }
  123.  
  124.  
  125. FindColors (cmap, numcolors)
  126. UWORD *cmap;
  127. int numcolors;
  128. {
  129.   int fdiff = -1, cdiff = 256, ndiff = -1; /* Differences for various colors */
  130.   int cnt, cur, color0;
  131.  
  132.   textcolor = 0;
  133.   bordercolor = 1;
  134.   normcolor = -1;
  135.   if (numcolors > 2) {
  136.     color0 = RGBtoGray (cmap[0]);
  137.     for (cnt = 1; cnt < numcolors; cnt++) {
  138.       cur = RGBtoGray (cmap[cnt]) - color0;
  139.       cur = (cur < 0 ? -cur : cur);
  140.       if (cur > fdiff) {fdiff = cur; textcolor = cnt;};
  141.       if (cur > ndiff && cur < 150) {ndiff = cur; normcolor = cnt;};
  142.       if (cur < cdiff && cur > color0+15) {cdiff = cur; bordercolor = cnt;};
  143.     }  
  144.   }
  145.   if (normcolor == -1) normcolor = textcolor;
  146.   else textcolor = normcolor;
  147.   if (textcolor == bordercolor) textcolor = 0;
  148.   if (normcolor == bordercolor) normcolor = 0;
  149.   if (textcolor == 0) nonzerocolor = bordercolor; else nonzerocolor = textcolor;
  150. }
  151.  
  152. extern struct WBStartup *WBenchMsg;
  153.  
  154. main(argc,argv)
  155. int  argc;
  156. char **argv;
  157. {
  158.   int scrw, scrh, scrd, scrc, cnt;
  159.  
  160.   runningfromcli = (argc == 0 ? false : true);
  161.  
  162.   if ((!(IntuitionBase = OpenLibrary ("intuition.library", 0L))) ||
  163.       (!(GfxBase = OpenLibrary ("graphics.library", 0L))) ||
  164.       (!(LayersBase = OpenLibrary ("layers.library", 0L)))) Panic ("No libs!");
  165.  
  166.   InitRnd ();  /* Initialize the random number generator */
  167.  
  168.   if ((fp = ParseArgs (argc, argv, WBenchMsg)) == NULL)
  169.     Panic ("Could not open file");
  170.  
  171.   if (ReadILBM (fp, &pic) == false) {
  172.     Close (fp); 
  173.     Panic ("File error - Maybe not IFF?");
  174.   };
  175.   Close (fp); 
  176.  
  177.   scrw = pic.bmhd.w;         /* Screen width in BITS */
  178.   scrh = pic.bmhd.h;         /* Screen height in SCANLINES */
  179.   scrd = pic.bmhd.nPlanes;   /* Screen depth in BIT PLANES */
  180.   scrc = pic.colorcount;     /* Screen colors in # of REGISTERS */
  181.  
  182. /*printf ("Scrw %d Scrh %d Scrd %d Scrc %d\n", scrw, scrh, scrd, scrc);*/
  183.  
  184. /*if ((scrw > 352) || (scrh > 235)) Panic ("Need a LO-RES picture");*/
  185.  
  186.   if (scrd > 4) Panic ("Ack! No more than 16 colors!");
  187.   if (scrw < 64 || scrh < 64) Panic ("Picture too small");
  188.  
  189.   /* Create a bitmap, expand the picture, and get rid of the compressed pic.
  190.   */  
  191.  
  192.   if (InitBM  (&picbm, scrh, scrw, scrd) == false) Panic ("No memory for picture");
  193.  
  194.   Expand  (&picbm, &(pic.bmhd), pic.rawsource);
  195.  
  196.   FreeMem (pic.rawsource, pic.rawsourcesize);
  197.   pic.rawsource = NULL;
  198.  
  199.   FindColors (&(pic.colortable), 1 << scrd);
  200.  
  201.   if ((scr0 = OpenPictureScreen (&pic, bordercolor, normcolor)) == NULL)
  202.     Panic ("No memory for screen");
  203.   LoadRGB4 (&(scr0->ViewPort), &(pic.colortable), (LONG)scrc);
  204.  
  205.   /* For now, FORCE some values... */
  206.   puzdepth = scrd;
  207.   picx     = 8;
  208.   picy     = 16;
  209.   pich     = Min (scrh, scr0->Height-picy-180);
  210.   picw     = Min (scrw, scr0->Width-picx*2);
  211.  
  212. /* A word on colors: Globally,
  213. **  normcolor is used for text (different than background, but not much)
  214. **  textcolor is used for bright stuff (highlights)
  215. **  bordercolor is slightly different than background
  216. */
  217.  
  218.   if (InitPzMenu (scrd, normcolor, normcolor, bordercolor) == false) 
  219.     Panic ("No memory for menu");
  220.  
  221.   GetAndHandleEvents (scr0->FirstWindow);
  222.  
  223.   CleanUp ();
  224.  
  225. }
  226.  
  227.