> The `BufferedImage` Javadoc does not mention any constraint about the data > type. In practice, `BufferedImage` with floating point values can be rendered > by Java2D as well as integers, provided that a compatible `ColorModel` was > supplied at construction time. However calls to `setData(Raster)` > unexpectedly cast floating point values to integers. For example sample value > 0.8 become 0. This is demonstrated by the `SetData` test case in this pull > request. > > An easy fix, which is proposed in this pull request, is to replace the whole > `BufferedImage.setData(Raster)` method body by a simple call to > `WritableRaster.setRect(Raster)`, which handles all `DataBuffer` types > correctly. The method contracts documented in their respective Javadoc are > compatible. Furthermore an examination of their source code shows that they > are equivalent, except for the differences noted in the _Behavioural changes_ > section below. > > # Source code comparison > For demonstrating that delegating to `WritableRaster.setRect(Raster)` would > be equivalent to the current code, one can copy the method body and apply the > following changes: > > * Remove `dx` parameter, replaced by 0. > * Remove `dy` parameter, replaced by 0. > * Rename `srcRaster` parameter as `r` (like in `BufferedImage`). > * Rename `startY` variable as `i` (like in `BufferedImage`). > * Rename `srcOffX` variable as `startX` (like in `BufferedImage`). > * Rename `srcOffY` variable as `startY` (like in `BufferedImage`). > * Replace `this.minX` by 0 and simplify. > * Replace `this.minY` by 0 and simplify. > * Remove the `switch` statement, keeping only the `TYPE_INT` case. > > Then compare with `BufferedImage.setData(Raster)`. The modified block of code > from `WritableRaster` is: > > > int width = r.getWidth(); > int height = r.getHeight(); > int startX = r.getMinX(); > int startY = r.getMinY(); > > We can see that above code is identical to `BufferedImage`. The next modified > block of code from `WritableRaster`: > > > int dstOffX = startX; > int dstOffY = startY; > > // Clip to this raster > if (dstOffX < 0) { > width += dstOffX; > startX -= dstOffX; // = 0 because dstOffX == startX > dstOffX = 0; > } > if (dstOffY < 0) { > height += dstOffY; > startY -= dstOffY; // = 0 because dstOffY == startY > dstOffY = 0; > } > if (dstOffX+width > this.width) { > width = this.width - dstOffX; > } > if (dstOffY+height > this.height) { > height = this.height - dstOffY; > } > if (width <= 0 || height <= 0) { > return; > } > > > Above is equivalent to the following code from `BufferedImage`, ex...
Martin Desruisseaux has updated the pull request incrementally with one additional commit since the last revision: Update copyright years. ------------- Changes: - all: https://git.openjdk.org/jdk/pull/13797/files - new: https://git.openjdk.org/jdk/pull/13797/files/65eb0072..5d69f631 Webrevs: - full: https://webrevs.openjdk.org/?repo=jdk&pr=13797&range=01 - incr: https://webrevs.openjdk.org/?repo=jdk&pr=13797&range=00-01 Stats: 3 lines in 3 files changed: 0 ins; 0 del; 3 mod Patch: https://git.openjdk.org/jdk/pull/13797.diff Fetch: git fetch https://git.openjdk.org/jdk.git pull/13797/head:pull/13797 PR: https://git.openjdk.org/jdk/pull/13797