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 / ShapeB.cpp < prev    next >
Encoding:
C/C++ Source or Header  |  1996-04-22  |  20.4 KB  |  781 lines  |  [TEXT/MPS ]

  1. /*
  2.     File:        ShapeB.cpp
  3.  
  4.     Contains:    Implementation of ODBaseShape class.
  5.  
  6.     Owned by:    Jens Alfke
  7.  
  8.     Copyright:    © 1994 - 1996 by Apple Computer, Inc., all rights reserved.
  9.  
  10.     Change History (most recent first):
  11.  
  12.          <2>     3/14/96    TJ        Changed volatile to ODVolatile.
  13.         <20>    10/17/95    jpa        1293487: ReadShape doesn't delete & return
  14.                                     NULL if shape is empty.
  15.         <19>     10/8/95    TJ        Fixes Recomended by Refball
  16.         <18>     9/13/95    DM        1277216 GM:API return no ODPoints nor
  17.                                     ODPolygons
  18.         <17>     9/12/95    JBS        1283120 Memory leak in ::ReadShape
  19.         <16>     8/12/95    TÇ        1276808 Call ODReleaseObject instead of
  20.                                     ODDeleteObject on shapes & transforms
  21.         <15>      8/3/95    RR        #1257260: Collapse B classes. Remove
  22.                                     somInit methods. Don't call IsInitialized
  23.                                     or SubclassResponsibility
  24.         <14>      5/4/95    jpa        IsSameAs checks for NULL target realshape.
  25.                                     [1238838]
  26.         <13>     4/15/95    jpa        Added exception handling for Purge method
  27.                                     [1236970]. Intersect, Subtract and Union
  28.                                     check for NULL target realshape. [1238838]
  29.         <12>     3/20/95    jpa        SOM_CATCH --> SOM_TRY [1224355]
  30.         <11>     2/24/95    jpa        Fixed bug in CopyFrom if src shape was
  31.                                     newly created (no RealShape). [1220690]
  32.         <10>     1/12/95    jpa        Removed five-dollar comment [1209502]
  33.          <9>     12/5/94    jpa        Call Simplify after SetPolygon. Other code
  34.                                     review fixes. [1203923]
  35.          <8>    10/24/94    jpa        Use NewGeometricShape to instantiate
  36.                                     polygon/gx shapes. [1195070]
  37.          <7>     9/29/94    RA        1189812: Mods for 68K build.
  38.          <6>      9/9/94    jpa        Added Release method, and verify refcnt in
  39.                                     somUninit. [1185660]
  40.          <5>     8/17/94    jpa        Function prefixes. [1181512]
  41.          <4>      8/8/94    jpa        Added Outset, NewShape, Reset [1178690,
  42.                                     1179574]
  43.          <3>     7/15/94    jpa        CopyFrom now calls InitBaseShape in case
  44.                                     caller had not yet initialized the object.
  45.          <2>     7/13/94    jpa        Call InitObject in InitBaseShape.
  46.          <1>     6/15/94    jpa        first checked in
  47.  
  48.     To Do:
  49.     In Progress:
  50.         
  51. */
  52.  
  53.  
  54. #include "AltPoint.h"
  55. #include "AltPoly.h"
  56.  
  57. #define ODBaseShape_Class_Source
  58. #define VARIABLE_MACROS
  59. #include <ShapeB.xih>
  60.  
  61. #include <Shape.xh>
  62. #include <Trnsform.xh>
  63. #include <StorageU.xh>
  64.  
  65. #include <Except.h>
  66. #include <ODUtils.h>
  67.  
  68. #include "RectShpe.h"
  69. #include "RgnShpe.h"
  70. #include "PolyShpe.h"
  71. #include "GXShpe.h"
  72.  
  73. #ifndef _ODDEBUG_
  74. #include "ODDebug.h"
  75. #endif
  76.  
  77.  
  78. //------------------------------------------------------------------------------
  79. //    somUninit
  80. //------------------------------------------------------------------------------
  81.  
  82. SOM_Scope void  SOMLINK ODBaseShape__somUninit(ODBaseShape *somSelf)
  83. {
  84.     ODBaseShapeData *somThis = ODBaseShapeGetData(somSelf);
  85.     ODBaseShapeMethodDebug("ODBaseShape","somUninit");
  86.     
  87.     ODDeleteObject(_fShape);
  88.  
  89.     parent_somUninit(somSelf);
  90. }
  91.  
  92. //------------------------------------------------------------------------------
  93. //    InitBaseShape
  94. //------------------------------------------------------------------------------
  95.  
  96. SOM_Scope void  SOMLINK ODBaseShape__InitBaseShape(ODBaseShape *somSelf, Environment *ev)
  97. {
  98.     ODBaseShapeData *somThis = ODBaseShapeGetData(somSelf);
  99.     ODBaseShapeMethodDebug("ODBaseShape","InitBaseShape");
  100.  
  101.     SOM_TRY
  102.  
  103.         /* Moved from somInit. SOM itself sets fields to zero
  104.         _fShape = kODNULL;
  105.         */
  106.         _fMode = kODPreserveGeometry;
  107.         
  108.         somSelf->InitRefCntObject(ev);
  109.  
  110.     SOM_CATCH_ALL
  111.     SOM_ENDTRY
  112. }
  113.  
  114. //------------------------------------------------------------------------------
  115. //    Purge
  116. //------------------------------------------------------------------------------
  117.  
  118. SOM_Scope ODSize  SOMLINK ODBaseShape__Purge(ODBaseShape *somSelf, Environment *ev,
  119.                                             ODSize bytes)
  120. {
  121.     ODBaseShapeData *somThis = ODBaseShapeGetData(somSelf);
  122.     ODBaseShapeMethodDebug("ODBaseShape","Purge");
  123.     
  124.     ODSize purged = 0; ODVolatile(purged);
  125.     
  126.     SOM_TRY
  127.  
  128.         purged = parent_Purge(somSelf,ev,bytes);
  129.         bytes -= purged;
  130.         
  131.         if( _fShape && bytes>0 )
  132.             purged += _fShape->Purge(bytes);
  133.         
  134.         purged += parent_Purge(somSelf,ev,bytes);
  135.     SOM_CATCH_ALL
  136.         WARN("Error %ld trying to purge in ODBaseShape__Purge",ErrorCode());
  137.         SetErrorCode(kODNoError);        // dh - Eat the exception; Purge should not 
  138.                                         // propagate it because clients function
  139.                                         // fine whether memory was purged or not.
  140.     SOM_ENDTRY
  141.     
  142.     return purged;
  143. }
  144.  
  145. //------------------------------------------------------------------------------
  146. //    Release
  147. //------------------------------------------------------------------------------
  148.  
  149. SOM_Scope void  SOMLINK ODBaseShape__Release(ODBaseShape *somSelf, Environment *ev)
  150. {
  151. //    ODBaseShapeData *somThis = ODBaseShapeGetData(somSelf);
  152.     ODBaseShapeMethodDebug("ODBaseShape","Release");
  153.  
  154.     parent_Release(somSelf,ev);
  155.     
  156.     // Delete myself when my refCount goes to zero:
  157.     if( somSelf->GetRefCount(ev) == 0 )
  158.         delete somSelf;
  159. }
  160.  
  161. //------------------------------------------------------------------------------
  162. //    NewShape
  163. //------------------------------------------------------------------------------
  164.  
  165. SOM_Scope ODShape*  SOMLINK ODBaseShape__NewShape(ODBaseShape *somSelf, Environment *ev)
  166. {
  167.     ODBaseShapeData *somThis = ODBaseShapeGetData(somSelf);
  168.     ODBaseShapeMethodDebug("ODBaseShape","NewShape");
  169.     
  170.     ODShape *shape = kODNULL;        ODVolatile(shape);
  171.     
  172.     SOM_TRY
  173.     
  174.     shape = new ODShape;
  175.     THROW_IF_NULL(shape);
  176.     shape->InitShape(ev);
  177.     if( _fMode != kODPreserveGeometry )
  178.         shape->SetGeometryMode(ev,_fMode);
  179.  
  180.     SOM_CATCH_ALL
  181.         ODSafeReleaseObject(shape); shape = kODNULL;
  182.     SOM_ENDTRY
  183.     
  184.     return shape;
  185. }
  186.  
  187. //------------------------------------------------------------------------------
  188. //    Copy
  189. //------------------------------------------------------------------------------
  190.  
  191. SOM_Scope ODShape*  SOMLINK ODBaseShape__Copy(ODBaseShape *somSelf, Environment *ev)
  192. {
  193.     ODBaseShapeData *somThis = ODBaseShapeGetData(somSelf);
  194.     ODBaseShapeMethodDebug("ODBaseShape","Copy");
  195.     
  196.     ODShape *copy = kODNULL;        ODVolatile(copy);
  197.     
  198.     SOM_TRY
  199.  
  200.     copy = new ODShape;
  201.     THROW_IF_NULL(copy);
  202.     copy->InitShape(ev);
  203.     copy->CopyFrom(ev,(ODShape*)somSelf);
  204.  
  205.     SOM_CATCH_ALL
  206.         ODSafeReleaseObject(copy);
  207.         copy = kODNULL;
  208.     SOM_ENDTRY
  209.     
  210.     return copy;
  211. }
  212.  
  213. //------------------------------------------------------------------------------
  214. //    CopyFrom
  215. //------------------------------------------------------------------------------
  216.  
  217. SOM_Scope void  SOMLINK ODBaseShape__CopyFrom(ODBaseShape *somSelf, Environment *ev,
  218.         ODShape* sourceShape)
  219. {
  220.     ODBaseShapeData *somThis = ODBaseShapeGetData(somSelf);
  221.     ODBaseShapeMethodDebug("ODBaseShape","CopyFrom");
  222.     
  223.     SOM_TRY
  224.     
  225.     ASSERT_NOT_NULL(sourceShape);
  226.     RealShape *newShape = sourceShape->GetRealShape(ev);
  227.     if( newShape )
  228.         newShape = newShape->Copy();
  229.     delete _fShape;
  230.     _fShape = newShape;
  231.     _fMode = sourceShape->GetGeometryMode(ev);
  232.  
  233.     SOM_CATCH_ALL
  234.     SOM_ENDTRY
  235. }
  236.  
  237. //------------------------------------------------------------------------------
  238. //    GetRealShape
  239. //------------------------------------------------------------------------------
  240.  
  241. SOM_Scope RealShape*  SOMLINK ODBaseShape__GetRealShape(ODBaseShape *somSelf, Environment *ev)
  242. {
  243.     ODBaseShapeData *somThis = ODBaseShapeGetData(somSelf);
  244.     ODBaseShapeMethodDebug("ODBaseShape","GetRealShape");
  245.  
  246.     return _fShape;
  247. }
  248.  
  249. //------------------------------------------------------------------------------
  250. //    GetGeometryMode
  251. //------------------------------------------------------------------------------
  252.  
  253. SOM_Scope ODGeometryMode  SOMLINK ODBaseShape__GetGeometryMode(ODBaseShape *somSelf, Environment *ev)
  254. {
  255.     ODBaseShapeData *somThis = ODBaseShapeGetData(somSelf);
  256.     ODBaseShapeMethodDebug("ODBaseShape","GetGeometryMode");
  257.  
  258.     if( _fShape )
  259.         return _fShape->GetGeometryMode();
  260.     else
  261.         return _fMode;
  262. }
  263.  
  264. //------------------------------------------------------------------------------
  265. //    SetGeometryMode
  266. //------------------------------------------------------------------------------
  267.  
  268. SOM_Scope void  SOMLINK ODBaseShape__SetGeometryMode(ODBaseShape *somSelf, Environment *ev,
  269.         ODGeometryMode mode)
  270. {
  271.     ODBaseShapeData *somThis = ODBaseShapeGetData(somSelf);
  272.     ODBaseShapeMethodDebug("ODBaseShape","SetGeometryMode");
  273.  
  274.     SOM_TRY
  275.     
  276.     if( _fShape )
  277.         _fShape->SetGeometryMode(mode);
  278.     _fMode = mode;
  279.  
  280.     SOM_CATCH_ALL
  281.     SOM_ENDTRY
  282. }
  283.  
  284. //------------------------------------------------------------------------------
  285. //    GetBoundingBox
  286. //------------------------------------------------------------------------------
  287.  
  288. SOM_Scope void  SOMLINK ODBaseShape__GetBoundingBox(ODBaseShape *somSelf, Environment *ev,
  289.         ODRect* bounds)
  290. {
  291.     ODBaseShapeData *somThis = ODBaseShapeGetData(somSelf);
  292.     ODBaseShapeMethodDebug("ODBaseShape","GetBoundingBox");
  293.     
  294.     SOM_TRY
  295.     
  296.     ASSERT_NOT_NULL(bounds);
  297.     if( _fShape )
  298.         _fShape->GetBoundingBox(bounds);
  299.     else
  300.         bounds->Clear();
  301.  
  302.     SOM_CATCH_ALL
  303.     SOM_ENDTRY
  304. }
  305.  
  306. //------------------------------------------------------------------------------
  307. //    SetRectangle
  308. //------------------------------------------------------------------------------
  309.  
  310. SOM_Scope ODShape*  SOMLINK ODBaseShape__SetRectangle(ODBaseShape *somSelf, Environment *ev,
  311.         ODRect* rect)
  312. {
  313.     ODBaseShapeData *somThis = ODBaseShapeGetData(somSelf);
  314.     ODBaseShapeMethodDebug("ODBaseShape","SetRectangle");
  315.  
  316.     SOM_TRY
  317.     
  318.     ASSERT_NOT_NULL(rect);
  319.     if( !_fShape )
  320.         _fShape = new RectShape(_fMode,*rect);
  321.     else
  322.         _fShape= _fShape->SetRectangle(rect);
  323.  
  324.     SOM_CATCH_ALL
  325.     SOM_ENDTRY
  326.     return (ODShape*) somSelf;
  327. }
  328.  
  329. //------------------------------------------------------------------------------
  330. //    CopyPolygon
  331. //------------------------------------------------------------------------------
  332.  
  333. SOM_Scope void  SOMLINK ODBaseShape__CopyPolygon(ODBaseShape *somSelf, Environment *ev,
  334.         ODPolygon* polygon)
  335. {
  336.     ODBaseShapeData *somThis = ODBaseShapeGetData(somSelf);
  337.     ODBaseShapeMethodDebug("ODBaseShape","CopyPolygon");
  338.     
  339.     SOM_TRY
  340.     
  341.     if( _fShape )
  342.         _fShape->CopyPolygon(*polygon);
  343.     else
  344.     {
  345.         ODPolygon empty;
  346.         polygon->CopyFrom(empty);
  347.     }
  348.  
  349.     SOM_CATCH_ALL
  350.     SOM_ENDTRY
  351. }
  352.  
  353. //------------------------------------------------------------------------------
  354. //    SetPolygon
  355. //------------------------------------------------------------------------------
  356.  
  357. SOM_Scope ODShape*  SOMLINK ODBaseShape__SetPolygon(ODBaseShape *somSelf, Environment *ev,
  358.         ODPolygon* polygon)
  359. {
  360.     ODBaseShapeData *somThis = ODBaseShapeGetData(somSelf);
  361.     ODBaseShapeMethodDebug("ODBaseShape","SetPolygon");
  362.     
  363.     SOM_TRY
  364.     
  365.     ASSERT_NOT_NULL(polygon);
  366.     if( !_fShape ) {
  367.         ODRect r;
  368.         if( polygon->AsRectangle(&r) )
  369.             _fShape = new RectShape(_fMode,r);
  370.         else if( _fMode==kODLoseGeometry )
  371.             _fShape = new RgnShape(_fMode);
  372.         else
  373.             _fShape = RealShape::NewGeometricShape(_fMode);
  374.             
  375.         TRY{
  376.             _fShape = _fShape->SetPolygon(*polygon);
  377.             _fShape->Simplify();        // PolygonShape needs to simplify polygon
  378.         }CATCH_ALL{
  379.             delete _fShape;
  380.             _fShape = kODNULL;
  381.             RERAISE;
  382.         }ENDTRY
  383.         
  384.     } else
  385.         _fShape = _fShape->SetPolygon(*polygon);
  386.  
  387.     SOM_CATCH_ALL
  388.     SOM_ENDTRY
  389.     return (ODShape*) somSelf;
  390. }
  391.  
  392. //------------------------------------------------------------------------------
  393. //    GetPlatformShape
  394. //------------------------------------------------------------------------------
  395.  
  396. SOM_Scope ODPlatformShape  SOMLINK ODBaseShape__GetPlatformShape(ODBaseShape *somSelf, Environment *ev,
  397.         ODGraphicsSystem graphicsSystem)
  398. {
  399.     ODBaseShapeData *somThis = ODBaseShapeGetData(somSelf);
  400.     ODBaseShapeMethodDebug("ODBaseShape","GetPlatformShape");
  401.  
  402.     SOM_TRY
  403.  
  404.     if( !_fShape ) {
  405.         ODRect r;
  406.         r.Clear();
  407.         somSelf->SetRectangle(ev,&r);
  408.     }
  409.     return _fShape->GetPlatformShape(graphicsSystem);
  410.  
  411.     SOM_CATCH_ALL
  412.     SOM_ENDTRY
  413.     return kODNULL;
  414. }
  415.  
  416. //------------------------------------------------------------------------------
  417. //    SetPlatformShape
  418. //------------------------------------------------------------------------------
  419.  
  420. SOM_Scope void  SOMLINK ODBaseShape__SetPlatformShape(ODBaseShape *somSelf, Environment *ev,
  421.         ODGraphicsSystem graphicsSystem,
  422.         ODPlatformShape platformShape)
  423. {
  424.     ODBaseShapeData *somThis = ODBaseShapeGetData(somSelf);
  425.     ODBaseShapeMethodDebug("ODBaseShape","SetPlatformShape");
  426.  
  427.     SOM_TRY
  428.         
  429.     ASSERT_NOT_NULL(platformShape);
  430.     
  431.     RealShape *s;
  432.     
  433.     if( graphicsSystem==kODQuickDraw )
  434.         s = new RgnShape(_fMode);
  435.     else if( graphicsSystem==kODQuickDrawGX && gGX )
  436.         s = new QDGXShape(_fMode);
  437.     else
  438.         THROW(kODErrInvalidGraphicsSystem);
  439.  
  440.     TRY{
  441.         s->SetPlatformShape(graphicsSystem,platformShape);
  442.     }CATCH_ALL{
  443.         delete s;
  444.         RERAISE;
  445.     }ENDTRY
  446.     
  447.     delete _fShape;
  448.     _fShape = s;
  449.  
  450.     SOM_CATCH_ALL
  451.     SOM_ENDTRY
  452. }
  453.  
  454. //------------------------------------------------------------------------------
  455. //    Reset
  456. //------------------------------------------------------------------------------
  457.  
  458. SOM_Scope void  SOMLINK ODBaseShape__Reset(ODBaseShape *somSelf, Environment *ev)
  459. {
  460.     ODBaseShapeData *somThis = ODBaseShapeGetData(somSelf);
  461.     ODBaseShapeMethodDebug("ODBaseShape","Reset");
  462.     
  463.     SOM_TRY
  464.  
  465.     if( _fShape )
  466.         _fShape = _fShape->Clear();
  467.  
  468.     SOM_CATCH_ALL
  469.     SOM_ENDTRY
  470. }
  471.  
  472. //------------------------------------------------------------------------------
  473. //    WriteShape
  474. //------------------------------------------------------------------------------
  475.  
  476. SOM_Scope void  SOMLINK ODBaseShape__WriteShape(ODBaseShape *somSelf, Environment *ev,
  477.         ODStorageUnit* su)
  478. {
  479.     ODBaseShapeData *somThis = ODBaseShapeGetData(somSelf);
  480.     ODBaseShapeMethodDebug("ODBaseShape","WriteShape");
  481.     
  482.     SOM_TRY
  483.  
  484.     ODPolygon poly;
  485.     if( _fShape )
  486.         _fShape->CopyPolygon(poly);
  487.  
  488.     TRY{
  489.         poly.WriteTo(ev,su);
  490.     }CATCH_ALL{
  491.         poly.Clear();
  492.         RERAISE;
  493.     }ENDTRY
  494.     poly.Clear();
  495.  
  496.     SOM_CATCH_ALL
  497.     SOM_ENDTRY
  498. }
  499.  
  500. //------------------------------------------------------------------------------
  501. //    ReadShape
  502. //------------------------------------------------------------------------------
  503.  
  504. SOM_Scope ODShape*  SOMLINK ODBaseShape__ReadShape(ODBaseShape *somSelf, Environment *ev,
  505.         ODStorageUnit* su)
  506. {
  507.     ODBaseShapeData *somThis = ODBaseShapeGetData(somSelf);
  508.     ODBaseShapeMethodDebug("ODBaseShape","ReadShape");
  509.  
  510.     SOM_TRY
  511.     
  512.     ODTempPolygon poly;
  513.     poly.ReadFrom(ev,su);
  514.     somSelf->SetPolygon(ev,&poly);
  515.     
  516.     SOM_CATCH_ALL
  517.     SOM_ENDTRY
  518.     
  519.     return (ODShape*) somSelf;
  520. }
  521.  
  522. //------------------------------------------------------------------------------
  523. //    IsSameAs
  524. //------------------------------------------------------------------------------
  525.  
  526. SOM_Scope ODBoolean  SOMLINK ODBaseShape__IsSameAs(ODBaseShape *somSelf, Environment *ev,
  527.         ODShape* compareShape)
  528. {
  529.     ODBaseShapeData *somThis = ODBaseShapeGetData(somSelf);
  530.     ODBaseShapeMethodDebug("ODBaseShape","IsSameAs");
  531.  
  532.     SOM_TRY
  533.     
  534.     ASSERT_NOT_NULL(compareShape);
  535.     if( _fShape ) {
  536.         RealShape *itsShape = compareShape->GetRealShape(ev);
  537.         if( itsShape )
  538.             return _fShape->IsSameAs(itsShape);
  539.         else
  540.             return _fShape->IsEmpty();
  541.     } else
  542.         return compareShape->IsEmpty(ev);
  543.  
  544.     SOM_CATCH_ALL
  545.     SOM_ENDTRY
  546.     return kODFalse;
  547. }
  548.  
  549. //------------------------------------------------------------------------------
  550. //    IsEmpty
  551. //------------------------------------------------------------------------------
  552.  
  553. SOM_Scope ODBoolean  SOMLINK ODBaseShape__IsEmpty(ODBaseShape *somSelf, Environment *ev)
  554. {
  555.     ODBaseShapeData *somThis = ODBaseShapeGetData(somSelf);
  556.     ODBaseShapeMethodDebug("ODBaseShape","IsEmpty");
  557.  
  558.     SOM_TRY
  559.     
  560.     return _fShape ?_fShape->IsEmpty() :kODTrue;
  561.  
  562.     SOM_CATCH_ALL
  563.     SOM_ENDTRY
  564.     return kODFalse;
  565. }
  566.  
  567. //------------------------------------------------------------------------------
  568. //    ContainsPoint
  569. //------------------------------------------------------------------------------
  570.  
  571. SOM_Scope ODBoolean  SOMLINK ODBaseShape__ContainsPoint(ODBaseShape *somSelf, Environment *ev,
  572.         ODPoint* point)
  573. {
  574.     ODBaseShapeData *somThis = ODBaseShapeGetData(somSelf);
  575.     ODBaseShapeMethodDebug("ODBaseShape","ContainsPoint");
  576.  
  577.     SOM_TRY
  578.     
  579.     return _fShape ?_fShape->ContainsPoint(*point) :kODFalse;
  580.  
  581.     SOM_CATCH_ALL
  582.     SOM_ENDTRY
  583.     return kODFalse;
  584. }
  585.  
  586. //------------------------------------------------------------------------------
  587. //    IsRectangular
  588. //------------------------------------------------------------------------------
  589.  
  590. SOM_Scope ODBoolean  SOMLINK ODBaseShape__IsRectangular(ODBaseShape *somSelf, Environment *ev)
  591. {
  592.     ODBaseShapeData *somThis = ODBaseShapeGetData(somSelf);
  593.     ODBaseShapeMethodDebug("ODBaseShape","IsRectangular");
  594.  
  595.     SOM_TRY
  596.     
  597.     return _fShape ?_fShape->IsRectangular() :kODTrue;
  598.  
  599.     SOM_CATCH_ALL
  600.     SOM_ENDTRY
  601.     return kODFalse;
  602. }
  603.  
  604. //------------------------------------------------------------------------------
  605. //    HasGeometry
  606. //------------------------------------------------------------------------------
  607.  
  608. SOM_Scope ODBoolean  SOMLINK ODBaseShape__HasGeometry(ODBaseShape *somSelf, Environment *ev)
  609. {
  610.     ODBaseShapeData *somThis = ODBaseShapeGetData(somSelf);
  611.     ODBaseShapeMethodDebug("ODBaseShape","HasGeometry");
  612.  
  613.     SOM_TRY
  614.     
  615.     return _fShape ?_fShape->HasGeometry() :kODTrue;
  616.  
  617.     SOM_CATCH_ALL
  618.     SOM_ENDTRY
  619.     return kODFalse;
  620. }
  621.  
  622. //------------------------------------------------------------------------------
  623. //    Transform
  624. //------------------------------------------------------------------------------
  625.  
  626. SOM_Scope ODShape*  SOMLINK ODBaseShape__Transform(ODBaseShape *somSelf, Environment *ev,
  627.         ODTransform* xform)
  628. {
  629.     ODBaseShapeData *somThis = ODBaseShapeGetData(somSelf);
  630.     ODBaseShapeMethodDebug("ODBaseShape","Transform");
  631.  
  632.     SOM_TRY
  633.     
  634.     ASSERT_NOT_NULL(xform);
  635.     if( _fShape ) {
  636.         if( xform->HasMatrix(ev) )
  637.             _fShape = _fShape->Transform(ev,xform);
  638.         else
  639.             xform->TransformShape(ev,(ODShape*)somSelf);
  640.     }
  641.  
  642.     SOM_CATCH_ALL
  643.     SOM_ENDTRY
  644.     return (ODShape*) somSelf;
  645. }
  646.  
  647. //------------------------------------------------------------------------------
  648. //    InverseTransform
  649. //------------------------------------------------------------------------------
  650.  
  651. SOM_Scope ODShape*  SOMLINK ODBaseShape__InverseTransform(ODBaseShape *somSelf, Environment *ev,
  652.         ODTransform* xform)
  653. {
  654.     ODBaseShapeData *somThis = ODBaseShapeGetData(somSelf);
  655.     ODBaseShapeMethodDebug("ODBaseShape","InverseTransform");
  656.  
  657.     SOM_TRY
  658.     
  659.     /* ***** Temporarily inverts xform, which may cause problems with threads.
  660.              The alternative would be to copy xform and invert the copy. */
  661.     
  662.     // In the implementation of ODTransform, Invert is a fully reversible operation
  663.     // with no round-off error. (The transform caches an inverse matrix, and
  664.     // inverting the transform again is just a matter of swapping matrices.)
  665.     
  666.     ASSERT_NOT_NULL(xform);
  667.     
  668.     if( _fShape ) {
  669.         if( xform->HasMatrix(ev) ) {
  670.             xform->Invert(ev);
  671.             TRY{
  672.                 _fShape = _fShape->Transform(ev,xform);
  673.             }CATCH_ALL{
  674.                 xform->Invert(ev);
  675.                 RERAISE;
  676.             }ENDTRY
  677.             xform->Invert(ev);
  678.         
  679.         } else
  680.             xform->InvertShape(ev,(ODShape*)somSelf);
  681.     }
  682.  
  683.     SOM_CATCH_ALL
  684.     SOM_ENDTRY
  685.     return (ODShape*) somSelf;
  686. }
  687.  
  688. //------------------------------------------------------------------------------
  689. //    Subtract
  690. //------------------------------------------------------------------------------
  691.  
  692. SOM_Scope ODShape*  SOMLINK ODBaseShape__Subtract(ODBaseShape *somSelf, Environment *ev,
  693.         ODShape* diffShape)
  694. {
  695.     ODBaseShapeData *somThis = ODBaseShapeGetData(somSelf);
  696.     ODBaseShapeMethodDebug("ODBaseShape","Subtract");
  697.  
  698.     SOM_TRY
  699.     
  700.     ASSERT_NOT_NULL(diffShape);
  701.     if( _fShape ) {
  702.         RealShape *itsShape = diffShape->GetRealShape(ev);
  703.         if( itsShape )
  704.             _fShape = _fShape->Subtract(itsShape);
  705.     }
  706.     
  707.     SOM_CATCH_ALL
  708.     SOM_ENDTRY
  709.     return (ODShape*) somSelf;
  710. }
  711.  
  712. //------------------------------------------------------------------------------
  713. //    Intersect
  714. //------------------------------------------------------------------------------
  715.  
  716. SOM_Scope ODShape*  SOMLINK ODBaseShape__Intersect(ODBaseShape *somSelf, Environment *ev,
  717.         ODShape* sectShape)
  718. {
  719.     ODBaseShapeData *somThis = ODBaseShapeGetData(somSelf);
  720.     ODBaseShapeMethodDebug("ODBaseShape","Intersect");
  721.  
  722.     SOM_TRY
  723.     
  724.     ASSERT_NOT_NULL(sectShape);
  725.     if( _fShape ) {
  726.         RealShape *itsShape = sectShape->GetRealShape(ev);
  727.         if( itsShape )
  728.             _fShape = _fShape->Intersect(itsShape);
  729.         else
  730.             somSelf->Reset(ev);
  731.     }
  732.  
  733.     SOM_CATCH_ALL
  734.     SOM_ENDTRY
  735.     return (ODShape*) somSelf;
  736. }
  737.  
  738. //------------------------------------------------------------------------------
  739. //    Union
  740. //------------------------------------------------------------------------------
  741.  
  742. SOM_Scope ODShape*  SOMLINK ODBaseShape__Union(ODBaseShape *somSelf, Environment *ev,
  743.         ODShape* unionShape)
  744. {
  745.     ODBaseShapeData *somThis = ODBaseShapeGetData(somSelf);
  746.     ODBaseShapeMethodDebug("ODBaseShape","Union");
  747.  
  748.     SOM_TRY
  749.     
  750.     ASSERT_NOT_NULL(unionShape);
  751.     if( _fShape ) {
  752.         RealShape *itsShape = unionShape->GetRealShape(ev);
  753.         if( itsShape )
  754.             _fShape = _fShape->Union(itsShape);
  755.     } else
  756.         somSelf->CopyFrom(ev,unionShape);
  757.  
  758.     SOM_CATCH_ALL
  759.     SOM_ENDTRY
  760.     return (ODShape*) somSelf;
  761. }
  762.  
  763. //------------------------------------------------------------------------------
  764. //    Outset
  765. //------------------------------------------------------------------------------
  766.  
  767. SOM_Scope ODShape*  SOMLINK ODBaseShape__Outset(ODBaseShape *somSelf, Environment *ev,
  768.         ODCoordinate distance)
  769. {
  770.     ODBaseShapeData *somThis = ODBaseShapeGetData(somSelf);
  771.     ODBaseShapeMethodDebug("ODBaseShape","Outset");
  772.     
  773.     if( distance != 0 && _fShape ) {
  774.         SOM_TRY
  775.             _fShape = _fShape->Outset(distance);
  776.         SOM_CATCH_ALL
  777.         SOM_ENDTRY
  778.     }
  779.     return (ODShape*) somSelf;
  780. }
  781.