NodeBitmapEffect Class Reference

Bitmap effects nodes are type of Post-Processors. They process the bitmap output of their child nodes. More...

#include <nodeliveeffect.h>

Inheritance diagram for NodeBitmapEffect:

NodeEffect NodeCompound NodeRenderableInk NodeRenderableBounded NodeRenderable Node CCObject SimpleCCObject NodeLiveEffect NodeLockedEffect NodeFeatherEffect List of all members.

Public Member Functions

 NodeBitmapEffect ()
 Note:.
 ~NodeBitmapEffect ()
 Destructor Note:.
 NodeBitmapEffect (Node *ContextNode, AttachNodeDirection Direction, BOOL Locked=FALSE, BOOL Mangled=FALSE, BOOL Marked=FALSE, BOOL Selected=FALSE)
 This constructor initialises the nodes flags and links it to ContextNode in the direction specified by Direction. All neccesary tree links are updated. Note: SetUpShape() must be called before the NodeRegularShape is in a state in which it can be used.
virtual BOOL IsBitmapEffect () const
virtual DocRect GetBlobBoundingRect ()
 Finds the bounding rect of the group along with its blobs. Its main use is to determine which areas of the document to invalidate.
virtual NodeRenderableInkGetInkNodeFromController () const
 If we had a Controller node inherited class from NodeGroup then this function really belongs there. But we don't, so this function only returns anything if your node also returns TRUE to IsAController(). If so it will return the node that is shadowed, bevelled or contoured.
virtual void Render (RenderRegion *pRender)
 Will render the liveeffect iff we have it cached - for hit detection reasons.
virtual BOOL DoBecomeA (BecomeA *pBecomeA)
 Converts me to a path Notes: Note that when this routine creates paths it does NOT call DoBecomeA on its children because the paths and the bitmap fills represetn everything the child objects have rendered.
virtual BOOL CanBecomeA (BecomeA *pBecomeA)
 Can become a path !
virtual BOOL HasCachedDirectBitmap ()
 

virtual BOOL WriteBoundsRecord (BaseCamelotFilter *pFilter)
 Begin to write out your child records, in the native format.
virtual BOOL WillWriteBounds (BaseCamelotFilter *pFilter)
 Determines if the down/up pair need to be written.
virtual void RenderAfterSubtree (RenderRegion *pRender)
 Capture the group as a cached bitmap.
virtual BOOL GetOriginalBitmap (LPBITMAPINFO *plpInfo, LPBYTE *plpBits, DocRect *pRect)
 To get the required/stored pixel width of this node -.
virtual void SetOriginalBitmap (LPBITMAPINFO lpInfo, LPBYTE lpBits, DocRect rect)
 

virtual BOOL GetProcessedBitmap (BOOL bDirect, LPBITMAPINFO *plpInfo, LPBYTE *plpBits, DocRect *pRect)
virtual DocRect SetProcessedBitmap (LPBITMAPINFO lpInfo, LPBYTE lpBits, DocRect rect, INT32 width, INT32 height, double xOffset, double yOffset, double dPixelWidth=0, Matrix *pmatTransform=NULL)
virtual IXMLDOMDocumentPtr GetEditList ()
 

virtual void SetEditList (IXMLDOMDocumentPtr pNewEditsDoc)
 

virtual BOOL SetDefaultEditList ()
 

virtual BOOL IsLockedEffect ()
virtual BOOL HasChanged () const
virtual BOOL SetChanged (BOOL bNewFlag=TRUE)
virtual BOOL CompareState (NodeEffect *pPPNode)
 
  • Notes: Would be more efficient to pass in level xml instead of getting it inside this function

virtual BOOL ProcessBitmap (RenderRegion *pRender, CBitmapCache *pBitmapCache, LPBITMAPINFO pBMPInfo, LPBYTE pBMPBits, DocRect BMPRect, LPBITMAPINFO &pOutputInfo, LPBYTE &pOutputBits, double *pXOffset, double *pYOffset)
 Processes the bitmap produced by the children of this node. Can be overridden by derived classes to perofrm special processing.
virtual String_64GetDisplayName ()
virtual void SetDisplayName (String_64 &strDisplayName)
virtual KernelBitmapGetKernelBitmap (DocCoord *pCoords, BOOL bRetainCached=FALSE)
virtual double GetPixelsPerInch ()
 To get the required/stored pixel res of this node.
virtual double GetPixelsPerInchValue () const
virtual void SetPixelsPerInch (double dPixelsPerInch)
 To get the required/stored pixel res of this node.
virtual BOOL CanGenerateBitmap ()
 Test whether node is big enough to bother with.
virtual BOOL GetChildDirectBitmap (RenderRegion *pRender, LPBITMAPINFO *plpInfo=NULL, LPBYTE *plpBits=NULL, DocRect *pRect=NULL, Matrix *pMat=NULL, double *pdRes=NULL)
 

virtual BOOL CanSupplyDirectBitmap ()
virtual BOOL GetDirectBitmap (RenderRegion *pRender, LPBITMAPINFO *plpInfo, LPBYTE *plpBits, DocRect *pRect, Matrix *pMat, double *pdRes)
 Return details of direct bitmap to caller (caller is usually a NodeBitmapEffect).
virtual BOOL RenderDirectBitmapState (RenderRegion *pRender)
 Render the current state into the renderregion if we haven't yet done so. Only used in background rendering timeslice screen update.
virtual BOOL EnableDirectCapture ()
 Determine whether this effect can do a direct capture of its child node(s) or whether it needs to do a normal, rendering capture. At the moment, this depends solely on whether the DirectBitmap supplier can supply a bitmap at the same resolution as this effect requires.

Static Public Member Functions

static BOOL Init ()
 Initialise the NodeBitmapEffect class.

Static Public Attributes

static UINT32 DefaultLivePixelsPerInch
static UINT32 DefaultLockedPixelsPerInch
static UINT32 GroupPixelsPerInch = 0
static UINT32 ShadowPixelsPerInch = 0
static BOOL DefaultLocked = FALSE

Protected Member Functions

virtual double GetPixelWidth ()
virtual DocRect AdjustPixelOffsets (DocRect inRect, INT32 width, INT32 height, double xOffset, double yOffset, double dPixelWidth=0)
 
  • Notes: Width, height, xoffset, yoffset refer to bitmap in standard Windows fashion - Y coords increase downwards, offsets refer to top-left corner This routine must move from one coord system to the other while it updates the supplied rectangle

virtual BOOL FindCachedEffect (CBitmapCache *pBitmapCache)
 Find all cached items this node needs to call RenderCachedEffect succesfully.
virtual BOOL RenderCachedEffect (CBitmapCache *pBitmapCache, RenderRegion *pRenderRegion, BOOL bIgnoreCapture=FALSE)
 Render the cached version of this node.
virtual BOOL GetQuickRender ()
virtual BOOL CanGetChildDirectBitmap ()
 FInd out whether our controlled child can give us a DirectBitmap.

Protected Attributes

IXMLDOMDocumentPtr m_pEditsDoc
StringVar m_vstrEdits
double m_dPixelsPerInch
BOOL m_bHasChangedRecently
String_64 m_strDisplayName
DocRect m_rectDirectBitmap

Private Member Functions

 CC_DECLARE_DYNCREATE (NodeBitmapEffect)

Friends

class LiveEffectRecordHandler

Detailed Description

Bitmap effects nodes are type of Post-Processors. They process the bitmap output of their child nodes.

Author:
Phil_Martin (Xara Group Ltd) <camelotdev@xara.com>
Date:
07/09/2004

Definition at line 163 of file nodeliveeffect.h.


Constructor & Destructor Documentation

NodeBitmapEffect::NodeBitmapEffect  ) 
 

Note:.

Author:
Phil_Martin (Xara Group Ltd) <camelotdev@xara.com>
Date:
07/09/2004
See also:

Definition at line 336 of file nodeliveeffect.cpp.

00336                                    : NodeEffect()
00337 {
00338     m_pEditsDoc = NULL;
00339     m_bHasChangedRecently = FALSE;
00340     m_strPostProID = String( _T("") );
00341     m_strDisplayName = String( _T("") );
00342 }

NodeBitmapEffect::~NodeBitmapEffect  ) 
 

Destructor Note:.

Author:
Phil_Martin (Xara Group Ltd) <camelotdev@xara.com>
Date:
07/09/2004
See also:

Definition at line 358 of file nodeliveeffect.cpp.

00359 {
00360     m_pEditsDoc = NULL;             // m_pEditsDoc is a smart pointer so NULLing it Releases the COM interface
00361                                     // and releases any memory
00362     // Note that NodeBitmapEffect stores original bitmap data in the cache
00363     // but this destructor relies no derived classes clareing cached data when they
00364     // are destroyed for efficiency.
00365 }

NodeBitmapEffect::NodeBitmapEffect Node ContextNode,
AttachNodeDirection  Direction,
BOOL  Locked = FALSE,
BOOL  Mangled = FALSE,
BOOL  Marked = FALSE,
BOOL  Selected = FALSE
 

This constructor initialises the nodes flags and links it to ContextNode in the direction specified by Direction. All neccesary tree links are updated. Note: SetUpShape() must be called before the NodeRegularShape is in a state in which it can be used.

Author:
Phil_Martin (Xara Group Ltd) <camelotdev@xara.com>
Date:
07/09/2004
Parameters:
ContextNode,: Pointer to a node which this node is to be attached to. [INPUTS] MonoOn Direction: MonoOff Specifies the direction in which the node is to be attached to the ContextNode. The values this variable can take are as follows:
PREV : Attach node as a previous sibling of the context node NEXT : Attach node as a next sibling of the context node FIRSTCHILD: Attach node as the first child of the context node LASTCHILD : Attach node as a last child of the context node

