home *** CD-ROM | disk | FTP | other *** search
/ Frozen Fish 1: Amiga / FrozenFish-Apr94.iso / bbs / alib / d1xx / d185 / iff.lha / EXAMPLES / ScreenSave / ScreenSave.c next >
C/C++ Source or Header  |  1988-12-13  |  10KB  |  393 lines

  1. /*
  2.  *  ScreenSave.c --  v1.06 Carolyn Scheppner  CBM
  3.  *                   Saves front screen as ILBM file
  4.  *                   Saves a CAMG chunk for HAM, etc.
  5.  *                   Creates icon for ILBM file
  6.  *  Original 10/86
  7.  *  Modified 9/88 - To mask out unwanted ViewMode bits in CAMG
  8.  *                  and use CAMG defs in new ilbm.h
  9.  *
  10.  *     Uses IFF rtns by J.Morrison and S.Shaw of Electronic Arts
  11.  *
  12.  *       (all C code including IFF modules compiled with -v on LC2)
  13.  * Linkage information:
  14.  * FROM     AStartup.obj, ScreenSave.o, iffw.o, ilbmw.o, packer.o
  15.  * TO       ScreenSave
  16.  * LIBRARY  Amiga.lib, LC.lib
  17.  *
  18.  */
  19.  
  20. #include <exec/types.h>
  21. #include <exec/memory.h>
  22. #include <libraries/dos.h>
  23. #include <libraries/dosextens.h>
  24. #include <graphics/gfxbase.h>
  25. #include <graphics/rastport.h>
  26. #include <graphics/gfx.h>
  27. #include <graphics/view.h>
  28.  
  29. #include <intuition/intuition.h>
  30. #include <intuition/intuitionbase.h>
  31. #include <workbench/workbench.h>
  32. #include <workbench/startup.h>
  33.  
  34. #include "iff/ilbm.h"
  35.  
  36. /* From AStartup - used to create stdio on WB startup */
  37. extern  LONG  stdin, stdout, stderr;
  38.  
  39. /* For masking unwanted Viewmodes bits */
  40. #define BADFLAGS  (SPRITES|VP_HIDE|GENLOCK_AUDIO|GENLOCK_VIDEO)
  41. #define FLAGMASK  (~BADFLAGS)
  42. #define CAMGMASK  (FLAGMASK & 0x0000FFFFL)
  43.  
  44. /* Other Stuff */
  45.  
  46. #define bufSize 512
  47.  
  48. struct IntuitionBase *IntuitionBase;
  49. struct GfxBase       *GfxBase;
  50. ULONG  IconBase;
  51.  
  52. struct Screen   *frontScreen;
  53.  
  54. struct ViewPort *picViewPort;
  55. struct BitMap   *picBitMap;
  56. WORD            *picColorTable;
  57. ULONG            picViewModes;
  58. BOOL fromWB, newStdio;
  59.  
  60. #define INBUFSZ 40
  61. char sbuf[INBUFSZ];
  62. char nbuf[INBUFSZ];
  63.  
  64. char conSpec[] = "CON:0/40/639/160/ ScreenSave v1.06 ";
  65.  
  66. /* Definitions for ILBM Icon */
  67. USHORT  ILBMimagedata[] = {
  68.  0xFFFF, 0xFFFC,
  69.  0xC000, 0x000C,
  70.  0xC000, 0x000C,
  71.  0xC1E7, 0x9E0C,
  72.  0xC1F8, 0x7E0C,
  73.  0xC078, 0x780C,
  74.  0xC187, 0x860C,
  75.  0xC078, 0x780C,
  76.  0xC1F8, 0x7E0C,
  77.  0xC1E7, 0x9E0C,
  78.  0xC000, 0x000C,
  79.  0xC000, 0x000C,
  80.  0xFFFF, 0xFFFC,
  81.  0x0000, 0x0000,
  82.  0x0000, 0x0000,
  83. /**/
  84.  0xFFFF, 0xFFFC,
  85.  0xFFFF, 0xFFFC,
  86.  0xF800, 0x007C,
  87.  0xF9E0, 0x1E7C,
  88.  0xF980, 0x067C,
  89.  0xF807, 0x807C,
  90.  0xF81F, 0xE07C,
  91.  0xF807, 0x807C,
  92.  0xF980, 0x067C,
  93.  0xF9E0, 0x1E7C,
  94.  0xF800, 0x007C,
  95.  0xFFFF, 0xFFFC,
  96.  0xFFFF, 0xFFFC,
  97.  0x0000, 0x0000,
  98.  0x0000, 0x0000,
  99. /**/
  100.  };
  101.  
  102. struct Image ILBMimage = {
  103.    0,0,                     /* Leftedge, Topedge */
  104.    30,15,                   /* Width Height */
  105.    2,                       /* Depth */
  106.    &ILBMimagedata[0],       /* Data for image */
  107.    3,0                      /* PlanePick, PlaneOnOff */
  108.    };
  109.  
  110. struct DiskObject ILBMobject = {
  111.    WB_DISKMAGIC,
  112.    WB_DISKVERSION,
  113.  
  114.    /* Gadget Structure */
  115.    NULL,                    /* Ptr to next gadget */
  116.    0,0,                     /* Leftedge, Topedge */
  117.    30,15,                   /* Width, Height */
  118.    GADGHBOX|GADGIMAGE,      /* Flags */
  119.    RELVERIFY|GADGIMMEDIATE, /* Activation */
  120.    BOOLGADGET,              /* Type */
  121.    (APTR)&ILBMimage,        /* Render */
  122.    NULL,                    /* Select Render */
  123.    NULL,                    /* Text */
  124.    NULL,NULL,NULL,NULL,     /* Exclude, Special, ID, UserData */
  125.  
  126.    4,                       /* WBObject type */
  127.    ":Display",              /* Default tool */
  128.    NULL,                    /* Tool Types */
  129.    NO_ICON_POSITION,        /* Current X */
  130.    NO_ICON_POSITION,        /* Current Y */
  131.    NULL,NULL,NULL,          /* Drawer, ToolWindow, Stack */
  132.    };
  133.  
  134.  
  135. main(argc, argv)
  136. int argc;
  137. char **argv;
  138.    {
  139.    LONG            file;
  140.    IFFP            iffp = NO_FILE;
  141.    char            *filename;
  142.    int l;
  143.  
  144.    newStdio = FALSE;
  145.    fromWB = (argc==0) ? TRUE : FALSE;
  146.  
  147.    if((fromWB) && (!(newStdio = openStdio(&conSpec[0]))))
  148.       {
  149.       return(0);
  150.       }
  151.  
  152.    if ((IntuitionBase =
  153.       (struct IntuitionBase *)OpenLibrary("intuition.library",0))==NULL)
  154.          cleanexit("Can't open intuition.library\n");
  155.  
  156.    if ((GfxBase =
  157.       (struct GfxBase *)OpenLibrary("graphics.library",0))==NULL)
  158.       cleanexit("Can't open graphics.library\n");
  159.  
  160.    if ((IconBase = OpenLibrary("icon.library",0))==NULL )
  161.       cleanexit("Can't open icon.library\n");
  162.  
  163.    printf("ScreenSave v 1.06 --- C. Scheppner  CBM  9/88\n");
  164.    printf("   Saves the front screen as an IFF ILBM file\n");
  165.    printf("   A CAMG chunk is saved (for HAM pics, etc.)\n\n");
  166.  
  167.    if(argc>1)                 /* Passed filename via command line  */
  168.       {
  169.       filename = argv[1];
  170.       }
  171.    else
  172.       {
  173.       printf("Enter filename for save: ");
  174.       l = gets(&nbuf[0]);
  175.  
  176.       if(l==0)                /* No filename - Exit */
  177.          {
  178.          cleanexit("\nScreen not saved, filename required\n");
  179.          }
  180.       else
  181.          {
  182.          filename = &nbuf[0];
  183.          }
  184.       }
  185.  
  186.    if (!(file = Open(filename, MODE_NEWFILE)))
  187.       cleanexit("Can't open output file\n");
  188.      
  189.    Write(file,"x",1);  /* 1.1 so Seek to beginning works ? */
  190.  
  191.    printf("Click here and press <RETURN> when ready: ");
  192.    gets(&sbuf[0]);
  193.    printf("Front screen will be saved in 10 seconds\n");
  194.    Delay(500);
  195.  
  196.    Forbid();
  197.    frontScreen  = IntuitionBase->FirstScreen;
  198.    Permit();
  199.  
  200.    picViewPort = &( frontScreen->ViewPort );
  201.    picBitMap = (struct BitMap*)picViewPort->RasInfo->BitMap;
  202.    picColorTable = (WORD *)picViewPort->ColorMap->ColorTable;
  203.    picViewModes = (ULONG)picViewPort->Modes;
  204.  
  205.    printf("\nSaving...\n");
  206.  
  207.    iffp = PutPicture(file, picBitMap, picColorTable, picViewModes);
  208.    Close(file);
  209.  
  210.    if (iffp == IFF_OKAY)
  211.       {
  212.       printf("Screen saved\n");
  213.       if(!(PutDiskObject(filename,&ILBMobject)))
  214.          {
  215.          cleanexit("Error saving icon\n");
  216.          }
  217.       printf("Icon saved\n");
  218.       }
  219.    cleanexit("Done\n");
  220.    }
  221.  
  222.  
  223. cleanexit(s)
  224.    char  *s;
  225.    {
  226.    if(*s) printf(s);
  227.    if ((fromWB)&&(*s))    /* Wait so user can read messages */
  228.       {
  229.       printf("\nPRESS RETURN TO EXIT\n");
  230.       gets(&sbuf[0]);
  231.       }
  232.    cleanup();
  233.    exit();
  234.    }
  235.  
  236. cleanup()
  237.    {
  238.    if (newStdio)  closeStdio();
  239.    if (GfxBase) CloseLibrary(GfxBase);
  240.    if (IntuitionBase) CloseLibrary(IntuitionBase);
  241.    if (IconBase) CloseLibrary(IconBase);
  242.    }
  243.  
  244.  
  245. openStdio(conspec)
  246. char *conspec;
  247.    {
  248.    LONG wfile;
  249.    struct Process *proc;
  250.    struct FileHandle *handle;
  251.  
  252.    if (!(wfile = Open(conspec,MODE_NEWFILE)))  return(0);
  253.    stdin  = wfile;
  254.    stdout = wfile;
  255.    stderr = wfile;
  256.    handle = (struct FileHandle *)(wfile << 2);
  257.    proc = (struct Process *)FindTask(NULL);
  258.    proc->pr_ConsoleTask = (APTR)(handle->fh_Type);
  259.    proc->pr_CIS = (BPTR)stdin;
  260.    proc->pr_COS = (BPTR)stdout;
  261.    return(1);
  262.    }
  263.  
  264. closeStdio()
  265.    {
  266.    struct Process *proc;
  267.    struct FileHandle *handle;
  268.  
  269.    if (stdin > 0)  Close(stdin);
  270.    stdin  = -1;
  271.    stdout = -1;
  272.    stderr = -1;
  273.    handle = (struct FileHandle *)(stdin << 2);
  274.    proc = (struct Process *)FindTask(NULL);
  275.    proc->pr_ConsoleTask = NULL;
  276.    proc->pr_CIS = NULL;
  277.    proc->pr_COS = NULL;
  278.    }
  279.  
  280.  
  281. gets(s)
  282. char *s;
  283.    {
  284.    int l = 0, max = INBUFSZ - 1;
  285.  
  286.    while (((*s = getchar()) !='\n' )&&(l < max)) s++, l++;
  287.    *s = NULL;
  288.    return(l);
  289.    }
  290.  
  291.  
  292. /* String Functions */
  293.  
  294. strlen(s)
  295. char *s;
  296.    {
  297.    int i = 0;
  298.    while(*s++) i++;
  299.    return(i);
  300.    }
  301.  
  302. strcpy(to,from)
  303. char *to, *from;
  304.    {
  305.    do
  306.       {
  307.       *to++ = *from;
  308.       }
  309.    while(*from++);
  310.    }
  311.  
  312.  
  313. /** PutPicture() ***********************************************************
  314.  *
  315.  * Put a picture into an IFF file.
  316.  * This procedure calls PutAnILBM, passing in an <x, y> location of <0, 0>,
  317.  * a NULL mask, and a locally-allocated buffer. It also assumes you want to
  318.  * write out all the bitplanes in the BitMap.
  319.  *
  320.  ***************************************************************************/
  321. Point2D nullPoint = {0, 0};
  322.  
  323. IFFP PutPicture(file, bitmap, colorMap, viewmodes)
  324.       LONG file;  struct BitMap *bitmap;
  325.       WORD *colorMap;  ULONG viewmodes;
  326.    {
  327.    BYTE buffer[bufSize];
  328.    return( PutAnILBM(file, bitmap, NULL,
  329.            colorMap, bitmap->Depth, viewmodes,
  330.            &nullPoint, buffer, bufSize) );
  331.    }    
  332.  
  333.    
  334. /** PutAnILBM() ************************************************************
  335.  *
  336.  * Write an entire BitMap as a FORM ILBM in an IFF file.
  337.  * This version works for any display mode (C. Scheppner).
  338.  *
  339.  * Normal return result is IFF_OKAY.
  340.  *
  341.  * The utility program IFFCheck would print the following outline of the
  342.  * resulting file:
  343.  *
  344.  *   FORM ILBM
  345.  *     BMHD
  346.  *     CAMG
  347.  *     CMAP
  348.  *     BODY       (compressed)
  349.  *
  350.  ***************************************************************************/
  351. #define CkErr(expression)  {if (ifferr == IFF_OKAY) ifferr = (expression);}
  352.  
  353. IFFP PutAnILBM(file, bitmap, mask, colorMap, depth,
  354.                                 viewmodes, xy, buffer, bufsize)
  355.       LONG file;
  356.       struct BitMap *bitmap;
  357.       BYTE *mask;  WORD *colorMap; UBYTE depth;
  358.       ULONG viewmodes;
  359.       Point2D *xy; BYTE *buffer;  LONG bufsize;
  360.    {
  361.    BitMapHeader bmHdr;
  362.    CamgChunk    camgChunk;
  363.    GroupContext fileContext, formContext;
  364.    IFFP ifferr;
  365.    WORD pageWidth, pageHeight;
  366.  
  367.    pageWidth  = (bitmap->BytesPerRow) << 3;
  368.    pageHeight = bitmap->Rows;
  369.  
  370.    ifferr = InitBMHdr(&bmHdr, bitmap, mskNone,
  371.                       cmpByteRun1, 0, pageWidth, pageHeight);
  372.    /* You could write an uncompressed image by passing cmpNone instead
  373.     * of cmpByteRun1 to InitBMHdr. */
  374.    bmHdr.nPlanes = depth;   /* This must be  <= bitmap->Depth */
  375.    if (mask != NULL) bmHdr.masking = mskHasMask;
  376.    bmHdr.x = xy->x;   bmHdr.y = xy->y;
  377.  
  378.    camgChunk.ViewModes = viewmodes & CAMGMASK; /* Mask out unwanted bits! */
  379.  
  380.    CkErr( OpenWIFF(file, &fileContext, szNotYetKnown) );
  381.    CkErr(StartWGroup(&fileContext, FORM, szNotYetKnown, ID_ILBM, &formContext));
  382.  
  383.    CkErr( PutBMHD(&formContext, &bmHdr) );
  384.    CkErr( PutCAMG(&formContext, &camgChunk) );
  385.    CkErr( PutCMAP(&formContext, colorMap, depth) );
  386.    CkErr( PutBODY(&formContext, bitmap, mask, &bmHdr, buffer, bufsize) );
  387.  
  388.    CkErr( EndWGroup(&formContext) );
  389.    CkErr( CloseWGroup(&fileContext) );
  390.    return( ifferr );
  391.    }
  392.    
  393.