PDShadingType4.java (pdfbox-2.0.23-src) | : | PDShadingType4.java (pdfbox-2.0.24-src) | ||
---|---|---|---|---|
skipping to change at line 20 | skipping to change at line 20 | |||
* | * | |||
* Unless required by applicable law or agreed to in writing, software | * Unless required by applicable law or agreed to in writing, software | |||
* distributed under the License is distributed on an "AS IS" BASIS, | * distributed under the License is distributed on an "AS IS" BASIS, | |||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | |||
* See the License for the specific language governing permissions and | * See the License for the specific language governing permissions and | |||
* limitations under the License. | * limitations under the License. | |||
*/ | */ | |||
package org.apache.pdfbox.pdmodel.graphics.shading; | package org.apache.pdfbox.pdmodel.graphics.shading; | |||
import java.awt.Paint; | import java.awt.Paint; | |||
import java.awt.geom.AffineTransform; | ||||
import java.awt.geom.Point2D; | ||||
import java.io.EOFException; | ||||
import java.io.IOException; | ||||
import java.util.ArrayList; | ||||
import java.util.Collections; | ||||
import java.util.List; | ||||
import javax.imageio.stream.ImageInputStream; | ||||
import javax.imageio.stream.MemoryCacheImageInputStream; | ||||
import org.apache.commons.logging.Log; | ||||
import org.apache.commons.logging.LogFactory; | ||||
import org.apache.pdfbox.cos.COSDictionary; | import org.apache.pdfbox.cos.COSDictionary; | |||
import org.apache.pdfbox.cos.COSName; | import org.apache.pdfbox.cos.COSName; | |||
import org.apache.pdfbox.cos.COSStream; | ||||
import org.apache.pdfbox.pdmodel.common.PDRange; | ||||
import org.apache.pdfbox.util.Matrix; | import org.apache.pdfbox.util.Matrix; | |||
/** | /** | |||
* Resources for a shading type 4 (Free-Form Gouraud-Shaded Triangle Mesh). | * Resources for a shading type 4 (Free-Form Gouraud-Shaded Triangle Mesh). | |||
*/ | */ | |||
public class PDShadingType4 extends PDTriangleBasedShadingType | public class PDShadingType4 extends PDTriangleBasedShadingType | |||
{ | { | |||
private static final Log LOG = LogFactory.getLog(PDShadingType4.class); | ||||
/** | /** | |||
* Constructor using the given shading dictionary. | * Constructor using the given shading dictionary. | |||
* | * | |||
* @param shadingDictionary the dictionary for this shading | * @param shadingDictionary the dictionary for this shading | |||
*/ | */ | |||
public PDShadingType4(COSDictionary shadingDictionary) | public PDShadingType4(COSDictionary shadingDictionary) | |||
{ | { | |||
super(shadingDictionary); | super(shadingDictionary); | |||
} | } | |||
skipping to change at line 72 | skipping to change at line 88 | |||
public void setBitsPerFlag(int bitsPerFlag) | public void setBitsPerFlag(int bitsPerFlag) | |||
{ | { | |||
getCOSObject().setInt(COSName.BITS_PER_FLAG, bitsPerFlag); | getCOSObject().setInt(COSName.BITS_PER_FLAG, bitsPerFlag); | |||
} | } | |||
@Override | @Override | |||
public Paint toPaint(Matrix matrix) | public Paint toPaint(Matrix matrix) | |||
{ | { | |||
return new Type4ShadingPaint(this, matrix); | return new Type4ShadingPaint(this, matrix); | |||
} | } | |||
@SuppressWarnings("squid:S1166") | ||||
@Override | ||||
List<ShadedTriangle> collectTriangles(AffineTransform xform, Matrix matrix) | ||||
throws IOException | ||||
{ | ||||
int bitsPerFlag = getBitsPerFlag(); | ||||
COSDictionary dict = getCOSObject(); | ||||
if (!(dict instanceof COSStream)) | ||||
{ | ||||
return Collections.emptyList(); | ||||
} | ||||
PDRange rangeX = getDecodeForParameter(0); | ||||
PDRange rangeY = getDecodeForParameter(1); | ||||
if (Float.compare(rangeX.getMin(), rangeX.getMax()) == 0 || | ||||
Float.compare(rangeY.getMin(), rangeY.getMax()) == 0) | ||||
{ | ||||
return Collections.emptyList(); | ||||
} | ||||
PDRange[] colRange = new PDRange[getNumberOfColorComponents()]; | ||||
for (int i = 0; i < colRange.length; ++i) | ||||
{ | ||||
colRange[i] = getDecodeForParameter(2 + i); | ||||
} | ||||
List<ShadedTriangle> list = new ArrayList<ShadedTriangle>(); | ||||
long maxSrcCoord = (long) Math.pow(2, getBitsPerCoordinate()) - 1; | ||||
long maxSrcColor = (long) Math.pow(2, getBitsPerComponent()) - 1; | ||||
COSStream stream = (COSStream) dict; | ||||
ImageInputStream mciis = new MemoryCacheImageInputStream(stream.createIn | ||||
putStream()); | ||||
try | ||||
{ | ||||
byte flag = (byte) 0; | ||||
try | ||||
{ | ||||
flag = (byte) (mciis.readBits(bitsPerFlag) & 3); | ||||
} | ||||
catch (EOFException ex) | ||||
{ | ||||
LOG.error(ex); | ||||
} | ||||
boolean eof = false; | ||||
while (!eof) | ||||
{ | ||||
Vertex p0; | ||||
Vertex p1; | ||||
Vertex p2; | ||||
Point2D[] ps; | ||||
float[][] cs; | ||||
int lastIndex; | ||||
try | ||||
{ | ||||
switch (flag) | ||||
{ | ||||
case 0: | ||||
p0 = readVertex(mciis, maxSrcCoord, maxSrcColor, ran | ||||
geX, rangeY, colRange, | ||||
matrix, xform); | ||||
flag = (byte) (mciis.readBits(bitsPerFlag) & 3); | ||||
if (flag != 0) | ||||
{ | ||||
LOG.error("bad triangle: " + flag); | ||||
} | ||||
p1 = readVertex(mciis, maxSrcCoord, maxSrcColor, ran | ||||
geX, rangeY, colRange, | ||||
matrix, xform); | ||||
mciis.readBits(bitsPerFlag); | ||||
if (flag != 0) | ||||
{ | ||||
LOG.error("bad triangle: " + flag); | ||||
} | ||||
p2 = readVertex(mciis, maxSrcCoord, maxSrcColor, ran | ||||
geX, rangeY, colRange, | ||||
matrix, xform); | ||||
ps = new Point2D[] { p0.point, p1.point, p2.point }; | ||||
cs = new float[][] { p0.color, p1.color, p2.color }; | ||||
list.add(new ShadedTriangle(ps, cs)); | ||||
flag = (byte) (mciis.readBits(bitsPerFlag) & 3); | ||||
break; | ||||
case 1: | ||||
case 2: | ||||
lastIndex = list.size() - 1; | ||||
if (lastIndex < 0) | ||||
{ | ||||
LOG.error("broken data stream: " + list.size()); | ||||
} | ||||
else | ||||
{ | ||||
ShadedTriangle preTri = list.get(lastIndex); | ||||
p2 = readVertex(mciis, maxSrcCoord, maxSrcColor, | ||||
rangeX, rangeY, | ||||
colRange, matrix, xform); | ||||
ps = new Point2D[] { flag == 1 ? preTri.corner[1 | ||||
] : preTri.corner[0], | ||||
preTri.corner[2], | ||||
p2.point }; | ||||
cs = new float[][] { flag == 1 ? preTri.color[1] | ||||
: preTri.color[0], | ||||
preTri.color[2], | ||||
p2.color }; | ||||
list.add(new ShadedTriangle(ps, cs)); | ||||
flag = (byte) (mciis.readBits(bitsPerFlag) & 3); | ||||
} | ||||
break; | ||||
default: | ||||
LOG.warn("bad flag: " + flag); | ||||
break; | ||||
} | ||||
} | ||||
catch (EOFException ex) | ||||
{ | ||||
eof = true; | ||||
} | ||||
} | ||||
} | ||||
finally | ||||
{ | ||||
mciis.close(); | ||||
} | ||||
return list; | ||||
} | ||||
} | } | |||
End of changes. 5 change blocks. | ||||
0 lines changed or deleted | 139 lines changed or added |