BoundingRect: Bounding rectangle

The remaining inputs specify the status of the node:

Locked: Is node locked ? Mangled: Is node mangled ? Marked: Is node marked ? Selected: Is node selected ?

See also:
NodeRegularShape::SetUpShape
Returns:
Errors: An ENSURE will occur if ContextNode is NULL

Definition at line 307 of file nodeliveeffect.cpp.

00313                 : NodeEffect(ContextNode, Direction, Locked, Mangled, Marked, Selected )
00314 {                         
00315     m_pEditsDoc = NULL;
00316     m_bHasChangedRecently = FALSE;
00317     m_strPostProID = String(_T(""));
00318     m_strDisplayName = String(_T(""));
00319     m_rectDirectBitmap = DocRect(0,0,0,0);
00320 }


Member Function Documentation

DocRect NodeBitmapEffect::AdjustPixelOffsets DocRect  inRect,
INT32  width,
INT32  height,
double  xOffset,
double  yOffset,
double  dPixelWidth = 0
[protected, virtual]
 

  • Notes: Width, height, xoffset, yoffset refer to bitmap in standard Windows fashion - Y coords increase downwards, offsets refer to top-left corner This routine must move from one coord system to the other while it updates the supplied rectangle

Author:
Phil_Martin (Xara Group Ltd) <camelotdev@xara.com>
Date:
14/09/2004
Parameters:
- [INPUTS]
- [OUTPUTS]

Definition at line 944 of file nodeliveeffect.cpp.

00945 {
00946     if (dPixelWidth==0)
00947         dPixelWidth = GetPixelWidth();
00948 
00949     DocRect outRect(inRect.lo.x, inRect.hi.y, inRect.lo.x, inRect.hi.y);
00950                                                             // Set new bitmap origin to old bitmap origin
00951     outRect.lo.x += INT32( xOffset * dPixelWidth );         // Set new bitmap origin X (-ve offset means "move left")
00952     outRect.hi.y -= INT32( yOffset * dPixelWidth );         // Set new bitmap origin Y (-ve yoffset means "move up")
00953 
00954     if (width==0)
00955         outRect.hi.x = outRect.lo.x + inRect.Width();
00956     else
00957         outRect.hi.x = outRect.lo.x + INT32( width * dPixelWidth ); // Set width of new bitmap
00958 
00959     if (height==0)
00960         outRect.lo.y = outRect.hi.y - inRect.Height();
00961     else
00962         outRect.lo.y = outRect.hi.y - INT32( height * dPixelWidth );    // Set height of new bitmap
00963 
00964     return outRect;
00965 }

BOOL NodeBitmapEffect::CanBecomeA BecomeA pBecomeA  )  [virtual]
 

Can become a path !

Author:
Phil_Martin (Xara Group Ltd) <camelotdev@xara.com>
Date:
08/02/2005
Parameters:
Ink class to test [INPUTS]
See also:

Reimplemented from NodeCompound.

Definition at line 1725 of file nodeliveeffect.cpp.

01726 {
01727     // Don't make a dumb square bitmap if the Op is a blend op because in that case
01728     // it's more useful to have the original shape with the effect
01729     // Or if this node is in the top surface of those being considered
01730     //      and the op tells us that the results of dobecomea will be left in place (i.e. under
01731     //      and effect stack)
01732     if (!IsLockedEffect())
01733     {
01734         if (pBecomeA->IsBlendBecomeA() || pBecomeA->ResultsStayInPlace())
01735         {
01736             return NodeEffect::CanBecomeA(pBecomeA);
01737         }
01738     }
01739 
01740     // We only do conversions if we are the top effect in the stack
01741     if (!IsLockedEffect() && FindParent() && FindParent()->IsEffect())
01742         return FALSE;
01743 
01744     if (pBecomeA->BAPath())
01745     {
01746         pBecomeA->AddCount(1);
01747 
01748         return TRUE;
01749     }
01750 
01751     return FALSE;
01752 }

BOOL NodeBitmapEffect::CanGenerateBitmap  )  [virtual]
 

Test whether node is big enough to bother with.

Author:
Phil_Martin (Xara Group Ltd) <camelotdev@xara.com>
Date:
01/07/2005
Parameters:
- [INPUTS]
Returns:
TRUE if this effect node can generate an original bitmap FALSE otherwise
See also:

Definition at line 1768 of file nodeliveeffect.cpp.

01769 {
01770     double PixelWidth = GetPixelWidth();
01771     DocRect CaptureRect = GetChildBoundingRect();
01772     return (CaptureRect.Width()>=PixelWidth && CaptureRect.Height()>=PixelWidth);
01773 }

BOOL NodeBitmapEffect::CanGetChildDirectBitmap  )  [protected, virtual]
 

FInd out whether our controlled child can give us a DirectBitmap.

Author:
Phil_Martin (Xara Group Ltd) <camelotdev@xara.com>
Date:
26/07/2005
Parameters:
- [INPUTS]
- [OUTPUTS]
Returns:
TRUE if we can get a bitmap dircetly from our controlled child node FALSE otherwise

Definition at line 823 of file nodeliveeffect.cpp.

00824 {
00825     NodeRenderableInk* pInkNode = GetInkNodeFromController();
00826     if (pInkNode==NULL)
00827         return FALSE;
00828 
00829     BOOL bOK = EnableDirectCapture() && pInkNode->CanSupplyDirectBitmap();
00830 
00831     return bOK;
00832 }

virtual BOOL NodeBitmapEffect::CanSupplyDirectBitmap  )  [inline, virtual]
 

Reimplemented from NodeRenderableInk.

Reimplemented in NodeLockedEffect, and NodeFeatherEffect.

Definition at line 254 of file nodeliveeffect.h.

00254 {return TRUE;}

NodeBitmapEffect::CC_DECLARE_DYNCREATE NodeBitmapEffect   )  [private]
 

BOOL NodeBitmapEffect::CompareState NodeEffect pPPNode  )  [virtual]
 

  • Notes: Would be more efficient to pass in level xml instead of getting it inside this function

Author:
Phil_Martin (Xara Group Ltd) <camelotdev@xara.com>
Date:
12/11/2004
Returns:
TRUE if this state matches the state (and type) of the supplied node

Reimplemented from NodeEffect.

Reimplemented in NodeFeatherEffect.

Definition at line 1437 of file nodeliveeffect.cpp.

01438 {
01439     if (!pPPNode->IsBitmapEffect())
01440         return FALSE;
01441 
01442     PORTNOTETRACE("other","NodeBitmapEffect::CompareState - do nothing, XML and BSTR");
01443 #ifndef EXCLUDE_FROM_XARALX
01444     BSTR temp;
01445     HRESULT hr;
01446 
01447     _bstr_t bstrThisEditDoc;
01448     IXMLDOMDocumentPtr pThisEditDoc = GetEditList();
01449     hr = pThisEditDoc->get_xml(&temp);
01450     bstrThisEditDoc = temp;
01451 
01452     _bstr_t bstrTestEditDoc;
01453     IXMLDOMDocumentPtr pTestEditDoc = ((NodeBitmapEffect*)pPPNode)->GetEditList();
01454     hr = pTestEditDoc->get_xml(&temp);
01455     bstrTestEditDoc = temp;
01456 
01457     return (bstrTestEditDoc == bstrThisEditDoc); */
01458 #else
01459     return false;
01460 #endif
01461 }

BOOL NodeBitmapEffect::DoBecomeA BecomeA pBecomeA  )  [virtual]
 

Converts me to a path Notes: Note that when this routine creates paths it does NOT call DoBecomeA on its children because the paths and the bitmap fills represetn everything the child objects have rendered.

Author:
Phil_Martin (Xara Group Ltd) <camelotdev@xara.com>
Date:
08/02/2005
Parameters:
BecomeA struct [INPUTS]
See also:

Reimplemented from NodeCompound.

Definition at line 1480 of file nodeliveeffect.cpp.

