in src/main/java/org/apache/pdfbox/jbig2/segments/GenericRefinementRegion.java [300:480]
private void decodeTemplate(final int lineNumber, final int width, final int rowStride,
final int refRowStride, final int paddedWidth, final int deltaRefStride,
final int lineOffset, int byteIndex, final int currentLine, int refByteIndex,
Template templateFormation) throws IOException
{
short c1, c2, c3, c4, c5;
int w1, w2, w3, w4;
w1 = w2 = w3 = w4 = 0;
if (currentLine >= 1 && (currentLine - 1) < referenceBitmap.getHeight())
w1 = referenceBitmap.getByteAsInteger(refByteIndex - refRowStride);
if (currentLine >= 0 && currentLine < referenceBitmap.getHeight())
w2 = referenceBitmap.getByteAsInteger(refByteIndex);
if (currentLine >= -1 && currentLine + 1 < referenceBitmap.getHeight())
w3 = referenceBitmap.getByteAsInteger(refByteIndex + refRowStride);
refByteIndex++;
if (lineNumber >= 1)
{
w4 = regionBitmap.getByteAsInteger(byteIndex - rowStride);
}
byteIndex++;
final int modReferenceDX = referenceDX % 8;
final int shiftOffset = 6 + modReferenceDX;
final int modRefByteIdx = refByteIndex % refRowStride;
if (shiftOffset >= 0)
{
c1 = (short) ((shiftOffset >= 8 ? 0 : w1 >>> shiftOffset) & 0x07);
c2 = (short) ((shiftOffset >= 8 ? 0 : w2 >>> shiftOffset) & 0x07);
c3 = (short) ((shiftOffset >= 8 ? 0 : w3 >>> shiftOffset) & 0x07);
if (shiftOffset == 6 && modRefByteIdx > 1)
{
if (currentLine >= 1 && (currentLine - 1) < referenceBitmap.getHeight())
{
c1 |= referenceBitmap.getByteAsInteger(refByteIndex - refRowStride - 2) << 2
& 0x04;
}
if (currentLine >= 0 && currentLine < referenceBitmap.getHeight())
{
c2 |= referenceBitmap.getByteAsInteger(refByteIndex - 2) << 2 & 0x04;
}
if (currentLine >= -1 && currentLine + 1 < referenceBitmap.getHeight())
{
c3 |= referenceBitmap.getByteAsInteger(refByteIndex + refRowStride - 2) << 2
& 0x04;
}
}
if (shiftOffset == 0)
{
w1 = w2 = w3 = 0;
if (modRefByteIdx < refRowStride - 1)
{
if (currentLine >= 1 && (currentLine - 1) < referenceBitmap.getHeight())
w1 = referenceBitmap.getByteAsInteger(refByteIndex - refRowStride);
if (currentLine >= 0 && currentLine < referenceBitmap.getHeight())
w2 = referenceBitmap.getByteAsInteger(refByteIndex);
if (currentLine >= -1 && currentLine + 1 < referenceBitmap.getHeight())
w3 = referenceBitmap.getByteAsInteger(refByteIndex + refRowStride);
}
refByteIndex++;
}
}
else
{
c1 = (short) ((w1 << 1) & 0x07);
c2 = (short) ((w2 << 1) & 0x07);
c3 = (short) ((w3 << 1) & 0x07);
w1 = w2 = w3 = 0;
if (modRefByteIdx < refRowStride - 1)
{
if (currentLine >= 1 && (currentLine - 1) < referenceBitmap.getHeight())
w1 = referenceBitmap.getByteAsInteger(refByteIndex - refRowStride);
if (currentLine >= 0 && currentLine < referenceBitmap.getHeight())
w2 = referenceBitmap.getByteAsInteger(refByteIndex);
if (currentLine >= -1 && currentLine + 1 < referenceBitmap.getHeight())
w3 = referenceBitmap.getByteAsInteger(refByteIndex + refRowStride);
refByteIndex++;
}
c1 |= (short) ((w1 >>> 7) & 0x07);
c2 |= (short) ((w2 >>> 7) & 0x07);
c3 |= (short) ((w3 >>> 7) & 0x07);
}
c4 = (short) (w4 >>> 6);
c5 = 0;
final int modBitsToTrim = (2 - modReferenceDX) % 8;
w1 <<= modBitsToTrim;
w2 <<= modBitsToTrim;
w3 <<= modBitsToTrim;
w4 <<= 2;
for (int x = 0; x < width; x++)
{
final int minorX = x & 0x07;
final short tval = templateFormation.form(c1, c2, c3, c4, c5);
if (override)
{
cx.setIndex(overrideAtTemplate0(tval, x, lineNumber,
regionBitmap.getByte(regionBitmap.getByteIndex(x, lineNumber)), minorX));
}
else
{
cx.setIndex(tval);
}
final int bit = arithDecoder.decode(cx);
regionBitmap.setPixel(x, lineNumber, (byte) bit);
c1 = (short) (((c1 << 1) | 0x01 & (w1 >>> 7)) & 0x07);
c2 = (short) (((c2 << 1) | 0x01 & (w2 >>> 7)) & 0x07);
c3 = (short) (((c3 << 1) | 0x01 & (w3 >>> 7)) & 0x07);
c4 = (short) (((c4 << 1) | 0x01 & (w4 >>> 7)) & 0x07);
c5 = (short) bit;
if ((x - referenceDX) % 8 == 5)
{
if (((x - referenceDX) / 8) + 1 >= referenceBitmap.getRowStride())
{
w1 = w2 = w3 = 0;
}
else
{
if (currentLine >= 1 && (currentLine - 1 < referenceBitmap.getHeight()))
{
w1 = referenceBitmap.getByteAsInteger(refByteIndex - refRowStride);
}
else
{
w1 = 0;
}
if (currentLine >= 0 && currentLine < referenceBitmap.getHeight())
{
w2 = referenceBitmap.getByteAsInteger(refByteIndex);
}
else
{
w2 = 0;
}
if (currentLine >= -1 && (currentLine + 1) < referenceBitmap.getHeight())
{
w3 = referenceBitmap.getByteAsInteger(refByteIndex + refRowStride);
}
else
{
w3 = 0;
}
}
refByteIndex++;
}
else
{
w1 <<= 1;
w2 <<= 1;
w3 <<= 1;
}
if (minorX == 5 && lineNumber >= 1)
{
if ((x >> 3) + 1 >= regionBitmap.getRowStride())
{
w4 = 0;
}
else
{
w4 = regionBitmap.getByteAsInteger(byteIndex - rowStride);
}
byteIndex++;
}
else
{
w4 <<= 1;
}
}
}