23 package com.realtime.crossfire.jxclient.gui.map;
41 import java.awt.Color;
42 import java.awt.Dimension;
43 import java.awt.Graphics;
44 import java.awt.Graphics2D;
45 import java.awt.GraphicsConfiguration;
46 import java.awt.GraphicsDevice;
47 import java.awt.GraphicsEnvironment;
48 import java.awt.Image;
49 import java.awt.Transparency;
50 import java.awt.image.BufferedImage;
51 import java.util.ArrayDeque;
52 import java.util.Deque;
53 import java.util.HashMap;
56 import javax.swing.ImageIcon;
57 import org.jetbrains.annotations.NotNull;
58 import org.jetbrains.annotations.Nullable;
221 private final Map<Color, Image>
images =
new HashMap<>();
230 public void mapChanged(@NotNull
final CfMap map, @NotNull
final Set<CfMapSquare> changedSquares) {
231 assert Thread.holdsLock(map);
233 final int x0 = map.getOffsetX();
234 final int y0 = map.getOffsetY();
238 final int x = mapSquare.getX()+x0;
240 final int y = mapSquare.getY()+y0;
272 private void clearMap(@NotNull
final Graphics2D g) {
274 g.fillRect(0, 0, getWidth(), getHeight());
322 this.mapUpdaterState.addCrossfireMapListener(
mapListener);
325 setMapSize(this.mapUpdaterState.getMapWidth(),
this.mapUpdaterState.getMapHeight());
377 private void redrawTiles(@NotNull
final Graphics g, @NotNull
final CfMap map,
final int x0,
final int y0,
final int x1,
final int y1) {
378 for (
int x = x0; x < x1; x++) {
379 for (
int y = y0; y < y1; y++) {
380 final CfMapSquare mapSquare = map.getMapSquare(x, y);
395 private void redrawTilesUnlessDirty(@NotNull
final Graphics g, @NotNull
final CfMap map,
final int x0,
final int y0,
final int x1,
final int y1) {
396 for (
int x = x0; x < x1; x++) {
397 for (
int y = y0; y < y1; y++) {
413 final CfMapSquare mapSquare = map.getMapSquareUnlessDirty(x, y);
414 if (mapSquare !=
null) {
430 if (x < 0 || y < 0 || x >=
mapWidth || y >=
mapHeight || mapSquare.isFogOfWar()) {
433 final int darkness = mapSquare.getDarkness();
455 final int mapSquareX = mapSquare.getX();
456 final int mapSquareY = mapSquare.getY();
457 boolean foundSquare =
false;
460 if (headMapSquare !=
null) {
461 final Face headFace = headMapSquare.
getFace(layer);
462 assert headFace !=
null;
463 final int dx = headMapSquare.
getX()-mapSquareX;
464 final int dy = headMapSquare.
getY()-mapSquareY;
465 assert dx > 0 || dy > 0;
473 final Face face = mapSquare.getFace(layer);
499 protected abstract void paintSquareBackground(@NotNull
final Graphics g,
final int px,
final int py,
final boolean hasImage, @NotNull
final CfMapSquare mapSquare);
512 final int sx = imageIcon.getIconWidth()-
offsetX;
513 final int sy = imageIcon.getIconHeight()-
offsetY;
523 protected abstract void markPlayer(@NotNull
final Graphics g,
final int dx,
final int dy);
526 @SuppressWarnings(
"MethodDoesntCallSuperMethod")
568 final GraphicsEnvironment graphicsEnvironment = GraphicsEnvironment.getLocalGraphicsEnvironment();
569 final GraphicsDevice graphicsDevice = graphicsEnvironment.getDefaultScreenDevice();
570 final GraphicsConfiguration graphicsConfiguration = graphicsDevice.getDefaultConfiguration();
572 bufferedImage = graphicsConfiguration.createCompatibleImage(Math.max(1, getWidth()), Math.max(1, getHeight()), Transparency.TRANSLUCENT);
618 public void setBounds(
final int x,
final int y,
final int width,
final int height) {
619 super.setBounds(x, y, width, height);
643 final int x = Math.max(dx, 0);
644 final int w = dx > 0 ? -dx : dx;
645 final int y = Math.max(dy, 0);
646 final int h = dy > 0 ? -dy : dy;
675 protected void paintColoredSquare(@NotNull
final Graphics g, @NotNull
final Color color,
final int x,
final int y) {
676 Image image =
images.get(color);
678 final BufferedImage tmp =
new BufferedImage(
tileSize,
tileSize, color.getTransparency() == Transparency.OPAQUE ? BufferedImage.TYPE_INT_RGB : BufferedImage.TYPE_INT_ARGB);
679 final Graphics g2 = tmp.createGraphics();
730 if (scrollMap ==
null) {
733 final long tmp = scrollMap;
734 final int dx = (int)(tmp>>32);
735 final int dy = (int)tmp;
744 @SuppressWarnings(
"MethodDoesntCallSuperMethod")