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-2023 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 java.util.Collection;
25 import java.util.concurrent.CopyOnWriteArrayList;
26 import javax.swing.GrayFilter;
27 import javax.swing.ImageIcon;
36 import org.jetbrains.annotations.NotNull;
37 import org.jetbrains.annotations.Nullable;
38 
46 public class FaceObjectProviders {
47 
52  private static final int GRAY_PERCENTAGE = 50;
53 
57  @NotNull
58  private static final ImageFilter GRAY_FILTER = new GrayFilter(false, GRAY_PERCENTAGE);
59 
63  @NotNull
65 
69  @NotNull
70  private static final ImageFilter RED_FILTER = new ColourFilter(ColourFilter.RED_MASK);
71 
75  @NotNull
76  private static final FilterFaceProvider RED = new FilterFaceProvider(RED_FILTER);
77 
81  @NotNull
82  private static final ImageFilter GREEN_FILTER = new ColourFilter(ColourFilter.GREEN_MASK);
83 
87  @NotNull
89 
93  @NotNull
94  private static final ImageFilter BLUE_FILTER = new ColourFilter(ColourFilter.BLUE_MASK);
95 
99  @NotNull
101 
105  @NotNull
106  private static final ImageFilter GRID_FILTER = new RGBImageFilter() {
107 
111  @Override
112  public int filterRGB(final int x, final int y, final int rgb) {
113  return (x + y) % 2 == 0 ? rgb & ColourFilter.RED_GREEN_BLUE_MASK : rgb;
114  }
115 
116  @NotNull
117  @Override
118  public RGBImageFilter clone() {
119  return (RGBImageFilter) super.clone();
120  }
121 
122  }; // GRID_FILTER
123 
127  @NotNull
129 
133  @Nullable
135 
139  @NotNull
141 
145  @NotNull
147 
151  @NotNull
153 
157  @NotNull
159 
163  @NotNull
164  private final FaceObjects faceObjects;
165 
169  @NotNull
171 
176  @NotNull
177  private final Collection<FaceObjectProvidersListener> faceObjectProvidersListeners = new CopyOnWriteArrayList<>();
178 
185  public FaceObjectProviders(final int doubleFaceOffset, @NotNull final FaceObjects faceObjects, @NotNull final ResourceIcons resourceIcons) {
186  this.faceObjects = faceObjects;
187  this.resourceIcons = resourceIcons;
188  doubleFaceProvider = new FilterFaceProvider(new DoubleImageFilter(doubleFaceOffset));
189  doubleAlphaFaceProvider = new FilterFaceProvider(new DoubleImageFilter(doubleFaceOffset));
191  }
192 
197  public void addFaceObjectProvidersListener(@NotNull final FaceObjectProvidersListener listener) {
198  faceObjectProvidersListeners.add(listener);
199  }
200 
206  public void removeFaceObjectProvidersListener(@NotNull final FaceObjectProvidersListener listener) {
207  faceObjectProvidersListeners.remove(listener);
208  }
209 
213  public void reloadAll() {
214  if (normalFaceProvider != null) {
216  }
218  faceProvider.reload();
219  }
220 
221  for (final FaceObjectProvidersListener faceObjectProvidersListener : faceObjectProvidersListeners) {
222  faceObjectProvidersListener.facesReloaded();
223  }
224  }
225 
231  public void setNormal(@NotNull final FaceProvider normalFaceProvider) {
232  this.normalFaceProvider = normalFaceProvider;
242  }
243 
250  @NotNull
251  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) {
252  if (normalFaceProvider == null) {
253  throw new IllegalStateException("normal face provider is unset");
254  }
255 
256  final boolean[] undefinedArchetype = new boolean[1];
257  baseObject.visit(new BaseObjectVisitor<G, A, R>() {
258 
259  @Override
260  public void visit(@NotNull final Archetype<G, A, R> archetype) {
261  undefinedArchetype[0] = archetype.isUndefinedArchetype();
262  }
263 
264  @Override
265  public void visit(@NotNull final GameObject<G, A, R> gameObject) {
266  undefinedArchetype[0] = gameObject.hasUndefinedArchetype();
267  }
268 
269  });
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("normal face provider is unset");
294  }
295  return getFace(gameObject.getFaceObjName(), gameObject.hasUndefinedArchetype(), normalFaceProvider, doubleFaceProvider, 0);
296  }
297 
304  @NotNull
305  public ImageIcon getTransDouble(@NotNull final GameObject<?, ?, ?> gameObject) {
306  return getFace(gameObject.getFaceObjName(), gameObject.hasUndefinedArchetype(), ALPHA, doubleAlphaFaceProvider, 0);
307  }
308 
315  @NotNull
316  public ImageIcon getStretched(@NotNull final GameObject<?, ?, ?> gameObject, final long stretch) {
317  return getFace(gameObject.getFaceObjName(), gameObject.hasUndefinedArchetype(), stretchedFaceProvider, ALPHA, stretch);
318  }
319 
330  @NotNull
331  private ImageIcon getFace(@Nullable final String faceName, final boolean hasUndefinedArchetype, @NotNull final FaceProvider singleFaceProvider, @NotNull final FaceProvider doubleFaceProvider, final long stretch) {
332  if (hasUndefinedArchetype) {
334  }
335 
336  if (faceName == null) {
338  }
339 
340  final FaceObject faceObject = faceObjects.get(faceName);
341  if (faceObject == null) {
343  }
344 
345  final FaceProvider faceProvider;
346 
347  if (stretch != 0) {
348  faceProvider = stretchedFaceProvider;
349  } else if (faceObject.isDouble()) {
350  faceProvider = doubleFaceProvider;
351  } else {
352  faceProvider = singleFaceProvider;
353  }
354 
355  final String alternativeFaceName = faceObject.getAlternativeFaceName();
356  final String effectiveFaceName = alternativeFaceName != null && singleFaceProvider == doubleFaceProvider ? alternativeFaceName : faceName;
357  final ImageIcon face = faceProvider.getImageIconForFacename(effectiveFaceName, stretch);
358  return face == null ? resourceIcons.getResourceIcon(ResourceIcons.SQUARE_UNKNOWN) : face;
359  }
360 
366  @Nullable
367  public ImageIcon getImageIconForFacename(@NotNull final String faceObjName) {
368  return normalFaceProvider == null ? null : normalFaceProvider.getImageIconForFacename(faceObjName, 0);
369  }
370 
376  @Nullable
377  public ImageIcon getDisplayIcon(@NotNull final NamedObject namedObject) {
378  return getImageIconForFacename(namedObject.getDisplayIconName());
379  }
380 
381 }
net.sf.gridarta.model.face.ColourFilter
Class to filter images by simply applying a boolean OR operation.
Definition: ColourFilter.java:29
net.sf.gridarta.model.face.FaceProvider
This interface represents a lazy loader that provides images on demand.
Definition: FaceProvider.java:30
net.sf.gridarta.model.face.FaceObjectProviders.GREEN_FILTER
static final ImageFilter GREEN_FILTER
The filter to make images green.
Definition: FaceObjectProviders.java:82
net.sf.gridarta.model.face.FaceObjectProviders.normalFaceProvider
FaceProvider normalFaceProvider
The face provider for normal faces.
Definition: FaceObjectProviders.java:134
net.sf.gridarta
Base package of all Gridarta classes.
net.sf.gridarta.model.face.FaceObjectProviders.faceObjectProvidersListeners
final Collection< FaceObjectProvidersListener > faceObjectProvidersListeners
The FaceObjectProvidersListeners to notify about changes.
Definition: FaceObjectProviders.java:177
net.sf.gridarta.model.face.FaceObject.isDouble
boolean isDouble()
Return whether this face is a double face.
net.sf.gridarta.model.baseobject.BaseObjectVisitor
Definition: BaseObjectVisitor.java:27
net.sf.gridarta.utils.ResourceIcons.SQUARE_NO_FACE
static final String SQUARE_NO_FACE
Definition: ResourceIcons.java:94
net.sf
net.sf.gridarta.model.data.NamedObjects.get
E get(@NotNull String objectName)
Gets a AbstractNamedObject.
net.sf.gridarta.model.face.FilterFaceProvider.setParent
void setParent(@Nullable final FaceProvider parent)
Sets a new provider as parent.
Definition: FilterFaceProvider.java:74
net.sf.gridarta.model.face.FaceObjectProviders.GRAY
static final FilterFaceProvider GRAY
The face provider for GRAY faces.
Definition: FaceObjectProviders.java:64
net.sf.gridarta.model.face.FaceObjectProviders.getStretched
ImageIcon getStretched(@NotNull final GameObject<?, ?, ?> gameObject, final long stretch)
Returns the stretched face for a GameObject as an {}.
Definition: FaceObjectProviders.java:316
net.sf.gridarta.model.face.ColourFilter.BLUE_MASK
static final int BLUE_MASK
The mask for selecting the blue bits.
Definition: ColourFilter.java:44
net.sf.gridarta.model.archetype
Definition: AbstractArchetype.java:20
net.sf.gridarta.model.face.ColourFilter.RED_MASK
static final int RED_MASK
The mask for selecting the red bits.
Definition: ColourFilter.java:34
net.sf.gridarta.model.face.FaceObjectProviders
Provider for faces of GameObjects and Archetypes.
Definition: FaceObjectProviders.java:46
net.sf.gridarta.model.gameobject.GameObject
Reflects a game object (object on a map).
Definition: GameObject.java:36
net.sf.gridarta.model.face.FaceObjectProviders.GRID_FILTER
static final ImageFilter GRID_FILTER
The filter using a full alpha grid instead of alpha blending.
Definition: FaceObjectProviders.java:106
net.sf.gridarta.model.face.FaceObjectProviders.setNormal
void setNormal(@NotNull final FaceProvider normalFaceProvider)
Sets the normal FaceProvider.
Definition: FaceObjectProviders.java:231
net.sf.gridarta.model.face.FaceObjectProviders.addFaceObjectProvidersListener
void addFaceObjectProvidersListener(@NotNull final FaceObjectProvidersListener listener)
Adds a FaceObjectProvidersListener to be notified about changes.
Definition: FaceObjectProviders.java:197
net.sf.gridarta.model.face.ColourFilter.GREEN_MASK
static final int GREEN_MASK
The mask for selecting the green bits.
Definition: ColourFilter.java:39
net.sf.gridarta.model.face.FaceObjectProviders.RED_FILTER
static final ImageFilter RED_FILTER
The filter to make images red.
Definition: FaceObjectProviders.java:70
net.sf.gridarta.model.face.DoubleImageFilter
An ImageFilter that produces double faces: the source image is drawn twice with a vertical shift.
Definition: DoubleImageFilter.java:31
net.sf.gridarta.model.face.FaceObjectProviders.ALPHA
static final FilterFaceProvider ALPHA
The face provider for alpha faces.
Definition: FaceObjectProviders.java:140
net.sf.gridarta.model.face.FaceObjectProviders.FaceObjectProviders
FaceObjectProviders(final int doubleFaceOffset, @NotNull final FaceObjects faceObjects, @NotNull final ResourceIcons resourceIcons)
Creates a new instance.
Definition: FaceObjectProviders.java:185
net.sf.gridarta.model.face.FaceObjectProviders.BLUE
static final FilterFaceProvider BLUE
The face provider for blue faces.
Definition: FaceObjectProviders.java:100
net.sf.gridarta.model.face.FaceObjectProviders.doubleAlphaFaceProvider
final FilterFaceProvider doubleAlphaFaceProvider
The face provider for transparent double faces.
Definition: FaceObjectProviders.java:152
net.sf.gridarta.model.face.StretchedImageFilter
An ImageFilter that produces stretched faces.
Definition: StretchedImageFilter.java:32
net.sf.gridarta.model.data.NamedObject
An.
Definition: NamedObject.java:32
net.sf.gridarta.model.gameobject
GameObjects are the objects based on Archetypes found on maps.
Definition: AbstractGameObject.java:20
net.sf.gridarta.model.face.FaceObjectProviders.removeFaceObjectProvidersListener
void removeFaceObjectProvidersListener(@NotNull final FaceObjectProvidersListener listener)
Removes a FaceObjectProvidersListener to be notified about changes.
Definition: FaceObjectProviders.java:206
net.sf.gridarta.model.face.FaceObjectProviders.stretchedFaceProvider
final FilterFaceProvider stretchedFaceProvider
The face provider for stretched floor faces.
Definition: FaceObjectProviders.java:158
net.sf.gridarta.model.face.FaceObjectProviders.GRAY_PERCENTAGE
static final int GRAY_PERCENTAGE
The gray level for gray-scaled images; 100=darkest gray, 0=lightest gray.
Definition: FaceObjectProviders.java:52
net.sf.gridarta.model.face.FaceObjectProviders.GREEN
static final FilterFaceProvider GREEN
The face provider for green faces.
Definition: FaceObjectProviders.java:88
net
net.sf.gridarta.model.face.FilterFaceProvider
A FilterFaceProvider provides modified versions of icons provided by another FaceProvider by applying...
Definition: FilterFaceProvider.java:34
net.sf.gridarta.utils.AlphaImageFilterInstance.ALPHA_FILTER
static final ImageFilter ALPHA_FILTER
The singleton AlphaImageFilter instance for creating transparent images.
Definition: AlphaImageFilterInstance.java:34
net.sf.gridarta.model.maparchobject.MapArchObject
Interface for MapArchObjects.
Definition: MapArchObject.java:40
net.sf.gridarta.model.face.FaceObjectProviders.GRID
static final FilterFaceProvider GRID
The face provider for grid faces.
Definition: FaceObjectProviders.java:128
net.sf.gridarta.model.face.FaceObjects
FaceObjects is a container for FaceObjects.
Definition: FaceObjects.java:31
net.sf.gridarta.model.face.FaceObjectProviders.getFace
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)
Returns the face of a BaseObject as an ImageIcon.
Definition: FaceObjectProviders.java:251
net.sf.gridarta.model.data
Classes for handling data that is organized in a tree.
Definition: AbstractNamedObject.java:20
net.sf.gridarta.model.baseobject.BaseObject
Definition: BaseObject.java:34
net.sf.gridarta.model.face.FaceObjectProviders.getTrans
ImageIcon getTrans(@NotNull final GameObject<?, ?, ?> gameObject)
Returns the transparent face for a GameObject as an {}.
Definition: FaceObjectProviders.java:280
net.sf.gridarta.model.face.ColourFilter.RED_GREEN_BLUE_MASK
static final int RED_GREEN_BLUE_MASK
The mask for selecting the red, green, and blue bits.
Definition: ColourFilter.java:49
net.sf.gridarta.utils.ResourceIcons.SQUARE_UNKNOWN
static final String SQUARE_UNKNOWN
Definition: ResourceIcons.java:83
net.sf.gridarta.utils.ResourceIcons.getResourceIcon
ImageIcon getResourceIcon(@NotNull final String iconName)
Returns the image icon for the given icon name.
Definition: ResourceIcons.java:168
net.sf.gridarta.model.face.FaceObjectProviders.reloadAll
void reloadAll()
Reloads all providers provided by this FaceObjects.
Definition: FaceObjectProviders.java:213
net.sf.gridarta.model.face.FaceObject
Common interface for FaceObject.
Definition: FaceObject.java:30
net.sf.gridarta.model
net.sf.gridarta.model.archetype.Archetype
Reflects an Archetype.
Definition: Archetype.java:41
net.sf.gridarta.model.face.FaceObjectProviders.RED
static final FilterFaceProvider RED
The face provider for red faces.
Definition: FaceObjectProviders.java:76
net.sf.gridarta.model.baseobject
Definition: AbstractBaseObject.java:20
net.sf.gridarta.model.face.FaceProvider.reload
void reload()
Reload faces.
net.sf.gridarta.model.face.FaceObjectProviders.resourceIcons
final ResourceIcons resourceIcons
The ResourceIcons for creating icons.
Definition: FaceObjectProviders.java:170
net.sf.gridarta.model.face.FaceObjectProviders.GRAY_FILTER
static final ImageFilter GRAY_FILTER
The filter to make gray-scaled images.
Definition: FaceObjectProviders.java:58
net.sf.gridarta.model.face.FaceObjectProvidersListener
Interface for listeners interested in FaceObjectProviders related events.
Definition: FaceObjectProvidersListener.java:29
net.sf.gridarta.model.face.FaceObjectProviders.getTransDouble
ImageIcon getTransDouble(@NotNull final GameObject<?, ?, ?> gameObject)
Returns the transparent double face for a GameObject as an {}.
Definition: FaceObjectProviders.java:305
net.sf.gridarta.var.crossfire.model.gameobject.GameObject<?, ?, ?>
net.sf.gridarta.model.face.FaceObjectProviders.getDisplayIcon
ImageIcon getDisplayIcon(@NotNull final NamedObject namedObject)
Returns the display icon for a NamedObject.
Definition: FaceObjectProviders.java:377
net.sf.gridarta.model.maparchobject
Definition: AbstractMapArchObject.java:20
net.sf.gridarta.utils.ResourceIcons
Creates ImageIcon instances from resources.
Definition: ResourceIcons.java:46
net.sf.gridarta.model.face.FaceObjectProviders.BLUE_FILTER
static final ImageFilter BLUE_FILTER
The filter to make images blue.
Definition: FaceObjectProviders.java:94
net.sf.gridarta.model.face.FaceObjectProviders.getFace
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.
Definition: FaceObjectProviders.java:331
net.sf.gridarta.model.face.FaceObjectProviders.getDouble
ImageIcon getDouble(@NotNull final GameObject<?, ?, ?> gameObject)
Returns the double face for a GameObject as an {}.
Definition: FaceObjectProviders.java:291
net.sf.gridarta.model.face.FaceObject.getAlternativeFaceName
String getAlternativeFaceName()
Returns the alternative face name for image.a.nnn faces.
net.sf.gridarta.utils
Definition: ActionBuilderUtils.java:20
net.sf.gridarta.model.face.FaceObjectProviders.faceObjects
final FaceObjects faceObjects
The FaceObjects instance for looking up face names.
Definition: FaceObjectProviders.java:164
net.sf.gridarta.utils.AlphaImageFilterInstance
Utility class holding the singleton AlphaImageFilter instance.
Definition: AlphaImageFilterInstance.java:28
net.sf.gridarta.model.face.FaceObjectProviders.doubleFaceProvider
final FilterFaceProvider doubleFaceProvider
The face provider for double faces.
Definition: FaceObjectProviders.java:146
net.sf.gridarta.model.face.FaceProvider.getImageIconForFacename
ImageIcon getImageIconForFacename(@NotNull String faceName, long stretch)
Get an image from this FaceProvider.
net.sf.gridarta.utils.ResourceIcons.SQUARE_NO_ARCH
static final String SQUARE_NO_ARCH
Definition: ResourceIcons.java:97
net.sf.gridarta.model.face.FaceObjectProviders.getImageIconForFacename
ImageIcon getImageIconForFacename(@NotNull final String faceObjName)
Returns the ImageIcon for a given face object name.
Definition: FaceObjectProviders.java:367