Package com.jcloisterzone.ui.theme

Source Code of com.jcloisterzone.ui.theme.Theme

package com.jcloisterzone.ui.theme;

import java.awt.Color;
import java.awt.Graphics2D;
import java.awt.Image;
import java.awt.Toolkit;
import java.awt.image.BufferedImage;
import java.awt.image.FilteredImageSource;
import java.awt.image.ImageFilter;
import java.net.URL;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.WeakHashMap;

import javax.swing.ImageIcon;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import com.jcloisterzone.ui.Client;
import com.jcloisterzone.ui.UiUtils;
import com.jcloisterzone.ui.legacy.FigureImageFilter;

public abstract class Theme {

    protected final transient Logger logger = LoggerFactory
            .getLogger(getClass());

    private final Client client;
    private final String baseDir;

    private Map<String, Image> imageCache = new WeakHashMap<String, Image>(64);

    public Theme(String baseDir, Client client) {
        this.baseDir = baseDir;
        this.client = client;
    }

    public Client getClient() {
        return client;
    }

    protected Map<String, Image> getImageCache() {
        return imageCache;
    }

    protected List<URL> getResourceLayers(String name) {
        int i = 0;
        List<URL> layers = new ArrayList<>();
        for (;;) {
            URL url = getResource(name + "_" + i + ".png", i > 0);
            if (url == null)
                break;
            layers.add(url);
            i++;
        }
        return layers;
    }

    protected URL getResource(String relativePath) {
        return getResource(relativePath, false);
    }

    private URL getResource(String relativePath, boolean silent) {
        // System.err.println(baseDir + "/" + relativePath);
        URL result = Theme.class.getClassLoader().getResource(
                baseDir + "/" + relativePath);
        if (result == null && !silent) {
            logger.error("Unable to load resource \"" + relativePath + "\"");
        }
        return result;
    }

    protected Image getImageResource(String relativePath) {
        return Toolkit.getDefaultToolkit().getImage(getResource(relativePath));
    }

    public Image getLayeredImage(String name, Color color) {
        String key;
        if (color == null) {
            key = name;
        } else {
            key = name + '#' + color.getRGB();
        }
        Image image = imageCache.get(key);
        if (image == null) {
            List<URL> layers = getResourceLayers(name);
            image = composeImages(layers, color);
            imageCache.put(key, image);
        }
        return image;
    }

    protected Image getImage(String name) {
        Image image = imageCache.get(name);
        if (image == null) {
            image = (new ImageIcon(getImageResource(name))).getImage();
            imageCache.put(name, image);
        }
        return image;
    }

    protected Image composeImages(Iterable<URL> layers, Color color) {
        BufferedImage result = null;
        Graphics2D g = null;

        ImageFilter colorfilter = null;
        if (color != null) {
            colorfilter = new FigureImageFilter(color);
        }

        for (URL layer : layers) {
            // Image img = new ImageIcon(getResource(path)).getImage();
            Image img = Toolkit.getDefaultToolkit().createImage(layer);
            if (colorfilter != null) {
                img = Toolkit.getDefaultToolkit().createImage(
                        new FilteredImageSource(img.getSource(), colorfilter));
            }
            img = (new ImageIcon(img)).getImage(); // wait for load
            if (g == null) {
                result = UiUtils.newTransparentImage(img.getWidth(null),
                        img.getHeight(null));
                g = result.createGraphics();
            }
            // bez new ImgIcon nefunguje - vyzkoumat proc
            g.drawImage(img, 0, 0, null);
        }

        g.dispose();
        return result;
    }

}
TOP

Related Classes of com.jcloisterzone.ui.theme.Theme

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.