home *** CD-ROM | disk | FTP | other *** search
/ Otherware / Otherware_1_SB_Development.iso / amiga / comms / comprgs / term232.lha / Source_Code / termSource / termRaster.c < prev    next >
Encoding:
C/C++ Source or Header  |  1992-08-18  |  6.8 KB  |  405 lines

  1. /*
  2. **    $Id: termRaster.c,v 1.6 92/08/15 20:14:54 olsen Sta Locker: olsen $
  3. **    $Revision: 1.6 $
  4. **    $Date: 92/08/15 20:14:54 $
  5. **
  6. **    Screen character (raster) buffering routines
  7. **
  8. **    Copyright ⌐ 1990-1992 by Olaf `Olsen' Barthel & MXM
  9. **        All Rights Reserved
  10. */
  11.  
  12. #include "termGlobal.h"
  13.  
  14.     /* DeleteRaster():
  15.      *
  16.      *    Free the contents of the character raster.
  17.      */
  18.  
  19. VOID
  20. DeleteRaster()
  21. {
  22.     if(Raster)
  23.     {
  24.         FreeVec(Raster);
  25.  
  26.         Raster = NULL;
  27.     }
  28.  
  29.     if(RasterAttr)
  30.     {
  31.         FreeVec(RasterAttr);
  32.  
  33.         RasterAttr = NULL;
  34.     }
  35. }
  36.  
  37.     /* CreateRaster():
  38.      *
  39.      *    Create the character raster.
  40.      */
  41.  
  42. BYTE
  43. CreateRaster()
  44. {
  45.         /* Width of the screen * 2 (in characters).
  46.          * extra for Double width
  47.          */
  48.  
  49.     RasterWidth    = (Window -> Width / TextFontWidth) * 2;
  50.  
  51.         /* Height of the character raster. */
  52.  
  53.     RasterHeight    = Window -> Height / TextFontHeight;
  54.  
  55.         /* Allocate the raster. */
  56.  
  57.     if(Raster = (UBYTE *)AllocVec(RasterWidth * RasterHeight,MEMF_ANY|MEMF_CLEAR))
  58.     {
  59.             /* Allocate the raster attributes. */
  60.  
  61.         if(RasterAttr = (UBYTE *)AllocVec(RasterHeight,MEMF_ANY|MEMF_CLEAR))
  62.             return(TRUE);
  63.         else
  64.         {
  65.             FreeVec(Raster);
  66.  
  67.             Raster = NULL;
  68.         }
  69.     }
  70.  
  71.     return(FALSE);
  72. }
  73.  
  74.     /* RasterEraseScreen(BYTE Mode):
  75.      *
  76.      *    Erase parts of the screen.
  77.      */
  78.  
  79. VOID __regargs
  80. RasterEraseScreen(BYTE Mode)
  81. {
  82.     WORD    First,
  83.         Last;
  84.  
  85.     switch(Mode)
  86.     {
  87.         case 1:    First    = 0;
  88.             Last    = CursorY * RasterWidth + CursorX + 1;
  89.  
  90.             memset(&RasterAttr[0],SCALE_NORMAL,CursorY + 1);
  91.  
  92.             break;
  93.  
  94.         case 2:    First    = 0;
  95.             Last    = RasterHeight * RasterWidth - 1;
  96.  
  97.             memset(&RasterAttr[0],SCALE_NORMAL,RasterHeight);
  98.  
  99.             break;
  100.  
  101.         default:First    = CursorY * RasterWidth + CursorX;
  102.             Last    = RasterHeight * RasterWidth - 1;
  103.  
  104.             memset(&RasterAttr[CursorY],SCALE_NORMAL,RasterHeight - CursorY);
  105.  
  106.             break;
  107.     }
  108.  
  109.     if(Last > First)
  110.         memset(&Raster[First],' ',Last - First);
  111. }
  112.  
  113.     /* RasterEraseLine(BYTE Mode):
  114.      *
  115.      *    Erase parts of the current cursor line.
  116.      */
  117.  
  118. VOID __regargs
  119. RasterEraseLine(BYTE Mode)
  120. {
  121.     WORD    First,
  122.         Last;
  123.  
  124.     switch(Mode)
  125.     {
  126.             /* From beginning to current cursor position. */
  127.  
  128.         case 1:    First    = CursorY * RasterWidth;
  129.             Last    = First + CursorX + 1;
  130.  
  131.             break;
  132.  
  133.             /* Entire line. */
  134.  
  135.         case 2:    First    = CursorY * RasterWidth;
  136.             Last    = First + RasterWidth - 1;
  137.  
  138.             break;
  139.  
  140.             /* From current cursor position towards end. */
  141.  
  142.         default:First    = CursorY * RasterWidth + CursorX;
  143.             Last    = (CursorY + 1) * RasterWidth - 1;
  144.  
  145.             break;
  146.     }
  147.  
  148.     if(Last > First)
  149.         memset(&Raster[First],' ',Last - First);
  150. }
  151.  
  152.     /* RasterEraseCharacters(WORD Chars):
  153.      *
  154.      *    Erase a number of characters in the current cursor
  155.      *    line.
  156.      */
  157.  
  158. VOID __regargs
  159. RasterEraseCharacters(WORD Chars)
  160. {
  161.     if(CursorX < RasterWidth - 1)
  162.     {
  163.         WORD     First,
  164.              Diff;
  165.         UBYTE    *To,
  166.             *From;
  167.  
  168.         First    = CursorY * RasterWidth + CursorX;
  169.         To    = &Raster[First];
  170.  
  171.         if(CursorX + Chars >= RasterWidth)
  172.         {
  173.             Diff = RasterWidth - 1 - CursorX;
  174.  
  175.             while(Diff-- > 0)
  176.                 *To++ = ' ';
  177.         }
  178.         else
  179.         {
  180.             From    = &Raster[First + Chars];
  181.             Diff    = RasterWidth - (CursorX + 1 + Chars);
  182.  
  183.             while(Diff--)
  184.             {
  185.                 *To++ = *From;
  186.  
  187.                 *From++ = ' ';
  188.             }
  189.         }
  190.     }
  191. }
  192.  
  193.     /* RasterClearLine(WORD Lines):
  194.      *
  195.      *    Clear and remove a number of lines.
  196.      */
  197.  
  198. VOID __regargs
  199. RasterClearLine(WORD Lines,WORD Top)
  200. {
  201.     if(Lines)
  202.     {
  203.         WORD RegionBottom;
  204.  
  205.         if(RegionSet)
  206.             RegionBottom = Bottom;
  207.         else
  208.             RegionBottom = LastLine + 1;
  209.  
  210.         if(Top + Lines >= RegionBottom)
  211.             RasterEraseScreen(0);
  212.         else
  213.         {
  214.             WORD     Max;
  215.             UBYTE    *From,
  216.                 *To;
  217.  
  218.             Max    = (RegionBottom - (Top + Lines)) * RasterWidth;
  219.  
  220.             From    = &Raster[(Top + Lines) * RasterWidth];
  221.             To    = &Raster[ Top          * RasterWidth];
  222.  
  223.             while(Max--)
  224.             {
  225.                 *To++ = *From;
  226.  
  227.                 *From++ = ' ';
  228.             }
  229.  
  230.             memset(&RasterAttr[RegionBottom - Lines],SCALE_NORMAL,Lines);
  231.         }
  232.     }
  233. }
  234.  
  235.     /* RasterInsertLine(WORD Lines):
  236.      *
  237.      *    Insert a number of lines at the current cursor line.
  238.      */
  239.  
  240. VOID __regargs
  241. RasterInsertLine(WORD Lines,WORD Top)
  242. {
  243.     if(Lines)
  244.     {
  245.         WORD RegionBottom;
  246.  
  247.         if(RegionSet)
  248.             RegionBottom = Bottom;
  249.         else
  250.             RegionBottom = LastLine + 1;
  251.  
  252.         if(Top + Lines > RegionBottom)
  253.             RasterEraseScreen(0);
  254.         else
  255.         {
  256.             WORD     From,To,
  257.                  Max;
  258.             UBYTE    *FromPtr,
  259.                 *ToPtr;
  260.  
  261.             Max    = (RegionBottom - Lines - Top) * RasterWidth;
  262.  
  263.             From    = (RegionBottom - Lines) * RasterWidth - 1;
  264.             To    =  RegionBottom          * RasterWidth - 1;
  265.  
  266.             FromPtr    = &Raster[From];
  267.             ToPtr    = &Raster[To];
  268.  
  269.             while(Max--)
  270.                 *ToPtr-- = *FromPtr--;
  271.  
  272.             memset(&Raster[Top * RasterWidth],' ',Lines * RasterWidth);
  273.         }
  274.     }
  275. }
  276.  
  277.     /* RasterScrollRegion(WORD Direction,WORD RasterTop,WORD RasterBottom,WORD RasterLines):
  278.      *
  279.      *    Scroll the contents of the character raster up/down.
  280.      */
  281.  
  282. VOID __regargs
  283. RasterScrollRegion(WORD Direction,WORD RasterTop,WORD RasterBottom,WORD RasterLines)
  284. {
  285.     WORD Dir = ABS(Direction);
  286.  
  287.     if(Dir >= RasterLines)
  288.     {
  289.             /* All that is needed is to delete the lines. */
  290.  
  291.         memset(&Raster[RasterTop * RasterWidth],' ',RasterLines * RasterWidth);
  292.     }
  293.     else
  294.     {
  295.         WORD     First,
  296.              Last,
  297.              Max,
  298.              i;
  299.         UBYTE    *From,
  300.             *To;
  301.  
  302.         Max = (RasterLines - Dir) * RasterWidth;
  303.  
  304.         if(Direction < 0)
  305.         {
  306.             First    = (RasterTop + RasterLines - Dir) * RasterWidth - 1;
  307.             Last    = (RasterTop + RasterLines    ) * RasterWidth - 1;
  308.  
  309.             From    = &Raster[First];
  310.             To    = &Raster[Last];
  311.  
  312.             while(Max--)
  313.                 *To-- = *From--;
  314.  
  315.             for(i = RasterBottom ; i >= (RasterTop + Dir) ; i--)
  316.                 RasterAttr[i] = RasterAttr[i - Dir];
  317.  
  318.             memset(&Raster[RasterTop * RasterWidth],' ',RasterWidth * Dir);
  319.  
  320.             memset(&RasterAttr[RasterTop],SCALE_NORMAL,Dir);
  321.         }
  322.         else
  323.         {
  324.             First    = RasterTop * RasterWidth + RasterWidth * Dir;
  325.             Last    = RasterTop * RasterWidth;
  326.  
  327.             From    = &Raster[First];
  328.             To    = &Raster[Last];
  329.  
  330.             while(Max--)
  331.                 *To++ = *From++;
  332.  
  333.             memset(&Raster[(RasterBottom - Dir) * RasterWidth],' ',RasterWidth * Dir);
  334.  
  335.             for(i = RasterTop ; i <= (RasterBottom - Dir) ; i++)
  336.                 RasterAttr[i] = RasterAttr[i + Dir];
  337.  
  338.             memset(&RasterAttr[RasterBottom - Dir],SCALE_NORMAL,Dir);
  339.         }
  340.     }
  341. }
  342.  
  343.     /* RasterShiftChar(WORD Size):
  344.      *
  345.      *    Shift the characters following the current cursor
  346.      *    position Size characters to the right.
  347.      */
  348.  
  349. VOID __regargs
  350. RasterShiftChar(WORD Size)
  351. {
  352.     WORD     i,
  353.          First;
  354.     UBYTE    *From,
  355.         *To;
  356.  
  357.     if(CursorX + Size >= RasterWidth - 1)
  358.     {
  359.         i    = RasterWidth - 1 - CursorX;
  360.         To    = &Raster[CursorY * RasterWidth + CursorX];
  361.  
  362.         while(i-- > 0)
  363.             *To++ = ' ';
  364.     }
  365.     else
  366.     {
  367.         First    = (CursorY + 1) * RasterWidth - 1;
  368.         To    = &Raster[First];
  369.  
  370.         From    = &Raster[First - Size];
  371.         i    = RasterWidth - Size;
  372.  
  373.         while(i-- > CursorX)
  374.             *To-- = *From--;
  375.  
  376.         To    = &Raster[CursorY * RasterWidth + CursorX];
  377.  
  378.         while(Size--)
  379.             *To++ = ' ';
  380.     }
  381. }
  382.  
  383.     /* RasterPutString(UBYTE *String,WORD Length):
  384.      *
  385.      *    Put a string into the character raster.
  386.      */
  387.  
  388. VOID __regargs
  389. RasterPutString(UBYTE *String,WORD Length)
  390. {
  391.     if(Length == 1)
  392.     {
  393.         if(CursorX + 1 < RasterWidth)
  394.             Raster[CursorY * RasterWidth + CursorX] = String[0];
  395.     }
  396.     else
  397.     {
  398.         if(CursorX + Length >= RasterWidth)
  399.             Length = RasterWidth - 1 - CursorX;
  400.  
  401.         if(Length > 0)
  402.             memcpy(&Raster[CursorY * RasterWidth + CursorX],String,Length);
  403.     }
  404. }
  405.