home *** CD-ROM | disk | FTP | other *** search
/ Club Amiga de Montreal - CAM / CAM_CD_1.iso / files / 199.lha / GimmeLib / dbufquick.c < prev    next >
C/C++ Source or Header  |  1988-12-27  |  4KB  |  140 lines

  1. /*
  2.  *  FILE: dbufquick.c
  3.  *  Support routines for converting a single-buffered Intuition screen
  4.  *  into a double-buffered screen and back.
  5.  *  It is faster than dbuf.c because copper lists are stored and manipulated
  6.  *  quickly by these routines.
  7.  *
  8.  *  NOTE: these routines are not very forgiving with respect to moving the
  9.  *  screen around under Intuition.
  10.  *
  11.  *  Public Domain, but keep my name in it as the original author.
  12.  *  31-Aug-88    Jan Sven Trabandt   first release version
  13.  */
  14.  
  15.  
  16. #define I_AM_DBUFQUICK
  17. #include "gimmelib/gimmefuncs.h"
  18. #include "gimmelib/minterm.h"
  19.  
  20.  
  21. short makeDBufQuick( screen, bmptr, lcprptr, scprptr )
  22.     struct Screen   *screen;
  23.     struct BitMap   **bmptr;
  24.     struct cprlist  **lcprptr, **scprptr;
  25. {
  26.     struct BitMap   *bm;
  27.     struct cprlist  *lcpr, *scpr;
  28.     struct View     *view;
  29.  
  30. #ifdef GIMME_WIMPY
  31.     if( !screen || !bmptr || !lcprptr || !scprptr ) {
  32.     return( -1 );
  33.     }
  34. #endif
  35.     if( !*bmptr ) {
  36.     *bmptr = gimmeBitMap( screen->BitMap.Depth, screen->Width,
  37.                 screen->Height );
  38.     if( !*bmptr ) {
  39.         return( -1 );
  40.     }
  41.     }
  42.  
  43.     Forbid();
  44.     bm = screen->RastPort.BitMap;        /* save main bitmap pointer */
  45.     view = ViewAddress();
  46.     lcpr = view->LOFCprList;            /* save these copper lists */
  47.     scpr = view->SHFCprList;
  48.     view->LOFCprList = NULL;
  49.     view->SHFCprList = NULL;
  50.     screen->ViewPort.RasInfo->BitMap = *bmptr;        /* set to back buffer */
  51.     MakeScreen( screen );
  52.     MrgCop( view );                         /* make new copper lists */
  53.     *lcprptr = view->LOFCprList;        /* save new copper lists */
  54.     *scprptr = view->SHFCprList;
  55.     view->LOFCprList = lcpr;            /* restore old copper lists */
  56.     view->SHFCprList = scpr;
  57.     screen->ViewPort.RasInfo->BitMap = bm;  /* restore main viewing buffer */
  58.     Permit();
  59.  
  60.     screen->RastPort.BitMap = *bmptr;        /* draw to back buffer */
  61.     return( 0 );
  62. } /* makeDBufQuick */
  63.  
  64.  
  65. short unmakeDBufQuick( screen, bmptr, bm, lcprptr, scprptr )
  66.     struct Screen   *screen;
  67.     struct BitMap   **bmptr;
  68.     struct BitMap   *bm;
  69.     struct cprlist  **lcprptr, **scprptr;
  70. {
  71.     struct BitMap   *viewbm;
  72.  
  73. #ifdef GIMME_WIMPY
  74.     if( !screen || !bmptr || !lcprptr || !scprptr ) {
  75.     return( -1 );
  76.     }
  77. #endif
  78.     viewbm = screen->ViewPort.RasInfo->BitMap;
  79.     if( !(screen->Flags & CUSTOMBITMAP) && viewbm == *bmptr ) {
  80.     BltBitMap( viewbm, 0L, 0L, screen->RastPort.BitMap, 0L, 0L,
  81.             (ULONG)(bm->BytesPerRow) << 3, (ULONG) bm->Rows,
  82.             (ULONG) GIM_MINTERM_COPY, 0x0ffL, NULL );
  83.     swapDBufQuick( screen, GIM_MINTERM_DEST, lcprptr, scprptr );
  84.     }
  85.     if( viewbm != screen->RastPort.BitMap ) {
  86.     screen->RastPort.BitMap = viewbm;
  87.     }
  88.     if( bm ) {
  89.     getRidOfBitMap( bm );
  90.     }
  91.     if( *lcprptr ) {
  92.     FreeCprList( *lcprptr );
  93.     }
  94.     if( *scprptr ) {
  95.     FreeCprList( *scprptr );
  96.     }
  97.     return( 0 );
  98. } /* unmakeDBufQuick */
  99.  
  100.  
  101. short swapDBufQuick( screen, minterm, lcprptr, scprptr )
  102.     register struct Screen  *screen;
  103.     SHORT   minterm;
  104.     struct cprlist  **lcprptr, **scprptr;
  105. {
  106.     struct BitMap   *bm;
  107.     struct cprlist  *lcpr, *scpr;
  108.     struct View     *view;
  109.  
  110. #ifdef GIMME_WIMPY
  111.     if( !screen || !lcprptr || !scprptr || !*lcprptr || !*scprptr ) {
  112.     return( -1 );
  113.     }
  114. #endif
  115.     Forbid();
  116.     bm = screen->ViewPort.RasInfo->BitMap;
  117.     if( bm == screen->RastPort.BitMap ) {
  118.     Permit();
  119.     return( 0 );
  120.     }
  121.     view = ViewAddress();
  122.     lcpr = view->LOFCprList;            /* get current copper lists */
  123.     scpr = view->SHFCprList;
  124.     view->LOFCprList = *lcprptr;        /* set other copper lists */
  125.     view->SHFCprList = *scprptr;
  126.     *lcprptr = lcpr;                /* save new other copper lists */
  127.     *scprptr = scpr;
  128.     LoadView( view );
  129.  
  130.     screen->ViewPort.RasInfo->BitMap = screen->RastPort.BitMap;
  131.     screen->RastPort.BitMap = bm;
  132.     Permit();
  133.     if( minterm != GIM_MINTERM_DEST ) {
  134.     BltBitMap( screen->ViewPort.RasInfo->BitMap, 0L, 0L, bm, 0L, 0L,
  135.             (ULONG)(bm->BytesPerRow) << 3, (ULONG) bm->Rows,
  136.             (ULONG) minterm, 0x0ffL, NULL );
  137.     }
  138.     return( 0 );
  139. } /* swapDBufQuick */
  140.