01481 {
01482     // Check for a NULL entry param
01483     ERROR2IF(pBecomeA == NULL, FALSE, "pBecomeA is NULL");
01484 
01485     if (!pBecomeA->BAPath())
01486         return FALSE;
01487 
01488     // This lump checks that the Reason is one that we understand
01489     // It also makes sure that we don't have a NULL UndoOp ptr
01490     BOOL ValidReason = (pBecomeA->GetReason() == BECOMEA_REPLACE || pBecomeA->GetReason() == BECOMEA_PASSBACK);
01491     ERROR2IF_PF(!ValidReason,FALSE,("Unkown BecomeA reason %d",pBecomeA->GetReason()));
01492 
01493     BOOL bOK                        = FALSE;
01494     NodePath* pNewNodePath          = NULL;
01495     NodeAttribute* pAttr            = NULL;
01496     NodeHidden* pHiddenNode         = NULL;
01497 //  AttrLineWidth* pLineWidth       = NULL;
01498     UndoableOperation* pOp          = pBecomeA->GetUndoOp();
01499 
01500     // Don't make a dumb square bitmap if the Op is a blend op because in that case
01501     // it's more useful to have the original shape with the effect
01502     // Or if this node is in the top surface of those being considered
01503     //      and the op tells us that the results of dobecomea will be left in place (i.e. under
01504     //      and effect stack)
01505     if (!IsLockedEffect())
01506     {
01507         if (pBecomeA->IsBlendBecomeA() || pBecomeA->DoSilhouette() || pBecomeA->OnlyNeedPaths() || pBecomeA->ResultsStayInPlace())
01508             return NodeEffect::DoBecomeA(pBecomeA);
01509     }
01510     else
01511     {
01512         if (pBecomeA->OnlyNeedPaths() || (pBecomeA->IsBlendBecomeA() && pBecomeA->GetReason() == BECOMEA_PASSBACK))
01513             return NodeEffect::DoBecomeA(pBecomeA);
01514     }
01515 
01516     // We only do conversions if we are the top effect in the stack
01517     if (!IsLockedEffect() && FindParent() && FindParent()->IsEffect())
01518         return TRUE;
01519 
01520     // Get a permanent kernel bitmap to fill the path
01521     DocCoord coords[3];
01522     KernelBitmap* kBitmap = GetKernelBitmap(coords, TRUE);  // Retain the cached data because we may be called again (blends with multiple paths)
01523     // Note: kBitmap may be NULL
01524 
01525     // Create a NodePath containing the parallelogram from the cache
01526     ALLOC_WITH_FAIL(pNewNodePath, new NodePath, pOp); 
01527     if (pNewNodePath)
01528     {
01529         Path InkPath;
01530         InkPath.Initialise();
01531         InkPath.AddMoveTo(coords[0]);
01532         InkPath.AddLineTo(coords[1]);
01533         InkPath.AddLineTo(DocCoord(coords[2].x+coords[1].x-coords[0].x, coords[2].y+coords[1].y-coords[0].y));
01534         InkPath.AddLineTo(coords[2]);
01535         InkPath.AddLineTo(coords[0]);
01536         InkPath.CloseSubPath();
01537 
01538         pNewNodePath->InkPath.Initialise();
01539         pNewNodePath->InkPath.CloneFrom(InkPath);
01540         pNewNodePath->InkPath.IsFilled = TRUE;
01541         pNewNodePath->InkPath.TryToClose();
01542         pNewNodePath->InkPath.InitialiseFlags();
01543 
01544         switch (pBecomeA->GetReason())
01545         {
01546         case BECOMEA_REPLACE:
01547             {
01548                 // Note! In many cases we are just being asked to become a path to get
01549                 // the path data ignoring the attributes.
01550                 // So if we can't make the attribute, it's better tp just go ahead
01551                 // and return the path data without them.
01552                 //
01553                 // Make a new bitmap fill attribute referring to the newly created Kernel bitmap
01554                 BitmapFillAttribute* pBitmapAttr = NULL;
01555                 ALLOC_WITH_FAIL(pBitmapAttr, new BitmapFillAttribute, pOp);
01556                 if (pBitmapAttr!=NULL && kBitmap)
01557                 {
01558                     pBitmapAttr->GetBitmapRef()->SetBitmap(kBitmap);
01559                     pBitmapAttr->StartPoint = coords[0];
01560                     pBitmapAttr->EndPoint   = coords[1];
01561                     pBitmapAttr->EndPoint2  = coords[2];
01562 
01563                     // Make sure the Fill attributes point to the new bitmap!
01564                     pAttr = pBitmapAttr->MakeNode();
01565                     pAttr->AttachNode(pNewNodePath, FIRSTCHILD);
01566                     delete pBitmapAttr;
01567                     pBitmapAttr = NULL;
01568                 }
01569 
01570                 AttrStrokeColour* pStrokeColour = NULL;
01571                 ALLOC_WITH_FAIL(pStrokeColour, new AttrStrokeColour, pOp);
01572                 if (pStrokeColour!=NULL)
01573                 {
01574                     // Also make the line colour NONE
01575                     DocColour colNone(COLOUR_NONE);
01576                     pStrokeColour->SetStartColour(&colNone);
01577                     pStrokeColour->AttachNode(pNewNodePath, FIRSTCHILD);
01578                 }
01579 
01580                 bOK = TRUE;
01581 
01582                 // Copy any effect attributes over to the new node
01583                 // where they can become normal attributes now that we have captured
01584                 // the effect as a bitmap
01585                 NodeAttribute* pEffectAttr = NodeAttribute::FindFirstAppliedAttr(this);
01586                 while (bOK && pEffectAttr && pEffectAttr->IsEffectAttribute())
01587                 {
01588                     CALL_WITH_FAIL(pEffectAttr->CopyNode(pNewNodePath, FIRSTCHILD), pOp, bOK);
01589 
01590                     pEffectAttr = NodeAttribute::FindPrevAppliedAttr(pEffectAttr);
01591                 }
01592 
01593                 // Now insert the new node
01594                 if (bOK)
01595                 {
01596                     if (pOp)
01597                     {
01598                         bOK = pOp->DoInsertNewNode(pNewNodePath, this, NEXT, TRUE, FALSE, this->IsSelected() || this->IsParentOfSelected(), TRUE);
01599                     }
01600                     else
01601                     {
01602                         pNewNodePath->AttachNode(this, NEXT);
01603                         pNewNodePath->Select(this->IsSelected() || this->IsParentOfSelected());
01604                     }
01605                 }
01606 
01607                 // Handle the passback bits
01608                 if (bOK)
01609                 {
01610                     CCAttrMap ThisMap;
01611                     CCAttrMap* pThisMap = NULL;
01612                     if (pNewNodePath->FindAppliedAttributes(&ThisMap))
01613                         pThisMap = ThisMap.Copy();
01614                     pBecomeA->PassBack(pNewNodePath, this, pThisMap);
01615                 }
01616 
01617                 // Now hide (or delete) this node
01618                 if (bOK)
01619                 {
01620                     if (pOp)
01621                     {
01622                         bOK = pOp->DoHideNode(this, TRUE, &pHiddenNode, FALSE);
01623                     }
01624                     else
01625                     {
01626                         CascadeDelete();
01627                         delete this;    // SCARY!
01628                     }
01629                 }
01630             }
01631             break;
01632 
01633         case BECOMEA_PASSBACK:
01634             {
01635                 // if we're passing back, just do the first path
01636                 CCAttrMap ThisMap;
01637                 if (FindAppliedAttributes(&ThisMap))
01638                 {
01639                     // make a copy of this attribute map
01640                     CCAttrMap* pNewAttrMap = ThisMap.Copy();
01641                     AttrStrokeColour* pStrokeColour = NULL;
01642                     // get the stroke colour attribute out of this map and set it to COLOUR_NONE
01643                     if( pNewAttrMap->Lookup( CC_RUNTIME_CLASS(AttrStrokeColour), (void*&)(pStrokeColour) ) )
01644                     {
01645                         if (pStrokeColour && pStrokeColour->GetStartColour())
01646                         {
01647                             DocColour colNone(COLOUR_NONE);
01648                             pStrokeColour->SetStartColour(&colNone);
01649                         }
01650                     }
01651 
01652                     // Replace the Fill attribute in the Attr Map copy
01653                     // with a bitmap fill
01654                     AttrFillGeometry* pBitmapFill = new AttrBitmapColourFill();
01655                     if (pBitmapFill && kBitmap)
01656                     {
01657                         // Make a Bitmap Fill that is equivalent to this
01658                         // node bitmap
01659                         pBitmapFill->AttachBitmap(kBitmap);
01660 
01661                         // Set any contone colours that we have
01662 //                      pBitmapFill->SetStartColour(ContoneStart);
01663 //                      pBitmapFill->SetEndColour(ContoneEnd);
01664 
01665                         // Set the control points from the NodeBitmap Parallelogram
01666                         pBitmapFill->SetStartPoint(&coords[0]);
01667                         pBitmapFill->SetEndPoint(&coords[1]);
01668                         pBitmapFill->SetEndPoint2(&coords[2]);
01669 
01670                         void* pOldFill;
01671                         if (pNewAttrMap->Lookup(CC_RUNTIME_CLASS(AttrFillGeometry), pOldFill))
01672                         {
01673                             // We need to Remove and Delete the existing Fill Attr
01674                             pNewAttrMap->RemoveKey(CC_RUNTIME_CLASS(AttrFillGeometry));
01675                             delete (AttrFillGeometry*)pOldFill;
01676                         }
01677 
01678                         // Add the Bitmap fill into the Attr Map
01679                         pNewAttrMap->SetAt(CC_RUNTIME_CLASS(AttrFillGeometry),(void*)pBitmapFill);
01680                     }
01681 
01682                     // ok, now lets set up the attribute maps
01683                     pBecomeA->PassBack(pNewNodePath, this, pNewAttrMap);
01684                     bOK = TRUE;
01685                 }
01686             }
01687             break;
01688 
01689         case BECOMEA_TEST:
01690             ERROR3("Unhandled BECOMEA type\n");
01691             break;
01692         }
01693     }
01694 
01695     if (!bOK)
01696     {
01697         if (pNewNodePath != NULL)
01698         {
01699             // Delete all the NodePath's children (if it has any) and unlink it from the tree (if it's linked)
01700             // This is all done by CascadeDelete()
01701             pNewNodePath->CascadeDelete(); 
01702             delete pNewNodePath;
01703             pNewNodePath = NULL;
01704         }
01705     }
01706 
01707     return bOK;
01708 }

BOOL NodeBitmapEffect::EnableDirectCapture  )  [virtual]
 

Determine whether this effect can do a direct capture of its child node(s) or whether it needs to do a normal, rendering capture. At the moment, this depends solely on whether the DirectBitmap supplier can supply a bitmap at the same resolution as this effect requires.

Author:
Phil_Martin (Xara Group Ltd) <camelotdev@xara.com>
Date:
04/08/2005
Parameters:
- [INPUTS]
- [OUTPUTS]
Returns:
-

