home *** CD-ROM | disk | FTP | other *** search
/ Amiga Format CD 28 / amigaformatcd28.iso / -seriously_amiga- / programming / c / oui / screen.cc < prev    next >
C/C++ Source or Header  |  1998-04-23  |  8KB  |  305 lines

  1. // $Id: screen.cc 1.2 1997/07/14 04:20:02 dlorre Exp dlorre $
  2. #include <exec/types.h>
  3. #include <graphics/gfxbase.h>
  4. #include <intuition/intuitionbase.h>
  5. #include <intuition/screens.h>
  6. #include <clib/macros.h>
  7. #include <mydebug.h>
  8.  
  9. #include "screen.h"
  10.  
  11. #include <proto/graphics.h>
  12. #include <proto/intuition.h>
  13. #include <proto/gadtools.h>
  14.  
  15. #include <stdio.h>
  16.  
  17. const UWORD NOMATCH = 0xFFFF ;
  18.  
  19. screen::screen(UWORD *xp, STRPTR name)
  20. {
  21.     status = FALSE ;
  22.     owner = FALSE ;
  23.     xpens = new UWORD[NUM_XPENS] ;
  24.     if (xpens) {
  25.         if (xp) {
  26.             defpens = NULL ;
  27.             setxpens(xp) ;
  28.         }
  29.         else {
  30.             defpens = new UWORD[NUM_XPENS] ;
  31.         }
  32.         if (xp || defpens) {
  33.             scr = LockPubScreen((UBYTE *)name) ;
  34.             if (!scr)
  35.                 scr = LockPubScreen(NULL) ;
  36.             if (scr)
  37.                 init() ;
  38.         }
  39.     }
  40. }
  41.  
  42. screen::screen(UWORD *xp, ULONG tdata, ...)
  43. {
  44. TagItem *tags = (TagItem *)&tdata ;
  45.     status = FALSE ;
  46.     owner = TRUE ;
  47.     xpens = new UWORD[NUM_XPENS] ;
  48.     if (xpens) {
  49.         if (xp) {
  50.             defpens = NULL ;
  51.             setxpens(xp) ;
  52.         }
  53.         else
  54.             defpens = new UWORD[NUM_XPENS] ;
  55.         if (xp || defpens) {
  56.             scr = OpenScreenTags(NULL,
  57.                 SA_ErrorCode,   &error,
  58.                 TAG_MORE,       tags) ;
  59.  
  60.             if (scr)
  61.                 init() ;
  62.         }
  63.     }
  64. }
  65.  
  66. screen::screen(UWORD *xp, TagItem *tags)
  67. {
  68.     status = FALSE ;
  69.     owner = TRUE ;
  70.     xpens = new UWORD[NUM_XPENS] ;
  71.     if (xpens) {
  72.         if (xp) {
  73.             defpens = NULL ;
  74.             setxpens(xp) ;
  75.         }
  76.         else
  77.             defpens = new UWORD[NUM_XPENS] ;
  78.         if (xp || defpens) {
  79.             scr = OpenScreenTags(NULL,
  80.                 SA_ErrorCode,   &error,
  81.                 TAG_MORE,       tags) ;
  82.  
  83.             if (scr)
  84.                 init() ;
  85.         }
  86.     }
  87. }
  88.  
  89. void screen::init()
  90. {
  91.  
  92.     vi = GetVisualInfo(scr, TAG_DONE);
  93.     if (vi) {
  94.         font = OpenFont(scr->Font) ;
  95.         if (font) {
  96.             drawinfo = GetScreenDrawInfo(scr) ;
  97.             if (drawinfo) {
  98.                 rp = &scr->RastPort ;
  99.                 getsize() ;
  100.                 if (defpens) {
  101.                     setdefpens() ;
  102.                 }
  103.                 status = TRUE ;
  104.             }
  105.             else
  106.                 error = -3 ;
  107.         }
  108.         else
  109.             error = -2 ;
  110.     }
  111.     else
  112.         error = -1 ;
  113. }
  114.  
  115. screen::~screen()
  116. {
  117.     if (xpens)
  118.         delete xpens ;
  119.  
  120.     if (defpens) {
  121.         if (GfxBase->LibNode.lib_Version >=39) {
  122.             ColorMap *cm = scr->ViewPort.ColorMap ;
  123.             ReleasePen(cm, defpens[GREEN_PEN]) ;
  124.             ReleasePen(cm, defpens[RED_PEN]) ;
  125.             ReleasePen(cm, defpens[WHITE_PEN]) ;
  126.             ReleasePen(cm, defpens[BLACK_PEN]) ;
  127.         }
  128.         delete defpens ;
  129.     }
  130.     if (drawinfo)
  131.         FreeScreenDrawInfo(scr, drawinfo) ;
  132.     if (font)
  133.         CloseFont(font) ;
  134.     if (vi)
  135.         FreeVisualInfo(vi) ;
  136.     if (scr) {
  137.         if (owner)
  138.             CloseScreen(scr) ;
  139.         else {
  140.             UnlockPubScreen(NULL, scr) ;
  141.         }
  142.     }
  143. }
  144.  
  145.  
  146. void screen::getsize()
  147. {
  148. DisplayInfo displayinfo ;
  149. DisplayInfoHandle handle ;
  150. ULONG   modeid ;
  151.  
  152.     left = short(MAX(0, -scr->LeftEdge)) ;
  153.     top = short(MAX(0, -scr->TopEdge) + scr->BarHeight + 1) ;
  154.     height = short(scr->Height - scr->BarHeight) ;
  155.     width = scr->Width ;
  156.     winbarheight = short(scr->WBorTop + font->tf_YSize + 1) ;
  157.     xratio = yratio = 1 ;
  158.     modeid = GetVPModeID(&scr->ViewPort);
  159.  
  160.     if ((modeid != INVALID_ID) && (handle = FindDisplayInfo(modeid))) {
  161.         if (GetDisplayInfoData(handle, (UBYTE *)&displayinfo, sizeof(DisplayInfo),
  162.             DTAG_DISP, NULL) && displayinfo.PixelSpeed) {
  163.             /* This two lines are code from Ghostscript amiga device */
  164.                 xratio = (35*140) / displayinfo.PixelSpeed ;
  165.                 yratio = (xratio * displayinfo.Resolution.x) / displayinfo.Resolution.y ;
  166.         }
  167.     }
  168. }
  169.  
  170.  
  171. void screen::front()
  172. {
  173.     ScreenToFront(scr) ;
  174. }
  175.  
  176. void screen::back()
  177. {
  178.     ScreenToBack(scr) ;
  179. }
  180.  
  181. void screen::cfront()
  182. {
  183.     if (IntuitionBase->LibNode.lib_Version >= 39)
  184.         ScreenDepth(scr, SDEPTH_TOFRONT | SDEPTH_INFAMILY, NULL) ;
  185.     else
  186.         ScreenToFront(scr) ;
  187. }
  188.  
  189. void screen::cback()
  190. {
  191.     if (IntuitionBase->LibNode.lib_Version >= 39)
  192.         ScreenDepth(scr, SDEPTH_TOBACK | SDEPTH_INFAMILY, NULL) ;
  193.     else
  194.         ScreenToBack(scr) ;
  195. }
  196.  
  197.  
  198. void screen::beep()
  199. {
  200.     DisplayBeep(scr) ;
  201. }
  202.  
  203. void screen::setxpens(UWORD *p)
  204. {
  205. int i = 0 ;
  206.  
  207.     while (p[i] != 0xFFFF) {
  208.         xpens[i] = p[i++]  ;
  209.     }
  210. }
  211.  
  212. void screen::setdefpens()
  213. {
  214. int i ;
  215. ColorMap *cm = scr->ViewPort.ColorMap ;
  216.  
  217.     if (GfxBase->LibNode.lib_Version >= 39) {
  218.  
  219.         defpens[GREEN_PEN] = ObtainBestPen(cm,
  220.             0x00000000,
  221.             0xffffffff,
  222.             0x00000000,
  223.             OBP_Precision,  PRECISION_IMAGE,
  224.             OBP_FailIfBad,  TRUE,
  225.             TAG_DONE) ;
  226.  
  227.         defpens[RED_PEN] = ObtainBestPen(cm,
  228.             0xffffffff,
  229.             0x00000000,
  230.             0x00000000,
  231.             OBP_Precision,  PRECISION_IMAGE,
  232.             OBP_FailIfBad,  TRUE,
  233.             TAG_DONE) ;
  234.  
  235.         defpens[WHITE_PEN] = ObtainBestPen(cm,
  236.             0xffffffff,
  237.             0xffffffff,
  238.             0xffffffff,
  239.             OBP_Precision,  PRECISION_IMAGE,
  240.             OBP_FailIfBad,  TRUE,
  241.             TAG_DONE) ;
  242.  
  243.         defpens[BLACK_PEN] = ObtainBestPen(cm,
  244.             0x00000000,
  245.             0x00000000,
  246.             0x00000000,
  247.             OBP_Precision,  PRECISION_IMAGE,
  248.             OBP_FailIfBad,  TRUE,
  249.             TAG_DONE) ;
  250.  
  251.     }
  252.     else {
  253.         defpens[GREEN_PEN] = drawinfo->dri_Pens[HIGHLIGHTTEXTPEN] ;
  254.         defpens[RED_PEN] = drawinfo->dri_Pens[TEXTPEN] ;
  255.         defpens[WHITE_PEN] = drawinfo->dri_Pens[HIGHLIGHTTEXTPEN] ;
  256.         defpens[BLACK_PEN] = drawinfo->dri_Pens[TEXTPEN] ;
  257.     }
  258.     defpens[GFILL_PEN] = drawinfo->dri_Pens[BACKGROUNDPEN] ;
  259.     defpens[GBORDER_PEN] = drawinfo->dri_Pens[TEXTPEN] ;
  260.     defpens[BUTTONFILL_PEN] = drawinfo->dri_Pens[BACKGROUNDPEN] ;
  261.     if (GfxBase->LibNode.lib_Version >= 39) {
  262.         xpens[GREEN_PEN] =
  263.             (defpens[GREEN_PEN] != NOMATCH) ? defpens[GREEN_PEN] :
  264.             FindColor(cm,
  265.                 0x00000000,
  266.                 0xffffffff,
  267.                 0x00000000,
  268.                 -1) ;
  269.  
  270.         xpens[RED_PEN] =
  271.             (defpens[RED_PEN] != NOMATCH) ? defpens[RED_PEN] :
  272.             FindColor(cm,
  273.                 0xffffffff,
  274.                 0x00000000,
  275.                 0x00000000,
  276.                 -1) ;
  277.         xpens[WHITE_PEN] =
  278.             (defpens[WHITE_PEN] != NOMATCH) ? defpens[WHITE_PEN] :
  279.             FindColor(cm,
  280.                 0xffffffff,
  281.                 0xffffffff,
  282.                 0xffffffff,
  283.                 -1) ;
  284.         xpens[BLACK_PEN] =
  285.             (defpens[BLACK_PEN] != NOMATCH) ? defpens[BLACK_PEN] :
  286.             FindColor(cm,
  287.                 0x00000000,
  288.                 0x00000000,
  289.                 0x00000000,
  290.                 -1) ;
  291.  
  292.         if (xpens[WHITE_PEN] == 0) xpens[WHITE_PEN] = (drawinfo->dri_Depth > 1)?2:1 ;
  293.         if (xpens[BLACK_PEN] == 0) xpens[BLACK_PEN] = 1 ;
  294.         if (xpens[BLACK_PEN] >0x0F &&
  295.             IntuitionBase->LibNode.lib_Version == 39)
  296.                 xpens[BLACK_PEN] = 1 ;
  297.         if (xpens[GREEN_PEN] == 0) xpens[GREEN_PEN] = (drawinfo->dri_Depth > 1)?2:1 ;
  298.         if (xpens[RED_PEN] == 0) xpens[RED_PEN] = 1 ;
  299.         i = 4 ;
  300.     }
  301.     else
  302.         i = 0 ;
  303.     while (i < NUM_XPENS)
  304.         xpens[i] = defpens[i++] ;
  305. }