--- old/src/java.desktop/share/classes/java/awt/image/Raster.java 2016-03-15 19:16:06.245389756 +0530 +++ new/src/java.desktop/share/classes/java/awt/image/Raster.java 2016-03-15 19:16:06.057295763 +0530 @@ -1,5 +1,5 @@ /* - * Copyright (c) 1997, 2013, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1997, 2016, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -645,15 +645,26 @@ bandOffsets); switch(dataType) { case DataBuffer.TYPE_BYTE: - return new ByteInterleavedRaster(csm, dataBuffer, location); + if (dataBuffer instanceof DataBufferByte) { + return new ByteInterleavedRaster(csm, + (DataBufferByte)dataBuffer, location); + } + break; case DataBuffer.TYPE_USHORT: - return new ShortInterleavedRaster(csm, dataBuffer, location); + if (dataBuffer instanceof DataBufferUShort) { + return new ShortInterleavedRaster(csm, + (DataBufferUShort)dataBuffer, location); + } + break; default: throw new IllegalArgumentException("Unsupported data type " + dataType); } + + // Create the generic raster + return new SunWritableRaster(csm, dataBuffer, location); } /** @@ -713,18 +724,33 @@ switch(dataType) { case DataBuffer.TYPE_BYTE: - return new ByteBandedRaster(bsm, dataBuffer, location); + if (dataBuffer instanceof DataBufferByte) { + return new ByteBandedRaster(bsm, + (DataBufferByte)dataBuffer, location); + } + break; case DataBuffer.TYPE_USHORT: - return new ShortBandedRaster(bsm, dataBuffer, location); + if (dataBuffer instanceof DataBufferUShort) { + return new ShortBandedRaster(bsm, + (DataBufferUShort)dataBuffer, location); + } + break; case DataBuffer.TYPE_INT: - return new SunWritableRaster(bsm, dataBuffer, location); + if (dataBuffer instanceof DataBufferInt) { + return new SunWritableRaster(bsm, + (DataBufferInt)dataBuffer, location); + } + break; default: throw new IllegalArgumentException("Unsupported data type " + dataType); } + + // Create the generic raster + return new SunWritableRaster(bsm, dataBuffer, location); } /** @@ -776,18 +802,33 @@ switch(dataType) { case DataBuffer.TYPE_BYTE: - return new ByteInterleavedRaster(sppsm, dataBuffer, location); + if(dataBuffer instanceof DataBufferByte) { + return new ByteInterleavedRaster(sppsm, + (DataBufferByte)dataBuffer, location); + } + break; case DataBuffer.TYPE_USHORT: - return new ShortInterleavedRaster(sppsm, dataBuffer, location); + if(dataBuffer instanceof DataBufferUShort) { + return new ShortInterleavedRaster(sppsm, + (DataBufferUShort) dataBuffer, location); + } + break; case DataBuffer.TYPE_INT: - return new IntegerInterleavedRaster(sppsm, dataBuffer, location); + if(dataBuffer instanceof DataBufferInt) { + return new IntegerInterleavedRaster(sppsm, + (DataBufferInt) dataBuffer, location); + } + break; default: throw new IllegalArgumentException("Unsupported data type " + dataType); } + + // Create the generic raster + return new SunWritableRaster(sppsm, dataBuffer, location); } /** @@ -847,8 +888,9 @@ new MultiPixelPackedSampleModel(dataType, w, h, bitsPerPixel); if (dataType == DataBuffer.TYPE_BYTE && + dataBuffer instanceof DataBufferByte && (bitsPerPixel == 1 || bitsPerPixel == 2 || bitsPerPixel == 4)) { - return new BytePackedRaster(mppsm, dataBuffer, location); + return new BytePackedRaster(mppsm, (DataBufferByte)dataBuffer, location); } else { return new SunWritableRaster(mppsm, dataBuffer, location); } @@ -891,31 +933,51 @@ if (sm instanceof PixelInterleavedSampleModel) { switch(dataType) { case DataBuffer.TYPE_BYTE: - return new ByteInterleavedRaster(sm, db, location); + if(db instanceof DataBufferByte) { + return new ByteInterleavedRaster(sm, + (DataBufferByte)db, location); + } + break; case DataBuffer.TYPE_USHORT: - return new ShortInterleavedRaster(sm, db, location); + if(db instanceof DataBufferUShort) { + return new ShortInterleavedRaster(sm, + (DataBufferUShort)db, location); + } + break; } } else if (sm instanceof SinglePixelPackedSampleModel) { switch(dataType) { case DataBuffer.TYPE_BYTE: - return new ByteInterleavedRaster(sm, db, location); + if(db instanceof DataBufferByte) { + return new ByteInterleavedRaster(sm, + (DataBufferByte)db, location); + } + break; case DataBuffer.TYPE_USHORT: - return new ShortInterleavedRaster(sm, db, location); + if(db instanceof DataBufferUShort) { + return new ShortInterleavedRaster(sm, + (DataBufferUShort)db, location); + } + break; case DataBuffer.TYPE_INT: - return new IntegerInterleavedRaster(sm, db, location); + if(db instanceof DataBufferInt) { + return new IntegerInterleavedRaster(sm, + (DataBufferInt)db, location); + } + break; } } else if (sm instanceof MultiPixelPackedSampleModel && dataType == DataBuffer.TYPE_BYTE && + db instanceof DataBufferByte && sm.getSampleSize(0) < 8) { - return new BytePackedRaster(sm, db, location); + return new BytePackedRaster(sm, (DataBufferByte)db, location); } // we couldn't do anything special - do the generic thing - - return new Raster(sm,db,location); + return new Raster(sm, db, location); } /** @@ -977,30 +1039,50 @@ if (sm instanceof PixelInterleavedSampleModel) { switch(dataType) { case DataBuffer.TYPE_BYTE: - return new ByteInterleavedRaster(sm, db, location); + if (db instanceof DataBufferByte) { + return new ByteInterleavedRaster(sm, + (DataBufferByte)db, location); + } + break; case DataBuffer.TYPE_USHORT: - return new ShortInterleavedRaster(sm, db, location); + if (db instanceof DataBufferUShort) { + return new ShortInterleavedRaster(sm, + (DataBufferUShort)db, location); + } + break; } } else if (sm instanceof SinglePixelPackedSampleModel) { switch(dataType) { case DataBuffer.TYPE_BYTE: - return new ByteInterleavedRaster(sm, db, location); + if (db instanceof DataBufferByte) { + return new ByteInterleavedRaster(sm, + (DataBufferByte)db, location); + } + break; case DataBuffer.TYPE_USHORT: - return new ShortInterleavedRaster(sm, db, location); + if (db instanceof DataBufferUShort) { + return new ShortInterleavedRaster(sm, + (DataBufferUShort)db, location); + } + break; case DataBuffer.TYPE_INT: - return new IntegerInterleavedRaster(sm, db, location); + if (db instanceof DataBufferInt) { + return new IntegerInterleavedRaster(sm, + (DataBufferInt)db, location); + } + break; } } else if (sm instanceof MultiPixelPackedSampleModel && dataType == DataBuffer.TYPE_BYTE && + db instanceof DataBufferByte && sm.getSampleSize(0) < 8) { - return new BytePackedRaster(sm, db, location); + return new BytePackedRaster(sm, (DataBufferByte)db, location); } // we couldn't do anything special - do the generic thing - return new SunWritableRaster(sm,db,location); }