Reimplemented in NodeFeatherEffect.

Definition at line 904 of file nodeliveeffect.cpp.

00905 {
00906     NodeRenderableInk* pInkNode = GetInkNodeFromController();
00907     if (pInkNode==NULL)
00908         return FALSE;
00909 
00910 PORTNOTE("effects", "EnableDirectCapture returns FALSE until effects work. Forces base objects to render themselves.");
00911 #if !defined(EXCLUDE_FROM_XARALX)
00912     double dChildPPI = 0;
00913     BOOL bDirectResolution = pInkNode->GetDirectBitmap(NULL, NULL, NULL, NULL, NULL, &dChildPPI);
00914     if (!bDirectResolution || dChildPPI==0)
00915         return FALSE;
00916 
00917     // Enable Direct Capture if we are "automatic" PPI or we are the same PPI as the child direct bitmap
00918     if (m_dPixelsPerInch==0 || dChildPPI==m_dPixelsPerInch)
00919         return TRUE;
00920 #endif 
00921 
00922     return FALSE;
00923 }

BOOL NodeBitmapEffect::FindCachedEffect CBitmapCache pBitmapCache  )  [protected, virtual]
 

Find all cached items this node needs to call RenderCachedEffect succesfully.

Author:
Phil_Martin (Xara Group Ltd) <camelotdev@xara.com>
Date:
24/11/2004
Parameters:
- [INPUTS]
- [OUTPUTS]

Reimplemented in NodeFeatherEffect.

Definition at line 1245 of file nodeliveeffect.cpp.

01246 {
01247 //  BOOL bRendered = FALSE;
01248 
01249     CBitmapCacheKey inky(this, GetPixelWidth(), 1);                     // Get cached BMP for this PROCESSED node at our dpi
01250     CCachedBitmap cbmp;
01251     BOOL bFoundCached = pBitmapCache->Lookup(inky, cbmp);
01252 
01253     return bFoundCached;
01254 }

DocRect NodeBitmapEffect::GetBlobBoundingRect  )  [virtual]
 

Finds the bounding rect of the group along with its blobs. Its main use is to determine which areas of the document to invalidate.

Author:
Ed_Cornes (Xara Group Ltd) <camelotdev@xara.com> (re-written)
Date:
29/6/95
Returns:
DocRect - The bounding rect of the group and its blobs

Reimplemented from NodeRenderable.

Definition at line 1375 of file nodeliveeffect.cpp.

01376 {
01377     DocRect NewRect = DocRect(0,0,0,0);
01378 
01379 #if !defined(EXCLUDE_FROM_RALPH)
01380     // Find the Blob manager
01381     BlobManager* pBlobMgr = GetApplication()->GetBlobManager();
01382     if (pBlobMgr!= NULL)
01383     {
01384 //      BlobStyle VisibleBlobs = pBlobMgr->GetCurrentInterest();
01385 //      if (VisibleBlobs.Object)
01386 //      {
01387             DocRect BoundingRect = GetBoundingRect();
01388 
01389             // Object blobs are visible, so include blob in each
01390             // corner of the group bounds
01391             DocRect BlobSize;
01392 
01393             // Find out where the blobs will be drawn
01394             DocCoord Low  = BoundingRect.LowCorner();
01395             DocCoord High = BoundingRect.HighCorner();
01396 
01397             // Include the object blob in each corner
01398             pBlobMgr->GetBlobRect(Low, &BlobSize);
01399             NewRect = NewRect.Union(BlobSize);
01400             pBlobMgr->GetBlobRect(High, &BlobSize);
01401             NewRect = NewRect.Union(BlobSize);
01402             pBlobMgr->GetBlobRect(DocCoord(Low.x, High.y), &BlobSize);
01403             NewRect = NewRect.Union(BlobSize);
01404             pBlobMgr->GetBlobRect(DocCoord(High.x, Low.y), &BlobSize);
01405             NewRect = NewRect.Union(BlobSize);
01406 //      }
01407     }
01408 
01409     Node* pNode=FindFirstChild();
01410     while (pNode!=NULL)
01411     {
01412         if (pNode->IsBounded())
01413             NewRect = NewRect.Union(((NodeRenderableBounded*)pNode)->GetBlobBoundingRect());
01414         pNode = pNode->FindNext();
01415     }
01416 
01417     IncludeChildrensBoundingRects(&NewRect);
01418 #endif
01419     return NewRect;
01420 }

BOOL NodeBitmapEffect::GetChildDirectBitmap RenderRegion pRender,
LPBITMAPINFO plpInfo = NULL,
LPBYTE plpBits = NULL,
DocRect pRect = NULL,
Matrix pMat = NULL,
double *  pdRes = NULL
[virtual]
 

Author:
Phil_Martin (Xara Group Ltd) <camelotdev@xara.com>
Date:
26/07/2005
Parameters:
- [INPUTS]
lpInfo - reference to LPBITMAPINFO pointer to be written to for bitmap info [OUTPUTS] lpBits - reference to LPBYTE pointer to be written to for bitmap data

Definition at line 606 of file nodeliveeffect.cpp.

00613 {
00614     NodeRenderableInk* pInkNode = GetInkNodeFromController();
00615     if (pInkNode==NULL)
00616         return FALSE;
00617 
00618     // This is the point to choke off all DirectBitmap handling if required
00619     // by returning FALSE;
00620 
00621 // TEMP BODGE! DO NOT RELEASE!
00622 //return FALSE;
00623     if (!EnableDirectCapture())
00624         return FALSE;
00625 
00626     return pInkNode->GetDirectBitmap(pRender, plpInfo, plpBits, pRect, pMat, pdRes);
00627 }

BOOL NodeBitmapEffect::GetDirectBitmap RenderRegion pRender,
LPBITMAPINFO plpInfo,
LPBYTE plpBits,
DocRect pRect,
Matrix pMat,
double *  pdRes
[virtual]
 

Return details of direct bitmap to caller (caller is usually a NodeBitmapEffect).

Author:
Phil_Martin (Xara Group Ltd) <camelotdev@xara.com>
Date:
28/07/2005
Parameters:
pMat - pointer to matrix awaiting update [INPUTS]
plpInfo - LPBITMAPINFO pointer describing bitmap [OUTPUTS] plpBits - LPBYTE pointer to bitmap data pRect - rect of Original bitmap data pMat - matrix describing transform from pRect to this instance on the page pdRes - resolution of this bitmap (dpi)
Returns:
TRUE if this node can supply direct bitmap data to the caller FALSE otherwise

Reimplemented from NodeRenderableInk.

Definition at line 650 of file nodeliveeffect.cpp.

