blob: 513dcca6880cc9152933482b1a982b9a607c85ac [file] [log] [blame]
/**
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.apache.pdfbox.jbig2.segments;
import java.io.IOException;
import org.apache.pdfbox.jbig2.SegmentData;
import org.apache.pdfbox.jbig2.SegmentHeader;
import org.apache.pdfbox.jbig2.err.InvalidHeaderValueException;
import org.apache.pdfbox.jbig2.io.SubInputStream;
import org.apache.pdfbox.jbig2.util.CombinationOperator;
import org.apache.pdfbox.jbig2.util.log.Logger;
import org.apache.pdfbox.jbig2.util.log.LoggerFactory;
/**
* This class represents the segment type "Page information", 7.4.8 (page 73).
*/
public class PageInformation implements SegmentData {
private final Logger log = LoggerFactory.getLogger(PageInformation.class);
private SubInputStream subInputStream;
/** Page bitmap width, four byte, 7.4.8.1 */
private int bitmapWidth;
/** Page bitmap height, four byte, 7.4.8.2 */
private int bitmapHeight;
/** Page X resolution, four byte, 7.4.8.3 */
private int resolutionX;
/** Page Y resolution, four byte, 7.4.8.4 */
private int resolutionY;
/** Page segment flags, one byte, 7.4.8.5 */
private boolean combinationOperatorOverrideAllowed;
private CombinationOperator combinationOperator;
private boolean requiresAuxiliaryBuffer;
private short defaultPixelValue;
private boolean mightContainRefinements;
private boolean isLossless;
/** Page striping information, two byte, 7.4.8.6 */
private boolean isStriped;
private short maxStripeSize;
private void parseHeader() throws IOException, InvalidHeaderValueException {
readWidthAndHeight();
readResolution();
/* Bit 7 */
subInputStream.readBit(); // dirty read
/* Bit 6 */
readCombinationOperatorOverrideAllowed();
/* Bit 5 */
readRequiresAuxiliaryBuffer();
/* Bit 3-4 */
readCombinationOperator();
/* Bit 2 */
readDefaultPixelvalue();
/* Bit 1 */
readContainsRefinement();
/* Bit 0 */
readIsLossless();
/* Bit 15 */
readIsStriped();
/* Bit 0-14 */
readMaxStripeSize();
this.checkInput();
}
private void readResolution() throws IOException {
resolutionX = (int) subInputStream.readBits(32) & 0xffffffff;
resolutionY = (int) subInputStream.readBits(32) & 0xffffffff;
}
private void checkInput() throws InvalidHeaderValueException {
if (bitmapHeight == 0xffffffffL)
if (!isStriped)
log.info("isStriped should contaion the value true");
}
private void readCombinationOperatorOverrideAllowed() throws IOException {
/* Bit 6 */
if (subInputStream.readBit() == 1) {
combinationOperatorOverrideAllowed = true;
}
}
private void readRequiresAuxiliaryBuffer() throws IOException {
/* Bit 5 */
if (subInputStream.readBit() == 1) {
requiresAuxiliaryBuffer = true;
}
}
private void readCombinationOperator() throws IOException {
/* Bit 3-4 */
combinationOperator = CombinationOperator.translateOperatorCodeToEnum((short) (subInputStream.readBits(2) & 0xf));
}
private void readDefaultPixelvalue() throws IOException {
/* Bit 2 */
defaultPixelValue = (short) subInputStream.readBit();
}
private void readContainsRefinement() throws IOException {
/* Bit 1 */
if (subInputStream.readBit() == 1) {
mightContainRefinements = true;
}
}
private void readIsLossless() throws IOException {
/* Bit 0 */
if (subInputStream.readBit() == 1) {
isLossless = true;
}
}
private void readIsStriped() throws IOException {
/* Bit 15 */
if (subInputStream.readBit() == 1) {
isStriped = true;
}
}
private void readMaxStripeSize() throws IOException {
/* Bit 0-14 */
maxStripeSize = (short) (subInputStream.readBits(15) & 0xffff);
}
private void readWidthAndHeight() throws IOException {
bitmapWidth = (int) subInputStream.readBits(32); // & 0xffffffff;
bitmapHeight = (int) subInputStream.readBits(32); // & 0xffffffff;
}
public void init(final SegmentHeader header, final SubInputStream sis) throws InvalidHeaderValueException, IOException {
subInputStream = sis;
parseHeader();
}
public int getWidth() {
return bitmapWidth;
}
public int getHeight() {
return bitmapHeight;
}
public int getResolutionX() {
return resolutionX;
}
public int getResolutionY() {
return resolutionY;
}
public short getDefaultPixelValue() {
return defaultPixelValue;
}
public boolean isCombinationOperatorOverrideAllowed() {
return combinationOperatorOverrideAllowed;
}
public CombinationOperator getCombinationOperator() {
return combinationOperator;
}
public boolean isStriped() {
return isStriped;
}
public short getMaxStripeSize() {
return maxStripeSize;
}
public boolean isAuxiliaryBufferRequired() {
return requiresAuxiliaryBuffer;
}
public boolean mightContainRefinements() {
return mightContainRefinements;
}
public boolean isLossless() {
return isLossless;
}
protected int getBitmapWidth() {
return bitmapWidth;
}
protected int getBitmapHeight() {
return bitmapHeight;
}
}