org.apache.fontbox.cmap.CodespaceRange Maven / Gradle / Ivy
Go to download
Show more of this group Show more artifacts with this name
Show all versions of org.apache.fop Show documentation
Show all versions of org.apache.fop Show documentation
The core maven build properties
The newest version!
/*
* 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.fontbox.cmap;
/**
* This represents a single entry in the codespace range.
*
* @author Ben Litchfield
*/
public class CodespaceRange
{
private byte[] startBytes;
private byte[] endBytes;
private int[] start;
private int[] end;
private int codeLength = 0;
/**
* Creates a new instance of CodespaceRange. The length of both arrays has to be the same.
* For one byte ranges startBytes and endBytes define a linear range of values. Double byte values define a
* rectangular range not a linear range. Examples:
* <00> <20> defines a linear range from 0x00 up to 0x20.
* <8140> to <9FFC> defines a rectangular range. The high byte has to be within 0x81 and 0x9F and the
* low byte has to be within 0x40 and 0xFC
*
* @param startBytes
* @param endBytes
*/
public CodespaceRange(byte[] startBytes, byte[] endBytes)
{
byte[] correctedStartBytes = startBytes;
if (startBytes.length != endBytes.length && startBytes.length == 1 && startBytes[0] == 0)
{
correctedStartBytes = new byte[endBytes.length];
}
else if (startBytes.length != endBytes.length)
{
throw new IllegalArgumentException(
"The start and the end values must not have different lengths.");
}
start = new int[correctedStartBytes.length];
end = new int[endBytes.length];
for (int i = 0; i < correctedStartBytes.length; i++)
{
start[i] = correctedStartBytes[i] & 0xFF;
end[i] = endBytes[i] & 0xFF;
}
codeLength = endBytes.length;
}
/**
* Creates a new instance of CodespaceRange.
*
* @deprecated to be removed in the next major release.
*/
public CodespaceRange()
{
}
/**
* Returns the length of the codes of the codespace.
*
* @return the code length
*/
public int getCodeLength()
{
return codeLength;
}
/**
* Getter for property end.
*
* @return Value of property end.
*
* @deprecated to be removed in the next major release
*/
public byte[] getEnd()
{
return endBytes;
}
/**
* Setter for property end.
*
* @param endBytes New value of property end.
*
* @deprecated to be removed in the next major release
*/
void setEnd(byte[] endBytes)
{
this.endBytes = endBytes;
end = new int[endBytes.length];
for (int i = 0; i < endBytes.length; i++)
{
end[i] = endBytes[i] & 0xFF;
}
}
/**
* Getter for property start.
*
* @return Value of property start.
*
* @deprecated to be removed in the next major release
*/
public byte[] getStart()
{
return startBytes;
}
/**
* Setter for property start.
*
* @param startBytes New value of property start.
*
* @deprecated to be removed in the next major release
*/
void setStart(byte[] startBytes)
{
this.startBytes = startBytes;
start = new int[startBytes.length];
for (int i = 0; i < startBytes.length; i++)
{
start[i] = startBytes[i] & 0xFF;
}
codeLength = startBytes.length;
}
/**
* Returns true if the given code bytes match this codespace range.
*/
public boolean matches(byte[] code)
{
return isFullMatch(code, code.length);
}
/**
* Returns true if the given code bytes match this codespace range.
*/
public boolean isFullMatch(byte[] code, int codeLen)
{
// code must be the same length as the bounding codes
if (codeLength != codeLen)
{
return false;
}
for (int i = 0; i < codeLength; i++)
{
int codeAsInt = code[i] & 0xFF;
if (codeAsInt < start[i] || codeAsInt > end[i])
{
return false;
}
}
return true;
}
}
© 2015 - 2025 Weber Informatics LLC | Privacy Policy