00651 {
00652     DocRect rectDirect;
00653     Matrix matLocalTransform;
00654     double dResolution = 0;
00655 
00656     // We don't change our child's instance transformation or resolution
00657     // So just get them directly from the child
00658     BOOL bChildDirect = GetChildDirectBitmap(pRender, NULL, NULL, NULL, &matLocalTransform, &dResolution);
00659     if (pMat)   *pMat = matLocalTransform;
00660     if (pdRes)  *pdRes = dResolution;
00661 
00662     // Initial response is to simply get the cached results of our processing
00663     // (See also HasCachedDirectBitmap())
00664     GetProcessedBitmap(bChildDirect && !matLocalTransform.IsIdentity(), plpInfo, plpBits, &rectDirect); // Rect is in DirectBitmap domain
00665     if (pRect)  *pRect = rectDirect;
00666 
00667     // We should return our native res if our child didn't supply one
00668     // So that callers can check whether they have the same res and optionally make a direct connection
00669     // to our bitmap.
00670     if (!bChildDirect && pdRes)
00671                 *pdRes = GetPixelsPerInch();
00672 
00673     // If we have effect attrs applied then we must make a subtree bitmap to capture them
00674     if (plpInfo && plpBits && HasEffectAttrs())
00675     {
00676         AttrFillGeometry* pTranspAttr = NULL;
00677         double dPixelWidth = GetPixelWidth();
00678 
00679         // Lookup processed bitmap in cache 
00680         CBitmapCache* pBitmapCache = Camelot.GetBitmapCache();
00681         if (pBitmapCache==NULL)
00682             return FALSE;
00683 
00684         CBitmapCacheKey inky2(this, dPixelWidth, 2);            // Option 2 is processed/rendered bitmap (see below)
00685         CCachedBitmap cbmp2;
00686         BOOL bFound = pBitmapCache->Lookup(inky2, cbmp2);
00687         if (bFound)
00688         {
00689             if (plpInfo)    *plpInfo = cbmp2.pbmpInfo;
00690             if (plpBits)    *plpBits = cbmp2.pbmpBits;
00691             return TRUE;
00692         }
00693 
00694         // TODO: Implement NodeFeatherEffect::GetDirectBitmap
00695         ERROR2IF(IsFeatherEffect(), FALSE, "TODO! Give NodeFeatherEffect its own implementation of GetDirectBitmap!");
00696 
00697         // We need to create a new bitmap here that captures the effects of the attributes
00698         //
00699         // If we don't have a RenderRegion, we can't build it, so return NULLs to indicate
00700         // that we need to be called again with a RenderRegion (allows quick test)
00701         // (See EnsureLiveEffectOriginalBitmaps)
00702         if (pRender == NULL)
00703         {
00704             if (plpInfo)    *plpInfo    = NULL;
00705             if (plpBits)    *plpBits    = NULL;
00706             return TRUE;
00707         }
00708 
00709         // We must "render" this bitmap to capture the attributes that effect its appearance
00710         // By default, we can't do arbitrarily transformed bitmaps - use a bitmap fill.
00711 //      CBitmapCacheKey inky(this, dPixelWidth, 1);             // Option 1 is processed bitmap not including rendering
00712 //      CCachedBitmap cbmp;
00713 //      BOOL bFoundCached = pBitmapCache->Lookup(inky, cbmp);
00714 //      ERROR3IF(!bFoundCached, "Effect:GetDirectBitmap failed to find processed bitmap!");
00715 //      LPBITMAPINFO lpInfo = cbmp.pbmpInfo;
00716 //      LPBYTE lpBits = cbmp.pbmpBits;
00717 
00718         // In the bitmap domain, we need to upright version of the bitmap, not the 
00719         // transformed parallelogram and bounds stored with the cbmp, the processed bitmap
00720 //      DocRect CaptureRect(0, 0, lpInfo->bmiHeader.biWidth*dPixelWidth, lpInfo->bmiHeader.biHeight*dPixelWidth);
00721 
00722         ERROR3IF(*plpInfo==NULL || *plpBits==NULL, "How come we got here with no processed bitmap?");
00723         DocRect CaptureRect = rectDirect;
00724 
00725         CaptureFlags caFlags = CaptureFlags(cfLOCKEDTRANSPARENT | cfFULLCOVERAGE);
00726         pRender->StartCapture(this, CaptureRect, CAPTUREINFO(ctNESTABLE, caFlags), TRUE, FALSE, dResolution);
00727         pRender->SaveContext();
00728 
00729         {   // ------------------------------------------------------
00730             // Setup coords for rendering in DirectBitmap domain
00731             DocCoord coords[3];
00732             coords[0] = CaptureRect.lo;
00733             coords[1] = DocCoord(CaptureRect.hi.x, CaptureRect.lo.y);
00734             coords[2] = DocCoord(CaptureRect.lo.x, CaptureRect.hi.y);
00735 
00736             // NOTE! We can only deal with effect transparency at the moment!
00737             // Render the transparency geometry using inverse Direct-Screen transform
00738             // (This bitmap is being rendered in "Direct space" whereas the transparency attribute
00739             // was applied in "Screen space")
00740             NodeAttribute* pAttr;
00741             if (FindAppliedAttribute(CC_RUNTIME_CLASS(AttrTranspFillGeometry), &pAttr))
00742             {
00743                 if (pAttr &&
00744                     !pAttr->IsADefaultAttr() &&
00745                     !pAttr->HasEquivalentDefaultValue(TRUE) &&
00746                     pAttr->IsEffectAttribute())
00747                 {
00748                     pTranspAttr = (AttrFillGeometry*) ((AttrFillGeometry*)pAttr)->SimpleCopy();
00749                     DocCoord tcoords[4];
00750                     DocCoord* pCoord = NULL;
00751                     pCoord = pTranspAttr->GetStartPoint();
00752                     tcoords[0] = pCoord ? *pCoord : DocCoord(0,0);
00753                     pCoord = pTranspAttr->GetEndPoint();
00754                     tcoords[1] = pCoord ? *pCoord : DocCoord(0,0);
00755                     pCoord = pTranspAttr->GetEndPoint2();
00756                     tcoords[2] = pCoord ? *pCoord : DocCoord(0,0);
00757                     pCoord = pTranspAttr->GetEndPoint3();
00758                     tcoords[3] = pCoord ? *pCoord : DocCoord(0,0);
00759 
00760                     Matrix matInverse = matLocalTransform.Inverse();
00761                     matInverse.transform(tcoords, 4);
00762 
00763                     pTranspAttr->SetStartPoint(&tcoords[0]);
00764                     pTranspAttr->SetEndPoint(&tcoords[1]);
00765                     pTranspAttr->SetEndPoint2(&tcoords[2]);
00766                     pTranspAttr->SetEndPoint3(&tcoords[3]);
00767 
00768                     pTranspAttr->Render(pRender);
00769                 }
00770             }
00771 
00772             pRender->RenderBits(*plpInfo, *plpBits, coords, 3, FALSE, NULL);
00773         }   // ------------------------------------------------------
00774 
00775         pRender->RestoreContext();
00776         if (pTranspAttr)
00777         {
00778             delete pTranspAttr;
00779             pTranspAttr = NULL;
00780         }
00781 
00782         LPBITMAPINFO lpInfo = NULL;
00783         LPBYTE lpBits = NULL;
00784         pRender->StopCapture(this, FALSE, FALSE, &lpInfo, &lpBits, &CaptureRect);
00785 
00786         // We should now have a bitmap containing an upright version of the NodeBitmap
00787         // with transparency and contoning applied as per the attributes in the tree
00788         if (lpInfo && lpBits)
00789         {
00790             *plpInfo = lpInfo;
00791             *plpBits = lpBits;
00792 
00793             // Cache the PROCESSED/RENDERED bitmap as Option 2
00794             cbmp2.pbmpBits = lpBits;
00795             cbmp2.pbmpInfo = lpInfo;
00796             cbmp2.SetCachedRect(CaptureRect);
00797             cbmp2.nPriority = CACHEPRIORITY_TEMPBITMAP_HIGH;
00798             if (cbmp2.IsValid())
00799                 pBitmapCache->StoreBitmap(inky2, cbmp2);
00800         }
00801     }
00802 
00803     return TRUE;
00804 }

virtual String_64& NodeBitmapEffect::GetDisplayName  )  [inline, virtual]
 

Definition at line 240 of file nodeliveeffect.h.

00240 {return m_strDisplayName;}

IXMLDOMDocumentPtr NodeBitmapEffect::GetEditList  )  [virtual]
 

Author:
Phil_Martin (Xara Group Ltd) <camelotdev@xara.com>
Date:
10/09/2004
Parameters:
- [INPUTS]
- [OUTPUTS]

Definition at line 982 of file nodeliveeffect.cpp.

00983 {
00984     return m_pEditsDoc;
00985 }

virtual NodeRenderableInk* NodeBitmapEffect::GetInkNodeFromController  )  const [inline, virtual]
 

If we had a Controller node inherited class from NodeGroup then this function really belongs there. But we don't, so this function only returns anything if your node also returns TRUE to IsAController(). If so it will return the node that is shadowed, bevelled or contoured.

Author:
Diccon_Yamanaka (Xara Group Ltd) <camelotdev@xara.com>
Date:
16/10/2000
Parameters:
- [INPUTS]
- [OUTPUTS]
Returns:
The ink node that is used by bevels, shadows and contours
See also:

Reimplemented from NodeCompound.

Reimplemented in NodeLockedEffect.

Definition at line 198 of file nodeliveeffect.h.

00198 {return FindFirstChildInk();}

virtual KernelBitmap* NodeBitmapEffect::GetKernelBitmap DocCoord pCoords,
BOOL  bRetainCached = FALSE
[inline, virtual]
 

Reimplemented in NodeLiveEffect, and NodeLockedEffect.

Definition at line 242 of file nodeliveeffect.h.

00242 {return NULL;}

BOOL NodeBitmapEffect::GetOriginalBitmap LPBITMAPINFO plpInfo,
LPBYTE plpBits,
DocRect pRect
[virtual]
 

To get the required/stored pixel width of this node -.

Author:
Phil_Martin (Xara Group Ltd) <camelotdev@xara.com>
Date:
10/09/2004
Parameters:
- [INPUTS]
lpInfo - reference to LPBITMAPINFO pointer to be written to for bitmap info [OUTPUTS] lpBits - reference to LPBYTE pointer to be written to for bitmap data

Definition at line 495 of file nodeliveeffect.cpp.

00496 {
00497     // ---------------------------------------------------------
00498     // New!
00499     // Discover whether our child can supply a DirectBitmap for
00500     // us to use as the original for processing...
00501     //
00502     LPBITMAPINFO lpLocalInfo = NULL;
00503     LPBYTE lpLocalBits = NULL;
00504     DocRect rectLocal;
00505     BOOL bFound = GetChildDirectBitmap(NULL, &lpLocalInfo, &lpLocalBits, &rectLocal);
00506     if (bFound)
00507     {
00508         if (plpInfo)    *plpInfo = lpLocalInfo;
00509         if (plpBits)    *plpBits = lpLocalBits;
00510         if (pRect)      *pRect = rectLocal;
00511         return (lpLocalInfo!=NULL && lpLocalBits!=NULL);        // Only return TRUE if we got good bitmap data
00512     }
00513     // ---------------------------------------------------------
00514 
00515     CBitmapCache* pBitmapCache = Camelot.GetBitmapCache();
00516     if (pBitmapCache)
00517     {
00518         // Look for a cached bitmap at the appropriate pixel size...
00519         CBitmapCacheKey inky(this, GetPixelWidth());                    // Get cached BMP for this node at our dpi
00520         CCachedBitmap cbmp;
00521         BOOL bFound = pBitmapCache->Lookup(inky, cbmp);
00522         if (bFound)
00523         {
00524             if (plpInfo)    *plpInfo = cbmp.pbmpInfo;
00525             if (plpBits)    *plpBits = cbmp.pbmpBits;
00526             if (pRect)      *pRect = cbmp.GetCachedRect();
00527             return TRUE;
00528         }
00529     }
00530 
00531     if (plpInfo)    *plpInfo = NULL;
00532     if (plpBits)    *plpBits = NULL;
00533 
00534     return FALSE;
00535 }

double NodeBitmapEffect::GetPixelsPerInch  )  [virtual]
 

To get the required/stored pixel res of this node.

