home *** CD-ROM | disk | FTP | other *** search
/ Developer CD Series 1996 July: Mac OS SDK / Dev.CD Jul 96 SDK / Dev.CD Jul 96 SDK1.toast / Development Kits (Disc 1) / OpenDoc / OpenDoc Development / Debugging Support / OpenDoc Source Code / Imaging / CanvasB.cpp < prev    next >
Encoding:
C/C++ Source or Header  |  1996-04-22  |  13.4 KB  |  450 lines  |  [TEXT/MPS ]

  1. /*
  2.     File:        CanvasB.cpp
  3.  
  4.     Contains:    ODBaseCanvas, an abstract drawing environment.
  5.  
  6.     Owned by:    Jens Alfke, Joshua Susser
  7.  
  8.     Copyright:    © 1993 - 1995 by Apple Computer, Inc., all rights reserved.
  9.  
  10.     Change History (most recent first):
  11.  
  12.         <17>     8/29/95    jpa        Use TempODShape to avoid checking result of
  13.                                     'new ODShape'. [1279066]
  14.         <16>      8/3/95    RR        #1257260: Collapse B classes. Remove
  15.                                     somInit methods. Don't call IsInitialized
  16.                                     or SubclassResponsibility
  17.         <15>      6/1/95    jpa        Removed CheckUpdateShape. [1232306]
  18.         <14>     5/26/95    RR        #1251403: Multithreading naming support
  19.         <13>      5/4/95    jpa        Fixed bad TRY block in GetOwner. [1246060]
  20.         <12>     3/31/95    jpa        Fixed crash in GetUpdateShape for onscreen
  21.                                     canvases. [1223422]
  22.         <11>     3/22/95    jpa        Use new ODPlatformPrintJob type. [1230236]
  23.         <10>     3/20/95    jpa        SOM_CATCH --> SOM_TRY [1224355]
  24.          <9>     1/13/95    RR        Check for null in GetBiasTransform
  25.          <8>    12/20/94    jpa        GetUpdateShape increments shape's refcount
  26.                                     [1207402]
  27.          <7>     12/5/94    jpa        Fixes from code review. [1203923]
  28.          <6>    10/24/94    jpa        Include Trnsform.xh. Initialize
  29.                                     fUpdateShape. [1153437, 1165562]
  30.          <5>     9/29/94    RA        1189812: Mods for 68K build.
  31.          <4>     8/17/94    jpa        Function prefixes. [1181512]
  32.          <3>      8/8/94    jpa        API changes for multiformat canvases & bias
  33.                                     transforms [1179683, 1178688]
  34.          <2>     7/13/94    jpa        Call InitObject in InitBaseCanvas.
  35.          <1>     6/15/94    jpa        first checked in
  36.  
  37.     To Do:
  38.     In Progress:
  39.         
  40. */
  41.  
  42. #ifndef _ALTPOINT_
  43. #include "AltPoint.h"
  44. #endif
  45.  
  46. #define ODBaseCanvas_Class_Source
  47. #define VARIABLE_MACROS
  48. #include <CanvasB.xih>
  49.  
  50. #ifndef SOM_ODPart_xh
  51. #include <Part.xh>
  52. #endif
  53.  
  54. #ifndef SOM_ODShape_xh
  55. #include <Shape.xh>
  56. #endif
  57.  
  58. #ifndef SOM_ODTransform_xh
  59. #include <Trnsform.xh>
  60. #endif
  61.  
  62. #ifndef _EXCEPT_
  63. #include <Except.h>
  64. #endif
  65.  
  66. #ifndef _ODUTILS_
  67. #include <ODUtils.h>
  68. #endif
  69.  
  70. #ifndef _TEMPOBJ_
  71. #include <TempObj.h>
  72. #endif
  73.  
  74.  
  75. //------------------------------------------------------------------------------
  76. // somUninit
  77. //------------------------------------------------------------------------------
  78.  
  79. SOM_Scope void  SOMLINK ODBaseCanvas__somUninit(ODBaseCanvas *somSelf)
  80. {
  81.     ODBaseCanvasData *somThis = ODBaseCanvasGetData(somSelf);
  82.     ODBaseCanvasMethodDebug("ODBaseCanvas","somUninit");
  83.     
  84.     ODSafeReleaseObject( _fOwner );
  85.     ODSafeReleaseObject( _fUpdateShape );
  86.     ODSafeReleaseObject( _fBiasTransform );
  87.     
  88.     ODBaseCanvas_parents_somUninit(somSelf);
  89. }
  90.  
  91. //------------------------------------------------------------------------------
  92. // InitBaseCanvas
  93. //------------------------------------------------------------------------------
  94.  
  95. SOM_Scope void  SOMLINK ODBaseCanvas__InitBaseCanvas(ODBaseCanvas *somSelf, Environment *ev,
  96.         ODBoolean isDynamic,
  97.         ODBoolean isOffscreen)
  98. {
  99.     ODBaseCanvasData *somThis = ODBaseCanvasGetData(somSelf);
  100.     ODBaseCanvasMethodDebug("ODBaseCanvas","InitBaseCanvas");
  101.     
  102.     SOM_TRY
  103.  
  104.     /* Moved from somInit. SOM itself sets fields to zero
  105.     _fOwner = kODNULL;
  106.     _fUpdateShape = kODNULL;
  107.     _fFacet = kODNULL;
  108.     _fIsDynamic = kODTrue;
  109.     _fIsOffscreen = kODFalse;
  110.     _fBiasTransform = kODNULL;
  111.     _fPlatformPrintJob = kODNULL;
  112.     */
  113.     _fPrintJobGraphicsSystem = kODNoGraphicsSystem;
  114.  
  115.     somSelf->InitObject(ev);
  116.  
  117.     _fIsDynamic = isDynamic;
  118.     _fIsOffscreen = isOffscreen;
  119.  
  120.     SOM_CATCH_ALL
  121.     SOM_ENDTRY
  122. }
  123.  
  124. //------------------------------------------------------------------------------
  125. // GetOwner
  126. //------------------------------------------------------------------------------
  127.  
  128. SOM_Scope ODPart*  SOMLINK ODBaseCanvas__AcquireOwner(ODBaseCanvas *somSelf, Environment *ev)
  129. {
  130.     ODBaseCanvasData *somThis = ODBaseCanvasGetData(somSelf);
  131.     ODBaseCanvasMethodDebug("ODBaseCanvas","AcquireOwner");
  132.  
  133.     if( _fOwner ) {
  134.         SOM_TRY
  135.             _fOwner->Acquire(ev);
  136.         SOM_CATCH_ALL
  137.         SOM_ENDTRY
  138.     }
  139.     return _fOwner;
  140. }
  141.  
  142. //------------------------------------------------------------------------------
  143. // SetOwner
  144. //------------------------------------------------------------------------------
  145.  
  146. SOM_Scope void  SOMLINK ODBaseCanvas__SetOwner(ODBaseCanvas *somSelf, Environment *ev,
  147.         ODPart* owner)
  148. {
  149.     ODBaseCanvasData *somThis = ODBaseCanvasGetData(somSelf);
  150.     ODBaseCanvasMethodDebug("ODBaseCanvas","SetOwner");
  151.     
  152.     if( owner != _fOwner ) {
  153.         SOM_TRY
  154.             ODTransferReference(ev,_fOwner,owner);
  155.             _fOwner = owner;
  156.         SOM_CATCH_ALL
  157.         SOM_ENDTRY
  158.     }
  159. }
  160.  
  161. //------------------------------------------------------------------------------
  162. // GetFacet
  163. //------------------------------------------------------------------------------
  164.  
  165. SOM_Scope ODFacet*  SOMLINK ODBaseCanvas__GetFacet(ODBaseCanvas *somSelf, Environment *ev)
  166. {
  167.     ODBaseCanvasData *somThis = ODBaseCanvasGetData(somSelf);
  168.     ODBaseCanvasMethodDebug("ODBaseCanvas","GetFacet");
  169.  
  170.     return _fFacet;
  171. }
  172.  
  173. //------------------------------------------------------------------------------
  174. // SetFacet
  175. //------------------------------------------------------------------------------
  176.  
  177. SOM_Scope void  SOMLINK ODBaseCanvas__SetFacet(ODBaseCanvas *somSelf, Environment *ev,
  178.         ODFacet* facet)
  179. {
  180.     ODBaseCanvasData *somThis = ODBaseCanvasGetData(somSelf);
  181.     ODBaseCanvasMethodDebug("ODBaseCanvas","SetFacet");
  182.  
  183.     _fFacet = facet;
  184. }
  185.  
  186. //------------------------------------------------------------------------------
  187. // IsDynamic
  188. //------------------------------------------------------------------------------
  189.  
  190. SOM_Scope ODBoolean  SOMLINK ODBaseCanvas__IsDynamic(ODBaseCanvas *somSelf, Environment *ev)
  191. {
  192.     ODBaseCanvasData *somThis = ODBaseCanvasGetData(somSelf);
  193.     ODBaseCanvasMethodDebug("ODBaseCanvas","IsDynamic");
  194.  
  195.     return _fIsDynamic;
  196. }
  197.  
  198. //------------------------------------------------------------------------------
  199. // IsOffscreen
  200. //------------------------------------------------------------------------------
  201.  
  202. SOM_Scope ODBoolean  SOMLINK ODBaseCanvas__IsOffscreen(ODBaseCanvas *somSelf, Environment *ev)
  203. {
  204.     ODBaseCanvasData *somThis = ODBaseCanvasGetData(somSelf);
  205.     ODBaseCanvasMethodDebug("ODBaseCanvas","IsOffscreen");
  206.  
  207.     return _fIsOffscreen;
  208. }
  209.  
  210. //------------------------------------------------------------------------------
  211. // HasPlatformCanvas
  212. //------------------------------------------------------------------------------
  213.  
  214. SOM_Scope ODBoolean  SOMLINK ODBaseCanvas__HasPlatformCanvas(ODBaseCanvas *somSelf, Environment *ev,
  215.         ODGraphicsSystem g)
  216. {
  217.     WARN("A subclass should have overridden this method!");
  218.     ODSetSOMException(ev,kODErrSubClassResponsibility, "SubClass Responsibility");
  219.     return kODFalse;
  220. }
  221.  
  222.  
  223. //------------------------------------------------------------------------------
  224. // GetPlatformCanvas
  225. //------------------------------------------------------------------------------
  226.  
  227. SOM_Scope ODPlatformCanvas  SOMLINK ODBaseCanvas__GetPlatformCanvas(ODBaseCanvas *somSelf, Environment *ev,
  228.         ODGraphicsSystem g)
  229. {
  230.     WARN("A subclass should have overridden this method!");
  231.     ODSetSOMException(ev,kODErrSubClassResponsibility, "SubClass Responsibility");
  232.     return kODNULL;
  233. }
  234.  
  235. //------------------------------------------------------------------------------
  236. // SetPlatformCanvas
  237. //------------------------------------------------------------------------------
  238.  
  239. SOM_Scope void  SOMLINK ODBaseCanvas__SetPlatformCanvas(ODBaseCanvas *somSelf, Environment *ev,
  240.         ODGraphicsSystem g,
  241.         ODPlatformCanvas c)
  242. {
  243.     WARN("A subclass should have overridden this method!");
  244.     ODSetSOMException(ev,kODErrSubClassResponsibility, "SubClass Responsibility");
  245. }
  246.  
  247. //------------------------------------------------------------------------------
  248. // HasPlatformPrintJob
  249. //------------------------------------------------------------------------------
  250.  
  251. SOM_Scope ODBoolean  SOMLINK ODBaseCanvas__HasPlatformPrintJob(ODBaseCanvas *somSelf, Environment *ev,
  252.         ODGraphicsSystem g)
  253. {
  254.     ODBaseCanvasData *somThis = ODBaseCanvasGetData(somSelf);
  255.     ODBaseCanvasMethodDebug("ODBaseCanvas","HasPlatformPrintJob");
  256.     
  257.     // This base implementation can only keep track of one graphics system's print job at
  258.     // a time; it seems unlikely that a print job would be run by more than one graphics
  259.     // system at once. If you really need to store more than one (as is done with platform
  260.     // canvases) then just override the 3 PlatformPrintJob methods in your platform subclass.
  261.  
  262.     return _fPlatformPrintJob!=kODNULL && g==_fPrintJobGraphicsSystem;
  263. }
  264.  
  265. //------------------------------------------------------------------------------
  266. // GetPlatformPrintJob
  267. //------------------------------------------------------------------------------
  268.  
  269. SOM_Scope ODPlatformPrintJob  SOMLINK ODBaseCanvas__GetPlatformPrintJob(ODBaseCanvas *somSelf, Environment *ev,
  270.         ODGraphicsSystem g)
  271. {
  272.     ODBaseCanvasData *somThis = ODBaseCanvasGetData(somSelf);
  273.     ODBaseCanvasMethodDebug("ODBaseCanvas","GetPlatformPrintJob");
  274.  
  275.     if( _fPlatformPrintJob!=kODNULL && g==_fPrintJobGraphicsSystem )
  276.         return _fPlatformPrintJob;
  277.     else {
  278.         ODSetSOMException(ev, kODErrInvalidGraphicsSystem);
  279.         return kODNULL;
  280.     }
  281. }
  282.  
  283. //------------------------------------------------------------------------------
  284. // SetPlatformPrintJob
  285. //------------------------------------------------------------------------------
  286.  
  287. SOM_Scope void  SOMLINK ODBaseCanvas__SetPlatformPrintJob(ODBaseCanvas *somSelf, Environment *ev,
  288.         ODGraphicsSystem g,
  289.         ODPlatformPrintJob j)
  290. {
  291.     ODBaseCanvasData *somThis = ODBaseCanvasGetData(somSelf);
  292.     ODBaseCanvasMethodDebug("ODBaseCanvas","SetPlatformPrintJob");
  293.  
  294.     _fPrintJobGraphicsSystem = g;
  295.     _fPlatformPrintJob = j;
  296. }
  297.  
  298. //------------------------------------------------------------------------------
  299. // GetUpdateShape
  300. //------------------------------------------------------------------------------
  301.  
  302. SOM_Scope ODShape*  SOMLINK ODBaseCanvas__AcquireUpdateShape(ODBaseCanvas *somSelf, Environment *ev)
  303. {
  304.     ODBaseCanvasData *somThis = ODBaseCanvasGetData(somSelf);
  305.     ODBaseCanvasMethodDebug("ODBaseCanvas","AcquireUpdateShape");
  306.     
  307.     SOM_TRY
  308.  
  309.     if( !_fUpdateShape )
  310.         somSelf->ResetUpdateShape(ev);
  311.     if( _fUpdateShape )
  312.         _fUpdateShape->Acquire(ev);
  313.     return _fUpdateShape;
  314.  
  315.     SOM_CATCH_ALL
  316.     SOM_ENDTRY
  317.     return kODNULL;
  318. }
  319.  
  320. //------------------------------------------------------------------------------
  321. // ResetUpdateShape
  322. //------------------------------------------------------------------------------
  323.  
  324. SOM_Scope void  SOMLINK ODBaseCanvas__ResetUpdateShape(ODBaseCanvas *somSelf, Environment *ev)
  325. {
  326.     ODBaseCanvasData *somThis = ODBaseCanvasGetData(somSelf);
  327.     ODBaseCanvasMethodDebug("ODBaseCanvas","ResetUpdateShape");
  328.     
  329.     if( !_fIsOffscreen )
  330.         return;
  331.     
  332.     SOM_TRY
  333.  
  334.     if( !_fUpdateShape ) {
  335.         // Create a new, empty update shape. It would be nice to use a factory,
  336.         // but from here there's no factory object we can reach...
  337.         TempODShape s = new ODShape;
  338.         THROW_IF_NULL(s);
  339.         s->InitShape(ev);
  340.         _fUpdateShape = s.DontRelease();
  341.             
  342.     } else {
  343.         // Just clear the update shape:
  344.         ODRect empty(0,0,0,0);
  345.         _fUpdateShape->SetRectangle(ev,&empty);
  346.     }
  347.  
  348.     SOM_CATCH_ALL
  349.     SOM_ENDTRY
  350. }
  351.  
  352. //------------------------------------------------------------------------------
  353. // ComputeBiasTransform
  354. //------------------------------------------------------------------------------
  355.  
  356. SOM_Scope void  SOMLINK ODBaseCanvas__ComputeBiasTransform(
  357.                                             ODBaseCanvas *somSelf, Environment *ev)
  358. {
  359. //    ODBaseCanvasData *somThis = ODBaseCanvasGetData(somSelf);
  360.     ODBaseCanvasMethodDebug("ODBaseCanvas","ComputeBiasTransform");
  361.  
  362.     // Do nothing by default.
  363. }
  364.  
  365. //------------------------------------------------------------------------------
  366. // GetBiasTransform
  367. //------------------------------------------------------------------------------
  368.  
  369. SOM_Scope ODTransform*  SOMLINK ODBaseCanvas__AcquireBiasTransform(ODBaseCanvas *somSelf, Environment *ev)
  370. {
  371.     ODBaseCanvasData *somThis = ODBaseCanvasGetData(somSelf);
  372.     ODBaseCanvasMethodDebug("ODBaseCanvas","GetBiasTransform");
  373.  
  374.     SOM_TRY
  375.     if (_fBiasTransform)
  376.         _fBiasTransform->Acquire(ev);
  377.     return _fBiasTransform;
  378.  
  379.     SOM_CATCH_ALL
  380.     SOM_ENDTRY
  381.     return kODNULL;
  382. }
  383.  
  384. //------------------------------------------------------------------------------
  385. // SetBiasTransform
  386. //------------------------------------------------------------------------------
  387.  
  388. SOM_Scope void  SOMLINK ODBaseCanvas__SetBiasTransform(ODBaseCanvas *somSelf, Environment *ev,
  389.         ODTransform* x)
  390. {
  391.     ODBaseCanvasData *somThis = ODBaseCanvasGetData(somSelf);
  392.     ODBaseCanvasMethodDebug("ODBaseCanvas","SetBiasTransform");
  393.  
  394.     if( x != _fBiasTransform ) {
  395.         SOM_TRY
  396.     
  397.             ODTransferReference(ev,_fBiasTransform,x);
  398.             _fBiasTransform = x;
  399.  
  400.         SOM_CATCH_ALL
  401.         SOM_ENDTRY
  402.     }
  403. }
  404.  
  405. //------------------------------------------------------------------------------
  406. // Invalidate
  407. //------------------------------------------------------------------------------
  408.  
  409. SOM_Scope void  SOMLINK ODBaseCanvas__Invalidate(ODBaseCanvas *somSelf, Environment *ev,
  410.         ODShape* shape)
  411. {
  412.     ODBaseCanvasData *somThis = ODBaseCanvasGetData(somSelf);
  413.     ODBaseCanvasMethodDebug("ODBaseCanvas","Invalidate");
  414.  
  415.     if ( !_fIsOffscreen )
  416.         return;
  417.         
  418.     SOM_TRY
  419.  
  420.     if( !_fUpdateShape )
  421.         somSelf->ResetUpdateShape(ev);
  422.     _fUpdateShape->Union(ev,shape);
  423.  
  424.     SOM_CATCH_ALL
  425.     SOM_ENDTRY
  426. }
  427.  
  428. //------------------------------------------------------------------------------
  429. // Validate
  430. //------------------------------------------------------------------------------
  431.  
  432. SOM_Scope void  SOMLINK ODBaseCanvas__Validate(ODBaseCanvas *somSelf, Environment *ev,
  433.         ODShape* shape)
  434. {
  435.     ODBaseCanvasData *somThis = ODBaseCanvasGetData(somSelf);
  436.     ODBaseCanvasMethodDebug("ODBaseCanvas","Validate");
  437.  
  438.     if ( !_fIsOffscreen )
  439.         return;
  440.  
  441.     SOM_TRY
  442.  
  443.     if( !_fUpdateShape )
  444.         somSelf->ResetUpdateShape(ev);
  445.     _fUpdateShape->Subtract(ev,shape);
  446.  
  447.     SOM_CATCH_ALL
  448.     SOM_ENDTRY
  449. }
  450.