本文整理汇总了C++中Path::Initialise方法的典型用法代码示例。如果您正苦于以下问题:C++ Path::Initialise方法的具体用法?C++ Path::Initialise怎么用?C++ Path::Initialise使用的例子?那么, 这里精选的方法代码示例或许可以为您提供帮助。您也可以进一步了解该方法所在类Path
的用法示例。
在下文中一共展示了Path::Initialise方法的11个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C++代码示例。
示例1: AddPathToImagemap
void ImagemapRenderRegion::AddPathToImagemap(Path* ppthToAdd, WebAddressAttribute* pwaaCurrent)
{
//First get the origin of the export area and the DPI
DocCoord dcOrigin=ImagemapFilterOptions::GetOriginOfExportArea(m_Options.m_stExportArea);
double dDPI=m_Options.m_dDPI;
//Now, how many subpaths are there in this path?
INT32 lNumSubpaths=ppthToAdd->GetNumSubpaths();
//For each subpath in the path
for (INT32 l=0; l<lNumSubpaths; l++)
{
//Create a new path
Path pthSubpath;
pthSubpath.Initialise(ppthToAdd->GetNumCoords());
//And copy the next subpath into it
ppthToAdd->MakePathFromSubPath(l, &pthSubpath);
//Now, if that subpath is closed
if (pthSubpath.IsSubPathClosed(0))
{
//Then we want to add it to the imagemap
//So scale it to dDPI and by dcOrigin
pthSubpath.Scale(dcOrigin, dDPI);
//Now we need to flatten it.
//This means creating a new path, because otherwise Path::Flatten
//goes wrong
Path pthFlattened;
pthFlattened.Initialise(pthSubpath.GetNumCoords());
//So, if we should flatten the path
if (m_Options.m_ffApprox!=FF_NOTATALL)
//Then do it
pthSubpath.Flatten(m_Options.m_ffApprox, &pthFlattened);
else
//Otherwise, simply copy the path across
pthFlattened.CopyPathDataFrom(&pthSubpath);
//Then add the flattened path to the imagemap
m_Imagemap.AddPolygon(&pthFlattened, pwaaCurrent->m_url.GetWebAddress(), pwaaCurrent->m_pcFrame);
}
}
}
示例2: MouldPathRender
void MouldGeometry::MouldPathRender(Path* pPath, RenderRegion* pRegion)
{
Path RenderPath;
if (!(RenderPath.Initialise(12,12))) return;
if (!MouldPathToPath(pPath,&RenderPath)) return;
pRegion->DrawPath(&RenderPath);
}
示例3: FindBoundsAt
DocRect ArrowRec::FindBoundsAt(const DocCoord& ArrowCentre, const DocCoord& Direction,
INT32 ParentLineWidth)
{
DocRect Bounds(0,0,0,0);
// Find a matrix to transform the ArrowHead to this Position.
Trans2DMatrix Trans;
GetArrowMatrix(ArrowCentre, Direction, ParentLineWidth, &Trans);
// Note:
// We should really be able to ask Gavin to Calculate the Bounds,
// and pass him this Transform Matrix, but he can't do this at the
// moment, so we'll have to actually transform the path into
// a tempory path, and then ask him to calc the bounds of that.
// Make a tempory path to transform
Path* TransPath = new Path();
if (TransPath == NULL)
return Bounds;
// Copy the path data from the ArrorHead into our tempory path.
BOOL ok = TransPath->Initialise(ArrowShape->GetNumCoords());
if (ok) ok = TransPath->CopyPathDataFrom(ArrowShape);
if (!ok)
{
// Tidy up if we failed
delete TransPath;
return Bounds;
}
// Go transform the Tempory path
Trans.Transform(TransPath->GetCoordArray(),
TransPath->GetNumCoords() );
BOOL GDrawResult = FALSE;
// Find out what the paths bounding rect is, taking into account
// any bezier curve thingies.
GDrawContext *GD = GRenderRegion::GetStaticDrawContext();
if (GD != NULL)
GDrawResult = GD->CalcStrokeBBox((POINT*)TransPath->GetCoordArray(),
TransPath->GetVerbArray(), TransPath->GetNumCoords(),
(RECT *)(&Bounds),
TRUE, 0, CAPS_ROUND, JOIN_ROUND, NULL) == 0;
// If Gavin failed, then use backup technique of getting coord array bounds
if (!GDrawResult)
Bounds = TransPath->GetBoundingRect();
// Delete the temporary transformed path
delete TransPath;
return Bounds;
}
示例4: AddCircleToImagemap
void ImagemapRenderRegion::AddCircleToImagemap(Path* ppthToScale, WebAddressAttribute* pwaaCurrent)
{
//First get the origin of the export area and the DPI
DocCoord dcOrigin=ImagemapFilterOptions::GetOriginOfExportArea(m_Options.m_stExportArea);
double dDPI=m_Options.m_dDPI;
//Now make a copy of the path
Path pthToAdd;
pthToAdd.Initialise(ppthToScale->GetNumCoords());
pthToAdd.CopyPathDataFrom(ppthToScale);
//Scale it
pthToAdd.Scale(dcOrigin, dDPI);
//And add it to the imagemap
m_Imagemap.AddCircle(&pthToAdd, pwaaCurrent->m_url.GetWebAddress(), pwaaCurrent->m_pcFrame);
}
示例5: CreateStockArrow
BOOL ArrowRec::CreateStockArrow(StockArrow ArrowType)
{
if (ArrowShape != NULL)
{
delete ArrowShape;
ArrowShape = NULL;
}
BOOL ok;
Path* pPath;
const INT32 Size = 3;
const INT32 Width = (72000/2)*3;
if (ArrowType >= NUM_STOCK_ARROWS)
ArrowType = SA_STRAIGHTARROW;
// Set the ArrowID
ArrowID = ArrowType;
switch (ArrowType)
{
case SA_STRAIGHTARROW:
/*
STRAIGHT
-9 54 m
-9 0 l
-9 -54 l
117 0 l
-9 54 l
-9 54 l
*/
pPath = new Path();
if (pPath == NULL)
return FALSE;
ok = pPath->Initialise(4);
if (ok) pPath->FindStartOfPath();
if (ok) ok = pPath->InsertMoveTo(DocCoord( -9000, 54000));
if (ok) ok = pPath->InsertLineTo(DocCoord( -9000, -54000));
if (ok) ok = pPath->InsertLineTo(DocCoord(117000, 0));
if (ok) ok = pPath->CloseSubPath();
if (!ok)
{
delete pPath;
return FALSE;
}
pPath->IsFilled = TRUE;
pPath->IsStroked = FALSE;
ArrowShape = pPath;
Centre = DocCoord(0,0);
LineWidth = Width;
ArrowWidth = INT32(Size);
ArrowHeight = INT32(Size);
IsNull = FALSE;
StartArrow = FALSE;
break;
case SA_ANGLEDARROW:
/*
ANGLED
-26.999 53.999 m
-9 0 l
-26.999 -54.001 l
135 0 l
-26.999 53.999 l
*/
pPath = new Path();
if (pPath == NULL)
return FALSE;
ok = pPath->Initialise(5);
if (ok) pPath->FindStartOfPath();
if (ok) ok = pPath->InsertMoveTo(DocCoord(-27000, 54000));
if (ok) ok = pPath->InsertLineTo(DocCoord( -9000, 0));
if (ok) ok = pPath->InsertLineTo(DocCoord(-27000, -54000));
if (ok) ok = pPath->InsertLineTo(DocCoord(135000, 0));
if (ok) ok = pPath->CloseSubPath();
if (!ok)
{
delete pPath;
return FALSE;
}
pPath->IsFilled = TRUE;
pPath->IsStroked = FALSE;
ArrowShape = pPath;
Centre = DocCoord(0,0);
LineWidth = Width;
//.........这里部分代码省略.........
示例6: TTFAddString
//.........这里部分代码省略.........
ok = GetTextExtentPoint(ScreenDC, *text, (pCurrentChar-(TCHAR*)(*text)), &StringSize);
ERROR3IF(!ok, "GetTextExtentPoint32() failed");
if (!ok) break;
// Get the characters path
DWORD PathSize = 0;
ok = TextManager::GetBezierFromChar(&SysDisplay, wchr, pLogFont, &PathSize, (POINT *)NULL, (BYTE *)NULL);
if (!ok)
{
wchr = FontDefaultCharacter;
ok = TextManager::GetBezierFromChar(&SysDisplay, wchr, pLogFont, &PathSize, (POINT *)NULL, (BYTE *)NULL);
}
ERROR3IF(!ok, "GetBezierFromChar returned false");
if (!ok) break;
// Pointer to an array of path coordinates
if(pPolyCordBuffer == NULL)
{
TRY
{
pPolyCordBuffer = new DocCoord[PathSize];
}
CATCH (CMemoryException, e)
{
pPolyCordBuffer = NULL;
/*ERROR(_R(IDS_OUT_OF_MEMORY), FALSE);*/
}
END_CATCH
}
// Pointer to an array of path verbs
if(pPolyVerbBuffer == NULL)
{
TRY
{
pPolyVerbBuffer = new PathVerb[PathSize];
}
CATCH (CMemoryException, e)
{
pPolyVerbBuffer = NULL;
/*ERROR(_R(IDS_OUT_OF_MEMORY), FALSE);*/
}
END_CATCH
}
if (pPolyCordBuffer == NULL || pPolyVerbBuffer == NULL)
{
ok = FALSE;
break;
}
CurrentPathSizeAlloc = PathSize;
// Fill up the buffers until they're bursting with fontyness
ok = TextManager::GetBezierFromChar(&SysDisplay, wchr, pLogFont, &PathSize, (POINT *)pPolyCordBuffer,
(BYTE *)pPolyVerbBuffer);
if(!ok) TRACEUSER( "Richard", _T("GetBezierFromChar returned false in second phase...\n"));
if(!ok) break;
// Spaces set PathSize to zero
if((PathSize > 0)/* && (pPath != NULL)*/)
{
pPath = new Path();
pPath->Initialise(PathSize, 12);
pPath->CopyPathDataFrom(pPolyCordBuffer, pPolyVerbBuffer, PathSize, TRUE);
// Major bodge at present with the x spacing...
Matrix scale(XScale, 0, 0, YScale, (INT32)((XScale*StringSize.cx*72000)/(double)DPI), (INT32)YShift);
pTransform = new Trans2DMatrix(scale);
pPathCoords = pPath->GetCoordArray();
pTransform->Transform( pPathCoords, pPath->GetNumCoords() );
delete pTransform;
pPath->InitialiseFlags();
ok = ALU->GradFillPath(pPath, ForeColour, ForeColour, 0, 0, 0,/*Xsize/2,*/ Ysize, S2BMP_ANTIALIAS);
ERROR3IF(!ok, "Gradfillpath returned false");
if(!ok) break;
delete pPath;
}
// S2BMP_MAGIC is the worderfully fabby constant that mark's getbezierfromchar returns
// Theory goes that he's going to sort this out sometime...
if(CurrentPathSizeAlloc != S2BMP_MAGIC)
{
delete []pPolyCordBuffer;
delete []pPolyVerbBuffer;
pPolyCordBuffer = NULL;
pPolyVerbBuffer = NULL;
CurrentPathSizeAlloc = 0;
}
pPath = NULL;
pTransform = NULL;
pCurrentChar = camStrinc(pCurrentChar);
}
示例7: ProcessPath
//.........这里部分代码省略.........
delete pMaskRegion;
pMaskRegion = NULL;
pPalette = NULL;
// Now, render a rectangle to the output render region, using the transparency mask
if (pOilBmp == NULL)
return;
KernelBitmap *pMask = new KernelBitmap(pOilBmp, TRUE);
if (pMask != NULL)
{
// Make sure the bitmap knows it's already a greyscale, else it will spend a lot of
// time "converting" itself to a greyscale, and what's more, corrupting the grey levels
// so that 255 (invisible) becomes 254 (slightly visible). Arrrrrgh!
pMask->SetAsGreyscale();
// Create a transparency attribute from our mask bitmap
BitmapTranspFillAttribute Trans;
// We don't call pTrans->AttachBitmap because it seems to be stupid, and causes ructions
// when we try to attach a temporary bitmap. We thus do the same thing, but avoiding
// its attempts to automatically screw us about.
Trans.BitmapRef.Detach();
Trans.BitmapRef.SetBitmap(pMask);
Trans.SetStartPoint(&ClipRegion.lo);
DocCoord EndPoint(ClipRegion.hi.x, ClipRegion.lo.y);
Trans.SetEndPoint(&EndPoint);
DocCoord EndPoint2(ClipRegion.lo.x, ClipRegion.hi.y);
Trans.SetEndPoint2(&EndPoint2);
UINT32 TValue = 0;
Trans.SetStartTransp(&TValue);
TValue = 255;
Trans.SetEndTransp(&TValue);
// Use the same transparency type as is set on the object being rendered (if any)
{
TranspFillAttribute *pTransAttr = (TranspFillAttribute *) pRender->GetCurrentAttribute(ATTR_TRANSPFILLGEOMETRY);
if (pTransAttr != NULL)
Trans.SetTranspType(pTransAttr->GetTranspType());
else
Trans.SetTranspType(TT_Mix); // By default, we'll use Mix transparency
}
// --- OK, we finally got here! Render the stroke, using the transparency mask we just made
pRender->SaveContext();
Trans.Render(pRender);
// Render the path. If it is filled, then we render the entire thing (fill & stroke) using
// the current fill geometry (to get a shadow/feather effect)
if (PathIsFilled)
{
// Render the entire thing (fill & stroke) in one go. We render a rectangle over the cliprect
// so that we do everything in one go (we can't render the fill &7 stroke separately, or
// the transparency will overlap & it'll look wrong)
pRender->SetLineColour(DocColour(COLOUR_TRANS)); // Don't render a line
Path Rect;
Rect.Initialise();
Rect.AddMoveTo(ClipRegion.lo);
Rect.AddLineTo(DocCoord(ClipRegion.hix, ClipRegion.loy));
Rect.AddLineTo(ClipRegion.hi);
Rect.AddLineTo(DocCoord(ClipRegion.lox, ClipRegion.hiy));
Rect.AddLineTo(ClipRegion.lo);
Rect.IsFilled = TRUE;
Rect.IsStroked = FALSE;
pRender->DrawPath(&Rect, this, ShapePath);
}
else
{
// Otherwise, create a filled-outline path for the entire stroke, and render it
// !!!!****ToDo - for now, strokes always render flat-filled with the stroke colour
StrokeColourAttribute *pStrokeColour = (StrokeColourAttribute *) pRender->GetCurrentAttribute(ATTR_STROKECOLOUR);
if (pStrokeColour != NULL)
pRender->SetFillColour(pStrokeColour->Colour);
// Fill the holes
pRender->SetWindingRule(NonZeroWinding);
Path *pOutput = CreateVarWidthStroke(pPath, pRender, LineWidth);
if (pOutput != NULL)
{
pRender->DrawPath(pOutput, NULL, ShapePath);
delete pOutput;
pOutput = NULL;
}
}
pRender->RestoreContext();
// Delete the kernel bitmap. This auto-deletes the OIL bitmap for us
delete pMask;
}
#endif
}
示例8: ProcessPath
void PathProcessorStrokeVector::ProcessPath(Path *pPath,
RenderRegion *pRender,
PathShape ShapePath)
{
PORTNOTETRACE("other","PathProcessorStrokeVector::ProcessPath - do nothing");
#ifndef EXCLUDE_FROM_XARALX
ERROR3IF(pPath == NULL || pRender == NULL, "Illegal NULL Params");
// Get the RenderRegion SubRenderContext and see if we're returning part-way through a background render
VectorStrokeSubRenderContext *pSubRenderContext = (VectorStrokeSubRenderContext *)pRender->GetSubRenderState();
if (pSubRenderContext != NULL && !IS_A(pSubRenderContext, VectorStrokeSubRenderContext))
{
// We can't use the sub render context, because it's not ours!
pSubRenderContext = NULL;
}
// --- If we don't have a valid stroke definition, then get the base class to render
// the stroke as a simple flat-filled stroke.
StrokeDefinition *pStrokeDef = StrokeComponent::FindStroke(StrokeID);
if (pStrokeDef == NULL)
{
PathProcessorStroke::ProcessPath(pPath, pRender);
return;
}
// --- See if we have to create a new SubRenderContext, or if we can use the one passed in.
// We always store all relevant variables in a SubRenderContext object so that we can easily
// return control to the RenderRegion without having to copy lots of local values in/out.
const BOOL CreateSubRenderContext = (pSubRenderContext == NULL);
if (CreateSubRenderContext)
{
pSubRenderContext = new VectorStrokeSubRenderContext;
if (pSubRenderContext == NULL)
{
pRender->DrawPath(pPath, this, ShapePath);
return;
}
// --- If the provided path is not stroked, then we'll just pass it straight through
// We also don't touch it if we're doing EOR rendering, or click hit detection
if (!pPath->IsStroked || pRender->DrawingMode != DM_COPYPEN || pRender->IsHitDetect())
{
delete pSubRenderContext;
pRender->DrawPath(pPath, this, ShapePath);
return;
}
// --- If the quality is set low, or if the current stroke attribute is not our "parent"
// attribute (so we're not the "current" stroker) then strokes are just rendered as centrelines
// BLOCK
{
QualityAttribute *pQuality = (QualityAttribute *) pRender->GetCurrentAttribute(ATTR_QUALITY);
StrokeTypeAttrValue *pTypeAttr = (StrokeTypeAttrValue *) pRender->GetCurrentAttribute(ATTR_STROKETYPE);
if ((pQuality != NULL && pQuality->QualityValue.GetLineQuality() != Quality::FullLine) ||
(pTypeAttr != NULL && pTypeAttr != GetParentAttr()))
{
delete pSubRenderContext;
pRender->DrawPath(pPath, this, ShapePath);
return;
}
}
// --- We don't expect the input path to be stroked AND filled on entry
ERROR3IF(pPath->IsFilled, "PathProcessor expected RenderRegion to handle IsFilled case");
// --- Get the current line width & Join Style from the render region
// BLOCK
{
LineWidthAttribute *pWidthAttr = (LineWidthAttribute *) pRender->GetCurrentAttribute(ATTR_LINEWIDTH);
if (pWidthAttr != NULL)
pSubRenderContext->LineWidth = pWidthAttr->LineWidth;
JoinTypeAttribute *pJoinAttr = (JoinTypeAttribute *) pRender->GetCurrentAttribute(ATTR_JOINTYPE);
if (pJoinAttr != NULL)
pSubRenderContext->JoinStyle = pJoinAttr->JoinType;
}
}
// --- Create a new path to be rendered in place of the provided path
// Note that I use a large allocation size so that reallocation need not be done
// frequently, which also helps reduce memory fragmentation.
Path *pOutput = new Path;
if (pOutput == NULL)
{
if (!pRender->IsSubRenderStateLocked())
pRender->SetSubRenderState(NULL);
delete pSubRenderContext;
pRender->DrawPath(pPath, this, ShapePath);
return;
}
pOutput->Initialise(128, 128);
// --- Find our Variable Width function
if (CreateSubRenderContext)
{
// --- Get the variable line width descriptor from the render region
VariableWidthAttrValue *pVarWidthAttr = (VariableWidthAttrValue *) pRender->GetCurrentAttribute(ATTR_VARWIDTH);
//.........这里部分代码省略.........
示例9: RedrawDiagram
void ArrangeAlignment::RedrawDiagram(ReDrawInfoType* ExtraInfo)
{
// objects drawn in the render region must be relatively large in the given coord space
// else Gavin's curve flattening results in visible straight lines
// so every dimension is scaled by scale
INT32 scale=1000;
// make a render region
DocRect VirtRendRect;
VirtRendRect.lo.x=-1*scale;
VirtRendRect.lo.y=-2*scale;
VirtRendRect.hi.x=(DiagWidth +1)*scale;
VirtRendRect.hi.y=(DiagHeight+2)*scale;
RenderRegion* pRender=CreateGRenderRegion(&VirtRendRect,ExtraInfo);
if (pRender!=NULL)
{
pRender->SaveContext();
// currently this must be set here before any colour tables calculated
Quality AntiAliasQuality(Quality::QualityMax);
QualityAttribute AntiAliasQualityAttr(AntiAliasQuality);
pRender->SetQuality(&AntiAliasQualityAttr,FALSE);
// Render the background rectangle
DialogColourInfo RedrawColours;
pRender->SetLineColour(RedrawColours.DialogBack());
pRender->SetFillColour(RedrawColours.DialogBack());
pRender->DrawRect(&VirtRendRect);
// declared at this scope else RestoreContext() dies!
RadialFillAttribute Fill;
// set up some defaults used by all objects
Fill.MakeElliptical();
Fill.Colour=DocColour(255,255,255);
pRender->SetLineColour(BLACK);
pRender->SetLineWidth(0);
for (INT32 i=0; i<DiagRects; i++)
{
// reverse order in which objets are rendered (now filled!)
INT32 j=DiagRects-1-i;
// set fill colour of each object
switch (j)
{
case 0: Fill.EndColour=DocColour(255,255,0); break;
case 1: Fill.EndColour=DocColour(0,0,255); break;
case 2: Fill.EndColour=DocColour(255,0,0); break;
case 3: Fill.EndColour=DocColour(0,160,0); break;
default: Fill.EndColour=DocColour(0,0,0); break;
}
// get bound rect of object to be drawn
INT32 x=DiagRectX[Align.h][j].lo*scale;
INT32 w=DiagRectX[Align.h][j].hi*scale-x;
INT32 y=DiagRectY[Align.v][j].lo*scale;
INT32 h=DiagRectY[Align.v][j].hi*scale-y;
// create shape and fill geometries
Path shape;
shape.Initialise(16,8);
shape.IsFilled=TRUE;
shape.FindStartOfPath();
switch (j)
{
case 0:
{
// create a rectangle
shape.InsertMoveTo(DocCoord(x,y));
shape.InsertLineTo(DocCoord(x,y+h));
shape.InsertLineTo(DocCoord(x+w,y+h));
shape.InsertLineTo(DocCoord(x+w,y));
shape.InsertLineTo(DocCoord(x,y));
// // create a radial fill
// Fill.StartPoint=DocCoord(x+w*3/16,y+h*3/4);
// Fill.EndPoint =DocCoord(x+w*3/8,y+h/2);
// Fill.EndPoint2 =DocCoord(x+w*3/8,y+h);
break;
}
case 1:
{
// create a pseudo ellipse
shape.InsertMoveTo( DocCoord(x,y+h/2));
shape.InsertCurveTo(DocCoord(x,y+h*3/4), DocCoord(x+w/4,y+h), DocCoord(x+w/2,y+h));
shape.InsertCurveTo(DocCoord(x+w*3/4,y+h),DocCoord(x+w,y+h*3/4),DocCoord(x+w,y+h/2));
shape.InsertCurveTo(DocCoord(x+w,y+h/4), DocCoord(x+w*3/4,y), DocCoord(x+w/2,y));
shape.InsertCurveTo(DocCoord(x+w/4,y), DocCoord(x,y+h/4), DocCoord(x,y+h/2));
// // create a radial fill
// Fill.StartPoint=DocCoord(x+w*3/8,y+h*5/8);
// Fill.EndPoint =DocCoord(x+w*6/8,y+h/4);
// Fill.EndPoint2 =DocCoord(x+w*6/8,y+h);
break;
}
default:
//.........这里部分代码省略.........
示例10: RenderControl
void RenderDemoDlg::RenderControl(ReDrawInfoType* ExtraInfo)
{
// Go get a render region
DocRect VirtualSize(-ExtraInfo->dx/2, -ExtraInfo->dy/2, ExtraInfo->dx/2, ExtraInfo->dy/2);
RenderRegion* pRender = CreateGRenderRegion(&VirtualSize, ExtraInfo);
if (pRender!=NULL)
{
DialogColourInfo RedrawColours; // Get a supplier for default dlg colours
// Render stuff in here
// Build a Linear fill attribute
LinearFillAttribute MyGradFill;
MyGradFill.Colour = DocColour(255, 255, 0);
MyGradFill.EndColour = DocColour(0, 255, 255);
MyGradFill.StartPoint = DocCoord(0, ExtraInfo->dy);
MyGradFill.EndPoint = DocCoord(ExtraInfo->dx, 0);
// Build a path
Path InkPath;
InkPath.Initialise(12,12);
InkPath.FindStartOfPath();
// Get the coords used to build a shape
INT32 dx = ExtraInfo->dx / 2;
INT32 dy = ExtraInfo->dy / 2;
INT32 Midx = ExtraInfo->dx / 4;
INT32 Midy = ExtraInfo->dy / 4;
// build a circle in the middle of the control
InkPath.InsertMoveTo(DocCoord(Midx, dy));
InkPath.InsertCurveTo(DocCoord(Midx+Midx/2, dy), DocCoord(dx, Midy+Midy/2), DocCoord(dx, Midy));
InkPath.InsertCurveTo(DocCoord(dx, Midy-Midy/2), DocCoord(Midx+Midx/2, 0), DocCoord(Midx, 0));
InkPath.InsertCurveTo(DocCoord(Midx-Midx/2, 0), DocCoord(0, Midy-Midy/2), DocCoord(0, Midy));
InkPath.InsertCurveTo(DocCoord(0, Midy+Midy/2), DocCoord(Midx-Midx/2, dy), DocCoord(Midx, dy));
InkPath.IsFilled = TRUE;
// A Grey colour [...hmmm, it's not a very grey grey any more... oragnge more like]
DocColour Grey(255,200,0);
// Render the attributes and the a rectangle
pRender->SaveContext();
pRender->SetLineColour(Grey);
// Draw a rectangle to fill in the background - Fill with Dialogue Background colour
DocRect DrawMe(0, 0, ExtraInfo->dx, ExtraInfo->dy);
pRender->SetFillColour(RedrawColours.DialogBack());
pRender->DrawRect(&VirtualSize);
// Draw some shapes and stuff
pRender->SetFillGeometry(&MyGradFill, FALSE);
pRender->DrawPath(&InkPath);
// Build a path
Path TriPath;
TriPath.Initialise(12,12);
TriPath.FindStartOfPath();
// build a circle in the middle of the control
TriPath.InsertMoveTo(VirtualSize.lo);
TriPath.InsertLineTo(DocCoord(VirtualSize.hi.x, VirtualSize.lo.y));
TriPath.InsertLineTo(DocCoord(0, VirtualSize.hi.y));
TriPath.InsertLineTo(VirtualSize.lo);
TriPath.IsFilled = TRUE;
LinearFillAttribute MyTriFill;
MyTriFill.Colour = ShowFirst ? First : Second;
MyTriFill.EndColour = DocColour(0,0,0);
MyTriFill.StartPoint = DocCoord(ExtraInfo->dx, 0);
MyTriFill.EndPoint = DocCoord(0, ExtraInfo->dy);
pRender->SetFillGeometry(&MyTriFill, FALSE);
pRender->DrawPath(&TriPath);
pRender->RestoreContext();
// Get rid of the render region
DestroyGRenderRegion(pRender);
}
// and animate it!
if (ShowFirst)
{
INT32 Red, Green, Blue;
First.GetRGBValue(&Red, &Green, &Blue);
if (Blue>0)
{
// Set the colour back again
Blue -= 10;
First.SetRGBValue(Red, Green, Blue);
// redraw it
InvalidateGadget(_R(IDC_REDRAW_ME));
}
}
else
{
// Set the colour back to how it was
First.SetRGBValue(255, 0, 250);
}
//.........这里部分代码省略.........
示例11: BlendPaths
/********************************************************************************************
> BOOL BlendHelpers::BlendPaths(BlendNodeParam * pParam, Path * pPath)
Author: David_McClarnon (Xara Group Ltd) <[email protected]>
Created: 21/2/2000
Inputs: The blend node parameter
Outputs: The blended path is stored in three arrays: the coords, the verbs, and the flags.
The arrays are:
pTempCoords
pTempVerbs
pTempFlags
ArrayLength = the length of all three arrays
This allows the caller to decide what to do with the blended path in a very flexible way.
Returns: TRUE if successful, FALSE otherwise
Purpose: Blends two BlendPath objects by the amount specified in BlendRatio
SeeAlso: -
********************************************************************************************/
BOOL BlendHelpers::BlendPaths(BlendNodeParam * pParam, Path * pPath)
{
// Check entry params
BlendPath * pBlendPathStart = pParam->GetStartBlendPath();
BlendPath * pBlendPathEnd = pParam->GetEndBlendPath();
ERROR2IF(!pBlendPathStart->GetBlendNode()->IsNodePath(), FALSE,
"Start blend path's node isn't a node path");
ERROR2IF(!pBlendPathEnd->GetBlendNode()->IsNodePath(), FALSE,
"End blend path's node isn't a node path");
BOOL ok = (pBlendPathStart != NULL && pBlendPathEnd != NULL);
if (ok) ok = (pBlendPathStart->GetBlendNode() != NULL && pBlendPathEnd->GetBlendNode() != NULL);
ERROR3IF(!ok,"One or more NULL entry params");
if (!ok) return FALSE;
// Get the types of the two paths
PathTypeEnum PathTypeStart = pBlendPathStart->GetPathType();
PathTypeEnum PathTypeEnd = pBlendPathEnd ->GetPathType();
// The blended path will be closed if either of the paths is a shape
BOOL Closed = (PathTypeStart == PATHTYPE_SHAPE) || (PathTypeEnd == PATHTYPE_SHAPE);
Path * pPathStart = NULL;
// Find the paths associated with the start and end blend paths
if (pBlendPathStart->GetBlendNode()->IsNodePath())
{
pPathStart = &(((NodePath *)pBlendPathStart->GetBlendNode())->InkPath);
}
Path * pPathEnd = NULL;
if (pBlendPathEnd->GetBlendNode()->IsNodePath())
{
pPathEnd = &(((NodePath *)pBlendPathEnd->GetBlendNode())->InkPath);
}
// Calculate how large the arrays have to be to store the blended path definition
INT32 DestPathSize = ((pPathStart->GetNumCoords()+pPathEnd->GetNumCoords())*3)+500;
// Get some arrays used to hold the blended path data, and error if any are NULL
DocCoord* pDestCoords = GetCoordArray(DestPathSize);
PathVerb* pDestVerbs = GetVerbArray(DestPathSize);
PathFlags* pDestFlags = GetFlagArray(DestPathSize);
UINT32* pBuff = GetGBlendBuff(DestPathSize);
if (pDestCoords == NULL || pDestVerbs == NULL || pDestFlags == NULL || pBuff == NULL)
return FALSE;
// This section copes with the case when blending a line with a shape.
// In this case we need to get a temp path the is actually a shape version of the line.
// The line is simply reversed back onto itself to form a shape that would look identical to the
// line if rendered. This allows the line to appear to open up to the shape when blended.
Path Shape;
if (PathTypeStart != PathTypeEnd)
{
BOOL ok = FALSE;
if (!Shape.Initialise()) return FALSE;
// if going from a line to a shape, convert the start path to a shape
if (PathTypeStart == PATHTYPE_LINE && PathTypeEnd == PATHTYPE_SHAPE)
{
ok = NodeBlender::ConvertLineToShape(pPathStart,&Shape);
pPathStart = &Shape;
}
// if going from a shape to a line, convert the end path to a shape
if (PathTypeStart == PATHTYPE_SHAPE && PathTypeEnd == PATHTYPE_LINE)
{
ok = NodeBlender::ConvertLineToShape(pPathEnd,&Shape);
pPathEnd = &Shape;
}
if (!ok) return FALSE;
}
// The blend should do a one-to-one mapping when the OneToOne flag is set AND both paths
//.........这里部分代码省略.........