Gridarta Editor
MapImageCreator.java
Go to the documentation of this file.
1 package net.sf.gridarta.action.exportmap;
2 
3 import java.awt.Graphics2D;
4 import java.awt.Image;
5 import java.awt.image.BufferedImage;
6 import java.io.IOException;
7 import java.util.ArrayList;
8 import java.util.Collection;
9 import java.util.Collections;
10 import java.util.HashSet;
11 import java.util.Iterator;
12 import java.util.LinkedHashMap;
13 import java.util.List;
14 import java.util.Map;
15 import java.util.Map.Entry;
30 import net.sf.gridarta.utils.Size2D;
31 import org.jetbrains.annotations.NotNull;
32 import org.jetbrains.annotations.Nullable;
33 
37 public class MapImageCreator<G extends GameObject<G, A, R>, A extends MapArchObject<A>, R extends Archetype<G, A, R>> {
38 
42  private static final int SCALE = 32;
43 
47  @NotNull
49 
53  @NotNull
55 
61  @NotNull
62  private final Map<MapFile, LayoutInfo> layoutInfo = new LinkedHashMap<>();
63 
69  @NotNull
70  private final Map<MapFile, PendingInfo> pending = new LinkedHashMap<>();
71 
76  @NotNull
77  private final Collection<MapFile> done = new HashSet<>();
78 
82  private int minX;
83 
87  private int minY;
88 
92  private int maxX;
93 
97  private int maxY;
98 
106  this.mapManager = mapManager;
107  this.rendererFactory = rendererFactory;
108  }
109 
117  @Nullable
118  public BufferedImage createImage(@NotNull final MapFile mapFile, final boolean includeTiledMaps, @NotNull final ExportMapProgress progress) {
119  progress.setMax(0);
120 
121  layoutInfo.clear();
122  pending.clear();
123  minX = 0;
124  minY = 0;
125  maxX = 1;
126  maxY = 1;
127  add(mapFile, includeTiledMaps, new PendingInfo(Direction.UP, 0, 0));
128  progress.setMax(done.size());
129 
130  while (true) {
131  final Iterator<Entry<MapFile, PendingInfo>> it = pending.entrySet().iterator();
132  if (!it.hasNext()) {
133  break;
134  }
135  final Entry<MapFile, PendingInfo> mapFile2 = it.next();
136  it.remove();
137 
138  add(mapFile2.getKey(), includeTiledMaps, mapFile2.getValue());
139  progress.setMax(done.size());
140  if (progress.cancel()) {
141  return null;
142  }
143  }
144 
145  final BufferedImage image = new BufferedImage((maxX - minX) / SCALE, (maxY - minY) / SCALE, BufferedImage.TYPE_INT_ARGB);
146  final Graphics2D graphics = image.createGraphics();
147  try {
148  final List<LayoutInfo> tmp = new ArrayList<>(layoutInfo.values());
149  Collections.shuffle(tmp);
150  int done = 0;
151  for (final LayoutInfo layoutInfo : tmp) {
152  final MapControl<G, A, R> mapControl;
153  try {
154  mapControl = mapManager.openMapFile(layoutInfo.getMapFile(), false);
155  } catch (final IOException ex) {
156  System.err.println("cannot load map: " + layoutInfo.getMapFile() + ": " + ex);
157  continue;
158  }
159  try {
160  final MapRenderer mapRenderer = rendererFactory.newSimpleMapRenderer(mapControl.getMapModel());
161  final BufferedImage tmp1Image = mapRenderer.getFullImage();
162  final Image tmp2Image = tmp1Image.getScaledInstance(tmp1Image.getWidth() / SCALE, tmp1Image.getHeight() / SCALE, Image.SCALE_AREA_AVERAGING);
163  graphics.drawImage(tmp2Image, (layoutInfo.getX() - minX) / SCALE, (layoutInfo.getY() - minY) / SCALE, null);
164  } finally {
165  mapManager.release(mapControl);
166  }
167 
168  done++;
169  progress.setValue(done, image);
170  if (progress.cancel()) {
171  return null;
172  }
173  }
174  } finally {
175  graphics.dispose();
176  }
177  return image;
178  }
179 
186  private void add(@NotNull final MapFile mapFile, final boolean includeTiledMaps, @NotNull final PendingInfo pendingInfo) {
187  final MapControl<G, A, R> mapControl;
188  try {
189  mapControl = mapManager.openMapFile(mapFile, false);
190  } catch (final IOException ex) {
191  System.err.println("cannot load map: " + mapFile + ": " + ex);
192  return;
193  }
194  try {
195  final MapRenderer mapRenderer = rendererFactory.newSimpleMapRenderer(mapControl.getMapModel());
196  final Size2D imageSize = mapRenderer.getImageSize();
197  final int width = imageSize.getWidth();
198  final int height = imageSize.getHeight();
199 
200  final int x = pendingInfo.getX(width);
201  final int y = pendingInfo.getY(height);
202  if (x < minX) {
203  minX = x;
204  } else if (x + width > maxX) {
205  maxX = x + width;
206  }
207  if (y < minY) {
208  minY = y;
209  } else if (y + height > maxY) {
210  maxY = y + height;
211  }
212  layoutInfo.put(mapFile, new LayoutInfo(mapFile, x, y));
213 
214  if (includeTiledMaps) {
215  final A mapArchObject = mapControl.getMapModel().getMapArchObject();
216  for (final Direction direction : Direction.values()) {
217  final String tilePath = mapArchObject.getTilePath(direction);
218  if (!tilePath.isEmpty()) {
219  final MapModel<G, A, R> mapModel2 = mapControl.getMapModel();
220  final MapPath mapPath2 = MapPathUtils.newMapPath(tilePath);
221  final MapFile mapFile2;
222  try {
223  mapFile2 = mapModel2.getMapFile(mapPath2);
224  } catch (final SameMapException | UnsavedMapException ignored) {
225  // ignore
226  continue;
227  }
228  if (done.add(mapFile2)) {
229  final int x2;
230  final int y2;
231  switch (direction) {
232  case NORTH:
233  case WEST:
234  x2 = x;
235  y2 = y;
236  break;
237 
238  case EAST:
239  x2 = x + width;
240  y2 = y;
241  break;
242 
243  case SOUTH:
244  x2 = x;
245  y2 = y + height;
246  break;
247 
248  case NORTH_EAST:
249  case SOUTH_EAST:
250  case SOUTH_WEST:
251  case NORTH_WEST:
252  case UP:
253  case DOWN:
254  default:
255  throw new AssertionError("unexpected direction: " + direction);
256  }
257  pending.put(mapFile2, new PendingInfo(direction, x2, y2));
258  }
259  }
260  }
261  }
262  } finally {
263  mapManager.release(mapControl);
264  }
265  }
266 
267 }
net.sf.gridarta.utils.Size2D.getWidth
int getWidth()
Definition: Size2D.java:96
net.sf.gridarta.model.direction.Direction
Definition: Direction.java:28
net.sf.gridarta.model.mapmanager
Definition: AbstractMapManager.java:20
net.sf.gridarta.model.mapmodel.MapModel
Definition: MapModel.java:75
net.sf.gridarta.model.mapmodel.SameMapException
Definition: SameMapException.java:26
net.sf.gridarta.gui.map.renderer.MapRenderer.getImageSize
Size2D getImageSize()
net.sf.gridarta.model.mapmodel.MapModel.getMapArchObject
A getMapArchObject()
net.sf.gridarta.model.mapmanager.MapManager
Definition: MapManager.java:37
net.sf.gridarta.action.exportmap.MapImageCreator.layoutInfo
final Map< MapFile, LayoutInfo > layoutInfo
Definition: MapImageCreator.java:62
net.sf.gridarta
net.sf.gridarta.action.exportmap.MapImageCreator.createImage
BufferedImage createImage(@NotNull final MapFile mapFile, final boolean includeTiledMaps, @NotNull final ExportMapProgress progress)
Definition: MapImageCreator.java:118
net.sf.gridarta.action.exportmap.MapImageCreator.SCALE
static final int SCALE
Definition: MapImageCreator.java:42
net.sf
net.sf.gridarta.gui.map.renderer.RendererFactory.newSimpleMapRenderer
MapRenderer newSimpleMapRenderer(@NotNull MapModel< G, A, R > mapModel)
net.sf.gridarta.action.exportmap.PendingInfo
Definition: PendingInfo.java:9
net.sf.gridarta.model.mapmodel
Definition: AboveFloorInsertionMode.java:20
net.sf.gridarta.gui.map.renderer
Definition: AbstractIsoMapRenderer.java:20
net.sf.gridarta.action.exportmap.MapImageCreator
Definition: MapImageCreator.java:37
net.sf.gridarta.model.mapmodel.MapPathUtils.newMapPath
static MapPath newMapPath(@NotNull final String string)
Definition: MapPathUtils.java:43
net.sf.gridarta.model.archetype
Definition: AbstractArchetype.java:20
net.sf.gridarta.model.gameobject.GameObject
Definition: GameObject.java:36
net.sf.gridarta.model.mapmodel.MapPathUtils
Definition: MapPathUtils.java:28
net.sf.gridarta.model.mapcontrol
Definition: DefaultMapControl.java:20
net.sf.gridarta.action.exportmap.MapImageCreator.rendererFactory
final RendererFactory< G, A, R > rendererFactory
Definition: MapImageCreator.java:54
net.sf.gridarta.gui
net.sf.gridarta.action.exportmap.MapImageCreator.minX
int minX
Definition: MapImageCreator.java:82
net.sf.gridarta.model.gameobject
Definition: AbstractGameObject.java:20
net
net.sf.gridarta.utils.Size2D.getHeight
int getHeight()
Definition: Size2D.java:104
net.sf.gridarta.action.exportmap.MapImageCreator.done
final Collection< MapFile > done
Definition: MapImageCreator.java:77
net.sf.gridarta.action.exportmap.ExportMapProgress
Definition: ExportMapProgress.java:9
net.sf.gridarta.action.exportmap.MapImageCreator.pending
final Map< MapFile, PendingInfo > pending
Definition: MapImageCreator.java:70
net.sf.gridarta.model.maparchobject.MapArchObject
Definition: MapArchObject.java:40
net.sf.gridarta.model.mapmanager.MapManager.openMapFile
MapControl< G, A, R > openMapFile(@NotNull MapFile mapFile, boolean interactive)
net.sf.gridarta.model.mapmodel.MapPath
Definition: MapPath.java:31
net.sf.gridarta.action.exportmap.MapImageCreator.MapImageCreator
MapImageCreator(@NotNull final MapManager< G, A, R > mapManager, @NotNull final RendererFactory< G, A, R > rendererFactory)
Definition: MapImageCreator.java:105
net.sf.gridarta.action.exportmap.MapImageCreator.mapManager
final MapManager< G, A, R > mapManager
Definition: MapImageCreator.java:48
net.sf.gridarta.model.mapmodel.UnsavedMapException
Definition: UnsavedMapException.java:26
net.sf.gridarta.model.direction.Direction.UP
UP
Definition: Direction.java:73
net.sf.gridarta.action.exportmap.MapImageCreator.minY
int minY
Definition: MapImageCreator.java:87
net.sf.gridarta.model.mapmodel.MapFile
Definition: MapFile.java:31
net.sf.gridarta.model.mapmanager.MapManager.release
void release(@NotNull MapControl< G, A, R > mapControl)
net.sf.gridarta.action.exportmap.MapImageCreator.maxX
int maxX
Definition: MapImageCreator.java:92
net.sf.gridarta.action.exportmap.MapImageCreator.add
void add(@NotNull final MapFile mapFile, final boolean includeTiledMaps, @NotNull final PendingInfo pendingInfo)
Definition: MapImageCreator.java:186
net.sf.gridarta.model
net.sf.gridarta.model.archetype.Archetype
Definition: Archetype.java:41
net.sf.gridarta.gui.map.renderer.RendererFactory
Definition: RendererFactory.java:33
net.sf.gridarta.gui.map
Definition: AbstractPerMapDialogManager.java:20
net.sf.gridarta.model.mapcontrol.MapControl
Definition: MapControl.java:35
net.sf.gridarta.model.mapcontrol.MapControl.getMapModel
MapModel< G, A, R > getMapModel()
net.sf.gridarta.model.maparchobject
Definition: AbstractMapArchObject.java:20
net.sf.gridarta.gui.map.renderer.MapRenderer.getFullImage
BufferedImage getFullImage()
net.sf.gridarta.gui.map.renderer.MapRenderer
Definition: MapRenderer.java:36
net.sf.gridarta.model.mapmodel.MapModel.getMapFile
MapFile getMapFile()
net.sf.gridarta.action.exportmap.LayoutInfo
Definition: LayoutInfo.java:9
net.sf.gridarta.utils.Size2D
Definition: Size2D.java:30
net.sf.gridarta.action.exportmap.MapImageCreator.maxY
int maxY
Definition: MapImageCreator.java:97
net.sf.gridarta.utils
Definition: ActionBuilderUtils.java:20
net.sf.gridarta.model.direction
Definition: Direction.java:20