< prev index next >
modules/graphics/src/main/java/com/sun/javafx/iio/gif/GIFImageLoader2.java
Print this page
rev 8890 : RT-40778
*** 28,39 ****
import com.sun.javafx.iio.ImageFrame;
import com.sun.javafx.iio.ImageMetadata;
import com.sun.javafx.iio.ImageStorage;
import com.sun.javafx.iio.common.ImageLoaderImpl;
import com.sun.javafx.iio.common.ImageTools;
- import com.sun.javafx.iio.common.PushbroomScaler;
- import com.sun.javafx.iio.common.ScalerFactory;
import java.io.EOFException;
import java.io.IOException;
import java.io.InputStream;
import java.nio.ByteBuffer;
import java.util.Arrays;
--- 28,37 ----
*** 221,247 ****
boolean localPalette = (imgCtrl & 0x80) != 0;
boolean isInterlaced = (imgCtrl & 0x40) != 0;
byte palette[][] = localPalette ? readPalete(2 << (imgCtrl & 7), trnsIndex) : globalPalette;
! ImageMetadata metadata = updateMetadata(screenW, screenH, imageControlCode & 0xFFFF);
int disposalCode = (imageControlCode >>> 26) & 7;
byte pImage[] = new byte[w * h];
decodeImage(pImage, w, h, isInterlaced ? computeInterlaceReIndex(h) : null);
! ImageFrame imgGIF = decodePalette(pImage, palette, trnsIndex,
! left, top, w, h, disposalCode, metadata);
! // need to remove scaler from image decoder itself
! int[] outWH = ImageTools.computeDimensions(screenW, screenH, width, height, preserveAspectRatio);
!
! if (screenW != outWH[0] || screenH != outWH[1]) {
! imgGIF = scaleImage(imgGIF, outWH[0], outWH[1], smooth);
}
! return imgGIF;
}
// IO helpers
private int readByte() throws IOException {
int ch = stream.read();
--- 219,248 ----
boolean localPalette = (imgCtrl & 0x80) != 0;
boolean isInterlaced = (imgCtrl & 0x40) != 0;
byte palette[][] = localPalette ? readPalete(2 << (imgCtrl & 7), trnsIndex) : globalPalette;
! int[] outWH = ImageTools.computeDimensions(screenW, screenH, width, height, preserveAspectRatio);
! width = outWH[0];
! height = outWH[1];
!
! ImageMetadata metadata = updateMetadata(width, height, imageControlCode & 0xFFFF);
int disposalCode = (imageControlCode >>> 26) & 7;
byte pImage[] = new byte[w * h];
decodeImage(pImage, w, h, isInterlaced ? computeInterlaceReIndex(h) : null);
! ByteBuffer img = decodePalette(pImage, palette, trnsIndex,
! left, top, w, h, disposalCode);
! if (screenW != width || screenH != height) {
! img = ImageTools.scaleImage(img, screenW, screenH, 4,
! width, height, smooth);
}
! return new ImageFrame(ImageStorage.ImageType.RGBA, img,
! width, height, width * 4, null, metadata);
}
// IO helpers
private int readByte() throws IOException {
int ch = stream.read();
*** 288,299 ****
}
}
}
// decode palletized image into RGBA
! private ImageFrame decodePalette(byte[] srcImage, byte[][] palette, int trnsIndex,
! int left, int top, int w, int h, int disposalCode, ImageMetadata metadata) {
byte img[] = (disposalCode == 3) ? image.clone() : image;
for (int y = 0; y != h; ++y) {
int iPos = ((top + y) * screenW + left) * 4;
--- 289,300 ----
}
}
}
// decode palletized image into RGBA
! private ByteBuffer decodePalette(byte[] srcImage, byte[][] palette, int trnsIndex,
! int left, int top, int w, int h, int disposalCode) {
byte img[] = (disposalCode == 3) ? image.clone() : image;
for (int y = 0; y != h; ++y) {
int iPos = ((top + y) * screenW + left) * 4;
*** 320,348 ****
}
if (disposalCode != 3) img = img.clone();
if (disposalCode == 2) restoreToBackground(image, left, top, w, h);
! return new ImageFrame(ImageStorage.ImageType.RGBA, ByteBuffer.wrap(img),
! screenW, screenH, screenW * 4, null, metadata);
! }
!
! // copy from PNG, needs exctract refactoring later
! // scales the image
! private ImageFrame scaleImage(ImageFrame imgPNG, int rWidth, int rHeight, boolean smooth) {
! byte image[] = ((ByteBuffer) imgPNG.getImageData()).array();
! int bpp = ImageStorage.getNumBands(imgPNG.getImageType());
!
! PushbroomScaler scaler = ScalerFactory.createScaler(screenW, screenH, bpp,
! rWidth, rHeight, smooth);
!
! for (int y = 0; y != screenH; ++y) {
! scaler.putSourceScanline(image, y * screenW * bpp);
! }
!
! return new ImageFrame(imgPNG.getImageType(), scaler.getDestination(),
! rWidth, rHeight, rWidth * bpp, null, imgPNG.getMetadata());
}
// fill metadata
private ImageMetadata updateMetadata(int w, int h, int delayTime) {
ImageMetadata metaData = new ImageMetadata(null, true, null, null, null,
--- 321,331 ----
}
if (disposalCode != 3) img = img.clone();
if (disposalCode == 2) restoreToBackground(image, left, top, w, h);
! return ByteBuffer.wrap(img);
}
// fill metadata
private ImageMetadata updateMetadata(int w, int h, int delayTime) {
ImageMetadata metaData = new ImageMetadata(null, true, null, null, null,
< prev index next >