From d9761ec54fc87d8227928627a5e97795f6725f0c Mon Sep 17 00:00:00 2001 From: Jason Long Date: Sun, 11 Jan 2015 13:47:50 -0500 Subject: [PATCH] TileImage: prepare the way for implementing normalForm() --- src/micropolisj/graphics/TileImage.java | 84 +++++++++++++++++++++++++ 1 file changed, 84 insertions(+) diff --git a/src/micropolisj/graphics/TileImage.java b/src/micropolisj/graphics/TileImage.java index 11e7ebc..7b9616b 100644 --- a/src/micropolisj/graphics/TileImage.java +++ b/src/micropolisj/graphics/TileImage.java @@ -12,6 +12,19 @@ public abstract class TileImage { public static final int STD_SIZE = 16; + interface MultiPart + { + MultiPart makeEmptyCopy(); + Iterable parts(); + void addPartLike(TileImage m, Part p); + TileImage asTileImage(); + } + + interface Part + { + TileImage getImage(); + } + /** * Draws a part of this tile image to the given graphics context. */ @@ -22,6 +35,15 @@ public abstract class TileImage this.drawFragment(gr, destX, destY, 0, 0); } + /** + * Brings any internal Animation object to the top of the hierarchy. + */ + public TileImage normalForm() + { + // subclasses should override this behavior + return this; + } + public static class TileImageLayer extends TileImage { public final TileImage below; @@ -36,6 +58,42 @@ public abstract class TileImage this.above = above; } + @Override + public TileImage normalForm() + { + TileImage below1 = below.normalForm(); + TileImage above1 = above.normalForm(); + + if (above1 instanceof MultiPart) { + + MultiPart rv = ((MultiPart)above1).makeEmptyCopy(); + for (Part p : ((MultiPart)above1).parts()) { + TileImageLayer m = new TileImageLayer( + below1, + p.getImage() + ); + rv.addPartLike(m, p); + } + return rv.asTileImage(); + } + else if (below1 instanceof MultiPart) { + + MultiPart rv = ((MultiPart)below1).makeEmptyCopy(); + for (Part p : ((MultiPart)below1).parts()) { + TileImageLayer m = new TileImageLayer( + p.getImage(), + above1 + ); + rv.addPartLike(m, p); + } + return rv.asTileImage(); + } + else { + + return new TileImageLayer(below1, above1); + } + } + @Override public void drawFragment(Graphics2D gr, int destX, int destY, int srcX, int srcY) { @@ -55,6 +113,32 @@ public abstract class TileImage this.source = source; } + @Override + public TileImage normalForm() + { + TileImage source_n = source.normalForm(); + if (source_n instanceof MultiPart) { + + MultiPart rv = ((MultiPart)source_n).makeEmptyCopy(); + for (Part p : ((MultiPart)source_n).parts()) { + TileImageSprite m = sameTransformFor(p.getImage()); + rv.addPartLike(m, p); + } + return rv.asTileImage(); + } + else { + return sameTransformFor(source_n); + } + } + + private TileImageSprite sameTransformFor(TileImage img) + { + TileImageSprite m = new TileImageSprite(img); + m.offsetX = this.offsetX; + m.offsetY = this.offsetY; + return m; + } + @Override public void drawFragment(Graphics2D gr, int destX, int destY, int srcX, int srcY) {