#include <nodeliveeffect.h>
Inheritance diagram for NodeBitmapEffect:
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 NodeRenderableInk * | GetInkNodeFromController () 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) |
| |
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_64 & | GetDisplayName () |
virtual void | SetDisplayName (String_64 &strDisplayName) |
virtual KernelBitmap * | GetKernelBitmap (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) |
| |
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 |
Definition at line 163 of file nodeliveeffect.h.
|
Note:.
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 }
|
|
Destructor Note:.
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 }
|
|
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.
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 ?
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 }
|
|
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 }
|
|
Can become a path !
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 }
|
|
Test whether node is big enough to bother with.
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 }
|
|
FInd out whether our controlled child can give us a DirectBitmap.
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 }
|
|
Reimplemented from NodeRenderableInk. Reimplemented in NodeLockedEffect, and NodeFeatherEffect. Definition at line 254 of file nodeliveeffect.h. 00254 {return TRUE;}
|
|
|
|
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 }
|
|
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.
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 }
|
|
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.
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 }
|
|
Find all cached items this node needs to call RenderCachedEffect succesfully.
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 }
|
|
Finds the bounding rect of the group along with its blobs. Its main use is to determine which areas of the document to invalidate.
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 }
|
|
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 }
|
|
Return details of direct bitmap to caller (caller is usually a NodeBitmapEffect).
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 }
|
|
Definition at line 240 of file nodeliveeffect.h. 00240 {return m_strDisplayName;}
|
|
Definition at line 982 of file nodeliveeffect.cpp. 00983 { 00984 return m_pEditsDoc; 00985 }
|
|
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.
Reimplemented from NodeCompound. Reimplemented in NodeLockedEffect. Definition at line 198 of file nodeliveeffect.h. 00198 {return FindFirstChildInk();}
|
|
Reimplemented in NodeLiveEffect, and NodeLockedEffect. Definition at line 242 of file nodeliveeffect.h. 00242 {return NULL;}
|
|
To get the required/stored pixel width of this node -.
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 }
|
|
To get the required/stored pixel res of this node.
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 };
|
|
Definition at line 244 of file nodeliveeffect.h. 00244 {return m_dPixelsPerInch;}
|
|
Definition at line 260 of file nodeliveeffect.h. 00260 {return 72000.0 / GetPixelsPerInch();}
|
|
Reimplemented in NodeLiveEffect, and NodeLockedEffect. Definition at line 213 of file nodeliveeffect.h. 00213 {return FALSE;}
|
|
Reimplemented in NodeFeatherEffect. Definition at line 264 of file nodeliveeffect.h. 00264 {return Operation::GetQuickRender(this);}
|
|
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 }
|
|
Definition at line 228 of file nodeliveeffect.h. 00228 {return m_bHasChangedRecently;}
|
|
Initialise the NodeBitmapEffect class.
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 }
|
|
Reimplemented from Node. Definition at line 196 of file nodeliveeffect.h. 00196 {return TRUE;}
|
|
Reimplemented from NodeEffect. Reimplemented in NodeLiveEffect, and NodeLockedEffect. Definition at line 227 of file nodeliveeffect.h. 00227 {return FALSE;}
|
|
Processes the bitmap produced by the children of this node. Can be overridden by derived classes to perofrm special processing.
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 }
|
|
Will render the liveeffect iff we have it cached - for hit detection reasons.
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 }
|
|
Capture the group as a cached bitmap.
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 }
|
|
Render the cached version of this node.
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 }
|
|
Render the current state into the renderregion if we haven't yet done so. Only used in background rendering timeslice screen update.
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 }
|
|
Definition at line 229 of file nodeliveeffect.h. 00229 {m_bHasChangedRecently = bNewFlag; return TRUE;}
|
|
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 }
|
|
Definition at line 241 of file nodeliveeffect.h. 00241 {m_strDisplayName = strDisplayName;}
|
|
Definition at line 1002 of file nodeliveeffect.cpp. 01003 { 01004 m_pEditsDoc = pNewEditsDoc; 01005 }
|
|
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 }
|
|
To get the required/stored pixel res of this node.
Definition at line 454 of file nodeliveeffect.cpp. 00455 { 00456 m_dPixelsPerInch = dPixelsPerInch; 00457 };
|
|
Reimplemented in NodeLiveEffect, and NodeLockedEffect. Definition at line 214 of file nodeliveeffect.h. 00223 {return DocRect(0,0,0,0);}
|
|
Determines if the down/up pair need to be written.
Reimplemented from NodeRenderableInk. Definition at line 206 of file nodeliveeffect.h. 00206 { return(TRUE); }
|
|
Begin to write out your child records, in the native format.
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 }
|
|
Reimplemented in NodeLiveEffect, NodeLockedEffect, and NodeFeatherEffect. Definition at line 168 of file nodeliveeffect.h. |
|
Definition at line 176 of file nodeliveeffect.h. |
|
Preference: DefaultLocked Section: Effects Range: FALSE-TRUE Definition at line 180 of file nodeliveeffect.h. |
|
Definition at line 177 of file nodeliveeffect.h. |
|
Preference: GroupPixelsPerInch Section: Effects Range: 0-72000 Definition at line 178 of file nodeliveeffect.h. |
|
Definition at line 271 of file nodeliveeffect.h. |
|
Definition at line 270 of file nodeliveeffect.h. |
|
Definition at line 268 of file nodeliveeffect.h. |
|
Definition at line 273 of file nodeliveeffect.h. |
|
Definition at line 272 of file nodeliveeffect.h. |
|
Definition at line 269 of file nodeliveeffect.h. |
|
Preference: ShadowPixelsPerInch Section: Effects Range: 0-72000 Definition at line 179 of file nodeliveeffect.h. |