home *** CD-ROM | disk | FTP | other *** search
/ Developer CD Series 1996 October: Mac OS SDK / Dev.CD Oct 96 SDK / Dev.CD Oct 96 SDK2.toast / Development Kits (Disc 2) / OpenDoc / OpenDoc Development / Debugging Support / OpenDoc Source Code / Imaging / Canvas.cpp next >
Encoding:
C/C++ Source or Header  |  1996-04-22  |  6.9 KB  |  246 lines  |  [TEXT/MPS ]

  1. /*
  2.     File:        Canvas.cpp
  3.  
  4.     Contains:    ODCanvas, a Macintosh drawing environment.
  5.  
  6.     Owned by:    Jens Alfke
  7.     Owned by:    Jens Alfke, Joshua Susser
  8.  
  9.     Copyright:    © 1993 - 1995 by Apple Computer, Inc., all rights reserved.
  10.  
  11.     Change History (most recent first):
  12.  
  13.          <9>     9/18/95    JBS        1285042 don't use QD grafport calls for
  14.                                     in/validation when printing
  15.          <8>      8/7/95    JBS        1275083 added Invalidate & Validate (moved
  16.                                     from ODFacet)
  17.          <7>     5/25/95    jpa        Use new GX headers [1241078, 1253324]
  18.          <6>     3/20/95    jpa        Create gxViewPort when asked for it
  19.                                     [1218787]. SOM_CATCH --> SOM_TRY [1224355].
  20.          <5>     12/5/94    jpa        Fixes from code review. [1203923]
  21.          <4>     9/29/94    RA        1189812: Mods for 68K build.
  22.          <3>     8/17/94    jpa        Function prefixes. [1181512]
  23.          <2>      8/8/94    jpa        API changes for multiformat canvases & bias
  24.                                     transforms [1179683, 1178688]
  25.          <1>     6/15/94    jpa        first checked in
  26.  
  27.     To Do:
  28.     In Progress:
  29. */
  30.  
  31.  
  32. #define ODCanvas_Class_Source
  33. #define VARIABLE_MACROS
  34. #include <Canvas.xih>
  35.  
  36. #ifndef _REALSHPE_
  37. #include "RealShpe.h"    /* For gGX */
  38. #endif
  39.  
  40. #ifndef _EXCEPT_
  41. #include <Except.h>
  42. #endif
  43.  
  44. #ifndef __GXENVIRONMENT__
  45. #include <GXEnvironment.h>
  46. #endif
  47.  
  48.  
  49. //------------------------------------------------------------------------------
  50. // InitCanvas
  51. //------------------------------------------------------------------------------
  52.  
  53. SOM_Scope void  SOMLINK ODCanvas__InitCanvas(ODCanvas *somSelf, Environment *ev,
  54.         ODGraphicsSystem graphicsSystem,
  55.         ODPlatformCanvas platformCanvas,
  56.         ODBoolean isDynamic,
  57.         ODBoolean isOffscreen)
  58. {
  59.     ODCanvasData *somThis = ODCanvasGetData(somSelf);
  60.     ODCanvasMethodDebug("ODCanvas","InitCanvas");
  61.     
  62.     somSelf->InitBaseCanvas(ev,isDynamic,isOffscreen);
  63.  
  64.     if( graphicsSystem == kODQuickDraw )
  65.         _fQDCanvas= platformCanvas;
  66.     else if( graphicsSystem == kODQuickDrawGX )
  67.         _fGXCanvas = platformCanvas;
  68.     else
  69.         ODSetSOMException(ev, kODErrInvalidGraphicsSystem);
  70. }
  71.  
  72. //------------------------------------------------------------------------------
  73. // HasPlatformCanvas
  74. //------------------------------------------------------------------------------
  75.  
  76. SOM_Scope ODBoolean  SOMLINK ODCanvas__HasPlatformCanvas(ODCanvas *somSelf, Environment *ev,
  77.         ODGraphicsSystem g)
  78. {
  79.     ODCanvasData *somThis = ODCanvasGetData(somSelf);
  80.     ODCanvasMethodDebug("ODCanvas","HasPlatformCanvas");
  81.  
  82.     if( g == kODQuickDraw )
  83.         return _fQDCanvas != kODNULL;
  84.     else if( g == kODQuickDrawGX )
  85.         return _fGXCanvas != kODNULL || (gGX && _fQDCanvas != kODNULL);
  86.     else
  87.         return kODFalse;
  88. }
  89.  
  90. //------------------------------------------------------------------------------
  91. // GetPlatformCanvas
  92. //------------------------------------------------------------------------------
  93.  
  94. SOM_Scope ODPlatformCanvas  SOMLINK ODCanvas__GetPlatformCanvas(ODCanvas *somSelf, Environment *ev,
  95.         ODGraphicsSystem g)
  96. {
  97.     ODCanvasData *somThis = ODCanvasGetData(somSelf);
  98.     ODCanvasMethodDebug("ODCanvas","GetPlatformCanvas");
  99.  
  100.     ODPlatformCanvas c;
  101.     if( g == kODQuickDraw )
  102.         c= _fQDCanvas;
  103.     else if( g == kODQuickDrawGX ) {
  104.         if( !_fGXCanvas ) {
  105.             (void) ODCanvas__GetGXViewport(somSelf,ev);
  106.             if( ev->_major )
  107.                 return kODNULL;
  108.         }
  109.         c = _fGXCanvas;
  110.     } else
  111.         c = kODNULL;
  112.     
  113.     if( c == kODNULL )
  114.         ODSetSOMException(ev, kODErrInvalidGraphicsSystem);
  115.     return c;
  116. }
  117.  
  118. //------------------------------------------------------------------------------
  119. // SetPlatformCanvas
  120. //------------------------------------------------------------------------------
  121.  
  122. SOM_Scope void  SOMLINK ODCanvas__SetPlatformCanvas(ODCanvas *somSelf, Environment *ev,
  123.         ODGraphicsSystem g,
  124.         ODPlatformCanvas c)
  125. {
  126.     ODCanvasData *somThis = ODCanvasGetData(somSelf);
  127.     ODCanvasMethodDebug("ODCanvas","SetPlatformCanvas");
  128.  
  129.     if( g == kODQuickDraw )
  130.         _fQDCanvas= c;
  131.     else if( g == kODQuickDrawGX )
  132.         _fGXCanvas = c;
  133.     else
  134.         ODSetSOMException(ev, kODErrInvalidGraphicsSystem);
  135. }
  136.  
  137. //------------------------------------------------------------------------------
  138. // GetQDPort
  139. //------------------------------------------------------------------------------
  140.  
  141. SOM_Scope GrafPtr  SOMLINK ODCanvas__GetQDPort(ODCanvas *somSelf, Environment *ev)
  142. {
  143.     ODCanvasData *somThis = ODCanvasGetData(somSelf);
  144.     ODCanvasMethodDebug("ODCanvas","GetQDPort");
  145.  
  146.     if( !_fQDCanvas )
  147.         ODSetSOMException(ev, kODErrInvalidGraphicsSystem);
  148.     return (GrafPtr)_fQDCanvas;
  149. }
  150.  
  151.  
  152. //------------------------------------------------------------------------------
  153. // GetGXViewport
  154. //------------------------------------------------------------------------------
  155.  
  156. SOM_Scope ODPlatformCanvas  SOMLINK ODCanvas__GetGXViewport(ODCanvas *somSelf, Environment *ev)
  157. {
  158.     ODCanvasData *somThis = ODCanvasGetData(somSelf);
  159.     ODCanvasMethodDebug("ODCanvas","GetGXViewport");
  160.  
  161.     if( !_fGXCanvas ) {
  162.         SOM_TRY
  163.             if( !gGX || !_fQDCanvas )
  164.                 THROW(kODErrInvalidGraphicsSystem);
  165.             else if( somSelf->IsOffscreen(ev) ) {
  166.                 THROW(kODErrNotImplemented);    // $$$$$
  167.             } else {
  168.                 ClearGXError();
  169.                 gxViewPort v = GXGetWindowViewPort((WindowPtr)_fQDCanvas);
  170.                 if( !v )
  171.                     v = GXNewWindowViewPort((WindowPtr)_fQDCanvas);
  172.                 ThrowIfFirstGXError();
  173.                 _fGXCanvas = (ODPlatformCanvas) v;
  174.             }
  175.         SOM_CATCH_ALL
  176.         SOM_ENDTRY
  177.     }
  178.     return _fGXCanvas;
  179. }
  180.  
  181. //------------------------------------------------------------------------------
  182. // Invalidate
  183. //------------------------------------------------------------------------------
  184.  
  185. SOM_Scope void  SOMLINK ODCanvas__Invalidate(ODCanvas *somSelf, Environment *ev,
  186.         ODShape* shape)
  187. {
  188.     ODCanvasData *somThis = ODCanvasGetData(somSelf);
  189.     ODCanvasMethodDebug("ODCanvas","Invalidate");
  190.  
  191.     SOM_TRY
  192.  
  193.     if ( somSelf->IsOffscreen(ev) )
  194.         parent_Invalidate(somSelf, ev, shape);
  195.     else if ( _fQDCanvas != kODNULL
  196.             && !somSelf->HasPlatformPrintJob(ev, kODQuickDraw) )
  197.     {
  198.         GrafPtr savedPort;
  199.         GrafPtr windowPort = (GrafPtr)_fQDCanvas;
  200.         GetPort(&savedPort);
  201.         SetPort(windowPort);
  202.         short oldLeft = windowPort->portRect.left;
  203.         short oldTop = windowPort->portRect.top;
  204.         SetOrigin(0, 0);
  205.         InvalRgn(shape->GetQDRegion(ev));
  206.         SetOrigin(oldLeft, oldTop);
  207.         SetPort(savedPort);
  208.     }
  209.         
  210.     SOM_CATCH_ALL
  211.     SOM_ENDTRY
  212. }
  213.  
  214. //------------------------------------------------------------------------------
  215. // Validate
  216. //------------------------------------------------------------------------------
  217.  
  218. SOM_Scope void  SOMLINK ODCanvas__Validate(ODCanvas *somSelf, Environment *ev,
  219.         ODShape* shape)
  220. {
  221.     ODCanvasData *somThis = ODCanvasGetData(somSelf);
  222.     ODCanvasMethodDebug("ODCanvas","Validate");
  223.  
  224.     SOM_TRY
  225.  
  226.     if ( somSelf->IsOffscreen(ev) )
  227.         parent_Validate(somSelf, ev, shape);
  228.     else if ( _fQDCanvas != kODNULL
  229.             && !somSelf->HasPlatformPrintJob(ev, kODQuickDraw) )
  230.     {
  231.         GrafPtr savedPort;
  232.         GrafPtr windowPort = (GrafPtr)_fQDCanvas;
  233.         GetPort(&savedPort);
  234.         SetPort(windowPort);
  235.         short oldLeft = windowPort->portRect.left;
  236.         short oldTop = windowPort->portRect.top;
  237.         SetOrigin(0, 0);
  238.         ValidRgn(shape->GetQDRegion(ev));
  239.         SetOrigin(oldLeft, oldTop);
  240.         SetPort(savedPort);
  241.     }
  242.         
  243.     SOM_CATCH_ALL
  244.     SOM_ENDTRY
  245. }
  246.