in src/main/java/org/apache/pdfbox/jbig2/segments/GenericRefinementRegion.java [193:256]
public Bitmap getRegionBitmap()
throws IOException, IntegerMaxValueException, InvalidHeaderValueException
{
if (null == regionBitmap)
{
/* 6.3.5.6 - 1) */
int isLineTypicalPredicted = 0;
if (referenceBitmap == null)
{
// Get the reference bitmap, which is the base of refinement process
referenceBitmap = getGrReference();
}
if (arithDecoder == null)
{
arithDecoder = new ArithmeticDecoder(subInputStream);
}
if (cx == null)
{
cx = new CX(8192, 1);
}
/* 6.3.5.6 - 2) */
regionBitmap = new Bitmap(regionInfo.getBitmapWidth(), regionInfo.getBitmapHeight());
if (templateID == 0)
{
// AT pixel may only occur in template 0
updateOverride();
}
final int paddedWidth = (regionBitmap.getWidth() + 7) & -8;
final int deltaRefStride = isTPGROn ? -referenceDY * referenceBitmap.getRowStride() : 0;
final int yOffset = deltaRefStride + 1;
/* 6.3.5.6 - 3 */
for (int y = 0; y < regionBitmap.getHeight(); y++)
{
/* 6.3.5.6 - 3 b) */
if (isTPGROn)
{
isLineTypicalPredicted ^= decodeSLTP();
}
if (isLineTypicalPredicted == 0)
{
/* 6.3.5.6 - 3 c) */
decodeOptimized(y, regionBitmap.getWidth(), regionBitmap.getRowStride(),
referenceBitmap.getRowStride(), paddedWidth, deltaRefStride, yOffset);
}
else
{
/* 6.3.5.6 - 3 d) */
decodeTypicalPredictedLine(y, regionBitmap.getWidth(),
regionBitmap.getRowStride(), referenceBitmap.getRowStride(),
paddedWidth, deltaRefStride);
}
}
}
/* 6.3.5.6 - 4) */
return regionBitmap;
}