home *** CD-ROM | disk | FTP | other *** search
- /*
- File: CanvasB.cpp
-
- Contains: ODBaseCanvas, an abstract drawing environment.
-
- Owned by: Jens Alfke, Joshua Susser
-
- Copyright: © 1993 - 1995 by Apple Computer, Inc., all rights reserved.
-
- Change History (most recent first):
-
- <17> 8/29/95 jpa Use TempODShape to avoid checking result of
- 'new ODShape'. [1279066]
- <16> 8/3/95 RR #1257260: Collapse B classes. Remove
- somInit methods. Don't call IsInitialized
- or SubclassResponsibility
- <15> 6/1/95 jpa Removed CheckUpdateShape. [1232306]
- <14> 5/26/95 RR #1251403: Multithreading naming support
- <13> 5/4/95 jpa Fixed bad TRY block in GetOwner. [1246060]
- <12> 3/31/95 jpa Fixed crash in GetUpdateShape for onscreen
- canvases. [1223422]
- <11> 3/22/95 jpa Use new ODPlatformPrintJob type. [1230236]
- <10> 3/20/95 jpa SOM_CATCH --> SOM_TRY [1224355]
- <9> 1/13/95 RR Check for null in GetBiasTransform
- <8> 12/20/94 jpa GetUpdateShape increments shape's refcount
- [1207402]
- <7> 12/5/94 jpa Fixes from code review. [1203923]
- <6> 10/24/94 jpa Include Trnsform.xh. Initialize
- fUpdateShape. [1153437, 1165562]
- <5> 9/29/94 RA 1189812: Mods for 68K build.
- <4> 8/17/94 jpa Function prefixes. [1181512]
- <3> 8/8/94 jpa API changes for multiformat canvases & bias
- transforms [1179683, 1178688]
- <2> 7/13/94 jpa Call InitObject in InitBaseCanvas.
- <1> 6/15/94 jpa first checked in
-
- To Do:
- In Progress:
-
- */
-
- #ifndef _ALTPOINT_
- #include "AltPoint.h"
- #endif
-
- #define ODBaseCanvas_Class_Source
- #define VARIABLE_MACROS
- #include <CanvasB.xih>
-
- #ifndef SOM_ODPart_xh
- #include <Part.xh>
- #endif
-
- #ifndef SOM_ODShape_xh
- #include <Shape.xh>
- #endif
-
- #ifndef SOM_ODTransform_xh
- #include <Trnsform.xh>
- #endif
-
- #ifndef _EXCEPT_
- #include <Except.h>
- #endif
-
- #ifndef _ODUTILS_
- #include <ODUtils.h>
- #endif
-
- #ifndef _TEMPOBJ_
- #include <TempObj.h>
- #endif
-
-
- //------------------------------------------------------------------------------
- // somUninit
- //------------------------------------------------------------------------------
-
- SOM_Scope void SOMLINK ODBaseCanvas__somUninit(ODBaseCanvas *somSelf)
- {
- ODBaseCanvasData *somThis = ODBaseCanvasGetData(somSelf);
- ODBaseCanvasMethodDebug("ODBaseCanvas","somUninit");
-
- ODSafeReleaseObject( _fOwner );
- ODSafeReleaseObject( _fUpdateShape );
- ODSafeReleaseObject( _fBiasTransform );
-
- ODBaseCanvas_parents_somUninit(somSelf);
- }
-
- //------------------------------------------------------------------------------
- // InitBaseCanvas
- //------------------------------------------------------------------------------
-
- SOM_Scope void SOMLINK ODBaseCanvas__InitBaseCanvas(ODBaseCanvas *somSelf, Environment *ev,
- ODBoolean isDynamic,
- ODBoolean isOffscreen)
- {
- ODBaseCanvasData *somThis = ODBaseCanvasGetData(somSelf);
- ODBaseCanvasMethodDebug("ODBaseCanvas","InitBaseCanvas");
-
- SOM_TRY
-
- /* Moved from somInit. SOM itself sets fields to zero
- _fOwner = kODNULL;
- _fUpdateShape = kODNULL;
- _fFacet = kODNULL;
- _fIsDynamic = kODTrue;
- _fIsOffscreen = kODFalse;
- _fBiasTransform = kODNULL;
- _fPlatformPrintJob = kODNULL;
- */
- _fPrintJobGraphicsSystem = kODNoGraphicsSystem;
-
- somSelf->InitObject(ev);
-
- _fIsDynamic = isDynamic;
- _fIsOffscreen = isOffscreen;
-
- SOM_CATCH_ALL
- SOM_ENDTRY
- }
-
- //------------------------------------------------------------------------------
- // GetOwner
- //------------------------------------------------------------------------------
-
- SOM_Scope ODPart* SOMLINK ODBaseCanvas__AcquireOwner(ODBaseCanvas *somSelf, Environment *ev)
- {
- ODBaseCanvasData *somThis = ODBaseCanvasGetData(somSelf);
- ODBaseCanvasMethodDebug("ODBaseCanvas","AcquireOwner");
-
- if( _fOwner ) {
- SOM_TRY
- _fOwner->Acquire(ev);
- SOM_CATCH_ALL
- SOM_ENDTRY
- }
- return _fOwner;
- }
-
- //------------------------------------------------------------------------------
- // SetOwner
- //------------------------------------------------------------------------------
-
- SOM_Scope void SOMLINK ODBaseCanvas__SetOwner(ODBaseCanvas *somSelf, Environment *ev,
- ODPart* owner)
- {
- ODBaseCanvasData *somThis = ODBaseCanvasGetData(somSelf);
- ODBaseCanvasMethodDebug("ODBaseCanvas","SetOwner");
-
- if( owner != _fOwner ) {
- SOM_TRY
- ODTransferReference(ev,_fOwner,owner);
- _fOwner = owner;
- SOM_CATCH_ALL
- SOM_ENDTRY
- }
- }
-
- //------------------------------------------------------------------------------
- // GetFacet
- //------------------------------------------------------------------------------
-
- SOM_Scope ODFacet* SOMLINK ODBaseCanvas__GetFacet(ODBaseCanvas *somSelf, Environment *ev)
- {
- ODBaseCanvasData *somThis = ODBaseCanvasGetData(somSelf);
- ODBaseCanvasMethodDebug("ODBaseCanvas","GetFacet");
-
- return _fFacet;
- }
-
- //------------------------------------------------------------------------------
- // SetFacet
- //------------------------------------------------------------------------------
-
- SOM_Scope void SOMLINK ODBaseCanvas__SetFacet(ODBaseCanvas *somSelf, Environment *ev,
- ODFacet* facet)
- {
- ODBaseCanvasData *somThis = ODBaseCanvasGetData(somSelf);
- ODBaseCanvasMethodDebug("ODBaseCanvas","SetFacet");
-
- _fFacet = facet;
- }
-
- //------------------------------------------------------------------------------
- // IsDynamic
- //------------------------------------------------------------------------------
-
- SOM_Scope ODBoolean SOMLINK ODBaseCanvas__IsDynamic(ODBaseCanvas *somSelf, Environment *ev)
- {
- ODBaseCanvasData *somThis = ODBaseCanvasGetData(somSelf);
- ODBaseCanvasMethodDebug("ODBaseCanvas","IsDynamic");
-
- return _fIsDynamic;
- }
-
- //------------------------------------------------------------------------------
- // IsOffscreen
- //------------------------------------------------------------------------------
-
- SOM_Scope ODBoolean SOMLINK ODBaseCanvas__IsOffscreen(ODBaseCanvas *somSelf, Environment *ev)
- {
- ODBaseCanvasData *somThis = ODBaseCanvasGetData(somSelf);
- ODBaseCanvasMethodDebug("ODBaseCanvas","IsOffscreen");
-
- return _fIsOffscreen;
- }
-
- //------------------------------------------------------------------------------
- // HasPlatformCanvas
- //------------------------------------------------------------------------------
-
- SOM_Scope ODBoolean SOMLINK ODBaseCanvas__HasPlatformCanvas(ODBaseCanvas *somSelf, Environment *ev,
- ODGraphicsSystem g)
- {
- WARN("A subclass should have overridden this method!");
- ODSetSOMException(ev,kODErrSubClassResponsibility, "SubClass Responsibility");
- return kODFalse;
- }
-
-
- //------------------------------------------------------------------------------
- // GetPlatformCanvas
- //------------------------------------------------------------------------------
-
- SOM_Scope ODPlatformCanvas SOMLINK ODBaseCanvas__GetPlatformCanvas(ODBaseCanvas *somSelf, Environment *ev,
- ODGraphicsSystem g)
- {
- WARN("A subclass should have overridden this method!");
- ODSetSOMException(ev,kODErrSubClassResponsibility, "SubClass Responsibility");
- return kODNULL;
- }
-
- //------------------------------------------------------------------------------
- // SetPlatformCanvas
- //------------------------------------------------------------------------------
-
- SOM_Scope void SOMLINK ODBaseCanvas__SetPlatformCanvas(ODBaseCanvas *somSelf, Environment *ev,
- ODGraphicsSystem g,
- ODPlatformCanvas c)
- {
- WARN("A subclass should have overridden this method!");
- ODSetSOMException(ev,kODErrSubClassResponsibility, "SubClass Responsibility");
- }
-
- //------------------------------------------------------------------------------
- // HasPlatformPrintJob
- //------------------------------------------------------------------------------
-
- SOM_Scope ODBoolean SOMLINK ODBaseCanvas__HasPlatformPrintJob(ODBaseCanvas *somSelf, Environment *ev,
- ODGraphicsSystem g)
- {
- ODBaseCanvasData *somThis = ODBaseCanvasGetData(somSelf);
- ODBaseCanvasMethodDebug("ODBaseCanvas","HasPlatformPrintJob");
-
- // This base implementation can only keep track of one graphics system's print job at
- // a time; it seems unlikely that a print job would be run by more than one graphics
- // system at once. If you really need to store more than one (as is done with platform
- // canvases) then just override the 3 PlatformPrintJob methods in your platform subclass.
-
- return _fPlatformPrintJob!=kODNULL && g==_fPrintJobGraphicsSystem;
- }
-
- //------------------------------------------------------------------------------
- // GetPlatformPrintJob
- //------------------------------------------------------------------------------
-
- SOM_Scope ODPlatformPrintJob SOMLINK ODBaseCanvas__GetPlatformPrintJob(ODBaseCanvas *somSelf, Environment *ev,
- ODGraphicsSystem g)
- {
- ODBaseCanvasData *somThis = ODBaseCanvasGetData(somSelf);
- ODBaseCanvasMethodDebug("ODBaseCanvas","GetPlatformPrintJob");
-
- if( _fPlatformPrintJob!=kODNULL && g==_fPrintJobGraphicsSystem )
- return _fPlatformPrintJob;
- else {
- ODSetSOMException(ev, kODErrInvalidGraphicsSystem);
- return kODNULL;
- }
- }
-
- //------------------------------------------------------------------------------
- // SetPlatformPrintJob
- //------------------------------------------------------------------------------
-
- SOM_Scope void SOMLINK ODBaseCanvas__SetPlatformPrintJob(ODBaseCanvas *somSelf, Environment *ev,
- ODGraphicsSystem g,
- ODPlatformPrintJob j)
- {
- ODBaseCanvasData *somThis = ODBaseCanvasGetData(somSelf);
- ODBaseCanvasMethodDebug("ODBaseCanvas","SetPlatformPrintJob");
-
- _fPrintJobGraphicsSystem = g;
- _fPlatformPrintJob = j;
- }
-
- //------------------------------------------------------------------------------
- // GetUpdateShape
- //------------------------------------------------------------------------------
-
- SOM_Scope ODShape* SOMLINK ODBaseCanvas__AcquireUpdateShape(ODBaseCanvas *somSelf, Environment *ev)
- {
- ODBaseCanvasData *somThis = ODBaseCanvasGetData(somSelf);
- ODBaseCanvasMethodDebug("ODBaseCanvas","AcquireUpdateShape");
-
- SOM_TRY
-
- if( !_fUpdateShape )
- somSelf->ResetUpdateShape(ev);
- if( _fUpdateShape )
- _fUpdateShape->Acquire(ev);
- return _fUpdateShape;
-
- SOM_CATCH_ALL
- SOM_ENDTRY
- return kODNULL;
- }
-
- //------------------------------------------------------------------------------
- // ResetUpdateShape
- //------------------------------------------------------------------------------
-
- SOM_Scope void SOMLINK ODBaseCanvas__ResetUpdateShape(ODBaseCanvas *somSelf, Environment *ev)
- {
- ODBaseCanvasData *somThis = ODBaseCanvasGetData(somSelf);
- ODBaseCanvasMethodDebug("ODBaseCanvas","ResetUpdateShape");
-
- if( !_fIsOffscreen )
- return;
-
- SOM_TRY
-
- if( !_fUpdateShape ) {
- // Create a new, empty update shape. It would be nice to use a factory,
- // but from here there's no factory object we can reach...
- TempODShape s = new ODShape;
- THROW_IF_NULL(s);
- s->InitShape(ev);
- _fUpdateShape = s.DontRelease();
-
- } else {
- // Just clear the update shape:
- ODRect empty(0,0,0,0);
- _fUpdateShape->SetRectangle(ev,&empty);
- }
-
- SOM_CATCH_ALL
- SOM_ENDTRY
- }
-
- //------------------------------------------------------------------------------
- // ComputeBiasTransform
- //------------------------------------------------------------------------------
-
- SOM_Scope void SOMLINK ODBaseCanvas__ComputeBiasTransform(
- ODBaseCanvas *somSelf, Environment *ev)
- {
- // ODBaseCanvasData *somThis = ODBaseCanvasGetData(somSelf);
- ODBaseCanvasMethodDebug("ODBaseCanvas","ComputeBiasTransform");
-
- // Do nothing by default.
- }
-
- //------------------------------------------------------------------------------
- // GetBiasTransform
- //------------------------------------------------------------------------------
-
- SOM_Scope ODTransform* SOMLINK ODBaseCanvas__AcquireBiasTransform(ODBaseCanvas *somSelf, Environment *ev)
- {
- ODBaseCanvasData *somThis = ODBaseCanvasGetData(somSelf);
- ODBaseCanvasMethodDebug("ODBaseCanvas","GetBiasTransform");
-
- SOM_TRY
- if (_fBiasTransform)
- _fBiasTransform->Acquire(ev);
- return _fBiasTransform;
-
- SOM_CATCH_ALL
- SOM_ENDTRY
- return kODNULL;
- }
-
- //------------------------------------------------------------------------------
- // SetBiasTransform
- //------------------------------------------------------------------------------
-
- SOM_Scope void SOMLINK ODBaseCanvas__SetBiasTransform(ODBaseCanvas *somSelf, Environment *ev,
- ODTransform* x)
- {
- ODBaseCanvasData *somThis = ODBaseCanvasGetData(somSelf);
- ODBaseCanvasMethodDebug("ODBaseCanvas","SetBiasTransform");
-
- if( x != _fBiasTransform ) {
- SOM_TRY
-
- ODTransferReference(ev,_fBiasTransform,x);
- _fBiasTransform = x;
-
- SOM_CATCH_ALL
- SOM_ENDTRY
- }
- }
-
- //------------------------------------------------------------------------------
- // Invalidate
- //------------------------------------------------------------------------------
-
- SOM_Scope void SOMLINK ODBaseCanvas__Invalidate(ODBaseCanvas *somSelf, Environment *ev,
- ODShape* shape)
- {
- ODBaseCanvasData *somThis = ODBaseCanvasGetData(somSelf);
- ODBaseCanvasMethodDebug("ODBaseCanvas","Invalidate");
-
- if ( !_fIsOffscreen )
- return;
-
- SOM_TRY
-
- if( !_fUpdateShape )
- somSelf->ResetUpdateShape(ev);
- _fUpdateShape->Union(ev,shape);
-
- SOM_CATCH_ALL
- SOM_ENDTRY
- }
-
- //------------------------------------------------------------------------------
- // Validate
- //------------------------------------------------------------------------------
-
- SOM_Scope void SOMLINK ODBaseCanvas__Validate(ODBaseCanvas *somSelf, Environment *ev,
- ODShape* shape)
- {
- ODBaseCanvasData *somThis = ODBaseCanvasGetData(somSelf);
- ODBaseCanvasMethodDebug("ODBaseCanvas","Validate");
-
- if ( !_fIsOffscreen )
- return;
-
- SOM_TRY
-
- if( !_fUpdateShape )
- somSelf->ResetUpdateShape(ev);
- _fUpdateShape->Subtract(ev,shape);
-
- SOM_CATCH_ALL
- SOM_ENDTRY
- }
-