/******************************************************************************* * Copyright (c) 2016 Weasis Team and others. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html * * Contributors: * Nicolas Roduit - initial API and implementation *******************************************************************************/ package org.weasis.imageio.codec; import java.net.URI; import java.util.ArrayList; import java.util.Hashtable; import java.util.Iterator; import java.util.List; import javax.imageio.ImageIO; import javax.imageio.spi.ImageReaderSpi; import javax.imageio.spi.ImageWriterSpi; import javax.media.jai.OperationDescriptorImpl; import javax.media.jai.OperationRegistry; import javax.media.jai.RegistryElementDescriptor; import javax.media.jai.registry.CollectionRegistryMode; import javax.media.jai.registry.RenderableRegistryMode; import javax.media.jai.registry.RenderedRegistryMode; import org.osgi.service.component.ComponentContext; import org.osgi.service.component.annotations.Activate; import org.osgi.service.component.annotations.Deactivate; import org.weasis.core.api.image.util.JAIUtil; import org.weasis.core.api.media.data.Codec; import org.weasis.core.api.media.data.MediaReader; import com.sun.media.imageioimpl.common.ImageioUtil; import com.sun.media.imageioimpl.plugins.bmp.BMPImageReaderSpi; import com.sun.media.imageioimpl.plugins.bmp.BMPImageWriterSpi; import com.sun.media.imageioimpl.plugins.gif.GIFImageWriterSpi; import com.sun.media.imageioimpl.plugins.jpeg.CLibJPEGImageReaderSpi; import com.sun.media.imageioimpl.plugins.jpeg.CLibJPEGImageWriterSpi; import com.sun.media.imageioimpl.plugins.jpeg2000.J2KImageReaderCodecLibSpi; import com.sun.media.imageioimpl.plugins.jpeg2000.J2KImageReaderSpi; import com.sun.media.imageioimpl.plugins.jpeg2000.J2KImageWriterCodecLibSpi; import com.sun.media.imageioimpl.plugins.jpeg2000.J2KImageWriterSpi; import com.sun.media.imageioimpl.plugins.png.CLibPNGImageReaderSpi; import com.sun.media.imageioimpl.plugins.png.CLibPNGImageWriterSpi; import com.sun.media.imageioimpl.plugins.pnm.PNMImageReaderSpi; import com.sun.media.imageioimpl.plugins.pnm.PNMImageWriterSpi; import com.sun.media.imageioimpl.plugins.raw.RawImageReaderSpi; import com.sun.media.imageioimpl.plugins.raw.RawImageWriterSpi; import com.sun.media.imageioimpl.plugins.tiff.TIFFImageReaderSpi; import com.sun.media.imageioimpl.plugins.tiff.TIFFImageWriterSpi; import com.sun.media.imageioimpl.plugins.wbmp.WBMPImageReaderSpi; import com.sun.media.imageioimpl.plugins.wbmp.WBMPImageWriterSpi; import com.sun.media.imageioimpl.stream.ChannelImageInputStreamSpi; import com.sun.media.imageioimpl.stream.ChannelImageOutputStreamSpi; import com.sun.media.jai.imageioimpl.ImageReadWriteSpi; import com.sun.media.jai.operator.ImageReadDescriptor; import com.sun.media.jai.operator.ImageWriteDescriptor; @org.osgi.service.component.annotations.Component(service = Codec.class, immediate = false) public class ImageioCodec implements Codec { @Override public String[] getReaderMIMETypes() { List<String> list = new ArrayList<>(); for (String s : ImageIO.getReaderMIMETypes()) { list.add(s); } list.add("image/x-ms-bmp"); //$NON-NLS-1$ return list.toArray(new String[list.size()]); } @Override public String[] getReaderExtensions() { return ImageIO.getReaderFileSuffixes(); } @Override public boolean isMimeTypeSupported(String mimeType) { if (mimeType != null) { for (String mime : getReaderMIMETypes()) { if (mimeType.equals(mime)) { return true; } } } return false; } @Override public MediaReader getMediaIO(URI media, String mimeType, Hashtable<String, Object> properties) { if (isMimeTypeSupported(mimeType)) { return new ImageElementIO(media, mimeType, this); } return null; } @Override public String getCodecName() { return "Sun java imageio"; //$NON-NLS-1$ } @Override public String[] getWriterExtensions() { return ImageIO.getWriterFileSuffixes(); } @Override public String[] getWriterMIMETypes() { return ImageIO.getWriterMIMETypes(); } // ================================================================================ // OSGI service implementation // ================================================================================ @Activate protected void activate(ComponentContext context) { // Do not use cache. Images must be download locally before reading them. ImageIO.setUseCache(false); // SPI Issue Resolution // Register imageio SPI with the classloader of this bundle // and unregister imageio SPI if imageio.jar is also in the jre/lib/ext folder Class[] jaiCodecs = { ChannelImageInputStreamSpi.class, ChannelImageOutputStreamSpi.class, J2KImageReaderSpi.class, J2KImageReaderCodecLibSpi.class, WBMPImageReaderSpi.class, BMPImageReaderSpi.class, PNMImageReaderSpi.class, RawImageReaderSpi.class, TIFFImageReaderSpi.class, J2KImageWriterSpi.class, J2KImageWriterCodecLibSpi.class, WBMPImageWriterSpi.class, BMPImageWriterSpi.class, GIFImageWriterSpi.class, PNMImageWriterSpi.class, RawImageWriterSpi.class, TIFFImageWriterSpi.class }; for (Class c : jaiCodecs) { ImageioUtil.registerServiceProvider(c); } // Set priority to these codec which have better performance to the one in JRE ImageioUtil.registerServiceProviderInHighestPriority(CLibJPEGImageReaderSpi.class, ImageReaderSpi.class, "jpeg"); //$NON-NLS-1$ ImageioUtil.registerServiceProviderInHighestPriority(CLibJPEGImageWriterSpi.class, ImageWriterSpi.class, "jpeg"); //$NON-NLS-1$ ImageioUtil.registerServiceProviderInHighestPriority(CLibPNGImageReaderSpi.class, ImageReaderSpi.class, "png"); //$NON-NLS-1$ ImageioUtil.registerServiceProviderInHighestPriority(CLibPNGImageWriterSpi.class, ImageWriterSpi.class, "png"); //$NON-NLS-1$ // TODO Should be in properties? // Unregister sun native jpeg codec // ImageioUtil.unRegisterServiceProvider(registry, CLibJPEGImageReaderSpi.class); // Register the ImageRead and ImageWrite operation for JAI new ImageReadWriteSpi().updateRegistry(JAIUtil.getOperationRegistry()); } @Deactivate protected void deactivate(ComponentContext context) { Class[] jaiCodecs = { ChannelImageInputStreamSpi.class, ChannelImageOutputStreamSpi.class, CLibJPEGImageReaderSpi.class, CLibPNGImageReaderSpi.class, J2KImageReaderSpi.class, J2KImageReaderCodecLibSpi.class, WBMPImageReaderSpi.class, BMPImageReaderSpi.class, PNMImageReaderSpi.class, RawImageReaderSpi.class, TIFFImageReaderSpi.class, CLibJPEGImageWriterSpi.class, CLibPNGImageWriterSpi.class, J2KImageWriterSpi.class, J2KImageWriterCodecLibSpi.class, WBMPImageWriterSpi.class, BMPImageWriterSpi.class, GIFImageWriterSpi.class, PNMImageWriterSpi.class, RawImageWriterSpi.class, TIFFImageWriterSpi.class }; for (Class c : jaiCodecs) { ImageioUtil.unRegisterServiceProvider(c); } OperationRegistry reg = JAIUtil.getOperationRegistry(); OperationDescriptorImpl[] desc = new OperationDescriptorImpl[] { new ImageReadDescriptor(), new ImageWriteDescriptor() }; for (OperationDescriptorImpl d : desc) { String[] supportedModes = { RenderedRegistryMode.MODE_NAME, RenderableRegistryMode.MODE_NAME, CollectionRegistryMode.MODE_NAME }; for (String mode : supportedModes) { Iterator<?> list = reg.getFactoryIterator(mode, d.getName()); while (list.hasNext()) { Object obj = list.next(); reg.unregisterFactory(mode, d.getName(), "com.sun.media.jai", obj); //$NON-NLS-1$ } } RegistryElementDescriptor dr = reg.getDescriptor(RenderedRegistryMode.MODE_NAME, d.getName()); if (dr != null) { reg.unregisterDescriptor(dr); } } } }