feat: add advanced multi sample anti-aliased shape renderer

Multi sample anti-alias renderer with configurable grid.
It can be turned on with icon under render window,
and with checkbox for export.
This commit is contained in:
Jindra Petřík
2026-04-03 08:11:19 +02:00
parent 0938f5cbad
commit 74b4e957a6
34 changed files with 2176 additions and 182 deletions

View File

@@ -2332,7 +2332,7 @@ public class CommandLineArgumentParser {
}
}
int aaScale = Configuration.reduceAntialiasConflationByScalingForExport.get() ? Configuration.reduceAntialiasConflationByScalingValueForExport.get() : 1;
int aaScale = Configuration.useMsaaForExport.get() ? Configuration.msaaGridForExport.get() : 1;
// Here the exportFormats array should contain only validitems
commandLineMode = true;
@@ -3014,7 +3014,7 @@ public class CommandLineArgumentParser {
File outFile = new File(args.pop());
printHeader();
int aaScale = Configuration.reduceAntialiasConflationByScalingForExport.get() ? Configuration.reduceAntialiasConflationByScalingValueForExport.get() : 1;
int aaScale = Configuration.useMsaaForExport.get() ? Configuration.msaaGridForExport.get() : 1;
try (StdInAwareFileInputStream is = new StdInAwareFileInputStream(inFile)) {

View File

@@ -174,6 +174,8 @@ public class ExportDialog extends AppDialog {
private JCheckBox transparentFrameBackgroundCheckBox;
private JCheckBox antialiasCheckBox;
private JTextField durationTextField = new JTextField(4);
private JTextField numberOfFramesTextField = new JTextField(4);
@@ -276,6 +278,8 @@ public class ExportDialog extends AppDialog {
}
}
Configuration.useMsaaForExport.set(antialiasCheckBox.isSelected());
StringBuilder cfg = new StringBuilder();
for (int i = 0; i < optionNames.length; i++) {
Object val = ((ComboValue) combos[i].getSelectedItem()).value;
@@ -347,6 +351,70 @@ public class ExportDialog extends AppDialog {
numberOfFramesTextField.setVisible(mode.hasFrames());
}
boolean aaVisible = false;
if (isOptionEnabled(FrameExportMode.class)) {
FrameExportMode mode = getValue(FrameExportMode.class);
switch (mode) {
case CANVAS:
case PDF:
case SWF:
case SVG:
break;
default:
aaVisible = true;
}
}
if (isOptionEnabled(SpriteExportMode.class)) {
SpriteExportMode mode = getValue(SpriteExportMode.class);
switch (mode) {
case CANVAS:
case PDF:
case SWF:
case SVG:
break;
default:
aaVisible = true;
}
}
if (isOptionEnabled(ButtonExportMode.class)) {
ButtonExportMode mode = getValue(ButtonExportMode.class);
switch (mode) {
case SWF:
case SVG:
case SVG_COMBINED:
break;
default:
aaVisible = true;
}
}
if (isOptionEnabled(ShapeExportMode.class)) {
ShapeExportMode mode = getValue(ShapeExportMode.class);
switch (mode) {
case CANVAS:
case SWF:
case SVG:
break;
default:
aaVisible = true;
}
}
if (isOptionEnabled(MorphShapeExportMode.class)) {
MorphShapeExportMode mode = getValue(MorphShapeExportMode.class);
switch (mode) {
case CANVAS:
case SWF:
case SVG:
case SVG_FRAMES:
case SVG_START_END:
break;
default:
aaVisible = true;
}
}
antialiasCheckBox.setVisible(aaVisible);
transparentFrameBackgroundCheckBox.setVisible(isOptionEnabled(FrameExportMode.class));
boolean hasZoom = false;
@@ -521,14 +589,13 @@ public class ExportDialog extends AppDialog {
label.setLabelFor(combos[i]);
}
gbc.gridy++;
gbc.gridx = 0;
gbc.gridwidth = 5;
gbc.fill = GridBagConstraints.BOTH;
comboPanel.add(new JPanel(), gbc);
gbc.insets = new Insets(2, 2, 2, 2);
embedCheckBox = new JCheckBox(translate("embed"));
@@ -571,6 +638,24 @@ public class ExportDialog extends AppDialog {
}
}
antialiasCheckBox = new JCheckBox(translate("antialias"));
antialiasCheckBox.setToolTipText(translate("antialias.hint"));
antialiasCheckBox.setVisible(false);
if (Configuration.useMsaaForExport.get()) {
antialiasCheckBox.setSelected(true);
}
if (visibleOptionClasses.contains(FrameExportMode.class)
|| visibleOptionClasses.contains(ButtonExportMode.class)
|| visibleOptionClasses.contains(ShapeExportMode.class)
|| visibleOptionClasses.contains(MorphShapeExportMode.class)
|| visibleOptionClasses.contains(SpriteExportMode.class)) {
gbc.gridy++;
antialiasCheckBox.setVisible(true);
comboPanel.add(antialiasCheckBox, gbc);
}
durationTextField.setVisible(false);
numberOfFramesTextField.setVisible(false);
if (visibleOptionClasses.contains(MorphShapeExportMode.class)) {

View File

@@ -308,7 +308,7 @@ public class FolderPreviewPanel extends JPanel {
treeItem = ((SceneFrame) treeItem).getFrame();
}
int aaScale = Configuration.reduceAntialiasConflationByScalingForDisplay.get() ? Configuration.reduceAntialiasConflationByScalingValueForDisplay.get() : 1;
int aaScale = Configuration.useMsaaForDisplay.get() ? Configuration.msaaGridForDisplay.get() : 1;
if (treeItem instanceof Frame) {
Frame fn = (Frame) treeItem;
@@ -333,8 +333,6 @@ public class FolderPreviewPanel extends JPanel {
String key = "frame_" + fn.frame + "_" + timeline.id + "_" + zoom;
imgSrc = swf.getFromCache(key);
if (imgSrc == null) {
aaScale = Configuration.calculateRealAaScale(rect.getWidth(), rect.getHeight(), zoom, aaScale);
imgSrc = SWF.frameToImageGet(timeline, fn.frame, 0, null, 0, rect, new Matrix(), null, swf.getBackgroundColor() == null ? null : swf.getBackgroundColor().backgroundColor.toColor(), zoom, !Configuration.disableBitmapSmoothing.get(), aaScale);
swf.putToCache(key, imgSrc);
}
@@ -385,23 +383,14 @@ public class FolderPreviewPanel extends JPanel {
return null;
}
aaScale = Configuration.calculateRealAaScale(width, height, 1, aaScale);
if (imgSrc == null) {
m = m.preConcatenate(Matrix.getScaleInstance(scale * aaScale));
m = m.preConcatenate(Matrix.getScaleInstance(scale));
DrawableTag drawable = (DrawableTag) treeItem;
ExportRectangle viewRectangle = new ExportRectangle(0, 0, ow, oh);
SerializableImage imageLarger = new SerializableImage(width * aaScale, height * aaScale, SerializableImage.TYPE_INT_ARGB);
SerializableImage imageLarger = new SerializableImage(width, height, SerializableImage.TYPE_INT_ARGB);
imageLarger.fillTransparent();
drawable.toImage(0, 0, 0, new RenderContext(), imageLarger, imageLarger, false, m, new Matrix(), m, m, null, scale * aaScale, false, viewRectangle, viewRectangle, true, Timeline.DRAW_MODE_ALL, 0, !Configuration.disableBitmapSmoothing.get(), aaScale);
if (aaScale > 1) {
SerializableImage imageNormalSize = new SerializableImage(width, height, SerializableImage.TYPE_INT_ARGB);
imageNormalSize.fillTransparent();
imageNormalSize.getGraphics().drawImage(imageLarger.getBufferedImage().getScaledInstance(width, height, Image.SCALE_SMOOTH), 0, 0, null);
return imageNormalSize;
}
drawable.toImage(0, 0, 0, new RenderContext(), imageLarger, imageLarger, false, m, new Matrix(), m, m, null, scale, false, viewRectangle, viewRectangle, true, Timeline.DRAW_MODE_ALL, 0, !Configuration.disableBitmapSmoothing.get(), aaScale);
return imageLarger;
}

View File

@@ -5081,7 +5081,7 @@ public final class ImagePanel extends JPanel implements MediaDisplay {
Matrix m = Matrix.getTranslateInstance(-rect.Xmin * zoomDouble, -rect.Ymin * zoomDouble);
m.scale(zoomDouble);
int aaScale = Configuration.reduceAntialiasConflationByScalingForDisplay.get() ? Configuration.reduceAntialiasConflationByScalingValueForDisplay.get() : 1;
int aaScale = Configuration.useMsaaForDisplay.get() ? Configuration.msaaGridForDisplay.get() : 1;
textTag.toImage(0, 0, 0, new RenderContext(), image, image, false, m, m, m, m, new ConstantColorColorTransform(0xFFC0C0C0), zoomDouble, false, new ExportRectangle(rect), new ExportRectangle(rect), true, Timeline.DRAW_MODE_ALL, 0, false, aaScale);
@@ -5217,12 +5217,10 @@ public final class ImagePanel extends JPanel implements MediaDisplay {
) {
Timeline timeline = drawable.getTimeline();
SerializableImage img;
int aaScale = Configuration.reduceAntialiasConflationByScalingForDisplay.get() ? Configuration.reduceAntialiasConflationByScalingValueForDisplay.get() : 1;
int aaScale = Configuration.useMsaaForDisplay.get() ? Configuration.msaaGridForDisplay.get() : 1;
aaScale = Configuration.calculateRealAaScale((int) viewRect.getWidth(), (int) viewRect.getHeight(), zoom, aaScale);
int width = aaScale * (int) (viewRect.getWidth() * zoom);
int height = aaScale * (int) (viewRect.getHeight() * zoom);
int width = (int) (viewRect.getWidth() * zoom);
int height = (int) (viewRect.getHeight() * zoom);
if (width == 0) {
width = 1;
}
@@ -5231,18 +5229,14 @@ public final class ImagePanel extends JPanel implements MediaDisplay {
}
Rectangle realRectAA = new Rectangle(realRect);
realRectAA.x *= aaScale;
realRectAA.y *= aaScale;
realRectAA.width *= aaScale;
realRectAA.height *= aaScale;
SerializableImage image = new SerializableImage((int) Math.ceil(width / SWF.unitDivisor),
(int) Math.ceil(height / SWF.unitDivisor), SerializableImage.TYPE_INT_ARGB);
image.fillTransparent();
Matrix m = new Matrix();
m.translate(-viewRect.xMin * zoom * aaScale, -viewRect.yMin * zoom * aaScale);
m.scale(zoom * aaScale);
m.translate(-viewRect.xMin * zoom, -viewRect.yMin * zoom);
m.scale(zoom);
Matrix fullM = m.clone();
@@ -5279,7 +5273,7 @@ public final class ImagePanel extends JPanel implements MediaDisplay {
if (Configuration.showGrid.get() && (drawable instanceof SWF) && !Configuration.gridOverObjects.get()) {
Graphics2D g = (Graphics2D) image.getBufferedImage().getGraphics();
drawGridSwf(g, realRectAA, zoom * aaScale);
drawGridSwf(g, realRectAA, zoom);
}
parentMatrix = new Matrix();
@@ -5291,7 +5285,7 @@ public final class ImagePanel extends JPanel implements MediaDisplay {
ignoreDepths.add(parentDepthState.depth);
if (Configuration.halfTransparentParentLayersEasy.get()) {
parentTimelined.getTimeline().toImage(parentFrames.get(i), 0, new RenderContext(), image, image, false,
parentMatrix.preConcatenate(m), new Matrix(), parentMatrix.preConcatenate(m), null, zoom * aaScale, true, viewRect, viewRect, parentMatrix.preConcatenate(m), true, Timeline.DRAW_MODE_ALL, 0, !Configuration.disableBitmapSmoothing.get(),
parentMatrix.preConcatenate(m), new Matrix(), parentMatrix.preConcatenate(m), null, zoom, true, viewRect, viewRect, parentMatrix.preConcatenate(m), true, Timeline.DRAW_MODE_ALL, 0, !Configuration.disableBitmapSmoothing.get(),
ignoreDepths, aaScale);
}
parentMatrix = parentMatrix.concatenate(new Matrix(parentDepthState.matrix));
@@ -5304,12 +5298,9 @@ public final class ImagePanel extends JPanel implements MediaDisplay {
g.fillRect(realRectAA.x, realRectAA.y, realRectAA.width, realRectAA.height);
}
timeline.toImage(frame, time, renderContext, image, image, false, parentMatrix.preConcatenate(m), new Matrix(), parentMatrix.preConcatenate(m), null, zoom * aaScale, true, viewRect, viewRect, parentMatrix.preConcatenate(m), true, Timeline.DRAW_MODE_ALL, 0, !Configuration.disableBitmapSmoothing.get(), ignoreDepths, aaScale);
if (Configuration.reduceAntialiasConflationByScalingForDisplay.get()) {
image = new SerializableImage(ImageResizer.resizeImage(image.getBufferedImage(), image.getWidth() / aaScale, image.getHeight() / aaScale, RenderingHints.VALUE_INTERPOLATION_BICUBIC, true));
}
timeline.toImage(frame, time, renderContext, image, image, false, parentMatrix.preConcatenate(m), new Matrix(), parentMatrix.preConcatenate(m), null, zoom, true, viewRect, viewRect, parentMatrix.preConcatenate(m), true, Timeline.DRAW_MODE_ALL, 0, !Configuration.disableBitmapSmoothing.get(), ignoreDepths, aaScale);
Graphics2D gg = (Graphics2D) image.getGraphics();
gg.setStroke(new BasicStroke(3));
gg.setPaint(Color.green);
@@ -5885,12 +5876,14 @@ public final class ImagePanel extends JPanel implements MediaDisplay {
first = false;
CharacterTag c = ds.getCharacter();
ret.append(tagNameResolver.getTagName(c));
if (ds.depth > -1) {
ret.append(" ");
ret.append(AppStrings.translate("imagePanel.depth"));
ret.append(" ");
ret.append(ds.depth);
if (c != null) {
ret.append(tagNameResolver.getTagName(c));
if (ds.depth > -1) {
ret.append(" ");
ret.append(AppStrings.translate("imagePanel.depth"));
ret.append(" ");
ret.append(ds.depth);
}
}
}

View File

@@ -2275,7 +2275,7 @@ public final class MainPanel extends JPanel implements TreeSelectionListener, Se
selFile2 = selFile;
}
int aaScale = Configuration.reduceAntialiasConflationByScalingForExport.get() ? Configuration.reduceAntialiasConflationByScalingValueForExport.get() : 1;
int aaScale = Configuration.useMsaaForExport.get() ? Configuration.msaaGridForExport.get() : 1;
EventListener evl = swf.getExportEventListener();
@@ -2395,7 +2395,7 @@ public final class MainPanel extends JPanel implements TreeSelectionListener, Se
return;
}
int aaScale = Configuration.reduceAntialiasConflationByScalingForExport.get() ? Configuration.reduceAntialiasConflationByScalingValueForExport.get() : 1;
int aaScale = Configuration.useMsaaForExport.get() ? Configuration.msaaGridForExport.get() : 1;
EventListener evl = swf.getExportEventListener();
@@ -2491,7 +2491,7 @@ public final class MainPanel extends JPanel implements TreeSelectionListener, Se
public void exportAllDebug(SWF swf, AbortRetryIgnoreHandler handler, String selFile, ExportDialog export) throws IOException, InterruptedException {
EventListener evl = swf.getExportEventListener();
int aaScale = Configuration.reduceAntialiasConflationByScalingForExport.get() ? Configuration.reduceAntialiasConflationByScalingValueForExport.get() : 1;
int aaScale = Configuration.useMsaaForExport.get() ? Configuration.msaaGridForExport.get() : 1;
if (export.isOptionEnabled(ImageExportMode.class)) {
for (ImageExportMode exportMode : ImageExportMode.values()) {
@@ -5667,7 +5667,7 @@ public final class MainPanel extends JPanel implements TreeSelectionListener, Se
try {
AbortRetryIgnoreHandler errorHandler = new GuiAbortRetryIgnoreHandler();
int aaScale = Configuration.reduceAntialiasConflationByScalingForExport.get() ? Configuration.reduceAntialiasConflationByScalingValueForExport.get() : 1;
int aaScale = Configuration.useMsaaForExport.get() ? Configuration.msaaGridForExport.get() : 1;
FrameExporter frameExporter = new FrameExporter();
FrameExportSettings fes = new FrameExportSettings(mode, dialog.getZoom(), dialog.isTransparentFrameBackgroundEnabled(), aaScale);

Binary file not shown.

After

Width:  |  Height:  |  Size: 372 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 571 B

View File

@@ -679,3 +679,15 @@ config.description.svgExportGaussianBlur = Use gaussian blur instead of box blur
#after 25.1.3
config.name.exportFlaAs3DisableScriptLayer = FLA export - AS3 - disable script layer
config.description.exportFlaAs3DisableScriptLayer = In ActionScript 3 FLA export, the scripts in frames will stay inside class they belong, instead of putting them separately to Script layer. True = in class, False = in Script layer.
config.name.useMsaaForDisplay = Use Multi sample Anti-aliasing (Display)
config.description.useMsaaForDisplay = Use Multi sample Anti-aliasing 4x4 for display purposes.
config.name.useMsaaForExport = Use Multi sample Anti-aliasing (Export)
config.description.useMsaaForExport = Use Multi sample Anti-aliasing 4x4 for export purposes.
config.name.msaaGridForDisplay = Multi sample Anti-aliasing Grid (Display)
config.description.msaaGridForDisplay = Multi sample Anti-aliasing grid size NxN for display purposes.
config.name.msaaGridForExport = Multi sample Anti-aliasing Grid (Export)
config.description.msaaGridForExport = Multi sample Anti-aliasing grid size NxN for display purposes.

View File

@@ -679,3 +679,15 @@ config.description.svgExportGaussianBlur = Pou\u017e\u00edt gaussovsk\u00fd blur
#after 25.1.3
config.name.exportFlaAs3DisableScriptLayer = Export FLA \u2013 AS3 - zak\u00e1zat vrstvu skript\u016f
config.description.exportFlaAs3DisableScriptLayer = P\u0159i exportu ActionScript 3 FLA z\u016fstanou skripty ve sn\u00edmc\u00edch uvnit\u0159 t\u0159\u00eddy, do kter\u00e9 pat\u0159\u00ed, m\u00edsto aby byly odd\u011blen\u011b um\u00edst\u011bny do vrstvy Script. True = ve t\u0159\u00edd\u011b, False = ve vrstv\u011b Script.
config.name.useMsaaForDisplay = Pou\u017e\u00edt v\u00edcen\u00e1sobn\u00e9 vyhlazov\u00e1n\u00ed (Zobrazen\u00ed)
config.description.useMsaaForDisplay = Pou\u017e\u00edt v\u00edcen\u00e1sobn\u00e9 vyhlazov\u00e1n\u00ed 4x4 pro \u00fa\u010dely zobrazen\u00ed.
config.name.useMsaaForExport = Pou\u017e\u00edt v\u00edcen\u00e1sobn\u00e9 vyhlazov\u00e1n\u00ed (Export)
config.description.useMsaaForExport = Pou\u017e\u00edt v\u00edcen\u00e1sobn\u00e9 vyhlazov\u00e1n\u00ed 4x4 pro \u00fa\u010dely exportu.
config.name.msaaGridForDisplay = M\u0159\u00ed\u017eka v\u00edcen\u00e1sobn\u00e9ho vyhlazov\u00e1n\u00ed (Zobrazen\u00ed)
config.description.msaaGridForDisplay = Velikost m\u0159\u00ed\u017eky v\u00edcen\u00e1sobn\u00e9ho vyhlazov\u00e1n\u00ed NxN pro \u00fa\u010dely zobrazen\u00ed.
config.name.msaaGridForExport = M\u0159\u00ed\u017eka v\u00edcen\u00e1sobn\u00e9ho vyhlazov\u00e1n\u00ed (Export)
config.description.msaaGridForExport = Velikost m\u0159\u00ed\u017eky v\u00edcen\u00e1sobn\u00e9ho vyhlazov\u00e1n\u00ed NxN pro \u00fa\u010dely zobrazen\u00ed.

View File

@@ -608,3 +608,15 @@ config.description.svgExportGaussianBlur = Beim SVG-Export den gau\u00dfschen We
#after 25.1.3
config.name.exportFlaAs3DisableScriptLayer = FLA-Export \u2013 AS3 - Skriptebene deaktivieren
config.description.exportFlaAs3DisableScriptLayer = Beim Export von ActionScript 3 FLA bleiben die Skripte in Frames innerhalb der Klasse, zu der sie geh\u00f6ren, anstatt separat in die Skriptebene verschoben zu werden. True = in der Klasse, False = in der Skriptebene.
config.name.useMsaaForDisplay = Multisample-Anti-Aliasing verwenden (Anzeige)
config.description.useMsaaForDisplay = Multisample-Anti-Aliasing 4x4 f\u00fcr Anzeigezwecke verwenden.
config.name.useMsaaForExport = Multisample-Anti-Aliasing verwenden (Export)
config.description.useMsaaForExport = Multisample-Anti-Aliasing 4x4 f\u00fcr Exportzwecke verwenden.
config.name.msaaGridForDisplay = Multisample-Anti-Aliasing-Raster (Anzeige)
config.description.msaaGridForDisplay = Rastergr\u00f6\u00dfe NxN f\u00fcr Multisample-Anti-Aliasing f\u00fcr Anzeigezwecke.
config.name.msaaGridForExport = Multisample-Anti-Aliasing-Raster (Export)
config.description.msaaGridForExport = Rastergr\u00f6\u00dfe NxN pro Multisample-Anti-Aliasing pro Anzeigezwecke.

View File

@@ -679,3 +679,15 @@ config.description.svgExportGaussianBlur = Pou\u017ei\u0165 gaussovsk\u00fd blur
#after 25.1.3
config.name.exportFlaAs3DisableScriptLayer = Export FLA \u2013 AS3 - zak\u00e1za\u0165 vrstvu skriptov
config.description.exportFlaAs3DisableScriptLayer = Pri exporte ActionScript 3 FLA zostan\u00fa skripty v sn\u00edmkach vn\u00fatri triedy, do ktorej patria, namiesto toho, aby boli oddelene umiestnen\u00e9 do vrstvy Script. True = v triede, False = vo vrstve Script.
config.name.useMsaaForDisplay = Pou\u017ei\u0165 viacn\u00e1sobn\u00e9 vyhladzovanie (Zobrazenie)
config.description.useMsaaForDisplay = Pou\u017ei\u0165 viacn\u00e1sobn\u00e9 vyhladzovanie 4x4 na \u00fa\u010dely zobrazenia.
config.name.useMsaaForExport = Pou\u017ei\u0165 viacn\u00e1sobn\u00e9 vyhladzovanie (Export)
config.description.useMsaaForExport = Pou\u017ei\u0165 viacn\u00e1sobn\u00e9 vyhladzovanie 4x4 na \u00fa\u010dely exportu.
config.name.msaaGridForDisplay = Mrie\u017eka viacn\u00e1sobn\u00e9ho vyhladzovania (Zobrazenie)
config.description.msaaGridForDisplay = Ve\u013ekos\u0165 mrie\u017eky viacn\u00e1sobn\u00e9ho vyhladzovania NxN na \u00fa\u010dely zobrazenia.
config.name.msaaGridForExport = Mrie\u017eka viacn\u00e1sobn\u00e9ho vyhladzovania (Export)
config.description.msaaGridForExport = Ve\u013ekos\u0165 mrie\u017eky viacn\u00e1sobn\u00e9ho vyhladzovania NxN na \u00fa\u010dely zobrazenia.

View File

@@ -124,3 +124,6 @@ morphshapes.apng = APNG
#after 25.1.3
buttons.svg_combined = SVG combined
antialias = Use advanced MSAA renderer (slow)
antialias.hint = Use advanced renderer with multi sample anti-aliasing. More precise, but slower than standard renderer. Use for seamless shape rendering.

View File

@@ -122,3 +122,7 @@ arrow = \ud83e\udc06
#after 25.1.3
buttons.svg_combined = SVG kombinovan\u00e9
antialias = Pou\u017e\u00edt pokro\u010dil\u00fd MSAA renderer (pomal\u00e9)
antialias.hint = Pou\u017e\u00edt pokro\u010dil\u00fd renderer s v\u00edcen\u00e1sobn\u00fdm vyhlazov\u00e1n\u00edm. P\u0159esn\u011bj\u0161\u00ed, ale pomalej\u0161\u00ed ne\u017e standardn\u00ed renderer. Vhodn\u00e9 pro vykreslov\u00e1n\u00ed tvar\u016f bez \u0161v\u016f.

View File

@@ -119,3 +119,6 @@ morphshapes.apng = APNG
#after 25.1.3
buttons.svg_combined = SVG kombiniertes
antialias = Erweiterter MSAA-Renderer verwenden (langsam)
antialias.hint = Erweiterter Renderer mit Multisample-Anti-Aliasing verwenden. Pr\u00e4ziser, aber langsamer als der Standard-Renderer. Geeignet f\u00fcr nahtloses Rendern ohne sichtbare \u00dcberg\u00e4nge zwischen Formen.

View File

@@ -124,3 +124,6 @@ morphshapes.apng = APNG
#after 25.1.3
buttons.svg_combined = SVG kombinovan\u00e9
antialias = Pou\u017ei\u0165 pokro\u010dil\u00fd MSAA renderer (pomal\u00e9)
antialias.hint = Pou\u017ei\u0165 pokro\u010dil\u00fd renderer s viacn\u00e1sobn\u00fdm vyhladzovan\u00edm. Presnej\u0161\u00ed, ale pomal\u0161\u00ed ne\u017e \u0161tandardn\u00fd renderer. Vhodn\u00e9 pre vykres\u013eovanie tvarov bez \u0161vov.

View File

@@ -1149,4 +1149,6 @@ contextmenu.exportXaml = Export XAML
menu.file.import.bulkImport = Bulk import...
menu.file.import.createTagFromFile = Create tag from file...
contextmenu.convertTextType = Convert text type
contextmenu.convertTextType = Convert text type
button.antialias.hint = Use advanced renderer with multi sample anti-aliasing (slow)

View File

@@ -1149,4 +1149,6 @@ contextmenu.exportXaml = Exportovat XAML
menu.file.import.bulkImport = Hromadn\u00fd import...
menu.file.import.createTagFromFile = Vytvo\u0159it tag ze souboru...
contextmenu.convertTextType = Konvertovat typ textu
contextmenu.convertTextType = Konvertovat typ textu
button.antialias.hint = Pou\u017e\u00edt pokro\u010dil\u00fd renderer s v\u00edcen\u00e1sobn\u00fdm vyhlazov\u00e1n\u00edm (pomal\u00e9)

View File

@@ -1010,4 +1010,6 @@ contextmenu.exportXaml = Exportiere als XAML
menu.file.import.bulkImport = Massenimport...
menu.file.import.createTagFromFile = Tag aus Datei erstellen...
contextmenu.convertTextType = Texttyp konvertieren
contextmenu.convertTextType = Texttyp konvertieren
button.antialias.hint = Erweiterter Renderer mit Multisample-Anti-Aliasing verwenden (langsam)

View File

@@ -1149,4 +1149,6 @@ contextmenu.exportXaml = Exportova\u0165 XAML
menu.file.import.bulkImport = Hromadn\u00fd import...
menu.file.import.createTagFromFile = Vytvori\u0165 tag zo s\u00faboru...
contextmenu.convertTextType = Konvertova\u0165 typ textu
contextmenu.convertTextType = Konvertova\u0165 typ textu
button.antialias.hint = Pou\u017ei\u0165 pokro\u010dil\u00fd renderer s viacn\u00e1sobn\u00fdm vyhladzovan\u00edm (pomal\u00e9)

View File

@@ -17,6 +17,7 @@
package com.jpexs.decompiler.flash.gui.player;
import com.jpexs.decompiler.flash.configuration.Configuration;
import com.jpexs.decompiler.flash.configuration.ConfigurationItemChangeListener;
import com.jpexs.decompiler.flash.gui.AppStrings;
import com.jpexs.decompiler.flash.gui.MainPanel;
import com.jpexs.decompiler.flash.gui.View;
@@ -125,7 +126,9 @@ public class PlayerControls extends JPanel implements MediaDisplayListener {
private final int zeroCharacterWidth;
private JButton selectColorButton;
private final JButton selectColorButton;
private JToggleButton msaaButton;
static {
Font font = new JLabel().getFont();
@@ -152,6 +155,19 @@ public class PlayerControls extends JPanel implements MediaDisplayListener {
selectColorButton = new JButton(View.getIcon("color16"));
selectColorButton.addActionListener(this::selectBkColorButtonActionPerformed);
selectColorButton.setToolTipText(AppStrings.translate("button.selectbkcolor.hint"));
msaaButton = new JToggleButton(View.getIcon("antialias16"));
msaaButton.addActionListener(this::msaaButtonActionPerformed);
msaaButton.setToolTipText(AppStrings.translate("button.antialias.hint"));
msaaButton.setSelected(Configuration.useMsaaForDisplay.get());
Configuration.useMsaaForDisplay.addListener(new ConfigurationItemChangeListener<Boolean>() {
@Override
public void configurationItemChanged(Boolean newValue) {
msaaButton.setSelected(newValue);
}
});
zoomPanel = new ZoomPanel(display);
zoomPanel.setVisible(false);
@@ -162,6 +178,7 @@ public class PlayerControls extends JPanel implements MediaDisplayListener {
snapshotButton.setVisible(false);
graphicButtonsPanel.add(zoomPanel);
graphicButtonsPanel.add(msaaButton);
graphicButtonsPanel.add(selectColorButton);
graphicButtonsPanel.add(snapshotButton);
@@ -499,6 +516,10 @@ public class PlayerControls extends JPanel implements MediaDisplayListener {
putImageToClipBoard(display.printScreen());
}
private void msaaButtonActionPerformed(ActionEvent evt) {
Configuration.useMsaaForDisplay.set(msaaButton.isSelected());
}
private void showButtonActionPerformed(ActionEvent evt) {
display.setDisplayed(showButton.isSelected());
if (!showButton.isSelected()) {