From deeb6c8bcebaba232601ade5a010c1c33fc88441 Mon Sep 17 00:00:00 2001 From: "changhyun1.lee" Date: Sat, 16 Mar 2013 15:14:18 +0900 Subject: [PATCH] [Title] Added AppTrayIcon Feature [Desc.] [Issue] Redmine-8752 Change-Id: Idd7800f58db059f83827a463ca1d742d76bff810 --- org.tizen.common/icons/effect.png | Bin 0 -> 6812 bytes org.tizen.common/icons/mask.png | Bin 0 -> 4499 bytes .../src/org/tizen/common/ScreenDensity.java | 81 ++++++ .../org/tizen/common/ui/dialog/NewIconDialog.java | 296 +++++++++++++++++++ .../src/org/tizen/common/util/ImageUtil.java | 313 +++++++++++++++------ 5 files changed, 603 insertions(+), 87 deletions(-) create mode 100644 org.tizen.common/icons/effect.png create mode 100644 org.tizen.common/icons/mask.png create mode 100644 org.tizen.common/src/org/tizen/common/ScreenDensity.java create mode 100644 org.tizen.common/src/org/tizen/common/ui/dialog/NewIconDialog.java diff --git a/org.tizen.common/icons/effect.png b/org.tizen.common/icons/effect.png new file mode 100644 index 0000000000000000000000000000000000000000..6271bf551e2831630ada85f305167c722bda5261 GIT binary patch literal 6812 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 literal 0 HcmV?d00001 diff --git a/org.tizen.common/src/org/tizen/common/ScreenDensity.java b/org.tizen.common/src/org/tizen/common/ScreenDensity.java new file mode 100644 index 0000000..b0f9d3b --- /dev/null +++ b/org.tizen.common/src/org/tizen/common/ScreenDensity.java @@ -0,0 +1,81 @@ +/* + * Common + * + * Copyright (c) 2000 - 2012 Samsung Electronics Co., Ltd. All rights reserved. + * + * Contact: + * Changhyun Lee + * Hyeongseok Heo + * Kangho Kim + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * Contributors: + * - S-Core Co., Ltd + * + */ + +package org.tizen.common; + +/** + * The original source is org.tizen.nativecpp.misc.core.ScreenDensity + */ +public enum ScreenDensity { + + XHIGH("xhigh", "Xhigh Density", 108), HIGH("high", "High Density", 90); + + private final String fName; + private final String fDisplayName; + private final int fIconSize; + + private ScreenDensity(String value, String display, int size) { + fName = value; + fDisplayName = display; + fIconSize = size; + } + + public int getIconSize() { + return fIconSize; + } + + public String getName() { + return fName; + } + + public String getDisplayName() { + return fDisplayName; + } + + public String getIconDirectory() { + return "screen-density-" + fName; + } + + public static ScreenDensity getEnumFromDisplayName(String disName) { + for (ScreenDensity sd : values()) { + if (sd.getDisplayName().equals(disName)) { + return sd; + } + } + return null; + } + + public static ScreenDensity getEnum(String name) { + for (ScreenDensity sd : values()) { + if (sd.getName().equals(name)) { + return sd; + } + } + return null; + } + +} diff --git a/org.tizen.common/src/org/tizen/common/ui/dialog/NewIconDialog.java b/org.tizen.common/src/org/tizen/common/ui/dialog/NewIconDialog.java new file mode 100644 index 0000000..981f9b4 --- /dev/null +++ b/org.tizen.common/src/org/tizen/common/ui/dialog/NewIconDialog.java @@ -0,0 +1,296 @@ +/* + * Common + * + * Copyright (c) 2000 - 2012 Samsung Electronics Co., Ltd. All rights reserved. + * + * Contact: + * Changhyun Lee + * Hyeongseok Heo + * Kangho Kim + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * Contributors: + * - S-Core Co., Ltd + * + */ + +package org.tizen.common.ui.dialog; + +import java.awt.AlphaComposite; +import java.awt.Graphics2D; +import java.awt.image.BufferedImage; +import java.io.File; +import java.io.IOException; + +import org.eclipse.core.resources.IFile; +import org.eclipse.core.resources.IProject; +import org.eclipse.core.runtime.CoreException; +import org.eclipse.core.runtime.IStatus; +import org.eclipse.core.runtime.Status; +import org.eclipse.jface.dialogs.MessageDialog; +import org.eclipse.swt.SWT; +import org.eclipse.swt.events.ModifyEvent; +import org.eclipse.swt.events.ModifyListener; +import org.eclipse.swt.events.SelectionAdapter; +import org.eclipse.swt.events.SelectionEvent; +import org.eclipse.swt.graphics.Image; +import org.eclipse.swt.graphics.ImageData; +import org.eclipse.swt.graphics.ImageLoader; +import org.eclipse.swt.layout.GridData; +import org.eclipse.swt.layout.GridLayout; +import org.eclipse.swt.widgets.Button; +import org.eclipse.swt.widgets.Combo; +import org.eclipse.swt.widgets.Composite; +import org.eclipse.swt.widgets.Control; +import org.eclipse.swt.widgets.Display; +import org.eclipse.swt.widgets.FileDialog; +import org.eclipse.swt.widgets.Label; +import org.eclipse.swt.widgets.Shell; +import org.eclipse.swt.widgets.Text; +import org.eclipse.ui.dialogs.SelectionStatusDialog; +import org.tizen.common.CommonPlugin; +import org.tizen.common.ScreenDensity; +import org.tizen.common.util.FileUtil; +import org.tizen.common.util.ImageUtil; +import org.tizen.common.util.log.Logger; + +/** + * The original source is org.tizen.nativecpp.misc.editor.UiNewIconDialog + */ +public class NewIconDialog extends SelectionStatusDialog { + + public static final String ICON_FILE_NAME = "icon.png"; + public static final String[] ICON_FILTER_EXTENSIONS = { "*.png;*.gif;*.jpg;*.ico" }; + public static final String MASK_IMAGE_PATH = "/icons/mask.png"; + public static final String EFFECT_IMAGE_PATH = "/icons/effect.png"; + + private Text fText; + private Button fBrowseBtn; + private Combo fDensityCombo; + private String fPath; + protected Label fPreviewImage; + private IProject fProject; // need to refresh file tree + private Label lblPreview; + private Label lblNewLabel; + private Label lblImageFile; + private boolean fIsMenuIcon; + private BufferedImage fMaskImage, fEffectImage, fIconImage; + private Button fMenuIconCheck; + + public NewIconDialog(Shell parentShell, IProject project) { + super(parentShell); + setTitle("Add Icon"); + fProject = project; + + setStatusLineAboveButtons(true); + } + + public String getPath() { + return fPath; + } + + @Override + protected Control createDialogArea(Composite parent) { + Composite grid = new Composite(parent, SWT.NONE); + grid.setLayout(new GridLayout(4, false)); + GridData gd = new GridData(GridData.FILL_BOTH); + // gd.widthHint = 400; + grid.setLayoutData(gd); + applyDialogFont(grid); + + lblImageFile = new Label(grid, SWT.NONE); + lblImageFile.setText("Image File:"); + lblImageFile.setLayoutData(new GridData(SWT.RIGHT, SWT.CENTER, false, false, 1, 1)); + + fText = new Text(grid, SWT.BORDER); + fText.addModifyListener(new ModifyListener() { + @Override + public void modifyText(ModifyEvent e) { + validate(); + } + }); + fText.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false, 1, 1)); + + fBrowseBtn = new Button(grid, SWT.PUSH); + fBrowseBtn.setText("Browse..."); + fBrowseBtn.addSelectionListener(new SelectionAdapter() { + @Override + public void widgetSelected(SelectionEvent e) { + super.widgetSelected(e); + handleBrowse(); + } + }); + fBrowseBtn.setLayoutData(new GridData(SWT.RIGHT, SWT.CENTER, false, false, 1, 1)); + + lblPreview = new Label(grid, SWT.NONE); + lblPreview.setLayoutData(new GridData(SWT.CENTER, SWT.CENTER, false, false, 1, 1)); + lblPreview.setText("Preview:"); + + // second row + Label label = new Label(grid, SWT.NONE); + label.setText("Density:"); + label.setLayoutData(new GridData(SWT.RIGHT, SWT.TOP, false, false, 1, 1)); + + fDensityCombo = new Combo(grid, SWT.READ_ONLY); + for (ScreenDensity sd : ScreenDensity.values()) { + fDensityCombo.add(sd.getName()); + } + + fDensityCombo.select(0); + GridData gd_fDensityCombo = new GridData(SWT.LEFT, SWT.CENTER, true, false, 1, 1); + gd_fDensityCombo.widthHint = 250; + fDensityCombo.setLayoutData(gd_fDensityCombo); + new Label(grid, SWT.NONE); + + fPreviewImage = new Label(grid, SWT.BORDER); + gd = new GridData(SWT.RIGHT, SWT.FILL, false, false, 1, 2); + gd.widthHint = 120; + gd.heightHint = 120; + fPreviewImage.setLayoutData(gd); + + lblNewLabel = new Label(grid, SWT.NONE); + lblNewLabel.setLayoutData(new GridData(SWT.RIGHT, SWT.TOP, false, false, 1, 1)); + lblNewLabel.setText("Option:"); + + fMenuIconCheck = new Button(grid, SWT.CHECK); + fMenuIconCheck.setLayoutData(new GridData(SWT.FILL, SWT.TOP, false, false, 1, 1)); + fMenuIconCheck.setText("MainMenu Icon"); + fMenuIconCheck.addSelectionListener(new SelectionAdapter() { + @Override + public void widgetSelected(SelectionEvent e) { + validate(); + super.widgetSelected(e); + } + }); + new Label(grid, SWT.NONE); + + setHelpAvailable(false); + validate(); + + return grid; + } + + private void validate() { + computeResult(); + IStatus status = null; + + File file = new File(fPath); + + if (fPath.length() < 3 || file.isDirectory()) { + status = new Status(IStatus.ERROR, CommonPlugin.PLUGIN_ID, "Enter a path"); + } else if (!file.exists()) { + status = new Status(IStatus.ERROR, CommonPlugin.PLUGIN_ID, fPath + " does not exist"); + } else { + status = new Status(IStatus.OK, CommonPlugin.PLUGIN_ID, null); + } + + updateStatus(status); + + if (status.isOK()) { + updatePreview(); + } + } + + @Override + protected void okPressed() { + IFile destFile = fProject.getFile(ICON_FILE_NAME); + if (destFile.exists()) { + MessageDialog dlg = new MessageDialog(getShell(), + "File Already Exists", + null, + destFile.getProjectRelativePath().toOSString() + " already exists.\nWould you like to replace it?", + MessageDialog.QUESTION, + new String[] { "Yes", "No" }, + 0 + ); + + if (dlg.open() == 1) { + return; + } else { + try { + destFile.delete(true, null); + } catch (CoreException e) { + Logger.log(e); + } + } + } + + try { + if (fIsMenuIcon) { + Image image = fPreviewImage.getImage(); + ImageLoader loader = new ImageLoader(); + loader.data = new ImageData[] { image.getImageData() }; + loader.save(destFile.getLocation().toString(), SWT.IMAGE_PNG); + } else { + FileUtil.copyTo(fPath, destFile.getLocation().toString(), false); + } + + destFile.getParent().refreshLocal(1, null); + } catch (IOException e) { + Logger.log(e); + } catch (CoreException e1) { + Logger.log(e1); + } + + super.okPressed(); // widget will be disposed + } + + @Override + protected void computeResult() { + fPath = fText.getText(); + fIsMenuIcon = fMenuIconCheck.getSelection(); + } + + protected void updatePreview() { + Image image = null; + if (fIsMenuIcon) { + int size = ScreenDensity.XHIGH.getIconSize(); + BufferedImage srcImage = ImageUtil.getAWTImage(fPath, false); + fIconImage = ImageUtil.getScaledImage(srcImage, size, size); + + if (fMaskImage == null) { + fMaskImage = ImageUtil.getAWTImage(MASK_IMAGE_PATH, true); + } + if (fEffectImage == null) { + fEffectImage = ImageUtil.getAWTImage(EFFECT_IMAGE_PATH, true); + } + + BufferedImage tempImage = new BufferedImage(fMaskImage.getWidth(), fMaskImage.getHeight(), BufferedImage.TYPE_INT_ARGB); + Graphics2D graph = tempImage.createGraphics(); + graph.drawImage(fMaskImage, 0, 0, null); + graph.setComposite(AlphaComposite.SrcAtop); + // graph.setComposite(AlphaComposite.SrcOver); + graph.drawImage(fIconImage, 0, 0, null); + graph.drawImage(fEffectImage, 0, 0, null); + graph.dispose(); + + image = ImageUtil.convertImageToSWT(getShell().getDisplay(), tempImage); + } else { + BufferedImage bimage = ImageUtil.getAWTImage(fPath, false); + image = ImageUtil.convertImageToSWT(fPreviewImage.getDisplay(), bimage); + } + fPreviewImage.setImage(image); + } + + public void handleBrowse() { + FileDialog dialog = new FileDialog(Display.getDefault().getActiveShell(), SWT.OPEN); + dialog.setFilterExtensions(ICON_FILTER_EXTENSIONS); + String src = dialog.open(); + if (src == null) { + return; + } + fText.setText(src); + } + +} diff --git a/org.tizen.common/src/org/tizen/common/util/ImageUtil.java b/org.tizen.common/src/org/tizen/common/util/ImageUtil.java index 49d85e2..acec67e 100644 --- a/org.tizen.common/src/org/tizen/common/util/ImageUtil.java +++ b/org.tizen.common/src/org/tizen/common/util/ImageUtil.java @@ -24,29 +24,42 @@ */ package org.tizen.common.util; +import java.awt.Graphics; +import java.awt.image.BufferedImage; +import java.awt.image.DirectColorModel; +import java.awt.image.IndexColorModel; +import java.awt.image.WritableRaster; +import java.io.File; +import java.io.IOException; +import java.io.InputStream; import java.net.URL; +import javax.imageio.ImageIO; + import org.eclipse.core.runtime.Platform; import org.eclipse.core.runtime.Plugin; import org.eclipse.jface.resource.ImageDescriptor; import org.eclipse.swt.graphics.Image; import org.eclipse.swt.graphics.ImageData; +import org.eclipse.swt.graphics.PaletteData; +import org.eclipse.swt.graphics.RGB; +import org.eclipse.swt.widgets.Display; import org.osgi.framework.Bundle; import org.tizen.common.SurrogateWithArgument; - +import org.tizen.common.util.log.Logger; public class ImageUtil { - public static class PlatformSurrogate { - public Bundle getBundle(String pluginID) { - return Platform.getBundle(pluginID); - } - } - - public static class PluginSurrogate { - public Bundle getBundle(Plugin plugin) { - return plugin.getBundle(); - } - } + public static class PlatformSurrogate { + public Bundle getBundle(String pluginID) { + return Platform.getBundle(pluginID); + } + } + + public static class PluginSurrogate { + public Bundle getBundle(Plugin plugin) { + return plugin.getBundle(); + } + } public static final String[] supportedImageExtension = { "*.gif;*.png;*.jpeg;*.jpg;*.tiff;*.tif;*.ico;*.bmp;*.rle", // all supported format in SWT //$NON-NLS-1$ @@ -58,79 +71,205 @@ public class ImageUtil { "*.bmp", // Windows Bitmap //$NON-NLS-1$ "*.rle" // Windows Bitmap with run-length encoding //$NON-NLS-1$ }; - - /** - * load image descriptor from bundle with filePath - * - * @param bundle {@link Bundle} - * @param filePath image file path - * - * @return loaded {@link ImageDescriptor} - */ - protected static - ImageDescriptor - getImageDescriptor( - final Bundle bundle, - final String filePath - ) - { - final URL url = bundle.getEntry( filePath ); - return ImageDescriptor.createFromURL( url ); - } - - protected static SurrogateWithArgument platformSurrogate = new SurrogateWithArgument() { - public Bundle getAdapter( final String pluginId ) - { - return Platform.getBundle( pluginId ); - } - }; - protected static SurrogateWithArgument pluginSurrogate = new SurrogateWithArgument() { - public Bundle getAdapter(Plugin plugin) { - return plugin.getBundle(); - } - }; - - // get ImageDescriptor from Plugin ID (ID -> ImageDescriptor) - public static ImageDescriptor getImageDescriptor(String pluginID, String filePath) { - return getImageDescriptor( platformSurrogate.getAdapter(pluginID), filePath ); - } - - // get ImageDescriptor from Activator Plugin (Activator -> ImageDescriptor) - public static ImageDescriptor getImageDescriptor(Plugin plugin, String filePath) { - return getImageDescriptor( pluginSurrogate.getAdapter(plugin), filePath ); - } - - // get Image from ImageDescriptor (ImageDescriptor -> Image) - public static Image getImage(ImageDescriptor descriptor) { - return (descriptor != null) ? descriptor.createImage() : null; - } - - // get ImageData from ImageDescriptor (ImageDescriptor -> ImageData) - public static ImageData getImageData(ImageDescriptor descriptor) { - return (descriptor != null) ? descriptor.getImageData() : null; - } - - // get Image from Activator Plugin (Activator -> ImageDescriptor -> Image) - public static Image getImage(Plugin plugin, String filePath) { - ImageDescriptor descriptor = getImageDescriptor(plugin, filePath); - return getImage(descriptor); - } - - // get ImageData from Activator Plugin (Activator -> ImageDescriptor -> ImageData) - public static ImageData getImageData(Plugin plugin, String filePath) { - ImageDescriptor descriptor = getImageDescriptor(plugin, filePath); - return getImageData(descriptor); - } - - // get Image from Plugin ID (ID -> ImageDescriptor -> Image) - public static Image getImage(String pluginID, String filePath) { - ImageDescriptor descriptor = getImageDescriptor(pluginID, filePath); - return getImage(descriptor); - } - - // get Image from Plugin ID (ID -> ImageDescriptor -> ImageData) - public static ImageData getImageData(String pluginID, String filePath) { - ImageDescriptor descriptor = getImageDescriptor(pluginID, filePath); - return getImageData(descriptor); - } + + /** + * load image descriptor from bundle with filePath + * + * @param bundle {@link Bundle} + * @param filePath image file path + * + * @return loaded {@link ImageDescriptor} + */ + protected static + ImageDescriptor + getImageDescriptor( + final Bundle bundle, + final String filePath + ) + { + final URL url = bundle.getEntry( filePath ); + return ImageDescriptor.createFromURL( url ); + } + + protected static SurrogateWithArgument platformSurrogate = new SurrogateWithArgument() { + public Bundle getAdapter( final String pluginId ) + { + return Platform.getBundle( pluginId ); + } + }; + + protected static SurrogateWithArgument pluginSurrogate = new SurrogateWithArgument() { + public Bundle getAdapter(Plugin plugin) { + return plugin.getBundle(); + } + }; + + // get ImageDescriptor from Plugin ID (ID -> ImageDescriptor) + public static ImageDescriptor getImageDescriptor(String pluginID, String filePath) { + return getImageDescriptor( platformSurrogate.getAdapter(pluginID), filePath ); + } + + // get ImageDescriptor from Activator Plugin (Activator -> ImageDescriptor) + public static ImageDescriptor getImageDescriptor(Plugin plugin, String filePath) { + return getImageDescriptor( pluginSurrogate.getAdapter(plugin), filePath ); + } + + // get Image from ImageDescriptor (ImageDescriptor -> Image) + public static Image getImage(ImageDescriptor descriptor) { + return (descriptor != null) ? descriptor.createImage() : null; + } + + // get ImageData from ImageDescriptor (ImageDescriptor -> ImageData) + public static ImageData getImageData(ImageDescriptor descriptor) { + return (descriptor != null) ? descriptor.getImageData() : null; + } + + // get Image from Activator Plugin (Activator -> ImageDescriptor -> Image) + public static Image getImage(Plugin plugin, String filePath) { + ImageDescriptor descriptor = getImageDescriptor(plugin, filePath); + return getImage(descriptor); + } + + // get ImageData from Activator Plugin (Activator -> ImageDescriptor -> ImageData) + public static ImageData getImageData(Plugin plugin, String filePath) { + ImageDescriptor descriptor = getImageDescriptor(plugin, filePath); + return getImageData(descriptor); + } + + // get Image from Plugin ID (ID -> ImageDescriptor -> Image) + public static Image getImage(String pluginID, String filePath) { + ImageDescriptor descriptor = getImageDescriptor(pluginID, filePath); + return getImage(descriptor); + } + + // get Image from Plugin ID (ID -> ImageDescriptor -> ImageData) + public static ImageData getImageData(String pluginID, String filePath) { + ImageDescriptor descriptor = getImageDescriptor(pluginID, filePath); + return getImageData(descriptor); + } + + public static BufferedImage getScaledImage(BufferedImage src, int width, int height) { + java.awt.Image scaledImage = src.getScaledInstance(width, height, java.awt.Image.SCALE_SMOOTH); + BufferedImage bi = new BufferedImage(width, height, BufferedImage.TYPE_INT_ARGB); + Graphics g = bi.getGraphics(); + g.drawImage(scaledImage, 0, 0, null); + g.dispose(); + return bi; + } + + /* + * The original source is org.tizen.nativecpp.misc.utils.ImageUtil + */ + public static BufferedImage getAWTImage(String path, boolean isRelativePath) { + BufferedImage image = null; + InputStream is = null; + + try { + if (isRelativePath) { + is = ImageUtil.class.getResourceAsStream(path); + if (is != null) { + image = ImageIO.read(is); + } + } else { + image = ImageIO.read(new File(path)); + } + } catch (Exception e) { + Logger.log(e); + } finally { + if (is != null) { + try { + is.close(); + } catch (IOException e) { + Logger.log(e); + } + } + } + + if (image == null) { + image = new BufferedImage(1, 1, BufferedImage.TYPE_INT_ARGB); + } + + return image; + } + + public static Image getSWTImage(Display display, String relativePath) { + Image image = null; + InputStream is = ImageUtil.class.getResourceAsStream(relativePath); + + try { + image = new Image(Display.getDefault(), is); + } catch (RuntimeException ex) { + Logger.log(ex); + } finally { + try { + if (is != null) { + is.close(); + } + } catch (IOException e) { + Logger.log(e); + } + } + + if (image == null) { + image = new Image(display, 1, 1); + } + return image; + } + + public static Image convertImageToSWT(Display display, BufferedImage bImage) { + int width = bImage.getWidth(); + int height = bImage.getHeight(); + + // we need alpha + BufferedImage bufferedImage = new BufferedImage(width, height, BufferedImage.TYPE_INT_ARGB); + Graphics graphics = bufferedImage.getGraphics(); + graphics.drawImage(bImage, 0, 0, null); + graphics.dispose(); + + if (bufferedImage.getColorModel() instanceof DirectColorModel) { + DirectColorModel colorModel = (DirectColorModel) bufferedImage.getColorModel(); + PaletteData palette = new PaletteData(colorModel.getRedMask(), colorModel.getGreenMask(), colorModel.getBlueMask()); + ImageData data = new ImageData(bufferedImage.getWidth(), bufferedImage.getHeight(), colorModel.getPixelSize(), palette); + for (int y = 0; y < data.height; y++) { + for (int x = 0; x < data.width; x++) { + int rgb = bufferedImage.getRGB(x, y); + int pixel = palette.getPixel(new RGB((rgb >> 16) & 0xFF, (rgb >> 8) & 0xFF, rgb & 0xFF)); + data.setPixel(x, y, pixel); + if (colorModel.hasAlpha()) { + data.setAlpha(x, y, (rgb >> 24) & 0xFF); + } + } + } + return new Image(display, data); + + } else if (bufferedImage.getColorModel() instanceof IndexColorModel) { + IndexColorModel colorModel = (IndexColorModel) bufferedImage.getColorModel(); + int size = colorModel.getMapSize(); + byte[] reds = new byte[size]; + byte[] greens = new byte[size]; + byte[] blues = new byte[size]; + colorModel.getReds(reds); + colorModel.getGreens(greens); + colorModel.getBlues(blues); + RGB[] rgbs = new RGB[size]; + for (int i = 0; i < rgbs.length; i++) { + rgbs[i] = new RGB(reds[i] & 0xFF, greens[i] & 0xFF, blues[i] & 0xFF); + } + PaletteData palette = new PaletteData(rgbs); + ImageData data = new ImageData(bufferedImage.getWidth(), bufferedImage.getHeight(), colorModel.getPixelSize(), palette); + data.transparentPixel = colorModel.getTransparentPixel(); + WritableRaster raster = bufferedImage.getRaster(); + int[] pixelArray = new int[1]; + for (int y = 0; y < data.height; y++) { + for (int x = 0; x < data.width; x++) { + raster.getPixel(x, y, pixelArray); + data.setPixel(x, y, pixelArray[0]); + } + } + return new Image(display, data); + } + + return null; + } + } -- 2.7.4