DefineShape clipShape = createDefineShape(null, clipRectRecords, new SolidColorFillNode(), null, context.getTransform());
FXGMatrix bitmapMatrix = TypeHelper.bitmapFillMatrix(fillNode, imageTag, edgeBounds);
FXGMatrix clipMatrix = new FXGMatrix(bitmapMatrix.a, bitmapMatrix.b, bitmapMatrix.c, bitmapMatrix.d, 0, 0);
clipMatrix.scale(1.0/SwfConstants.TWIPS_PER_PIXEL, 1.0/SwfConstants.TWIPS_PER_PIXEL);
clipMatrix.translate(bitmapMatrix.tx, bitmapMatrix.ty);
GraphicContext clipContext = new GraphicContext();
clipContext.setTransform(clipMatrix);
placeObject(clipShape, clipContext);
spriteStack.pop();
// Set the depth of the mask to that of the bitmap image fill
clipContext.setTransform(context.getTransform());
PlaceObject po3clip = placeObject(clipSprite, clipContext);
po3clip.setClipDepth(po3clip.depth+1);
// Then, process the bitmap image fill
ShapeWithStyle sws = new ShapeWithStyle();
sws.shapeRecords = shapeRecords;
int lineStyleIndex = 0;
int fillStyle0Index = 1;
int fillStyle1Index = 0;
if (windings.length > 0)
ShapeHelper.setPathStyles(shapeRecords, lineStyleIndex, fillStyle0Index, fillStyle1Index);
else
ShapeHelper.setStyles(shapeRecords, lineStyleIndex, fillStyle0Index, fillStyle1Index);
FillStyle fillStyle = createFillStyle(fill, edgeBounds);
sws.fillstyles = new ArrayList<FillStyle>(1);
sws.fillstyles.add(fillStyle);
DefineShape imageShape = new DefineShape(Tag.stagDefineShape4);
imageShape.shapeWithStyle = sws;
imageShape.bounds = edgeBounds;
imageShape.edgeBounds = edgeBounds;
if ((fill != null) &&( windings.length > 0))
{
Winding windingValue = windings[0];
imageShape.usesFillWindingRule = (windingValue == Winding.NON_ZERO);
}
PlaceObject po3 = placeObject(imageShape, context);
if (stroke != null)
{
//make a copy of ShapeRecord for strokes
ArrayList<ShapeRecord> shapeRecords2 = new ArrayList<ShapeRecord>(shapeRecords);
Collections.copy(shapeRecords2, shapeRecords);
//generate the define sprite for the stroke object with no clipping
ShapeWithStyle swsStroke = new ShapeWithStyle();
swsStroke.shapeRecords = shapeRecords2;
lineStyleIndex = 1;
fillStyle0Index = 0;
fillStyle1Index = 0;
ShapeHelper.replaceStyles(shapeRecords2, lineStyleIndex, fillStyle0Index, fillStyle1Index);
// Consider linestyle stroke widths with bounds calculation
AbstractStrokeNode strokeNode = (AbstractStrokeNode) stroke;
LineStyle ls = createGenericLineStyle(strokeNode);
Rect shapeBounds = node.getBounds(shapeRecords2, ls);
LineStyle lineStyle = createLineStyle(stroke, shapeBounds);
swsStroke.linestyles = new ArrayList<LineStyle>(1);
swsStroke.linestyles.add(lineStyle);
DefineShape strokeShape = new DefineShape(Tag.stagDefineShape4);
strokeShape.shapeWithStyle = swsStroke;
strokeShape.bounds = shapeBounds;
strokeShape.edgeBounds = edgeBounds;
po3 = placeObject(strokeShape, context);
}
spriteStack.pop();
po3 = placeObject(imageSprite, new GraphicContext());
// If filters were not processed, place the topmost sprite in display list and apply filters
// This is done to force processing of masks before filters
if (filters != null)
{
DefineSprite sprite = spriteStack.pop();
GraphicContext gc = new GraphicContext();
gc.filters = filters;
PlaceObject poFilter = placeObject(sprite, gc);
return poFilter;
}