home *** CD-ROM | disk | FTP | other *** search
/ Frozen Fish 1: Amiga / FrozenFish-Apr94.iso / bbs / alib / d5xx / d595 / iconswap.lha / IconSwap / IconSwap.c < prev    next >
C/C++ Source or Header  |  1992-02-01  |  8KB  |  271 lines

  1. /*----------------------------------------------------------------------------
  2.    File   :    IconSwap.c
  3.    Projekt:    IconSwap
  4.    Inhalt :    OpenAll  (die berühmte "Öffne-Mir-Alles"-Routine)
  5.                CloseAll (Zumachen tu ich das dann auch wieder)
  6.                SwapPlane(tauscht zwei Bitplanes aus)
  7.                SwapIcon (Bearbeitet ein Icon (s.o.))
  8.                ShowHelp (Gibt den Hilfe-Text in CLI-Fenster aus)
  9.                main     (zumindest mal ein HauptPrg)
  10.  
  11.    Version:    0.14
  12.    Datum  :    23./24./29. und 31.März 1991
  13.    Autor  :    Uwe Röhm
  14.    Adresse:    Auber Str. 25,  W-6209 Hohenstein 4
  15.     (Semester) Wörthstr. 18    W-8390 Passau
  16.    Bemerkung:
  17.    "IconSwap" soll das leidige Problem mit den vertauschten 2.0 und 1.3 Farben
  18.    in den Griff kriegen...
  19. ----------------------------------------------------------------------------*/
  20. short PRGVersion = 0;
  21. short PRGRevision= 14;
  22.  
  23. #include <exec/Types.h>
  24. #include <exec/memory.h>
  25. #include <libraries/dos.h>
  26. #include <workbench/icon.h>
  27. #include <workbench/startup.h>
  28. #include <workbench/workbench.h>
  29. #include "IconSwap.h"
  30.  
  31. #ifndef LATTICE
  32.    #include <functions.h>
  33. #else
  34.    #include <proto/dos.h>
  35.    #include <proto/exec.h>
  36.    #include <proto/icon.h>
  37. /* Lattice-CTRL-C Handling ausschalten... */
  38.    int CXBRK (void)     {  return (0); }
  39. #endif
  40. #include <string.h>
  41. #include <stdlib.h>
  42.  
  43. /*  --------------------  Globale Variablen   --------------------  */
  44. struct Library *IconBase;
  45. struct FileInfoBlock *FIB;
  46. extern struct DosLibrary *DOSBase;
  47. BOOL FromWB;
  48. BPTR fh;
  49.  
  50.  
  51. /*  --  --  --  --  --  --  --  --  --  --  --  --  --  --  --  --  --  --  --
  52.    Funktion  : OpenAll
  53.    Parameter : --
  54.    Rückgabe  : BOOL (TRUE+ => alles korrekt geöffnet, sonst FALSE)
  55.  
  56.    Aufruf von: main (s.u.)
  57.    UnterFunks: --
  58.    Autor     : Floyd (das bin ich)
  59.    Datum     : 29.03.1991
  60.    Bemerkung :
  61.    Die benötigte Icon-Library wird geöffnet und - sofern vom CLI gestartet -
  62.    die Standart-Output ermittelt...
  63. --  --  --  --  --  --  --  --  --  --  --  --  --  --  --  --  --  --  --  */
  64. BOOL OpenAll ()
  65. {
  66.    if (!FromWB)
  67.       fh = Output ();
  68.  
  69.    FIB = (struct FileInfoBlock *) AllocMem (sizeof (*FIB), MEMF_CLEAR | MEMF_PUBLIC);
  70.  
  71.    IconBase = OpenLibrary ("icon.library", 33);
  72.    return (( (IconBase == NULL) || (FIB == NULL) ) ? FALSE : TRUE);
  73. }
  74.  
  75.  
  76. /*  --  --  --  --  --  --  --  --  --  --  --  --  --  --  --  --  --  --  --
  77.    Funktion  : CloseAll
  78.    Parameter : --
  79.    Rückgabe  : --
  80.  
  81.    Aufruf von: main (s.u.)
  82.    UnterFunks: --
  83.    Autor     : immer noch Floyd
  84.    Datum     : 23.03.91
  85.    Bemerkung :
  86.    Meine globale ShowDown-Funktion. Was mit "OpenAll" aufgemacht wurde, sollte
  87.    hier auch wieder geschlossen werden. ACHTUNG! Die Standart-Output schließt
  88.    meine C-Exitroutine (ich lasse also die Finger davon, sonst GURU)!
  89. --  --  --  --  --  --  --  --  --  --  --  --  --  --  --  --  --  --  --  */
  90. VOID CloseAll ()
  91. {
  92.    if (FIB)
  93.    {  FreeMem (FIB, sizeof (*FIB));
  94.       FIB = NULL;
  95.    }
  96.  
  97.    if (IconBase)
  98.    {  CloseLibrary (IconBase);
  99.       IconBase = NULL;
  100.    }
  101. }
  102.  
  103.  
  104. /*  --  --  --  --  --  --  --  --  --  --  --  --  --  --  --  --  --  --  --
  105.    Funktion  :  SwapPlane
  106.    Parameter :  struct Image *(Zeiger auf Image mit zu vertauschenden Daten)
  107.    Rückgabe  :  BOOL (ob getauscht wurde...)
  108.  
  109.    Aufruf von:  SwapIcon (s.u.)
  110.    UnterFunks:  --
  111.    Autor     :  Floyd
  112.    Datum     :  31.03.91
  113.    Bemerkung:
  114.    "SwapPlane" vertauscht in 4farbigen Info-Dateien die beiden BitPlanes
  115. --  --  --  --  --  --  --  --  --  --  --  --  --  --  --  --  --  --  --  */
  116. BOOL SwapPlane (struct Image *Im)
  117. {
  118.    USHORT *p1, *p2, mitte, swap, i;
  119.  
  120.    if ( Im->Depth == 2 )
  121.    {  mitte = Im->Height *
  122.               (((Im->Width % 16) == 0) ? (Im->Width / 16) : (Im->Width / 16 + 1));
  123.       p1 = Im->ImageData;
  124.       p2 = p1 + mitte;
  125.       for (i = 0; i < mitte; i++, p1++, p2++)
  126.       {  swap = *p1;
  127.          *p1  = *p2;
  128.          *p2  = swap;
  129.       }
  130.       return TRUE;
  131.    }
  132.    return FALSE;
  133. }
  134.  
  135.  
  136. /*  --  --  --  --  --  --  --  --  --  --  --  --  --  --  --  --  --  --  --
  137.    Funktion  :  SwapIcon
  138.    Parameter :  char * (Name der .info-Datei)
  139.    Rückgabe  :  --
  140.  
  141.    Aufruf von:  main (s.u.)
  142.    UnterFunks:  SwapPlane (s.o.)
  143.    Autor     :  Floyd
  144.    Datum     :  24.3.91
  145.    Bemerkung:
  146.    sorgt für den Austausch von Select- und Normalen ImageDaten und schreibt
  147.    dann das Icon unter dem selben Namen zurück.
  148. --  --  --  --  --  --  --  --  --  --  --  --  --  --  --  --  --  --  --  */
  149. VOID SwapIcon (char *name)
  150. {
  151.    struct DiskObject *Icon;
  152.  
  153.    if (strlen (name) > 0)
  154.    {
  155.       Icon = GetDiskObject (name);
  156.       if (Icon->do_Gadget.GadgetRender != NULL)
  157.       {
  158.          if (SwapPlane ((struct Image *) Icon->do_Gadget.GadgetRender))
  159.          {
  160.             if (Icon->do_Gadget.SelectRender != NULL)
  161.                SwapPlane ((struct Image *) Icon->do_Gadget.SelectRender);
  162.  
  163.             PutDiskObject (name, Icon);
  164.          }
  165.       }
  166.       FreeDiskObject (Icon);
  167.    }
  168. }
  169.  
  170.  
  171. /*  --  --  --  --  --  --  --  --  --  --  --  --  --  --  --  --  --  --  --
  172.    Funktion  :  ShowHelp
  173.    Parameter :  --
  174.    Rückgabe  :  --
  175.  
  176.    Aufruf von:  main (s.u.)
  177.    UnterFunks:  --
  178.    Autor     :  Floyd, der Römer
  179.    Datum     :  29.03.91
  180.    Bemerkung :
  181.    Gibt eine Kurzbeschreibung dieses wahrhaften tollen PRGs aus (wenn ich den
  182.    Sinn mal vergessen sollte, werde ich noch dankbar sein...).
  183. --  --  --  --  --  --  --  --  --  --  --  --  --  --  --  --  --  --  --  */
  184. VOID ShowHelp ()
  185. {
  186.    Write (fh, "USAGE: IconSwap <Name1> <Name2> ....\n", 37);
  187.    Write (fh, "'IconSwap' tauscht in Icons mit vier Farben (Depth == 2)\n", 57);
  188.    Write (fh, "die beiden Bitplanes aus und ermöglicht es so, Icons unter\n", 59);
  189.    Write (fh, "2.0 Style und 1.3 Style auszutauschen. Die Endung '.info'\n", 58);
  190.    Write (fh, "wird vom Program selbständig an die Dateinnamen angehängt.\n", 59);
  191.  
  192.    Write (fh, "Compiliert am:   ",17);
  193.    Write (fh, __DATE__, strlen (__DATE__));
  194.    Write (fh, "  um  ", 6);
  195.    Write (fh, __TIME__, strlen (__TIME__));
  196.    Write (fh, ".\n",2);
  197. }
  198.  
  199.  
  200. /*  --  --  --  --  --  --  --  --  --  --  --  --  --  --  --  --  --  --  --
  201.    Funktion  :  main
  202.    Parameter :  int arc      (Zahl der CLI-Parameter)
  203.                 char *argv[] (einzelne Paramterstrings)
  204.    Rückgabe  :  --
  205.  
  206.    Aufruf von:  Benutzer über CLI
  207.    UnterFunks:  OpenAll (s.o.)
  208.                 CloseAll (s.o.)
  209.                 SwapPlane (s.o.)
  210.    Autor     :  Floyd
  211.    Datum     :  29.März 1991
  212.    Bemerkung:
  213.    Das Hauptprogramm sorgt für die richtige Unterscheidung zwischen CLI und
  214.    WB-Aufruf. Unter der WB versuche ich zudem verzweifelt, daß ich auch Drawer
  215.    und Disk-Dateien korrekt anspreche. Da ich "_tinymain" und "exit ()" ver-
  216.    wende, muß ich zwar selbst die Standart-Output suchen, brauche diese und
  217.    die DOSBase aber nicht selbst zu schließen!
  218. --  --  --  --  --  --  --  --  --  --  --  --  --  --  --  --  --  --  --  */
  219. VOID __stdargs __saveds main (int argc, char *argv[])
  220. {
  221. int i;
  222. BPTR cd, pd;
  223. BOOL retcode;
  224. struct WBArg *wbarg;
  225. struct WBStartup *WBMsg;
  226.  
  227.    FromWB = (argc == 0) ? TRUE : FALSE;
  228.  
  229.    if (retcode = OpenAll ())
  230.    {
  231.       if (!FromWB)
  232.       {  Write (fh, HAILTEXT, strlen (HAILTEXT));
  233.  
  234.          if (argc == 1)
  235.             Write (fh, "Keinen Filenamen angegeben...\n", 30);
  236.          else
  237.          if ((argc == 2) && (strcmp (argv[1], "?") == 0))
  238.             ShowHelp ();
  239.          else
  240.             for (i = 1; i < argc; i++)
  241.                SwapIcon (argv[i]);
  242.       }
  243.       else
  244.       {  WBMsg = (struct WBStartup *) argv;
  245.          for (i = 1, wbarg = (WBMsg->sm_ArgList + 1); i < WBMsg->sm_NumArgs; i++, wbarg++)
  246.          {  if ( wbarg->wa_Lock != NULL )
  247.             {  cd = CurrentDir (wbarg->wa_Lock);
  248.  
  249.                if (strlen (wbarg->wa_Name) == 0)/* Länge 0, aber Pointer != NULL*/
  250.                {
  251.                   Examine (wbarg->wa_Lock, FIB); /* Namen von Dir holen */
  252.                   if (pd = ParentDir (wbarg->wa_Lock)) /* ein Dir */
  253.                   {  CurrentDir (pd);
  254.                      SwapIcon (FIB->fib_FileName);
  255.                      UnLock (pd);
  256.                   }
  257.                   else  /* also wohl ROOT - und damit 'Disk.info' */
  258.                      SwapIcon ("Disk");
  259.                }
  260.                else
  261.                   SwapIcon (wbarg->wa_Name);
  262.                (void) CurrentDir (cd);
  263.             }
  264.          }
  265.       }
  266.    }
  267.  
  268.    CloseAll ();
  269.    exit ( (retcode == TRUE) ? 0 : 1 );
  270. }
  271.