Gridarta Editor
FaceObjectProviders.java
Go to the documentation of this file.
1 /*
2  * Gridarta MMORPG map editor for Crossfire, Daimonin and similar games.
3  * Copyright (C) 2000-2015 The Gridarta Developers.
4  *
5  * This program is free software; you can redistribute it and/or modify
6  * it under the terms of the GNU General Public License as published by
7  * the Free Software Foundation; either version 2 of the License, or
8  * (at your option) any later version.
9  *
10  * This program is distributed in the hope that it will be useful,
11  * but WITHOUT ANY WARRANTY; without even the implied warranty of
12  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13  * GNU General Public License for more details.
14  *
15  * You should have received a copy of the GNU General Public License along
16  * with this program; if not, write to the Free Software Foundation, Inc.,
17  * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
18  */
19 
20 package net.sf.gridarta.model.face;
21 
22 import java.awt.image.ImageFilter;
23 import java.awt.image.RGBImageFilter;
24 import javax.swing.GrayFilter;
25 import javax.swing.ImageIcon;
35 import org.jetbrains.annotations.NotNull;
36 import org.jetbrains.annotations.Nullable;
37 
45 public class FaceObjectProviders {
46 
51  private static final int GRAY_PERCENTAGE = 50;
52 
56  @NotNull
57  private static final ImageFilter GRAY_FILTER = new GrayFilter(false, GRAY_PERCENTAGE);
58 
62  @NotNull
63  private static final FilterFaceProvider GRAY = new FilterFaceProvider(GRAY_FILTER);
64 
68  @NotNull
69  private static final ImageFilter RED_FILTER = new ColourFilter(ColourFilter.RED_MASK);
70 
74  @NotNull
75  private static final FilterFaceProvider RED = new FilterFaceProvider(RED_FILTER);
76 
80  @NotNull
81  private static final ImageFilter GREEN_FILTER = new ColourFilter(ColourFilter.GREEN_MASK);
82 
86  @NotNull
87  private static final FilterFaceProvider GREEN = new FilterFaceProvider(GREEN_FILTER);
88 
92  @NotNull
93  private static final ImageFilter BLUE_FILTER = new ColourFilter(ColourFilter.BLUE_MASK);
94 
98  @NotNull
99  private static final FilterFaceProvider BLUE = new FilterFaceProvider(BLUE_FILTER);
100 
104  @NotNull
105  private static final ImageFilter GRID_FILTER = new RGBImageFilter() {
106 
110  @Override
111  public int filterRGB(final int x, final int y, final int rgb) {
112  return (x + y) % 2 == 0 ? rgb & ColourFilter.RED_GREEN_BLUE_MASK : rgb;
113  }
114 
115  @NotNull
116  @Override
117  public Object clone() {
118  return super.clone();
119  }
120 
121  }; // GRID_FILTER
122 
126  @NotNull
127  private static final FilterFaceProvider GRID = new FilterFaceProvider(GRID_FILTER);
128 
132  @Nullable
134 
138  @NotNull
140 
144  @NotNull
146 
150  @NotNull
152 
156  @NotNull
158 
162  @NotNull
163  private final FaceObjects faceObjects;
164 
168  @NotNull
170 
175  @NotNull
177 
184  public FaceObjectProviders(final int doubleFaceOffset, @NotNull final FaceObjects faceObjects, @NotNull final ResourceIcons resourceIcons) {
185  this.faceObjects = faceObjects;
186  this.resourceIcons = resourceIcons;
187  doubleFaceProvider = new FilterFaceProvider(new DoubleImageFilter(doubleFaceOffset));
188  doubleAlphaFaceProvider = new FilterFaceProvider(new DoubleImageFilter(doubleFaceOffset));
189  stretchedFaceProvider = new FilterFaceProvider(new StretchedImageFilter());
190  }
191 
196  public void addFaceObjectProvidersListener(@NotNull final FaceObjectProvidersListener listener) {
197  faceObjectProvidersListeners.add(listener);
198  }
199 
205  public void removeFaceObjectProvidersListener(@NotNull final FaceObjectProvidersListener listener) {
206  faceObjectProvidersListeners.remove(listener);
207  }
208 
212  public void reloadAll() {
213  if (normalFaceProvider != null) {
214  normalFaceProvider.reload();
215  }
216  for (final FaceProvider faceProvider : new FaceProvider[] { GRAY, RED, GREEN, BLUE, ALPHA, GRID, doubleFaceProvider, doubleAlphaFaceProvider, stretchedFaceProvider }) {
217  faceProvider.reload();
218  }
219 
220  for (final FaceObjectProvidersListener faceObjectProvidersListener : faceObjectProvidersListeners.getListeners()) {
221  faceObjectProvidersListener.facesReloaded();
222  }
223  }
224 
230  public void setNormal(@NotNull final FaceProvider normalFaceProvider) {
231  this.normalFaceProvider = normalFaceProvider;
232  GRAY.setParent(normalFaceProvider);
233  RED.setParent(normalFaceProvider);
234  GREEN.setParent(normalFaceProvider);
235  BLUE.setParent(normalFaceProvider);
236  ALPHA.setParent(normalFaceProvider);
237  GRID.setParent(normalFaceProvider);
238  doubleFaceProvider.setParent(normalFaceProvider);
239  doubleAlphaFaceProvider.setParent(normalFaceProvider);
240  stretchedFaceProvider.setParent(normalFaceProvider);
241  }
242 
249  @NotNull
250  public <G extends GameObject<G, A, R>, A extends MapArchObject<A>, R extends Archetype<G, A, R>> ImageIcon getFace(@NotNull final BaseObject<G, A, R, ?> baseObject) {
251  if (normalFaceProvider == null) {
252  throw new IllegalStateException();
253  }
254 
255  final boolean[] undefinedArchetype = new boolean[1];
256  baseObject.visit(new BaseObjectVisitor<G, A, R>() {
257 
258  @Override
259  public void visit(@NotNull final Archetype<G, A, R> archetype) {
260  undefinedArchetype[0] = archetype.isUndefinedArchetype();
261  }
262 
263  @Override
264  public void visit(@NotNull final GameObject<G, A, R> gameObject) {
265  undefinedArchetype[0] = gameObject.hasUndefinedArchetype();
266  }
267 
268  });
269  //noinspection ConstantConditions
270  return getFace(baseObject.getFaceObjName(), undefinedArchetype[0], normalFaceProvider, normalFaceProvider, 0);
271  }
272 
279  @NotNull
280  public ImageIcon getTrans(@NotNull final GameObject<?, ?, ?> gameObject) {
281  return getFace(gameObject.getFaceObjName(), gameObject.hasUndefinedArchetype(), ALPHA, ALPHA, 0);
282  }
283 
290  @NotNull
291  public ImageIcon getDouble(@NotNull final GameObject<?, ?, ?> gameObject) {
292  if (normalFaceProvider == null) {
293  throw new IllegalStateException();
294  }
295  //noinspection ConstantConditions
296  return getFace(gameObject.getFaceObjName(), gameObject.hasUndefinedArchetype(), normalFaceProvider, doubleFaceProvider, 0);
297  }
298 
305  @NotNull
306  public ImageIcon getTransDouble(@NotNull final GameObject<?, ?, ?> gameObject) {
307  return getFace(gameObject.getFaceObjName(), gameObject.hasUndefinedArchetype(), ALPHA, doubleAlphaFaceProvider, 0);
308  }
309 
316  @NotNull
317  public ImageIcon getStretched(@NotNull final GameObject<?, ?, ?> gameObject, final long stretch) {
318  return getFace(gameObject.getFaceObjName(), gameObject.hasUndefinedArchetype(), stretchedFaceProvider, ALPHA, stretch);
319  }
320 
331  @NotNull
332  private ImageIcon getFace(@Nullable final String faceName, final boolean hasUndefinedArchetype, @NotNull final FaceProvider singleFaceProvider, @NotNull final FaceProvider doubleFaceProvider, final long stretch) {
333  if (hasUndefinedArchetype) {
334  return resourceIcons.getResourceIcon(ResourceIcons.SQUARE_NO_ARCH);
335  }
336 
337  if (faceName == null) {
338  return resourceIcons.getResourceIcon(ResourceIcons.SQUARE_NO_FACE);
339  }
340 
341  final FaceObject faceObject = faceObjects.get(faceName);
342  if (faceObject == null) {
343  return resourceIcons.getResourceIcon(ResourceIcons.SQUARE_NO_FACE);
344  }
345 
346  final FaceProvider faceProvider;
347 
348  if (stretch != 0) {
349  faceProvider = stretchedFaceProvider;
350  } else if (faceObject.isDouble()) {
351  faceProvider = doubleFaceProvider;
352  } else {
353  faceProvider = singleFaceProvider;
354  }
355 
356  final String alternativeFaceName = faceObject.getAlternativeFaceName();
357  final String effectiveFaceName = alternativeFaceName != null && singleFaceProvider == doubleFaceProvider ? alternativeFaceName : faceName;
358  final ImageIcon face = faceProvider.getImageIconForFacename(effectiveFaceName, stretch);
359  if (face == null) {
360  return resourceIcons.getResourceIcon(ResourceIcons.SQUARE_UNKNOWN);
361  }
362 
363  return face;
364  }
365 
371  @Nullable
372  public ImageIcon getImageIconForFacename(@NotNull final String faceObjName) {
373  return normalFaceProvider == null ? null : normalFaceProvider.getImageIconForFacename(faceObjName, 0);
374  }
375 
381  @Nullable
382  public ImageIcon getDisplayIcon(@NotNull final NamedObject namedObject) {
383  return getImageIconForFacename(namedObject.getDisplayIconName());
384  }
385 
386 }
final EventListenerList2< FaceObjectProvidersListener > faceObjectProvidersListeners
The FaceObjectProvidersListeners to notify about changes.
boolean isDouble()
Return whether this face is a double face.
static final FilterFaceProvider GRID
The face provider for grid faces.
final FilterFaceProvider doubleFaceProvider
The face provider for double faces.
ImageIcon getTransDouble(@NotNull final GameObject<?, ?, ?> gameObject)
Returns the transparent double face for a GameObject as an ImageIcon.
A FilterFaceProvider provides modified versions of icons provided by another FaceProvider by applying...
The data package contains classes for handling data that is organized in a tree.
An ImageFilter that produces double faces: the source image is drawn twice with a vertical shift...
T [] getListeners()
Returns an array of all the listeners.
Utility class holding the singleton AlphaImageFilter instance.
static final FilterFaceProvider GREEN
The face provider for green faces.
Common interface for FaceObject.
Definition: FaceObject.java:30
This interface represents a lazy loader that provides images on demand.
final FaceObjects faceObjects
The FaceObjects instance for looking up face names.
ImageIcon getDisplayIcon(@NotNull final NamedObject namedObject)
Returns the display icon for a NamedObject.
void addFaceObjectProvidersListener(@NotNull final FaceObjectProvidersListener listener)
Adds a FaceObjectProvidersListener to be notified about changes.
ImageIcon getFace(@Nullable final String faceName, final boolean hasUndefinedArchetype, @NotNull final FaceProvider singleFaceProvider, @NotNull final FaceProvider doubleFaceProvider, final long stretch)
Returns the ImageIcon of a face with a certain face name.
FaceObjectProviders(final int doubleFaceOffset, @NotNull final FaceObjects faceObjects, @NotNull final ResourceIcons resourceIcons)
Creates a new instance.
Base package of all Gridarta classes.
static final FilterFaceProvider GRAY
The face provider for GRAY faces.
Reflects a game object (object on a map).
Definition: GameObject.java:36
static final ImageFilter GRAY_FILTER
The filter to make gray-scaled images.
static final ImageFilter GREEN_FILTER
The filter to make images green.
String getAlternativeFaceName()
Returns the alternative face name for image.a.nnn faces.
E get(@NotNull String objectName)
Gets a AbstractNamedObject.
static final int RED_GREEN_BLUE_MASK
The mask for selecting the red, green, and blue bits.
static final ImageFilter GRID_FILTER
The filter using a full alpha grid instead of alpha blending.
void remove(@NotNull final T listener)
Removes a listener.
static final int GREEN_MASK
The mask for selecting the green bits.
static final ImageFilter BLUE_FILTER
The filter to make images blue.
final ResourceIcons resourceIcons
The ResourceIcons for creating icons.
GameObjects are the objects based on Archetypes found on maps.
final FilterFaceProvider stretchedFaceProvider
The face provider for stretched floor faces.
void setNormal(@NotNull final FaceProvider normalFaceProvider)
Sets the normal FaceProvider.
ImageIcon getImageIconForFacename(@NotNull String faceName, long stretch)
Get an image from this FaceProvider.
void add(@NotNull final T listener)
Adds a listener.
FaceProvider normalFaceProvider
The face provider for normal faces.
static final ImageFilter RED_FILTER
The filter to make images red.
ImageIcon getTrans(@NotNull final GameObject<?, ?, ?> gameObject)
Returns the transparent face for a GameObject as an ImageIcon.
FaceObjects is a container for FaceObjects.
void removeFaceObjectProvidersListener(@NotNull final FaceObjectProvidersListener listener)
Removes a FaceObjectProvidersListener to be notified about changes.
static final ImageFilter ALPHA_FILTER
The singleton AlphaImageFilter instance for creating transparent images.
void setParent(@Nullable final FaceProvider parent)
Sets a new provider as parent.
static final FilterFaceProvider RED
The face provider for red faces.
static final int GRAY_PERCENTAGE
The gray level for gray-scaled images; 100=darkest gray, 0=lightest gray.
Type-safe version of EventListenerList.
Interface for listeners interested in FaceObjectProviders related events.
Provider for faces of GameObjects and Archetypes.
static final int RED_MASK
The mask for selecting the red bits.
Creates ImageIcon instances from resources.
ImageIcon getImageIconForFacename(@NotNull final String faceObjName)
Returns the ImageIcon for a given face object name.
Class to filter images by simply applying a boolean OR operation.
ImageIcon getResourceIcon(@NotNull final String iconName)
Returns the image icon for the given icon name.
An ImageFilter that produces stretched faces.
void reloadAll()
Reloads all providers provided by this FaceObjects.
ImageIcon getDouble(@NotNull final GameObject<?, ?, ?> gameObject)
Returns the double face for a GameObject as an ImageIcon.
final FilterFaceProvider doubleAlphaFaceProvider
The face provider for transparent double faces.
static final FilterFaceProvider BLUE
The face provider for blue faces.
static final int BLUE_MASK
The mask for selecting the blue bits.
ImageIcon getStretched(@NotNull final GameObject<?, ?, ?> gameObject, final long stretch)
Returns the stretched face for a GameObject as an ImageIcon.
static final FilterFaceProvider ALPHA
The face provider for alpha faces.