Rectangle2D filterRegion,
Map filterMap) {
// 'in' attribute
Filter in = getIn(filterElement,
filteredElement,
filteredNode,
inputFilter,
filterMap,
ctx);
if (in == null) {
return null; // disable the filter
}
// Default region is the size of in (if in is SourceGraphic or
// SourceAlpha it will already include a pad/crop to the
// proper filter region size).
Rectangle2D defaultRegion = in.getBounds2D();
Rectangle2D primitiveRegion
= SVGUtilities.convertFilterPrimitiveRegion(filterElement,
filteredElement,
filteredNode,
defaultRegion,
filterRegion,
ctx);
float dx = convertNumber(filterElement, SVG_DX_ATTRIBUTE, 0, ctx);
float dy = convertNumber(filterElement, SVG_DY_ATTRIBUTE, 0, ctx);
AffineTransform at = AffineTransform.getTranslateInstance(dx, dy);
// feOffset is a point operation. Therefore, to take the
// filter primitive region into account, only a pad operation
// on the input is required.
PadRable pad = new PadRable8Bit(in, primitiveRegion, PadMode.ZERO_PAD);
Filter filter = new AffineRable8Bit(pad, at);
filter = new PadRable8Bit(filter, primitiveRegion, PadMode.ZERO_PAD);
// handle the 'color-interpolation-filters' property
handleColorInterpolationFilters(filter, filterElement);