org.xmind.ui.resources.ImageUtils.java Source code

Java tutorial

Introduction

Here is the source code for org.xmind.ui.resources.ImageUtils.java

Source

/* ******************************************************************************
 * Copyright (c) 2006-2012 XMind Ltd. and others.
 * 
 * This file is a part of XMind 3. XMind releases 3 and
 * above are dual-licensed under the Eclipse Public License (EPL),
 * which is available at http://www.eclipse.org/legal/epl-v10.html
 * and the GNU Lesser General Public License (LGPL), 
 * which is available at http://www.gnu.org/licenses/lgpl.html
 * See http://www.xmind.net/license.html for details.
 * 
 * Contributors:
 *     XMind Ltd. - initial API and implementation
 *******************************************************************************/
package org.xmind.ui.resources;

import org.eclipse.jface.resource.ImageDescriptor;
import org.eclipse.jface.resource.ImageRegistry;
import org.eclipse.jface.resource.JFaceResources;
import org.eclipse.jface.resource.LocalResourceManager;
import org.eclipse.swt.graphics.Color;
import org.eclipse.swt.graphics.GC;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.graphics.ImageData;
import org.eclipse.swt.graphics.Point;
import org.eclipse.swt.graphics.RGB;
import org.eclipse.swt.graphics.Rectangle;
import org.eclipse.swt.widgets.Display;

/**
 * @author Frank Shaka
 */
public class ImageUtils {

    private static Display display = null;

    private static Display getDisplay() {
        if (display == null) {
            display = Display.getCurrent();
            if (display == null)
                display = Display.getDefault();
        }
        return display;
    }

    private static ImageRegistry imageRegistry = null;

    private static ImageRegistry getImageRegistry() {
        if (imageRegistry == null)
            imageRegistry = JFaceResources.getImageRegistry();
        return imageRegistry;
    }

    private ImageUtils() {
    }

    /**
     * @deprecated Use local {@link ImageRegistry} instances
     */
    public static Image getImage(String key) {
        return getImageRegistry().get(key);
    }

    /**
     * @deprecated Use local {@link ImageRegistry} instances
     */
    public static ImageDescriptor getDescriptor(String key) {
        return getImageRegistry().getDescriptor(key);
    }

    /**
     * @deprecated Use local {@link ImageRegistry} instances
     */
    public static void putImage(String key, Image image) {
        getImageRegistry().put(key, image);
    }

    /**
     * @deprecated Use local {@link ImageRegistry} instances
     */
    public static void putImageDescriptor(String key, ImageDescriptor descriptor) {
        getImageRegistry().put(key, descriptor);
    }

    /**
     * @deprecated Use local {@link ImageRegistry} instances
     */
    public static boolean disposeImage(String key) {
        Image img = getImage(key);
        if (img == null)
            return false;
        getImageRegistry().remove(key);
        if (!img.isDisposed())
            img.dispose();
        return true;
    }

    /**
     * @deprecated Use local {@link ImageRegistry} instances
     */
    public static Image getImage(String key, ImageData defaultImageData) {
        Image image = getImage(key);
        if (image == null) {
            getImageRegistry().put(key, ImageDescriptor.createFromImageData(defaultImageData));
            image = getImage(key);
        }
        return image;
    }

    /**
     * @deprecated Use local {@link ImageRegistry} instances
     */
    public static Image getImage(String key, ImageDescriptor defaultImageDescriptor) {
        ImageDescriptor descriptor = getImageRegistry().getDescriptor(key);
        if (descriptor == null && defaultImageDescriptor != null) {
            getImageRegistry().put(key, defaultImageDescriptor);
        }
        return getImageRegistry().get(key);
    }

    /**
     * @deprecated Use {@link LocalResourceManager}
     */
    public static Image getImage(ImageDescriptor imgDesc) {
        return imgDesc == null ? null : getImage(imgDesc.toString(), imgDesc);
    }

    public static Image getSmallIconByRGB(String key, RGB rgb) {
        return getSmallIconByColor(key, ColorUtils.getColor(rgb));
    }

    public static Image getSmallIconByColor(String key, Color c) {
        Image image = getImage(key);
        if (image == null) {
            image = new Image(getDisplay(), 16, 16);
            GC gc = new GC(image);
            gc.setBackground(c);
            gc.fillRectangle(image.getBounds());
            gc.dispose();
            getImageRegistry().put(key, image);
        }
        return image;
    }

    public static Image getFilledImage(String key, Image src, int width, int height) {
        Image image = getImage(key);
        if (image == null) {
            image = createFilledImage(src, width, height);
            getImageRegistry().put(key, image);
        }
        return image;
    }

    public static Image createFilledImage(Image src, int width, int height) {
        Rectangle srcBounds = src.getBounds();
        Image dest = new Image(getDisplay(), width, height);
        GC gc = new GC(dest);
        gc.drawImage(src, 0, 0, srcBounds.width, srcBounds.height, 0, 0, width, height);
        gc.dispose();
        return dest;
    }