Author:
Phil_Martin (Xara Group Ltd) <camelotdev@xara.com>
Date:
09/09/2004
Parameters:
- [INPUTS]
Pixel resolution for this live effect bitmap in pixels per inch (double) [OUTPUTS]
Returns:
Description of the group node

Errors: -

See also:
-

Definition at line 385 of file nodeliveeffect.cpp.

00386 {
00387     double dPPI = 0.0;
00388 
00389     if (m_dPixelsPerInch==0)
00390     {
00391         // 0 means automatic
00392         // Automatic means get resolution in context
00393         // Context means either:
00394         //  * Respond to a direct bitmap below us
00395         //  * or respond to a fixed resolution above us in the tree
00396         //  * or get resolution from current view
00397         BOOL bDirectResolution = GetChildDirectBitmap(NULL, NULL, NULL, NULL, NULL, &dPPI);
00398         if (bDirectResolution && dPPI!=0)
00399             return dPPI;
00400 
00401         Node* pParent = this->FindParent();
00402 //      while (pParent && (pParent->IsBitmapEffect() || pParent->IsNodeHidden()))
00403         while (pParent && !pParent->IsLayer())
00404         {
00405             if (pParent->IsBitmapEffect())
00406             {
00407                 dPPI = ((NodeBitmapEffect*)pParent)->GetPixelsPerInchValue();
00408                 if (dPPI!=0)
00409                     break;
00410             }
00411 
00412             pParent = pParent->FindParent();
00413         }
00414 
00415         if (dPPI==0)
00416         {
00417             // See also OpEffectLock::DoEffectNodeOp
00418             View* pView = View::GetCurrent();
00419             if (pView) dPPI = 72000.0 / pView->GetPixelWidth().MakeDouble();
00420         }
00421     }
00422 
00423     if (dPPI==0)
00424         dPPI = m_dPixelsPerInch;
00425 
00426     if (dPPI==0)
00427     {
00428         // Shouldn't ever reach this clause but just in case...
00429         ERROR3("GetPixelsPerInch can't get sensible PPI so defaulting to 96");
00430         dPPI = 96.0;
00431     }
00432 
00433     return dPPI;
00434 };

virtual double NodeBitmapEffect::GetPixelsPerInchValue  )  const [inline, virtual]
 

Definition at line 244 of file nodeliveeffect.h.

00244 {return m_dPixelsPerInch;}

virtual double NodeBitmapEffect::GetPixelWidth  )  [inline, protected, virtual]
 

Definition at line 260 of file nodeliveeffect.h.

00260 {return 72000.0 / GetPixelsPerInch();}

virtual BOOL NodeBitmapEffect::GetProcessedBitmap BOOL  bDirect,
LPBITMAPINFO plpInfo,
LPBYTE plpBits,
DocRect pRect
[inline, virtual]
 

Reimplemented in NodeLiveEffect, and NodeLockedEffect.

Definition at line 213 of file nodeliveeffect.h.

00213 {return FALSE;}

virtual BOOL NodeBitmapEffect::GetQuickRender  )  [inline, protected, virtual]
 

Reimplemented in NodeFeatherEffect.

Definition at line 264 of file nodeliveeffect.h.

00264 {return Operation::GetQuickRender(this);}

BOOL NodeBitmapEffect::HasCachedDirectBitmap  )  [virtual]
 

Author:
Phil_Martin (Xara Group Ltd) <camelotdev@xara.com>
Date:
29/07/2005
Parameters:
- [INPUTS]
- [OUTPUTS]
Returns:
-

Reimplemented from NodeRenderableBounded.

Definition at line 878 of file nodeliveeffect.cpp.

00879 {
00880     Matrix matTrans;
00881     BOOL bDirect = GetChildDirectBitmap(NULL, NULL, NULL, NULL, &matTrans, NULL);
00882     return (bDirect && !matTrans.IsIdentity());         // ??? Non-ident used to indicate that a direct bitmap was found under the effect...
00883 }

virtual BOOL NodeBitmapEffect::HasChanged  )  const [inline, virtual]
 

Definition at line 228 of file nodeliveeffect.h.

00228 {return m_bHasChangedRecently;}

BOOL NodeBitmapEffect::Init void   )  [static]
 

Initialise the NodeBitmapEffect class.

Author:
Phil_Martin (Xara Group Ltd) <camelotdev@xara.com>
Date:
08/09/2004
Parameters:
- [INPUTS]

Reimplemented from NodeRenderableInk.

Definition at line 249 of file nodeliveeffect.cpp.

00250 {
00251     if (Camelot.DeclareSection( _T("Effects"), 10))
00252     {
00253         Camelot.DeclarePref(NULL, _T("DefaultLivePixelsPerInch"), (INT32*)&DefaultLivePixelsPerInch, 0, 72000);
00254         Camelot.DeclarePref(NULL, _T("DefaultLockedPixelsPerInch"), (INT32*)&DefaultLockedPixelsPerInch, 1, 72000);
00255         Camelot.DeclarePref(NULL, _T("DefaultLocked"), (INT32*)&DefaultLocked, FALSE, TRUE);
00256         Camelot.DeclarePref(NULL, _T("GroupPixelsPerInch"), (INT32*)&GroupPixelsPerInch, 0, 72000);
00257         Camelot.DeclarePref(NULL, _T("ShadowPixelsPerInch"), (INT32*)&ShadowPixelsPerInch, 0, 72000);
00258     }
00259 
00260     return TRUE;
00261 }

virtual BOOL NodeBitmapEffect::IsBitmapEffect  )  const [inline, virtual]
 

Reimplemented from Node.

Definition at line 196 of file nodeliveeffect.h.

00196 {return TRUE;}

virtual BOOL NodeBitmapEffect::IsLockedEffect  )  [inline, virtual]
 

Reimplemented from NodeEffect.

Reimplemented in NodeLiveEffect, and NodeLockedEffect.

Definition at line 227 of file nodeliveeffect.h.

00227 {return FALSE;}

BOOL NodeBitmapEffect::ProcessBitmap RenderRegion pRender,
CBitmapCache pBitmapCache,
LPBITMAPINFO  pBMPInfo,
LPBYTE  pBMPBits,
DocRect  BMPRect,
LPBITMAPINFO pOutputInfo,
LPBYTE pOutputBits,
double *  pXOffset,
double *  pYOffset
[virtual]
 

Processes the bitmap produced by the children of this node. Can be overridden by derived classes to perofrm special processing.

Author:
Phil_Martin (Xara Group Ltd) <camelotdev@xara.com>
Date:
24/11/2004
Returns:

Reimplemented in NodeFeatherEffect.

Definition at line 1324 of file nodeliveeffect.cpp.

01333 {
01334     BOOL                bOK = TRUE;
01335 
01336     PORTNOTETRACE("other","NodeBitmapEffect::ProcessBitmap - do nothing, CXMLUtils, XPEEditOp");
01337 #ifndef EXCLUDE_FROM_XARALX
01338     // Apply the effect to the newly captured bitmap
01339     BOOL bValidEditList = TRUE;
01340     if (m_pEditsDoc==NULL)
01341     {
01342         HRESULT hr = E_FAIL;
01343         m_pEditsDoc = CXMLUtils::NewDocument();
01344         bValidEditList = FALSE;
01345         ERROR3IF(m_pEditsDoc==NULL, "Can't make default edit document");
01346     }
01347 
01348     if (bValidEditList)
01349     {
01350 //TRACEUSER( "Phil", _T("NodeLiveEffect calling ProcessBitmap %x %s\n"), this, this->GetRuntimeClass()->m_lpszClassName);
01351         INT32 iXOffset = (INT32)*pXOffset;
01352         INT32 iYOffset = (INT32)*pYOffset;
01353         bOK = XPEEditOp::ProcessBitmap(pBMPInfo, pBMPBits, pOutputInfo, pOutputBits, m_pEditsDoc, &iXOffset, &iYOffset);
01354         *pXOffset = iXOffset;
01355         *pYOffset = iYOffset;
01356 //TRACEUSER( "Phil", _T("NodeLiveEffect back from ProcessBitmap\n"));
01357     } 
01358 #endif
01359     return bOK;
01360 }

void NodeBitmapEffect::Render RenderRegion pRender  )  [virtual]
 

Will render the liveeffect iff we have it cached - for hit detection reasons.

Author:
Phil_Martin (Xara Group Ltd) <camelotdev@xara.com>
Date:
13/12/2004
Parameters:
Pointer to a render region [INPUTS]

Reimplemented from Node.

Reimplemented in NodeLockedEffect.

Definition at line 1221 of file nodeliveeffect.cpp.

01222 {
01223     CBitmapCache* pBitmapCache = Camelot.GetBitmapCache();
01224     if (pBitmapCache!=NULL && pRender->IsHitDetect() && pRender->RRQuality.GetFillQuality() > Quality::Solid)
01225     {
01226         RenderCachedEffect(pBitmapCache, pRender, TRUE);
01227     }
01228 }

void NodeBitmapEffect::RenderAfterSubtree RenderRegion pRender  )  [virtual]
 

Capture the group as a cached bitmap.

Author:
Phil_Martin (Xara Group Ltd) <camelotdev@xara.com>
Date:
07/09/2004
Parameters:
pRender - The region to render into [INPUTS]

Reimplemented from NodeEffect.

Definition at line 1051 of file nodeliveeffect.cpp.

