home *** CD-ROM | disk | FTP | other *** search
/ Fresh Fish 7 / FreshFishVol7.bin / bbs / gnu / aplusplus-1.01-src.lha / GNU / src / amiga / APlusPlus-1.01 / libsource / DrawArea.cxx < prev    next >
C/C++ Source or Header  |  1994-05-04  |  6KB  |  258 lines

  1. /******************************************************************************
  2.  **
  3.  **    C++ Class Library for the Amiga© system software.
  4.  **
  5.  **    Copyright (C) 1994 by Armin Vogt  **  EMail: armin@uni-paderborn.de
  6.  **    All Rights Reserved.
  7.  **
  8.  **    $Source: apphome:APlusPlus/RCS/libsource/DrawArea.cxx,v $
  9.  **    $Revision: 1.4 $
  10.  **    $Date: 1994/05/04 15:18:41 $
  11.  **    $Author: Armin_Vogt $
  12.  **
  13.  ******************************************************************************/
  14.  
  15.  
  16. extern "C" {
  17. #ifdef __GNUG__
  18. #include <inline/graphics.h>
  19. #include <inline/layers.h>
  20. #include <inline/gadtools.h>
  21. #endif
  22.  
  23. #ifdef __SASC
  24. #include <proto/graphics.h>
  25. #include <proto/layers.h>
  26. #include <proto/gadtools.h>
  27. #endif
  28. }
  29.  
  30. #include <APlusPlus/graphics/DrawArea.h>
  31. #include <APlusPlus/intuition/GWindow.h>
  32.  
  33.  
  34. volatile static char rcs_id[] = "$Id: DrawArea.cxx,v 1.4 1994/05/04 15:18:41 Armin_Vogt Exp Armin_Vogt $";
  35.  
  36.  
  37. DrawArea::DrawArea(GWindow *homeWindow)
  38. {
  39.    ownClippingInstalled = FALSE;
  40.    oldRegion = NULL;
  41.    regionPtr = NewRegion();
  42.    setGWindow(homeWindow);
  43. }
  44.  
  45. void DrawArea::setGWindow(GWindow *homeWindow)
  46. {
  47.    gWindowPtr = homeWindow;
  48.     if (homeWindow)   rastPort = gwindow()->windowPtr()->RPort;
  49. }
  50.  
  51. DrawArea::~DrawArea()
  52. {
  53.    if (isValid())
  54.    {
  55.       DisposeRegion(regionPtr);
  56.       regionPtr = NULL;
  57.    }
  58. }
  59.  
  60.  
  61. /********************* RastPort draw routines *******************************************/
  62.  
  63.  
  64. void DrawArea::setAPen(UBYTE pen)
  65. {
  66.    SetAPen(rp(),pen);
  67. }
  68. void DrawArea::setBPen(UBYTE pen)
  69. {
  70.    SetBPen(rp(),pen);
  71. }
  72. void DrawArea::setDrMd(UBYTE mode)
  73. {
  74.    SetDrMd(rp(),mode);
  75. }
  76.  
  77. void DrawArea::polyDraw(LONG count,WORD *polyTable)
  78. {    
  79.     WORD *pt = polyTable,*const p= new WORD[count*2];
  80.     WORD *pp=p;
  81.     for (LONG i=count; i>0; i--) { *pp++=(WORD)abs_X(*pt++); *pp++= (WORD)abs_Y(*pt++); }
  82.     Move(rp(),*p,*(p+1));
  83.    PolyDraw(rp(),count,p);
  84.     delete[] p;    
  85. }
  86.  
  87. void DrawArea::rectFill(XYVAL xmin,XYVAL ymin,XYVAL xmax,XYVAL ymax)
  88. {
  89.    xmax = abs_X(xmax);
  90.    ymax = abs_Y(ymax);
  91.  
  92.    if (xmin<xmax && ymin<ymax)   // negative width/height causes GURU MEDITATION!
  93.       RectFill(rp(),abs_X(xmin),abs_Y(ymin),xmax,ymax);
  94. }
  95.  
  96. void DrawArea::scrollRaster(LONG dx,LONG dy,XYVAL xmin,XYVAL ymin,XYVAL xmax,XYVAL ymax)
  97. {
  98.     xmax = abs_X(xmax);
  99.    ymax = abs_Y(ymax);
  100.  
  101.    if (xmin<xmax && ymin<ymax)
  102.       ScrollRaster(rp(),dx,dy,abs_X(xmin),abs_Y(ymin),xmax,ymax);
  103. }
  104.  
  105. void DrawArea::move(XYVAL x,XYVAL y)
  106. {
  107.    Move(rp(),abs_X(x),abs_Y(y));
  108. }
  109. void DrawArea::moveTx(XYVAL x,XYVAL y)
  110. {
  111.    Move(rp(),abs_X(x),abs_Y(y)+rp()->Font->tf_Baseline);
  112. }
  113.  
  114. void DrawArea::draw(XYVAL x,XYVAL y)
  115. {
  116.    Draw(rp(),abs_X(x),abs_Y(y));
  117. }
  118.  
  119. void DrawArea::drawBevelBox(XYVAL xmin,XYVAL ymin,WHVAL width,WHVAL height,BOOL recessed)
  120. {
  121.    DrawBevelBox(rp(),abs_X(xmin),abs_Y(ymin),width,height,
  122.                      GT_VisualInfo,(LONG)gwindow()->screenC()->getVisualInfo(),
  123.                      GTBB_Recessed,recessed,TAG_END);
  124. }
  125.    
  126. void DrawArea::drawEllipse(XYVAL x,XYVAL y,WHVAL hr,WHVAL vr)
  127. {
  128.    DrawEllipse(rp(),abs_X(x),abs_Y(y),hr,vr);
  129. }
  130.  
  131. void DrawArea::setFont(FontC& font)
  132. {
  133.    SetFont(rp(),font);
  134. }
  135.  
  136. void DrawArea::text(UBYTE *textString,UWORD textLength)
  137. {
  138.    if (textLength==0) textLength = (UWORD)strlen((const char*)textString);
  139.    Text(rp(),(STRPTR)textString,textLength);
  140. }
  141.  
  142.  
  143. /*********************** Clipping region routines ***************************************/
  144.  
  145.  
  146. void DrawArea::adjustStdClip()
  147.    /* set the clipping rectangle to the dimensions present in the RectObject.
  148.    */
  149. {
  150.    if (isValid())
  151.    {
  152.       if (ownClippingInstalled)    // clip already installed
  153.          InstallClipRegion(layer(),NULL);
  154.  
  155.       clearRegion();    // free the memory of the rectangles incorporated in the ClipRegion's region.
  156.       orRectRegion(0,0,iWidth()-1,iHeight()-1);   // permit drawing within the RectObject.
  157.         
  158.         if (ownClippingInstalled)    // clip already installed
  159.          InstallClipRegion(layer(),region());
  160.    }
  161. }
  162.  
  163. void DrawArea::resetStdClip()
  164. {
  165.    if (isValid())
  166.       InstallClipRegion(layer(),oldRegion);
  167.     oldRegion = NULL; ownClippingInstalled = FALSE;
  168. }
  169.  
  170. void DrawArea::setStdClip()
  171. {
  172.    if (isValid())
  173.       if (ownClippingInstalled==FALSE)
  174.          oldRegion = InstallClipRegion(layer(),region());
  175. }
  176.  
  177. void DrawArea::setRectangle(XYVAL minX,XYVAL minY,XYVAL maxX,XYVAL maxY,struct Rectangle& rect)
  178.    /* transform RectObject relative dimensions into RastPort absolute coords
  179.       and store them into the referenced Rectangle structure.
  180.    */
  181. {
  182.    rect.MinX = (WORD)abs_X(minX);
  183.    rect.MinY = (WORD)abs_Y(minY);
  184.    rect.MaxX = (WORD)abs_X(maxX);
  185.    rect.MaxY = (WORD)abs_Y(maxY);
  186. }
  187.  
  188. void DrawArea::removeClip()
  189. {
  190.     if (ownClippingInstalled)
  191.     {
  192.         InstallClipRegion(layer(),NULL);
  193.     }
  194. }
  195.  
  196. void DrawArea::insertClip()
  197. {
  198.     if (ownClippingInstalled)
  199.     {
  200.         InstallClipRegion(layer(),region());
  201.     }
  202. }
  203.         
  204. void DrawArea::andRectRegion(XYVAL minX,XYVAL minY,XYVAL maxX,XYVAL maxY)
  205. {
  206.    if (isValid())
  207.    {
  208.    struct Rectangle rect;
  209.    setRectangle(minX,minY,maxX,maxY,rect);
  210.    removeClip();
  211.    AndRectRegion(region(),&rect);
  212.    insertClip();
  213.    }
  214. }
  215. void DrawArea::orRectRegion(XYVAL minX,XYVAL minY,XYVAL maxX,XYVAL maxY)
  216. {
  217.    if (isValid())
  218.    {
  219.    struct Rectangle rect;
  220.    setRectangle(minX,minY,maxX,maxY,rect);
  221.    removeClip();
  222.    OrRectRegion(region(),&rect);
  223.    insertClip();
  224.    }
  225. }
  226. void DrawArea::xorRectRegion(XYVAL minX,XYVAL minY,XYVAL maxX,XYVAL maxY)
  227. {
  228.    if (isValid())
  229.    {
  230.    struct Rectangle rect;
  231.    setRectangle(minX,minY,maxX,maxY,rect);
  232.    removeClip();
  233.    XorRectRegion(region(),&rect);
  234.    insertClip();
  235.    }
  236. }
  237. void DrawArea::clearRectRegion(XYVAL minX,XYVAL minY,XYVAL maxX,XYVAL maxY)
  238. {
  239.    if (isValid())
  240.    {
  241.    struct Rectangle rect;
  242.    setRectangle(minX,minY,maxX,maxY,rect);
  243.    removeClip();
  244.    ClearRectRegion(region(),&rect);
  245.    insertClip();
  246.    }
  247. }
  248.  
  249. void DrawArea::clearRegion()
  250. {
  251.    if (isValid())
  252.    {
  253.    removeClip();
  254.    ClearRegion(region());
  255.    insertClip();
  256.    }
  257. }
  258.