home *** CD-ROM | disk | FTP | other *** search
/ The Fred Fish Collection 1.5 / ffcollection-1-5-1992-11.iso / ff_disks / 300-399 / ff329.lzh / OnePlane / OnePlane.c < prev    next >
C/C++ Source or Header  |  1990-03-02  |  4KB  |  143 lines

  1. /*
  2.  
  3.  OnePlane.c - program to steal bottom bitplane from workbench screen
  4.  
  5. Ethan Dicks
  6. (c) 15-Nov-1988
  7.  
  8. Version 1.1
  9. (c) 14-Dec-1988
  10.  
  11. Version 1.2
  12. (c) 24-Feb-1989
  13.  
  14. Version 1.3
  15. (c) 26-Feb-1990
  16.  
  17. This program is *not* in the public domain, but may be freely
  18. redistributed on the condition that it is not sold, nor used in any
  19. commercial or shareware package without the express written permission
  20. of the author.  This program may be included in a freely redistributable
  21. library, including, but not limited to the Fred Fish library collection.
  22. In other words, selling this program is right out, but giving it away is
  23. encouraged.
  24.  
  25.  
  26. I got the encouragement for this program from the discussion on
  27. comp.sys.amiga regarding fast text scrolling.  Someone called for a
  28. program to reduce the Workbench screen to 1 bitplane to enhance the
  29. speed of CON: output.
  30.  
  31. COMPILATION INSTUCTIONS:
  32.  
  33. This code will compile under either Lattice C, V4.01, V5.00, or V5.02,
  34. although V5.0x will produce a 28 byte smaller executable.  Currently, 
  35. Lattice V4.01 produces a 468 byte executable, V5.00 produces a 440 byte
  36. executable.
  37.  
  38. With some minor code changes, this program now weighs in at 256 bytes, if
  39. compiled under V5.02.  Who says C has to be bloated!
  40.  
  41. Now, as of V1.3 on 26-Feb-90, with better compilation switches, this code
  42. compiles to xxx bytes under Lattice 5.04!
  43.  
  44. To compile, either use LMK and the provided Makefile or use the commands:
  45.  
  46. lc -b -r -v -y oneplane.c
  47. blink oneplane.o SC SD ND
  48.  
  49. This is why some of the structure looks odd; I don't link with any external
  50. files, not even startup code.  I know that the program could be made even
  51. smaller, but what do want for a one night's hack? (With a few minor
  52. touchups)
  53.  
  54. HOW IT WORKS:
  55.  
  56. In the structure GfxBase, there is a field, ActView, which describes the 
  57. current ViewPort.  This program uses the active viewport information to
  58. aquire the active BitPlane structure, which contains information about how
  59. many bitplanes are in use, their location in memory, the number of rows in
  60. the bitplane, and the number of bytes in each row.  With this information,
  61. is it trival to change the number of bitplanes down by one, and to free
  62. up the memory held by the highest bitplane.  The request is checked in case
  63. this is the only bitplane allocated.  The advantage of this system is that
  64. the number of bitplanes can be increased and decreased at will, without
  65. fear of a visit from the GURU.
  66.  
  67. Most of the information I got came from the RKM graphic primitives section,
  68. in the Libraries and Devices volume, especially the examples, and most of the
  69. rest came from picking apart the include files.
  70.  
  71. */
  72.  
  73. #include <exec/types.h>
  74. #include <exec/execbase.h>
  75. #include <intuition/intuition.h>
  76. #include <graphics/gfxbase.h>
  77. #include <proto/exec.h>
  78. #include <proto/intuition.h>
  79. #include <proto/graphics.h>
  80.  
  81. #define MIN_DEPTH 1
  82.  
  83.  
  84. #pragma libcall ExecBase FreeMem d2 0902
  85. #pragma libcall IntuitionBase RemakeDisplay 180 00
  86. #pragma libcall ExecBase CloseLibrary 19e 901
  87. #pragma libcall ExecBase OpenLibrary 228 0902
  88.  
  89.  
  90. /* 
  91.     Here goes nuthin'
  92. */
  93. void main()
  94.  
  95. {
  96.  
  97. /* Set up structure pointers to make Intuition happy */
  98. register struct GfxBase *GfxBase;
  99. register struct IntuitionBase *IntuitionBase;
  100. struct ExecBase **SysBase;
  101. register struct ExecBase *ExecBase;
  102.  
  103. /* 
  104.     Keep the pointer to the current BitMap structure in 
  105.     a register for faster access and smaller code
  106. */
  107. register struct BitMap *b;        /* pointer to current BitMap */
  108.  
  109. /* Set the ExecBase pointer manually, since we do not link with anybody */
  110.  
  111.     SysBase = (struct ExecBase **)(4L);
  112.     ExecBase = *SysBase;
  113.  
  114. /* Open the graphics.library and the intuition.library */
  115.  
  116. /* error checking not done, because if they won't open, the system is hosed */
  117.     GfxBase
  118.         = (struct GfxBase *)OpenLibrary("graphics.library",0);
  119.  
  120.     IntuitionBase
  121.         = (struct IntuitionBase *)OpenLibrary("intuition.library",0);
  122.  
  123. /* Here goes with the pointer game... the idea is to end up at the BitMap */
  124.  
  125.     b = GfxBase -> ActiView -> ViewPort -> RasInfo -> BitMap;
  126.  
  127. /* And here is where we fiddle with the numbers */
  128.  
  129. /* ---> ONLY DO THIS IF THERE ARE BITPLANES LEFT TO REMOVE <--- */
  130.     if ( (b -> Depth) > MIN_DEPTH) {
  131.  
  132.         FreeMem( (b -> Planes)[--(b -> Depth)],
  133.              (b-> Rows) * (b -> BytesPerRow) );
  134.     }
  135.  
  136. /* Now that we are done fiddling with it, redraw the display */
  137.     RemakeDisplay();
  138.     
  139. /* Now clean up and go home */
  140.     CloseLibrary((struct Library *)GfxBase);
  141.     CloseLibrary((struct Library *)IntuitionBase);
  142. }
  143.