    public static Image createFilledImage2(Image src, int width, int height) {
        ImageData srcData = src.getImageData();
        return new Image(getDisplay(), srcData.scaledTo(width, height));
    }

    public static Image getScaledConstrainedImage(String key, Image src, int width, int height) {
        Image image = getImage(key);
        if (image == null) {
            image = createScaledConstrainedImage(src, width, height);
            getImageRegistry().put(key, image);
        }
        return image;
    }

    public static Image createScaledConstrainedImage(Image src, int width, int height) {
        ImageData srcData = src.getImageData();
        ImageData destData = new ImageData(width, height, srcData.depth, srcData.palette);
        destData.type = srcData.type;
        destData.transparentPixel = srcData.transparentPixel;
        destData.alpha = -1;

        Point destSize = getScaledConstrainedSize(srcData.width, srcData.height, width, height);
        int startX = (width - destSize.x) / 2;
        int startY = (height - destSize.y) / 2;

        srcData = srcData.scaledTo(destSize.x, destSize.y);

        if (srcData.transparentPixel != -1) {
            for (int x = 0; x < width; x++)
                for (int y = 0; y < height; y++)
                    destData.setPixel(x, y, srcData.transparentPixel);
        } else {
            for (int x = 0; x < width; x++)
                for (int y = 0; y < height; y++)
                    destData.setAlpha(x, y, 0);
        }

        int length = destSize.x;
        int[] pixels = new int[length];
        byte[] alphas = null;
        for (int y = 0; y < destSize.y; y++) {
            srcData.getPixels(0, y, length, pixels, 0);
            destData.setPixels(startX, startY + y, length, pixels, 0);
            if (srcData.alpha == -1 && srcData.alphaData != null) {
                if (alphas == null)
                    alphas = new byte[length];
                srcData.getAlphas(0, y, length, alphas, 0);
            } else if (srcData.alpha != -1 && alphas == null) {
                alphas = new byte[length];
                for (int i = 0; i < alphas.length; i++)
                    alphas[i] = (byte) srcData.alpha;
            } else if (alphas == null) {
                alphas = new byte[length];
                for (int i = 0; i < alphas.length; i++)
                    alphas[i] = (byte) 0xff;
            }
            destData.setAlphas(startX, startY + y, length, alphas, 0);
        }

        Image image = new Image(getDisplay(), destData);
        return image;
    }

    private static Point getScaledConstrainedSize(int w, int h, int maxWidth, int maxHeight) {
        if (w == 0 || h == 0)
            return new Point(0, 0);
        if (maxWidth < 0 && maxHeight < 0)
            return new Point(w, h);
        if (w <= maxWidth && h <= maxHeight)
            return new Point(w, h);
        int nw = w * maxHeight / h;
        int nh = h * maxWidth / w;
        if (maxWidth < 0)
            return new Point(nw, maxHeight);
        if (maxHeight < 0)
            return new Point(maxWidth, nh);
        if (nw < maxWidth)
            maxWidth = nw;
        if (nh < maxHeight)
            maxHeight = nh;
        return new Point(Math.max(1, maxWidth), Math.max(1, maxHeight));
    }

    public static Image createScaledImage(Image src, int width, int height) {
        Rectangle srcBounds = src.getBounds();
        Image image = new Image(getDisplay(), width, height);
        GC gc = new GC(image);
        gc.drawImage(src, 0, 0, srcBounds.width, srcBounds.height, 0, 0, width, height);
        gc.dispose();
        return image;
    }

    public static ImageDescriptor createErrorImage(int width, int height) {
        return new ErrorImageDescriptor(width, height);
    }

    public static Image getErrorImage(int width, int height) {
        String key = "image.common.error#" + width + "," + height; //$NON-NLS-1$ //$NON-NLS-2$
        Image img = getImage(key);
        if (img == null) {
            img = createErrorImage(width, height).createImage(getDisplay());
            if (img != null) {
                getImageRegistry().put(key, img);
            }
        }
        return img;
    }

    public static ImageDescriptor scaleImage(Display display, ImageDescriptor imageDesc, int width, int height) {
        if (imageDesc == null)
            return null;

        ImageData imageData = imageDesc.getImageData();
        if (imageData == null) // Can by JPEG using CMYK colour space etc.
            return imageDesc;

        int newHeight = height;
        int newWidth = (imageData.width * newHeight) / imageData.height;
        if (newWidth > width) {
            newWidth = width;
            newHeight = (imageData.height * newWidth) / imageData.width;
        }

        // Use GC.drawImage to scale which gives better result on Mac

        Image newImage = new Image(display, newWidth, newHeight);

        GC gc = new GC(newImage);

        Image oldImage = imageDesc.createImage();

        gc.drawImage(oldImage, 0, 0, imageData.width, imageData.height, 0, 0, newWidth, newHeight);

        ImageDescriptor result = ImageDescriptor.createFromImage(newImage);

        oldImage.dispose();
        gc.dispose();

        return result;
    }

}