Crossfire JXClient, Trunk
ItemPainter.java
Go to the documentation of this file.
1 /*
2  * This file is part of JXClient, the Fullscreen Java Crossfire Client.
3  *
4  * JXClient is free software; you can redistribute it and/or modify
5  * it under the terms of the GNU General Public License as published by
6  * the Free Software Foundation; either version 2 of the License, or
7  * (at your option) any later version.
8  *
9  * JXClient is distributed in the hope that it will be useful,
10  * but WITHOUT ANY WARRANTY; without even the implied warranty of
11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12  * GNU General Public License for more details.
13  *
14  * You should have received a copy of the GNU General Public License
15  * along with JXClient; if not, write to the Free Software
16  * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
17  *
18  * Copyright (C) 2005-2008 Yann Chachkoff
19  * Copyright (C) 2006-2017,2019-2023 Andreas Kirschbaum
20  * Copyright (C) 2010-2012,2014-2018,2020-2023 Nicolas Weeger
21  */
22 
23 package com.realtime.crossfire.jxclient.gui.item;
24 
27 import java.awt.Color;
28 import java.awt.Dimension;
29 import java.awt.Font;
30 import java.awt.Graphics;
31 import java.awt.Graphics2D;
32 import java.awt.Image;
33 import java.awt.geom.RectangularShape;
34 import org.jetbrains.annotations.NotNull;
35 import org.jetbrains.annotations.Nullable;
36 
41 public class ItemPainter {
42 
46  private static final int TEXT_OFFSET = 3;
47 
51  @Nullable
52  private final Image cursedImage;
53 
57  @Nullable
58  private final Image damnedImage;
59 
63  @Nullable
64  private final Image magicImage;
65 
69  @Nullable
70  private final Image blessedImage;
71 
75  @Nullable
76  private final Image appliedImage;
77 
81  @Nullable
82  private final Image unidentifiedImage;
83 
87  @Nullable
88  private final Image selectorImage;
89 
93  @Nullable
94  private final Image lockedImage;
95 
99  @Nullable
100  private final Image unpaidImage;
101 
105  @Nullable
106  private final Image markedImage;
107 
111  @Nullable
112  private final Color cursedColor;
113 
117  @Nullable
118  private final Color damnedColor;
119 
123  @Nullable
124  private final Color magicColor;
125 
129  @Nullable
130  private final Color blessedColor;
131 
135  @Nullable
136  private final Color appliedColor;
137 
141  @Nullable
142  private final Color unidentifiedColor;
143 
147  @Nullable
148  private final Color selectorColor;
149 
153  @Nullable
154  private final Color lockedColor;
155 
159  @Nullable
160  private final Color unpaidColor;
161 
165  @Nullable
166  private final Color markedColor;
167 
171  @NotNull
172  private final Font font;
173 
177  @NotNull
178  private final Color nrofColor;
179 
205  public ItemPainter(@Nullable final Image cursedImage, @Nullable final Image damnedImage, @Nullable final Image magicImage, @Nullable final Image blessedImage, @Nullable final Image appliedImage, @Nullable final Image unidentifiedImage, @Nullable final Image selectorImage, @Nullable final Image lockedImage, @Nullable final Image unpaidImage, @Nullable final Image markedImage, @Nullable final Color cursedColor, @Nullable final Color damnedColor, @Nullable final Color magicColor, @Nullable final Color blessedColor, @Nullable final Color appliedColor, @Nullable final Color unidentifiedColor, @Nullable final Color selectorColor, @Nullable final Color lockedColor, @Nullable final Color unpaidColor, @Nullable final Color markedColor, @NotNull final Font font, @NotNull final Color nrofColor) {
206  this.cursedImage = cursedImage;
207  this.damnedImage = damnedImage;
208  this.magicImage = magicImage;
209  this.blessedImage = blessedImage;
210  this.appliedImage = appliedImage;
211  this.unidentifiedImage = unidentifiedImage;
212  this.selectorImage = selectorImage;
213  this.lockedImage = lockedImage;
214  this.unpaidImage = unpaidImage;
215  this.markedImage = markedImage;
216  this.cursedColor = cursedColor;
217  this.damnedColor = damnedColor;
218  this.magicColor = magicColor;
219  this.blessedColor = blessedColor;
220  this.appliedColor = appliedColor;
221  this.unidentifiedColor = unidentifiedColor;
222  this.selectorColor = selectorColor;
223  this.lockedColor = lockedColor;
224  this.unpaidColor = unpaidColor;
225  this.markedColor = markedColor;
226  this.font = font;
227  this.nrofColor = nrofColor;
228  }
229 
235  @NotNull
238  }
239 
244  @NotNull
245  public Dimension getMinimumSize() {
246  final Dimension dimension = new Dimension(32, 32);
247  updateMinimumSize(dimension, appliedImage);
249  updateMinimumSize(dimension, cursedImage);
250  updateMinimumSize(dimension, magicImage);
251  updateMinimumSize(dimension, blessedImage);
252  updateMinimumSize(dimension, lockedImage);
253  updateMinimumSize(dimension, unpaidImage);
254  updateMinimumSize(dimension, markedImage);
255  return dimension;
256  }
257 
263  private static void updateMinimumSize(@NotNull final Dimension minimumSize, @Nullable final Image image) {
264  if (image == null) {
265  return;
266  }
267 
268  final int width = image.getWidth(null);
269  if (minimumSize.width < width) {
270  minimumSize.width = width;
271  }
272 
273  final int height = image.getWidth(null);
274  if (minimumSize.height < height) {
275  minimumSize.height = height;
276  }
277  }
278 
288  public void paint(@NotNull final Graphics2D g, @NotNull final CfItem item, final boolean selected, @NotNull final Image face, final int w, final int h) {
289  paintColor(g, appliedColor, item.isApplied(), w, h);
290  paintColor(g, unidentifiedColor, item.isUnidentified(), w, h);
291  paintColor(g, cursedColor, item.isCursed(), w, h);
292  paintColor(g, damnedColor, item.isDamned(), w, h);
293  paintColor(g, magicColor, item.isMagic(), w, h);
294  paintColor(g, blessedColor, item.isBlessed(), w, h);
295  paintColor(g, lockedColor, item.isLocked(), w, h);
296  paintColor(g, selectorColor, selected, w, h);
297  paintColor(g, unpaidColor, item.isUnpaid(), w, h);
298  paintColor(g, markedColor, item.isMarked(), w, h);
299  final int imageW = Math.max(0, face.getWidth(null));
300  final int imageH = Math.max(0, face.getHeight(null));
301  final int scaledW;
302  final int scaledH;
303  final int offsetX;
304  final int offsetY;
305  if (imageW > imageH) {
306  scaledW = h;
307  scaledH = MathUtils.divRound(imageH*h, imageW);
308  offsetX = 0;
309  offsetY = (h-scaledH)/2;
310  } else {
311  scaledW = MathUtils.divRound(imageW*h, imageH);
312  scaledH = h;
313  offsetX = (h-scaledW)/2;
314  offsetY = 0;
315  }
316  g.drawImage(face, offsetX, offsetY, scaledW, scaledH, null);
317  paintImage(g, appliedImage, item.isApplied());
318  paintImage(g, unidentifiedImage, item.isUnidentified());
319  paintImage(g, cursedImage, item.isCursed());
320  paintImage(g, damnedImage, item.isDamned());
321  paintImage(g, magicImage, item.isMagic());
322  paintImage(g, blessedImage, item.isBlessed());
323  paintImage(g, lockedImage, item.isLocked());
324  paintImage(g, selectorImage, selected);
325  paintImage(g, unpaidImage, item.isUnpaid());
326  paintImage(g, markedImage, item.isMarked());
327  if (w <= h) {
328  if (item.getNrOf() > 1) {
329  g.setFont(font);
330  g.setColor(nrofColor);
331  g.drawString(String.valueOf(item.getNrOf()), 1, 1+font.getSize());
332  }
333  } else {
334  g.setFont(font);
335  g.setColor(nrofColor);
336  g.setBackground(new Color(0, 0, 0, 0.0f));
337  final String tooltipText1 = item.getTooltipText1();
338  final String tooltipText2 = item.getTooltipText2();
339  renderText(g, TEXT_OFFSET+h, 0, h, tooltipText2.isEmpty() ? tooltipText1 : tooltipText1+" ("+tooltipText2+")");
340  }
341  }
342 
351  private static void paintColor(@NotNull final Graphics g, @Nullable final Color color, final boolean isActive, final int w, final int h) {
352  if (isActive && color != null) {
353  g.setColor(color);
354  g.fillRect(0, 0, w, h);
355  }
356  }
357 
364  private static void paintImage(@NotNull final Graphics g, @Nullable final Image image, final boolean isActive) {
365  if (isActive) {
366  g.drawImage(image, 0, 0, null);
367  }
368  }
369 
378  private void renderText(@NotNull final Graphics2D g, final int dx, final int dy, final int height, @NotNull final String text) {
379  final RectangularShape rectangle = font.getStringBounds(text, g.getFontRenderContext());
380  final int y = dy+(int)Math.round(height-rectangle.getMaxY()-rectangle.getMinY())/2;
381  g.drawString(text, dx, y);
382  }
383 
384 }
com.realtime.crossfire.jxclient
com.realtime.crossfire.jxclient.gui.item.ItemPainter.TEXT_OFFSET
static final int TEXT_OFFSET
Definition: ItemPainter.java:46
com.realtime.crossfire.jxclient.gui.item.ItemPainter.markedColor
final Color markedColor
Definition: ItemPainter.java:166
com.realtime.crossfire.jxclient.gui.item.ItemPainter.lockedColor
final Color lockedColor
Definition: ItemPainter.java:154
com.realtime.crossfire.jxclient.gui.item.ItemPainter.renderText
void renderText(@NotNull final Graphics2D g, final int dx, final int dy, final int height, @NotNull final String text)
Definition: ItemPainter.java:378
com.realtime.crossfire.jxclient.gui.item.ItemPainter.selectorColor
final Color selectorColor
Definition: ItemPainter.java:148
com.realtime.crossfire.jxclient.gui.item.ItemPainter.ItemPainter
ItemPainter(@Nullable final Image cursedImage, @Nullable final Image damnedImage, @Nullable final Image magicImage, @Nullable final Image blessedImage, @Nullable final Image appliedImage, @Nullable final Image unidentifiedImage, @Nullable final Image selectorImage, @Nullable final Image lockedImage, @Nullable final Image unpaidImage, @Nullable final Image markedImage, @Nullable final Color cursedColor, @Nullable final Color damnedColor, @Nullable final Color magicColor, @Nullable final Color blessedColor, @Nullable final Color appliedColor, @Nullable final Color unidentifiedColor, @Nullable final Color selectorColor, @Nullable final Color lockedColor, @Nullable final Color unpaidColor, @Nullable final Color markedColor, @NotNull final Font font, @NotNull final Color nrofColor)
Definition: ItemPainter.java:205
com.realtime.crossfire.jxclient.gui.item.ItemPainter.getMinimumSize
Dimension getMinimumSize()
Definition: ItemPainter.java:245
com.realtime.crossfire.jxclient.gui.item.ItemPainter.magicColor
final Color magicColor
Definition: ItemPainter.java:124
com.realtime.crossfire.jxclient.gui.item.ItemPainter.newItemPainter
ItemPainter newItemPainter()
Definition: ItemPainter.java:236
com.realtime.crossfire.jxclient.gui.item.ItemPainter.blessedColor
final Color blessedColor
Definition: ItemPainter.java:130
com.realtime.crossfire.jxclient.gui.item.ItemPainter.updateMinimumSize
static void updateMinimumSize(@NotNull final Dimension minimumSize, @Nullable final Image image)
Definition: ItemPainter.java:263
com.realtime.crossfire.jxclient.gui.item.ItemPainter.damnedColor
final Color damnedColor
Definition: ItemPainter.java:118
com.realtime.crossfire.jxclient.gui.item.ItemPainter.unidentifiedImage
final Image unidentifiedImage
Definition: ItemPainter.java:82
com.realtime.crossfire.jxclient.gui.item.ItemPainter.blessedImage
final Image blessedImage
Definition: ItemPainter.java:70
com.realtime.crossfire.jxclient.gui.item.ItemPainter.nrofColor
final Color nrofColor
Definition: ItemPainter.java:178
com.realtime.crossfire.jxclient.gui.item.ItemPainter.paintImage
static void paintImage(@NotNull final Graphics g, @Nullable final Image image, final boolean isActive)
Definition: ItemPainter.java:364
com.realtime.crossfire.jxclient.gui.item.ItemPainter
Definition: ItemPainter.java:41
com.realtime.crossfire.jxclient.util.MathUtils
Definition: MathUtils.java:29
com.realtime.crossfire.jxclient.items.CfItem
Definition: CfItem.java:37
com.realtime.crossfire.jxclient.gui.item.ItemPainter.lockedImage
final Image lockedImage
Definition: ItemPainter.java:94
com.realtime.crossfire.jxclient.gui.item.ItemPainter.paintColor
static void paintColor(@NotNull final Graphics g, @Nullable final Color color, final boolean isActive, final int w, final int h)
Definition: ItemPainter.java:351
com.realtime.crossfire.jxclient.util
Definition: Codec.java:23
com.realtime.crossfire.jxclient.gui.item.ItemPainter.markedImage
final Image markedImage
Definition: ItemPainter.java:106
com.realtime.crossfire.jxclient.gui.item.ItemPainter.cursedImage
final Image cursedImage
Definition: ItemPainter.java:52
com.realtime.crossfire.jxclient.gui.item.ItemPainter.magicImage
final Image magicImage
Definition: ItemPainter.java:64
com.realtime.crossfire.jxclient.gui.item.ItemPainter.unpaidImage
final Image unpaidImage
Definition: ItemPainter.java:100
com.realtime.crossfire
com.realtime.crossfire.jxclient.gui.item.ItemPainter.appliedImage
final Image appliedImage
Definition: ItemPainter.java:76
com.realtime
com.realtime.crossfire.jxclient.gui.item.ItemPainter.appliedColor
final Color appliedColor
Definition: ItemPainter.java:136
com.realtime.crossfire.jxclient.gui.item.ItemPainter.selectorImage
final Image selectorImage
Definition: ItemPainter.java:88
com.realtime.crossfire.jxclient.util.MathUtils.divRound
static int divRound(final int numerator, final int denominator)
Definition: MathUtils.java:80
com
com.realtime.crossfire.jxclient.gui.item.ItemPainter.unidentifiedColor
final Color unidentifiedColor
Definition: ItemPainter.java:142
com.realtime.crossfire.jxclient.items
Definition: AbstractItemView.java:23
com.realtime.crossfire.jxclient.gui.item.ItemPainter.cursedColor
final Color cursedColor
Definition: ItemPainter.java:112
com.realtime.crossfire.jxclient.gui.item.ItemPainter.damnedImage
final Image damnedImage
Definition: ItemPainter.java:58
com.realtime.crossfire.jxclient.gui.item.ItemPainter.paint
void paint(@NotNull final Graphics2D g, @NotNull final CfItem item, final boolean selected, @NotNull final Image face, final int w, final int h)
Definition: ItemPainter.java:288
com.realtime.crossfire.jxclient.gui.item.ItemPainter.unpaidColor
final Color unpaidColor
Definition: ItemPainter.java:160
com.realtime.crossfire.jxclient.gui.item.ItemPainter.font
final Font font
Definition: ItemPainter.java:172