01052 {
01053     Matrix matTrans;
01054     double dResolution = 0;
01055 
01056     CBitmapCache* pBitmapCache = Camelot.GetBitmapCache();
01057     if (pBitmapCache==NULL)
01058     {
01059         return;
01060     }
01061 
01062     // --------------------------------------------------------------------------------------
01063     // Note that we use the Capture system to store the state of rendering
01064     // in this node in the scope of the rendering system rather than storing
01065     // it temporarilly in the document tree (e.g. in this node). This means
01066     // the tree is stateless and can be rendered by several different "threads"
01067     // with different states at the same time.
01068     // In this context a "thread" is a background, rendering RenderRegion but
01069     // it could be a real thread one day.
01070     //
01071     Capture* pCapture = pRender->GetTopCapture();
01072     if (pCapture==NULL)                                         // If nothing was captured
01073         return;                                                 // Then do nothing
01074 
01075     // Only stop the capture if we started it
01076     // (means we only capture whole subtrees at the mo.)
01077     if (pCapture->GetOwner()==this)
01078     {
01079         // End this capture:
01080         // Blit capture to screen
01081         // Retain bitmap because we will release it ourselves only if we fail to cache it
01082         BOOL bCached = FALSE;
01083         BOOL bCaptureIsDirect = pCapture->IsDirect();
01084         LPBITMAPINFO lpInfo = NULL;
01085         LPBYTE lpBits = NULL;
01086         DocRect CaptureRect = GetChildBoundingRect();               // Set maximum size we allow
01087         CaptureRect.Inflate(CAPTURE_BORDER*(INT32)GetPixelWidth());
01088         pRender->StopCapture(this, FALSE, FALSE, &lpInfo, &lpBits, &CaptureRect, &matTrans, &dResolution);
01089                                                                     // pCapture is deleted now...
01090 
01091         // Is this capture direct?
01092         if (bCaptureIsDirect)
01093         {
01094             ERROR3IF(dResolution==0, "Direct Capture returned 0 pixels per inch\n");
01095             // If we are supplied with a direct bitmap, try to process it and cache
01096             // the results.
01097             // 
01098             // Note that CaptureRect is in DirectBitmap space, not drawing space
01099             // and that matTransform holds the matrix to map from DirectBitmap space
01100             // to drawing space...
01101             //
01102             if (lpInfo && lpBits && CaptureRect.IsValid())
01103             {
01104                 // Process the bitmap using appropriate virtual functions from derived class
01105                 LPBITMAPINFO lpProcessedInfo = NULL;
01106                 LPBYTE lpProcessedBits = NULL;
01107                 double xOffset = 0;
01108                 double yOffset = 0;
01109                 ProcessBitmap(pRender, pBitmapCache, lpInfo, lpBits, CaptureRect, lpProcessedInfo, lpProcessedBits, &xOffset, &yOffset);
01110 
01111                 if (lpProcessedInfo && lpProcessedBits)
01112                 {
01113                     // Cache the PROCESSED bitmap, as Option 1
01114                     //
01115                     // Note that SetProcessedBitmap stores the bitmap with coords transformed into Drawing space
01116                     // So that rendering into drawing space will be quick and simple
01117                     // The rectangle in DirectBitmap space is stored in a member variable m_rectDirectBitmap
01118                     SetProcessedBitmap(lpProcessedInfo, lpProcessedBits, CaptureRect, lpProcessedInfo->bmiHeader.biWidth, lpProcessedInfo->bmiHeader.biHeight, xOffset, yOffset, 72000.0/dResolution, &matTrans);
01119 
01120                     // Note RenderCachedEffect only does anything if the current capture
01121                     // doesn't consume this bitmap directly
01122                     RenderCachedEffect(pBitmapCache, pRender);
01123                 }
01124             }
01125         }
01126         else
01127         {
01128             // If the capture gave us back a bitmap, try to cache it
01129             if (lpInfo && lpBits && CaptureRect.IsValid())
01130             {
01131                 // Cache the ORIGINAL bitmap as Option 0
01132                 // See also, SetOriginalBitmap
01133                 double PixelWidth = GetPixelWidth();
01134                 CBitmapCacheKey inky(this, PixelWidth, 0);
01135 
01136                 CCachedBitmap cbmp;
01137 
01138                 cbmp.pbmpBits = lpBits;
01139                 cbmp.pbmpInfo = lpInfo;
01140                 cbmp.SetCachedRect(CaptureRect);
01141                 cbmp.nPriority = CACHEPRIORITY_TEMPBITMAP_HIGH;
01142 
01143                 if (cbmp.IsValid())
01144                 {
01145                     pBitmapCache->StoreBitmap(inky, cbmp);
01146                     bCached = TRUE;
01147                 }
01148 
01149                 // Process the bitmap using appropriate virtual processor for derived class
01150                 LPBITMAPINFO lpProcessedInfo = NULL;
01151                 LPBYTE lpProcessedBits = NULL;
01152                 double xOffset = 0;
01153                 double yOffset = 0;
01154 
01155                 //BOOL bOK =
01156                 ProcessBitmap(pRender, pBitmapCache, lpInfo, lpBits, CaptureRect, lpProcessedInfo, lpProcessedBits, &xOffset, &yOffset);
01157 //              ERROR3IF(!bOK, "NodeBitmapEffect::RenderAfterSubtree ProcessBitmap failed\n");
01158 
01159                 if (lpProcessedInfo && lpProcessedBits)
01160                 {
01161                     // Cache the PROCESSED bitmap as well, as Option 1
01162                     CaptureRect = SetProcessedBitmap(lpProcessedInfo, lpProcessedBits, CaptureRect, lpProcessedInfo->bmiHeader.biWidth, lpProcessedInfo->bmiHeader.biHeight, xOffset, yOffset);
01163 
01164                     // Render it
01165                     RenderCachedEffect(pBitmapCache, pRender);
01166 
01167                     // If we are rendering during printing, there may be multiple passes
01168                     // through the tree to do different aspects of printing. The
01169                     // PrintingMaskedRenderRegion produces a monochrome mask so we
01170                     // definitely don't want to cache that!
01171                     if (pRender->IsKindOf(CC_RUNTIME_CLASS(PrintingMaskedRenderRegion)))
01172                     {
01173                         double PixelWidth = GetPixelWidth();
01174                         CBitmapCacheKey inky(this, PixelWidth, 0);
01175                         pBitmapCache->RemoveBitmap(inky);
01176 
01177                         CBitmapCacheKey inky2(this, PixelWidth, 1);
01178                         pBitmapCache->RemoveBitmap(inky2);
01179 
01180                         bCached = FALSE;
01181                     }
01182 
01183                     // If we failed to cache the captured bitmap then release it
01184                     if (lpProcessedInfo!=NULL && lpProcessedBits!=NULL && !bCached)
01185                     {
01186                         FreeDIB(lpProcessedInfo, lpProcessedBits, NULL, FALSE);
01187                     }
01188                 }
01189                 else
01190                 {
01191                     // If we failed to process the captured bitmap for some reason
01192                     // Then just plot it back to the screen so the user sees something
01193 //                  ERROR3("NodeBitmapEffect::RenderAfterSubtree ProcessBitmap failed\n");
01194                     pRender->RenderBits(lpInfo, lpBits, CaptureRect);
01195                 }
01196             }
01197 
01198             // If we failed to cache the captured bitmap then release it
01199             if (lpInfo!=NULL && lpBits!=NULL && !bCached)
01200             {
01201                 FreeDIB(lpInfo, lpBits, NULL, FALSE);
01202             }
01203         }
01204     }
01205 }

BOOL NodeBitmapEffect::RenderCachedEffect CBitmapCache pBitmapCache,
RenderRegion pRender,
BOOL  bIgnoreCapture = FALSE
[protected, virtual]
 

Render the cached version of this node.

Author:
Phil_Martin (Xara Group Ltd) <camelotdev@xara.com>
Date:
24/11/2004
Parameters:
- [INPUTS]
- [OUTPUTS]
Returns:
TRUE if the cached effect was rendered or passed on to a consumer capture FALSE if the cached effect was not present or could not be consumed or rendered

Reimplemented in NodeLockedEffect, and NodeFeatherEffect.

Definition at line 1273 of file nodeliveeffect.cpp.

01274 {
01275     BOOL bRendered = FALSE;
01276 
01277     CBitmapCacheKey inky(this, GetPixelWidth(), 1);                     // Get cached BMP for this PROCESSED node at our dpi
01278     CCachedBitmap cbmp;
01279     BOOL bFoundCached = pBitmapCache->Lookup(inky, cbmp);
01280 
01281     if (bFoundCached)
01282     {
01283         // No need to render if we are going to supply to a capture
01284         Capture* pCapture = pRender->GetTopCapture();
01285         if (!bIgnoreCapture && pCapture && pCapture->ConsumeDirectBitmap(this))
01286         {
01287             // Tell the caller that the effect has been "rendered"
01288             bRendered = TRUE;
01289         }
01290         else
01291         {
01292             // Allow RenderBits to render any effect attributes that are attached to us
01293             // before rendering the bitmap so that they affect its appearance
01294             // by passing it a pointer to this node to search for effect attributes
01295             bRendered = pRender->RenderBits(cbmp.pbmpInfo, cbmp.pbmpBits, &cbmp.coord0, 3, TRUE, this);
01296         }
01297     } 
01298 
01299     return bRendered;
01300 }

BOOL NodeBitmapEffect::RenderDirectBitmapState RenderRegion pRender  )  [virtual]
 

Render the current state into the renderregion if we haven't yet done so. Only used in background rendering timeslice screen update.

Author:
Phil_Martin (Xara Group Ltd) <camelotdev@xara.com>
Date:
30/07/2005
Parameters:
- [INPUTS]
- [OUTPUTS]
Returns:
-

