From 88039893213febe05da53379c2c39e9f58450bc7 Mon Sep 17 00:00:00 2001 From: Andreas Beeker Date: Mon, 3 Feb 2020 00:25:52 +0000 Subject: [PATCH] Use indexed palette for duo tone pattern git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@1873516 13f79535-47bb-0310-9956-ffa450edef68 --- .../org/apache/poi/sl/draw/DrawPaint.java | 43 +++++++++++++------ 1 file changed, 29 insertions(+), 14 deletions(-) diff --git a/src/java/org/apache/poi/sl/draw/DrawPaint.java b/src/java/org/apache/poi/sl/draw/DrawPaint.java index d8a11a956e..eb18e10a4b 100644 --- a/src/java/org/apache/poi/sl/draw/DrawPaint.java +++ b/src/java/org/apache/poi/sl/draw/DrawPaint.java @@ -25,7 +25,6 @@ import java.awt.LinearGradientPaint; import java.awt.MultipleGradientPaint.ColorSpaceType; import java.awt.MultipleGradientPaint.CycleMethod; import java.awt.Paint; -import java.awt.Point; import java.awt.RadialGradientPaint; import java.awt.Shape; import java.awt.geom.AffineTransform; @@ -33,9 +32,8 @@ import java.awt.geom.Dimension2D; import java.awt.geom.Point2D; import java.awt.geom.Rectangle2D; import java.awt.image.BufferedImage; -import java.awt.image.DataBufferInt; -import java.awt.image.DirectColorModel; -import java.awt.image.Raster; +import java.awt.image.DataBuffer; +import java.awt.image.IndexColorModel; import java.awt.image.WritableRaster; import java.io.IOException; import java.io.InputStream; @@ -350,25 +348,42 @@ public class DrawPaint { * @return the original image if no duotone was found, otherwise the colorized pattern */ private static BufferedImage colorizePattern(TexturePaint fill, BufferedImage pattern) { - List duoTone = fill.getDuoTone(); + final List duoTone = fill.getDuoTone(); if (duoTone == null || duoTone.size() != 2) { return pattern; } // the pattern image is actually a gray scale image, so we simply take the first color component // as an index into our gradient samples - int blendShades = 1 << pattern.getSampleModel().getSampleSize(0); - int[] gradSample = linearBlendedColors(duoTone, blendShades); - int[] redSample = pattern.getRaster().getSamples(0, 0, pattern.getWidth(), pattern.getHeight(), 0, (int[])null); + final int redBits = pattern.getSampleModel().getSampleSize(0); + final int blendBits = Math.max(Math.min(redBits, 8), 1); + final int blendShades = 1 << blendBits; + // Currently ImageIO converts 16-bit images to 8-bit internally, so it's unlikely to get a blendRatio != 1 + final double blendRatio = blendShades / (double)(1 << Math.max(redBits,1)); + final int[] gradSample = linearBlendedColors(duoTone, blendShades); - for (int i=0; i duoTone, final int blendShades) {