home *** CD-ROM | disk | FTP | other *** search
/ Dream 57 / Amiga_Dream_57.iso / Amiga / Programmation / c / Extensions / APPSource.lha / APlusPlus / libsource / Canvas.cxx < prev    next >
Encoding:
C/C++ Source or Header  |  1994-08-29  |  7.7 KB  |  222 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:RCS/libsource/Canvas.cxx,v $
  9.  **   $Revision: 1.8 $
  10.  **   $Date: 1994/07/27 11:47:47 $
  11.  **   $Author: Armin_Vogt $
  12.  **
  13.  ******************************************************************************/
  14.  
  15.  
  16. #include <APlusPlus/graphics/Canvas.h>
  17. #include <APlusPlus/intuition/IntuiMessageC.h>
  18.  
  19.  
  20. static const char rcs_id[] = "$Id: Canvas.cxx,v 1.8 1994/07/27 11:47:47 Armin_Vogt Exp Armin_Vogt $";
  21.  
  22. //runtime type inquiry support
  23. intui_typeinfo(Canvas, derived(from(AutoDrawArea)), rcs_id)
  24.  
  25.  
  26. #define VISIBLE_X (iWidth()/iGranularityX)
  27. #define VISIBLE_Y (iHeight()/iGranularityY)
  28. #define SCROLLWIDTH (iWidth()-(scrollGratX()==TRUE?(iWidth()%granularityX()):0))
  29. #define SCROLLHEIGHT (iHeight()-(scrollGratY()==TRUE?(iHeight()%granularityY()):0))
  30.  
  31.  
  32. Canvas::Canvas(GOB_OWNER,AttrList& attrs) : AutoDrawArea(gob_owner,attrs)
  33.    /* Note that ViewX and ViewY values are only stored in the IntuiObject attributes.
  34.       The relation is: xy_offset = xy_view * xy_granularity.
  35.    */
  36. {
  37.    if (Ok())
  38.    {
  39.    _dprintf("Canvas::create()\n");
  40.    xOffset = yOffset = 0;
  41.  
  42.    // read init values. If no were specified use default values.
  43.    widthG  = (UWORD)intuiAttrs().getTagData(CNV_Width,iWidth());
  44.    heightG = (UWORD)intuiAttrs().getTagData(CNV_Height,iHeight());
  45.    iGranularityX = (UWORD)intuiAttrs().getTagData(CNV_GranularityX,1);
  46.    iGranularityY = (UWORD)intuiAttrs().getTagData(CNV_GranularityY,1);
  47.    iViewX = (UWORD)intuiAttrs().getTagData(CNV_ViewX);   if (iViewX >= widthG) iViewX = widthG;
  48.    iViewY = (UWORD)intuiAttrs().getTagData(CNV_ViewY);   if (iViewY >= heightG) iViewY = heightG;
  49.    scrollGratingX = (UBYTE)intuiAttrs().getTagData(CNV_ScrollGratX,FALSE);
  50.    scrollGratingY = (UBYTE)intuiAttrs().getTagData(CNV_ScrollGratY,FALSE);
  51.    iVisibleX = 0;
  52.    iVisibleY = 0;
  53.  
  54.    setIOType(IOTYPE_CANVAS);
  55.    }
  56. }
  57.  
  58. Canvas::~Canvas()
  59. {
  60. }
  61.  
  62. APTR Canvas::redrawSelf(GWindow *home,ULONG& returnType)
  63.    /* Computes CNV_VisibleX/Y values and propagates 'redrawSelf' request to base classes.
  64.    */
  65. {
  66.    setAttrs( AttrList(CNV_VisibleX,iVisibleX=(UWORD)VISIBLE_X,
  67.                       CNV_VisibleY,iVisibleY=(UWORD)VISIBLE_Y, TAG_END));
  68.    return AutoDrawArea::redrawSelf(home,returnType);
  69. }
  70.  
  71. ULONG Canvas::setAttributes(AttrList& attrs)
  72. {
  73.    if (notificationLoop()) return 0L;
  74.  
  75.    AttrManipulator next(attrs);
  76.    while (next())
  77.    {
  78.       LONG data = next.data();
  79.       switch (next.tag())
  80.       {
  81.          case CNV_ViewX : // gets data as amount of granularityX units
  82.                {
  83.                   if (data != iViewX && data >= 0 && data < widthG)
  84.                   {
  85.                      adjustStdClip();
  86.                      setStdClip();
  87.                      UWORD deltaViewX = (UWORD)abs((data-(LONG)viewX()));
  88.                      UWORD org_iViewX = iViewX = (UWORD)data;
  89.                      LONG deltaPix = (data*=iGranularityX)-xOffset;
  90.                      xOffset = data;
  91.                      if (deltaViewX < visibleX())
  92.                      {
  93.                         scrollRaster(deltaPix,0,0,0,SCROLLWIDTH-1,SCROLLHEIGHT-1);  // scroll the view rectangle
  94.                         if (deltaPix > 0)    // scroll left, move right
  95.                         {
  96.                            XYVAL right = SCROLLWIDTH;
  97.                            andRectRegion(right-deltaPix-1,0,right-1,iHeight()-1);
  98.                            iViewX += visibleX()-deltaViewX;
  99.                         }
  100.                         else
  101.                         {
  102.                            andRectRegion(0,0,-deltaPix,iHeight()-1);
  103.                         }
  104.                      }
  105.                      else
  106.                      {
  107.                         deltaViewX = visibleX();
  108.                         AutoDrawArea::clear();    // clear draw area
  109.                      }
  110.                      UWORD org_iVisibleX = iVisibleX;
  111.                      iVisibleX = deltaViewX;
  112.                      drawSelf();
  113.                      iViewX = org_iViewX;
  114.                      iVisibleX = org_iVisibleX;
  115.                      resetStdClip();
  116.                   }
  117.                }
  118.                break;
  119.  
  120.          case CNV_ViewY :
  121.                {
  122.                   if (data != iViewY && data >= 0 && data < heightG)
  123.                   {
  124.                      adjustStdClip();
  125.                      setStdClip();
  126.                      UWORD deltaViewY = (UWORD)abs(data-(LONG)viewY());
  127.                      UWORD org_iViewY = iViewY = (UWORD)data;
  128.                      LONG deltaPix = (data*=iGranularityY)-yOffset;
  129.                      yOffset = data;
  130.                      if (deltaViewY < visibleY())
  131.                      {
  132.                         scrollRaster(0,deltaPix,0,0,SCROLLWIDTH-1,SCROLLHEIGHT-1);  // scroll the view rectangle
  133.                         if (deltaPix > 0)
  134.                         {
  135.                            // the 'bottom' of the writeable drawing area
  136.                            XYVAL bottom = SCROLLHEIGHT;
  137.                            andRectRegion(0,bottom-deltaPix-1,iWidth()-1,bottom-1);
  138.                            iViewY += visibleY()-deltaViewY;
  139.                         }
  140.                         else
  141.                         {
  142.                            andRectRegion(0,0,iWidth()-1,-deltaPix);
  143.                         }
  144.                      }
  145.                      else
  146.                      {
  147.                         deltaViewY = visibleY();
  148.                         AutoDrawArea::clear();    // clear draw area
  149.                      }
  150.                      UWORD org_iVisibleY = iVisibleY;
  151.                      iVisibleY = deltaViewY;
  152.                      drawSelf();
  153.                      iViewY = org_iViewY;
  154.                      iVisibleY = org_iVisibleY;
  155.                      resetStdClip();
  156.                   }
  157.                }
  158.                break;
  159.  
  160.          case CNV_Width  :
  161.                next.writeData(widthG = (UWORD)((data > MAXPOT)?MAXPOT:data));
  162.                break;
  163.  
  164.          case CNV_Height :
  165.                next.writeData(heightG = (UWORD)((data > MAXPOT)?MAXPOT:data));
  166.                break;
  167.  
  168.          case CNV_GranularityX :
  169.                if (data==0) data = 1;
  170.                iGranularityX = (UWORD)data;
  171.                break;
  172.  
  173.          case CNV_GranularityY :
  174.                if (data==0) data = 1;
  175.                iGranularityY = (UWORD)data;
  176.                break;
  177.  
  178.          case CNV_ScrollGratX :
  179.                scrollGratingX = (UBYTE)data;
  180.                break;
  181.  
  182.          case CNV_ScrollGratY :
  183.                scrollGratingY = (UBYTE)data;
  184.                break;
  185.  
  186.       }
  187.  
  188.       _dprintf("Canvas: y-offset=%ld\n",yOffset);
  189.    }
  190.    return AutoDrawArea::setAttributes(attrs);
  191. }
  192.  
  193. ULONG Canvas::getAttribute(Tag tag,ULONG& dataStore)
  194. {
  195.    switch (tag)
  196.    {
  197.       case CNV_ViewX : return (dataStore=iViewX);
  198.       case CNV_ViewY : return (dataStore=iViewY);
  199.       case CNV_VisibleX : return (dataStore=iVisibleX);
  200.       case CNV_VisibleY : return (dataStore=iVisibleY);
  201.       case CNV_Width : return (dataStore=widthG);
  202.       case CNV_Height : return (dataStore=heightG);
  203.       case CNV_GranularityX : return (dataStore=iGranularityX);
  204.       case CNV_GranularityY : return (dataStore=iGranularityY);
  205.       case CNV_ScrollGratX : return (dataStore=scrollGratingX);
  206.       case CNV_ScrollGratY : return (dataStore=scrollGratingY);
  207.  
  208.       default:
  209.          return AutoDrawArea::getAttribute(tag,dataStore);
  210.    }
  211. }
  212.  
  213. void Canvas::callback(const IntuiMessageC *imsg)
  214. {
  215.    AutoDrawArea::callback(imsg);
  216.  
  217.    LONG m = ((LONG)imsg->MouseX + xOffset)/iGranularityX;
  218.    iMouseX = (UWORD) (m<0?0:(m>=widthG?widthG-1:m));
  219.    m = ((LONG)imsg->MouseY + yOffset)/iGranularityY;
  220.    iMouseY = (UWORD) (m<0?0:(m>=heightG?heightG-1:m));
  221. }
  222.