Reimplemented from NodeRenderableInk.

Definition at line 851 of file nodeliveeffect.cpp.

00852 {
00853     CBitmapCache* pBitmapCache = Camelot.GetBitmapCache();
00854     if (pBitmapCache!=NULL && pRender->RRQuality.GetFillQuality() > Quality::Solid)
00855     {
00856         RenderCachedEffect(pBitmapCache, pRender, TRUE);
00857     }
00858 
00859     return TRUE;
00860 }

virtual BOOL NodeBitmapEffect::SetChanged BOOL  bNewFlag = TRUE  )  [inline, virtual]
 

Definition at line 229 of file nodeliveeffect.h.

00229 {m_bHasChangedRecently = bNewFlag; return TRUE;}

BOOL NodeBitmapEffect::SetDefaultEditList  )  [virtual]
 

Author:
Phil_Martin (Xara Group Ltd) <camelotdev@xara.com>
Date:
27/07/2005
Parameters:
- [INPUTS]
- [OUTPUTS]

Definition at line 1022 of file nodeliveeffect.cpp.

01023 {
01024     PORTNOTETRACE("other","NodeBitmapEffect::SetDefaultEditList - do nothing");
01025 #ifndef EXCLUDE_FROM_XARALX
01026     // Ensure that we have an edit list
01027     if (m_pEditsDoc==NULL)
01028     {
01029         m_pEditsDoc = CXMLUtils::NewDocument();
01030         ERROR3IF(m_pEditsDoc==NULL, "Can't make default edit document");
01031         return (m_pEditsDoc!=NULL);
01032     }
01033 #endif
01034     return TRUE;
01035 }

virtual void NodeBitmapEffect::SetDisplayName String_64 strDisplayName  )  [inline, virtual]
 

Definition at line 241 of file nodeliveeffect.h.

00241 {m_strDisplayName = strDisplayName;}

void NodeBitmapEffect::SetEditList IXMLDOMDocumentPtr  pNewEditsDoc  )  [virtual]
 

Author:
Phil_Martin (Xara Group Ltd) <camelotdev@xara.com>
Date:
14/09/2004
Parameters:
- [INPUTS]
- [OUTPUTS]

Definition at line 1002 of file nodeliveeffect.cpp.

01003 {
01004     m_pEditsDoc = pNewEditsDoc;
01005 }

void NodeBitmapEffect::SetOriginalBitmap LPBITMAPINFO  lpInfo,
LPBYTE  lpBits,
DocRect  rect
[virtual]
 

Author:
Phil_Martin (Xara Group Ltd) <camelotdev@xara.com>
Date:
13/09/2004
Parameters:
- [INPUTS]
lpInfo - reference to LPBITMAPINFO pointer for bitmap info [OUTPUTS] lpBits - reference to LPBYTE pointer for bitmap data

Definition at line 553 of file nodeliveeffect.cpp.

00554 {
00555     CBitmapCache* pBitmapCache = Camelot.GetBitmapCache();
00556     if (pBitmapCache==NULL)
00557         return;
00558 
00559     if (rect.IsEmpty())
00560     {
00561         rect = GetChildBoundingRect();
00562         rect.Inflate(CAPTURE_BORDER*(INT32)GetPixelWidth());
00563     }
00564 
00565     CBitmapCacheKey inky(this, GetPixelWidth());                        // Get cached BMP for this node at our dpi
00566 
00567     // Deallocate any cached DIB here
00568     CCachedBitmap cbmp;
00569     BOOL bFound = pBitmapCache->Lookup(inky, cbmp);
00570     if (bFound)
00571     {
00572         pBitmapCache->RemoveBitmap(inky);
00573         cbmp.Release();
00574     }
00575 
00576     if (lpInfo && lpBits)
00577     {
00578         cbmp.pbmpInfo = lpInfo;
00579         cbmp.pbmpBits = lpBits;
00580         cbmp.SetCachedRect(rect);
00581         cbmp.nPriority = CACHEPRIORITY_TEMPBITMAP_HIGH;
00582 
00583         pBitmapCache->StoreBitmap(inky, cbmp);
00584     }
00585 }

void NodeBitmapEffect::SetPixelsPerInch double  dPixelsPerInch  )  [virtual]
 

To get the required/stored pixel res of this node.

Author:
Phil_Martin (Xara Group Ltd) <camelotdev@xara.com>
Date:
09/09/2004
Parameters:
- [INPUTS]
Pixel resolution for this live effect bitmap in pixels per inch (double) [OUTPUTS] Retuns: Description of the group node
Returns:
Errors: -
See also:
-

Definition at line 454 of file nodeliveeffect.cpp.

00455 {
00456     m_dPixelsPerInch = dPixelsPerInch;
00457 };

virtual DocRect NodeBitmapEffect::SetProcessedBitmap LPBITMAPINFO  lpInfo,
LPBYTE  lpBits,
DocRect  rect,
INT32  width,
INT32  height,
double  xOffset,
double  yOffset,
double  dPixelWidth = 0,
Matrix pmatTransform = NULL
[inline, virtual]
 

Reimplemented in NodeLiveEffect, and NodeLockedEffect.

Definition at line 214 of file nodeliveeffect.h.

00223                                                     {return DocRect(0,0,0,0);}

virtual BOOL NodeBitmapEffect::WillWriteBounds BaseCamelotFilter pFilter  )  [inline, virtual]
 

Determines if the down/up pair need to be written.

Author:
Gerry_Iles (Xara Group Ltd) <camelotdev@xara.com>
Date:
25/10/05
Parameters:
pFilter = ptr to filter to write to [INPUTS]
Returns:
TRUE if this node will write out a bounds record

Reimplemented from NodeRenderableInk.

Definition at line 206 of file nodeliveeffect.h.

00206 { return(TRUE); }

BOOL NodeBitmapEffect::WriteBoundsRecord BaseCamelotFilter pFilter  )  [virtual]
 

Begin to write out your child records, in the native format.

Author:
Phil_Martin (Xara Group Ltd) <camelotdev@xara.com>
Date:
30/09/2005
Parameters:
pFilter = ptr to filter to write to [INPUTS]
Returns:
TRUE if ok, FALSE otherwise
The base class will write out a TAG_DOWN record, but only if it has a child ptr

See also:
WritePostChildrenWeb(), WritePreChildrenWeb()

Reimplemented from NodeRenderableInk.

Definition at line 1794 of file nodeliveeffect.cpp.

01795 {
01796     BOOL ok = TRUE;
01797 
01798     // Add a description of the TAG_COMPOUNDRENDER record, for older importers that don't understand this record
01799     pFilter->AddTagDescription(TAG_COMPOUNDRENDER, _R(IDS_TAG_COMPOUNDRENDER));
01800 
01801     // Write out the record
01802     DocRect Rect = GetChildBoundingRect();
01803 
01804     CamelotFileRecord Rec(pFilter, TAG_COMPOUNDRENDER, TAG_COMPOUNDRENDER_SIZE);
01805     ok = Rec.Init();
01806     if (ok) ok = Rec.WriteUINT32(0);            // Reserved
01807     if (ok) ok = Rec.WriteCoord(Rect.lo);
01808     if (ok) ok = Rec.WriteCoord(Rect.hi);
01809     if (ok) ok = pFilter->Write(&Rec);
01810 
01811     return ok;
01812 }


Friends And Related Function Documentation

friend class LiveEffectRecordHandler [friend]
 

Reimplemented in NodeLiveEffect, NodeLockedEffect, and NodeFeatherEffect.

Definition at line 168 of file nodeliveeffect.h.


Member Data Documentation

UINT32 NodeBitmapEffect::DefaultLivePixelsPerInch [static]
 

Definition at line 176 of file nodeliveeffect.h.

BOOL NodeBitmapEffect::DefaultLocked = FALSE [static]
 

Preference: DefaultLocked Section: Effects Range: FALSE-TRUE

Definition at line 180 of file nodeliveeffect.h.

UINT32 NodeBitmapEffect::DefaultLockedPixelsPerInch [static]
 

Definition at line 177 of file nodeliveeffect.h.

UINT32 NodeBitmapEffect::GroupPixelsPerInch = 0 [static]
 

Preference: GroupPixelsPerInch Section: Effects Range: 0-72000

Definition at line 178 of file nodeliveeffect.h.

BOOL NodeBitmapEffect::m_bHasChangedRecently [protected]
 

Definition at line 271 of file nodeliveeffect.h.

double NodeBitmapEffect::m_dPixelsPerInch [protected]
 

Definition at line 270 of file nodeliveeffect.h.

IXMLDOMDocumentPtr NodeBitmapEffect::m_pEditsDoc [protected]
 

Definition at line 268 of file nodeliveeffect.h.

DocRect NodeBitmapEffect::m_rectDirectBitmap [protected]
 

Definition at line 273 of file nodeliveeffect.h.

String_64 NodeBitmapEffect::m_strDisplayName [protected]
 

Definition at line 272 of file nodeliveeffect.h.

StringVar NodeBitmapEffect::m_vstrEdits [protected]
 

Definition at line 269 of file nodeliveeffect.h.

UINT32 NodeBitmapEffect::ShadowPixelsPerInch = 0 [static]
 

Preference: ShadowPixelsPerInch Section: Effects Range: 0-72000

Definition at line 179 of file nodeliveeffect.h.


The documentation for this class was generated from the following files:
Generated on Sat Nov 10 03:56:38 2007 for Camelot by  doxygen 1.4.4