001: /*
002: * Copyright (c) 2007, intarsys consulting GmbH
003: *
004: * Redistribution and use in source and binary forms, with or without
005: * modification, are permitted provided that the following conditions are met:
006: *
007: * - Redistributions of source code must retain the above copyright notice,
008: * this list of conditions and the following disclaimer.
009: *
010: * - Redistributions in binary form must reproduce the above copyright notice,
011: * this list of conditions and the following disclaimer in the documentation
012: * and/or other materials provided with the distribution.
013: *
014: * - Neither the name of intarsys nor the names of its contributors may be used
015: * to endorse or promote products derived from this software without specific
016: * prior written permission.
017: *
018: * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
019: * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
020: * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
021: * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
022: * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
023: * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
024: * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
025: * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
026: * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
027: * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
028: * POSSIBILITY OF SUCH DAMAGE.
029: */
030: package de.intarsys.pdf.font;
031:
032: import java.util.ArrayList;
033: import java.util.Iterator;
034: import java.util.List;
035: import de.intarsys.pdf.cos.COSArray;
036: import de.intarsys.pdf.cos.COSNumber;
037: import de.intarsys.pdf.cos.COSObject;
038:
039: /**
040: *
041: */
042: public class CIDWidthMap {
043: private List entries;
044:
045: public CIDWidthMap(List entries) {
046: super ();
047: this .entries = entries;
048: }
049:
050: public static CIDWidthMap createMap(COSArray array) {
051: List entries = new ArrayList();
052: if (array != null) {
053: for (Iterator itMap = array.iterator(); itMap.hasNext();) {
054: COSNumber element1 = ((COSObject) itMap.next())
055: .asNumber();
056: if (!itMap.hasNext()) {
057: break;
058: }
059: COSObject element2 = (COSObject) itMap.next();
060: int start = element1.intValue();
061: int stop = start;
062: if (element1 == null) {
063: continue;
064: }
065: if (element2 instanceof COSNumber) {
066: stop = ((COSNumber) element2).intValue();
067: element2 = (COSObject) itMap.next();
068: int width = ((COSNumber) element2).intValue();
069: entries
070: .add(new CIDWidthMapEntry(start, stop,
071: width));
072: } else if (element2 instanceof COSArray) {
073: COSArray widths = (COSArray) element2;
074: for (Iterator itWidths = widths.iterator(); itWidths
075: .hasNext();) {
076: COSNumber widthObject = ((COSObject) itWidths
077: .next()).asNumber();
078: int width = 0;
079: if (widthObject != null) {
080: width = widthObject.intValue();
081: }
082: entries.add(new CIDWidthMapEntry(start, stop,
083: width));
084: start++;
085: stop++;
086: }
087: }
088: }
089: }
090: CIDWidthMap map = new CIDWidthMap(entries);
091: return map;
092: }
093:
094: public int getWidth(int cidValue) {
095: for (Iterator it = entries.iterator(); it.hasNext();) {
096: CIDWidthMapEntry entry = (CIDWidthMapEntry) it.next();
097: if (entry.getStart() <= cidValue) {
098: if (entry.getStop() >= cidValue) {
099: return entry.getWidth();
100: }
101: }
102: }
103: return -1;
104: }
105: }
|