diff --git a/CHANGELOG.md b/CHANGELOG.md index cd2ad8b0a..cc4b1ccf6 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,7 +6,7 @@ All notable changes to this project will be documented in this file. - AS3 - Remove trait which is outside class ### Fixed -- Flash viewer - bitmap line style +- Flash viewer - bitmap stroke style, strokes scaling, cropped strokes ## [14.2.1] - 2021-03-13 ### Added diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/SWF.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/SWF.java index eb16c6259..21b5bf716 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/SWF.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/SWF.java @@ -2903,7 +2903,7 @@ public final class SWF implements SWFContainerItem, Timelined { RenderContext renderContext = new RenderContext(); renderContext.cursorPosition = cursorPosition; renderContext.mouseButton = mouseButton; - timeline.toImage(frame, time, renderContext, image, false, m, transformation, m, colorTransform); + timeline.toImage(frame, time, renderContext, image, false, m, new Matrix(), m, colorTransform); return image; } @@ -3830,4 +3830,9 @@ public final class SWF implements SWFContainerItem, Timelined { removeTag(index); addTag(index, newTag); } + + @Override + public RECT getRectWithStrokes() { + return getRect(); + } } diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/exporters/shape/BitmapExporter.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/exporters/shape/BitmapExporter.java index 3a8c0f3ae..10f2d4cc8 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/exporters/shape/BitmapExporter.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/exporters/shape/BitmapExporter.java @@ -391,6 +391,9 @@ public class BitmapExporter extends ShapeExporterBase { case "NORMAL": thickness *= Math.max(strokeTransformation.scaleX, strokeTransformation.scaleY); break; + case "NONE": + thickness /= SWF.unitDivisor; + break; } if (thickness < 0) { @@ -405,8 +408,7 @@ public class BitmapExporter extends ShapeExporterBase { // Do not scale strokes automatically: try { - AffineTransform t = (AffineTransform) graphics.getTransform().clone(); - t.translate(-0.5, -0.5); + AffineTransform t = (AffineTransform) strokeTransformation.toTransform().clone();//(AffineTransform) graphics.getTransform().clone(); lineStroke = new TransformedStroke(lineStroke, t); } catch (NoninvertibleTransformException net) { // ignore diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/tags/DefineEditTextTag.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/tags/DefineEditTextTag.java index 2bb587495..a12fea001 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/tags/DefineEditTextTag.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/tags/DefineEditTextTag.java @@ -904,6 +904,11 @@ public class DefineEditTextTag extends TextTag { return bounds; } + @Override + public RECT getRectWithStrokes() { + return getRect(); + } + @Override public int getCharacterId() { return characterID; diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/tags/DefineSpriteTag.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/tags/DefineSpriteTag.java index 675435c0c..f3bbdaba6 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/tags/DefineSpriteTag.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/tags/DefineSpriteTag.java @@ -12,7 +12,8 @@ * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public - * License along with this library. */ + * License along with this library. + */ package com.jpexs.decompiler.flash.tags; import com.jpexs.decompiler.flash.ReadOnlyTagList; @@ -429,4 +430,9 @@ public class DefineSpriteTag extends DrawableTag implements Timelined { removeTag(index); addTag(index, newTag); } + + @Override + public RECT getRectWithStrokes() { + return getRect(); //? + } } diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/tags/DefineText2Tag.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/tags/DefineText2Tag.java index a9d5d79ef..98c205e7f 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/tags/DefineText2Tag.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/tags/DefineText2Tag.java @@ -12,7 +12,8 @@ * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public - * License along with this library. */ + * License along with this library. + */ package com.jpexs.decompiler.flash.tags; import com.jpexs.decompiler.flash.SWF; @@ -79,4 +80,9 @@ public class DefineText2Tag extends StaticTextTag { public int getTextNum() { return 2; } + + @Override + public RECT getRectWithStrokes() { + return getRect(); + } } diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/tags/DefineTextTag.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/tags/DefineTextTag.java index 7b049f20b..c75e960e8 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/tags/DefineTextTag.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/tags/DefineTextTag.java @@ -12,7 +12,8 @@ * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public - * License along with this library. */ + * License along with this library. + */ package com.jpexs.decompiler.flash.tags; import com.jpexs.decompiler.flash.SWF; @@ -79,4 +80,9 @@ public class DefineTextTag extends StaticTextTag { public int getTextNum() { return 1; } + + @Override + public RECT getRectWithStrokes() { + return getRect(); + } } diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/tags/DefineVideoStreamTag.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/tags/DefineVideoStreamTag.java index 10798bc9b..8fcca039b 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/tags/DefineVideoStreamTag.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/tags/DefineVideoStreamTag.java @@ -12,7 +12,8 @@ * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public - * License along with this library. */ + * License along with this library. + */ package com.jpexs.decompiler.flash.tags; import com.jpexs.decompiler.flash.SWF; @@ -143,4 +144,9 @@ public class DefineVideoStreamTag extends CharacterTag implements BoundedTag { public RECT getRect(Set added) { return new RECT(0, (int) (SWF.unitDivisor * width), 0, (int) (SWF.unitDivisor * height)); } + + @Override + public RECT getRectWithStrokes() { + return getRect(); + } } diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/tags/base/BoundedTag.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/tags/base/BoundedTag.java index 306619038..9c2e4545f 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/tags/base/BoundedTag.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/tags/base/BoundedTag.java @@ -12,7 +12,8 @@ * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public - * License along with this library. */ + * License along with this library. + */ package com.jpexs.decompiler.flash.tags.base; import com.jpexs.decompiler.flash.types.RECT; @@ -26,5 +27,7 @@ public interface BoundedTag { public RECT getRect(); + public RECT getRectWithStrokes(); + public RECT getRect(Set added); } diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/tags/base/ButtonTag.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/tags/base/ButtonTag.java index dfefcec6b..9d4555c13 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/tags/base/ButtonTag.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/tags/base/ButtonTag.java @@ -12,7 +12,8 @@ * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public - * License along with this library. */ + * License along with this library. + */ package com.jpexs.decompiler.flash.tags.base; import com.jpexs.decompiler.flash.ReadOnlyTagList; @@ -80,6 +81,11 @@ public abstract class ButtonTag extends DrawableTag implements Timelined { return getRect(new HashSet<>()); } + @Override + public RECT getRectWithStrokes() { + return getRect(); + } + @Override public int getUsedParameters() { return PARAMETER_FRAME | PARAMETER_TIME | PARAMETER_RATIO; // inner tags can contain morphshapes, too diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/tags/base/FontTag.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/tags/base/FontTag.java index 6a8140ee2..35f7a9673 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/tags/base/FontTag.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/tags/base/FontTag.java @@ -462,6 +462,11 @@ public abstract class FontTag extends DrawableTag implements AloneTag { return getRect(null); // parameter not used } + @Override + public RECT getRectWithStrokes() { + return getRect(); + } + @Override public RECT getRect(Set added) { return new RECT(0, (int) (PREVIEWSIZE * SWF.unitDivisor), 0, (int) (PREVIEWSIZE * SWF.unitDivisor)); diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/tags/base/ImageTag.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/tags/base/ImageTag.java index ad4c69510..53d8a3cd8 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/tags/base/ImageTag.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/tags/base/ImageTag.java @@ -12,7 +12,8 @@ * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public - * License along with this library. */ + * License along with this library. + */ package com.jpexs.decompiler.flash.tags.base; import com.jpexs.decompiler.flash.SWF; @@ -277,4 +278,9 @@ public abstract class ImageTag extends DrawableTag { public void setCharacterId(int characterId) { this.characterID = characterId; } + + @Override + public RECT getRectWithStrokes() { + return getRect(); + } } diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/tags/base/MorphShapeTag.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/tags/base/MorphShapeTag.java index 3cb80cfee..f7d4072d3 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/tags/base/MorphShapeTag.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/tags/base/MorphShapeTag.java @@ -12,7 +12,8 @@ * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public - * License along with this library. */ + * License along with this library. + */ package com.jpexs.decompiler.flash.tags.base; import com.jpexs.decompiler.flash.SWF; @@ -27,6 +28,8 @@ import com.jpexs.decompiler.flash.types.ColorTransform; import com.jpexs.decompiler.flash.types.FILLSTYLEARRAY; import com.jpexs.decompiler.flash.types.LINESTYLEARRAY; import com.jpexs.decompiler.flash.types.MORPHFILLSTYLEARRAY; +import com.jpexs.decompiler.flash.types.MORPHLINESTYLE; +import com.jpexs.decompiler.flash.types.MORPHLINESTYLE2; import com.jpexs.decompiler.flash.types.MORPHLINESTYLEARRAY; import com.jpexs.decompiler.flash.types.RECT; import com.jpexs.decompiler.flash.types.SHAPE; @@ -79,6 +82,38 @@ public abstract class MorphShapeTag extends DrawableTag { return getRect(new HashSet<>()); } + @Override + public RECT getRectWithStrokes() { + int shapeNum = getShapeNum(); + int maxWidth = 0; + if (shapeNum == 1) { + for (MORPHLINESTYLE ls : morphLineStyles.lineStyles) { + if (ls.startWidth > maxWidth) { + maxWidth = ls.startWidth; + } + if (ls.endWidth > maxWidth) { + maxWidth = ls.endWidth; + } + } + } + if (shapeNum == 2) { + for (MORPHLINESTYLE2 ls : morphLineStyles.lineStyles2) { + if (ls.startWidth > maxWidth) { + maxWidth = ls.startWidth; + } + if (ls.endWidth > maxWidth) { + maxWidth = ls.endWidth; + } + } + } + RECT r = getRect(); + r.Xmin -= maxWidth; + r.Ymin -= maxWidth; + r.Xmax += maxWidth; + r.Ymax += maxWidth; + return r; + } + @Override public void getNeededCharacters(Set needed) { morphFillStyles.getNeededCharacters(needed); diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/tags/base/ShapeTag.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/tags/base/ShapeTag.java index 81f447000..3b34e1106 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/tags/base/ShapeTag.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/tags/base/ShapeTag.java @@ -12,7 +12,8 @@ * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public - * License along with this library. */ + * License along with this library. + */ package com.jpexs.decompiler.flash.tags.base; import com.jpexs.decompiler.flash.SWF; @@ -27,9 +28,12 @@ import com.jpexs.decompiler.flash.exporters.shape.SVGShapeExporter; import com.jpexs.decompiler.flash.helpers.LazyObject; import com.jpexs.decompiler.flash.types.BasicType; import com.jpexs.decompiler.flash.types.ColorTransform; +import com.jpexs.decompiler.flash.types.LINESTYLE; import com.jpexs.decompiler.flash.types.RECT; import com.jpexs.decompiler.flash.types.SHAPEWITHSTYLE; import com.jpexs.decompiler.flash.types.annotations.SWFType; +import com.jpexs.decompiler.flash.types.shaperecords.SHAPERECORD; +import com.jpexs.decompiler.flash.types.shaperecords.StyleChangeRecord; import com.jpexs.helpers.ByteArrayRange; import com.jpexs.helpers.SerializableImage; import java.awt.Color; @@ -123,6 +127,39 @@ public abstract class ShapeTag extends DrawableTag implements LazyObject { return getRect(null); // parameter not used } + @Override + public RECT getRectWithStrokes() { + + + int maxWidth = 0; + for (LINESTYLE ls : getShapes().lineStyles.lineStyles) { + if (ls.width > maxWidth) { + maxWidth = ls.width; + } + } + for (SHAPERECORD sr : getShapes().shapeRecords) { + if (sr instanceof StyleChangeRecord) { + StyleChangeRecord scr = (StyleChangeRecord) sr; + if (scr.stateNewStyles) { + for (LINESTYLE ls : scr.lineStyles.lineStyles) { + if (ls.width > maxWidth) { + maxWidth = ls.width; + } + } + } + } + } + + RECT r = getRect(); + r.Xmin -= maxWidth; + r.Ymin -= maxWidth; + r.Xmax += maxWidth; + r.Ymax += maxWidth; + + return r; + } + + @Override public int getUsedParameters() { return 0; diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/tags/gfx/DefineCompactedFont.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/tags/gfx/DefineCompactedFont.java index d9b6b4daf..d8bff85fe 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/tags/gfx/DefineCompactedFont.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/tags/gfx/DefineCompactedFont.java @@ -529,4 +529,9 @@ public final class DefineCompactedFont extends FontTag { public boolean isLeadingEditable() { return true; } + + @Override + public RECT getRectWithStrokes() { + return getRect(); + } } diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/timeline/Timeline.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/timeline/Timeline.java index e97f1ea5b..4e6dba9b8 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/timeline/Timeline.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/timeline/Timeline.java @@ -612,12 +612,14 @@ public class Timeline { drawableFrameCount = 1; } - RECT boundRect = drawable.getRect(); + RECT boundRect = drawable.getRectWithStrokes(); ExportRectangle rect = new ExportRectangle(boundRect); Matrix mat = transformation.concatenate(layerMatrix); rect = mat.transform(rect); + strokeTransform = strokeTransform.concatenate(layerMatrix); + boolean cacheAsBitmap = layer.cacheAsBitmap() && layer.placeObjectTag != null && drawable.isSingleFrame(); /* // draw bounds AffineTransform trans = mat.preConcatenate(Matrix.getScaleInstance(1 / SWF.unitDivisor)).toTransform(); @@ -682,6 +684,8 @@ public class Timeline { } Matrix m = mat.preConcatenate(Matrix.getTranslateInstance(-rect.xMin, -rect.yMin)); + + //strokeTransform = strokeTransform.preConcatenate(Matrix.getTranslateInstance(-rect.xMin, -rect.yMin)); //strokeTransform = strokeTransform.clone(); //strokeTransform.translate(-rect.xMin, -rect.yMin); diff --git a/libsrc/ffdec_lib/testdata/graphics/graphics.swf b/libsrc/ffdec_lib/testdata/graphics/graphics.swf index ca0133366..46a0b9ad4 100644 Binary files a/libsrc/ffdec_lib/testdata/graphics/graphics.swf and b/libsrc/ffdec_lib/testdata/graphics/graphics.swf differ diff --git a/libsrc/ffdec_lib/testdata/graphics/graphics/DOMDocument.xml b/libsrc/ffdec_lib/testdata/graphics/graphics/DOMDocument.xml index 0420d2f20..e35fcc660 100644 --- a/libsrc/ffdec_lib/testdata/graphics/graphics/DOMDocument.xml +++ b/libsrc/ffdec_lib/testdata/graphics/graphics/DOMDocument.xml @@ -3,8 +3,8 @@ - - + + @@ -20,13 +20,15 @@ - - + + + + - + @@ -38,7 +40,7 @@ - + @@ -113,7 +115,7 @@ - + @@ -1128,7 +1130,7 @@ - + @@ -1136,7 +1138,7 @@ - + @@ -1144,7 +1146,7 @@ - + @@ -1152,7 +1154,126 @@ - + + + + + + + + + + + + + scale:normal + + + + + + + + + + + + + + + + scale:none + + + + + + + + + + + + + + + + + + + + + scale:horizontal + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + scale:vertical + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -1827,7 +1948,7 @@ - + @@ -3023,6 +3144,12 @@ + + + + + + @@ -3037,11 +3164,5 @@ - - - - - - \ No newline at end of file diff --git a/libsrc/ffdec_lib/testdata/graphics/graphics/LIBRARY/Stroke 1.xml b/libsrc/ffdec_lib/testdata/graphics/graphics/LIBRARY/Stroke 1.xml index 97ee897d7..552de12a2 100644 --- a/libsrc/ffdec_lib/testdata/graphics/graphics/LIBRARY/Stroke 1.xml +++ b/libsrc/ffdec_lib/testdata/graphics/graphics/LIBRARY/Stroke 1.xml @@ -1,4 +1,4 @@ - + @@ -17,7 +17,7 @@ - + diff --git a/libsrc/ffdec_lib/testdata/graphics/graphics/LIBRARY/Stroke 2.xml b/libsrc/ffdec_lib/testdata/graphics/graphics/LIBRARY/Stroke 2.xml index f072479c6..04daaf1d8 100644 --- a/libsrc/ffdec_lib/testdata/graphics/graphics/LIBRARY/Stroke 2.xml +++ b/libsrc/ffdec_lib/testdata/graphics/graphics/LIBRARY/Stroke 2.xml @@ -1,4 +1,4 @@ - + @@ -17,7 +17,7 @@ - + diff --git a/libsrc/ffdec_lib/testdata/graphics/graphics/LIBRARY/Stroke 3.xml b/libsrc/ffdec_lib/testdata/graphics/graphics/LIBRARY/Stroke 3.xml new file mode 100644 index 000000000..28b3a7eee --- /dev/null +++ b/libsrc/ffdec_lib/testdata/graphics/graphics/LIBRARY/Stroke 3.xml @@ -0,0 +1,30 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/libsrc/ffdec_lib/testdata/graphics/graphics/LIBRARY/Stroke 4.xml b/libsrc/ffdec_lib/testdata/graphics/graphics/LIBRARY/Stroke 4.xml new file mode 100644 index 000000000..e225fcb52 --- /dev/null +++ b/libsrc/ffdec_lib/testdata/graphics/graphics/LIBRARY/Stroke 4.xml @@ -0,0 +1,30 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/libsrc/ffdec_lib/testdata/graphics/graphics/bin/SymDepend.cache b/libsrc/ffdec_lib/testdata/graphics/graphics/bin/SymDepend.cache index f1554d5cf..a80ebf82a 100644 Binary files a/libsrc/ffdec_lib/testdata/graphics/graphics/bin/SymDepend.cache and b/libsrc/ffdec_lib/testdata/graphics/graphics/bin/SymDepend.cache differ diff --git a/src/com/jpexs/decompiler/flash/gui/ImagePanel.java b/src/com/jpexs/decompiler/flash/gui/ImagePanel.java index 6c8b1b6d7..4514068d1 100644 --- a/src/com/jpexs/decompiler/flash/gui/ImagePanel.java +++ b/src/com/jpexs/decompiler/flash/gui/ImagePanel.java @@ -1646,7 +1646,7 @@ public final class ImagePanel extends JPanel implements MediaDisplay { timeline.getFrame(frame).layers.get(freeTransformDepth).matrix = newMatrix; } - timeline.toImage(frame, time, renderContext, image, false, m, m, m, null); + timeline.toImage(frame, time, renderContext, image, false, m, new Matrix(), m, null); Graphics2D gg = (Graphics2D) image.getGraphics(); gg.setStroke(new BasicStroke(3)); diff --git a/src/com/jpexs/decompiler/flash/gui/MainPanel.java b/src/com/jpexs/decompiler/flash/gui/MainPanel.java index 5b47c7c32..82de02f15 100644 --- a/src/com/jpexs/decompiler/flash/gui/MainPanel.java +++ b/src/com/jpexs/decompiler/flash/gui/MainPanel.java @@ -3981,6 +3981,11 @@ public final class MainPanel extends JPanel implements TreeSelectionListener, Se @Override public void replaceTag(int index, Tag newTag) { } + + @Override + public RECT getRectWithStrokes() { + return getRect(); + } }; }