📄 cfffont.java
字号:
while (!gotKey) { char b0 = getCard8(); if (b0 == 29) { int item = getInt(); args[arg_count] = new Integer(item); arg_count++; //System.err.println(item+" "); continue; } if (b0 == 28) { short item = getShort(); args[arg_count] = new Integer(item); arg_count++; //System.err.println(item+" "); continue; } if (b0 >= 32 && b0 <= 246) { byte item = (byte) (b0-139); args[arg_count] = new Integer(item); arg_count++; //System.err.println(item+" "); continue; } if (b0 >= 247 && b0 <= 250) { char b1 = getCard8(); short item = (short) ((b0-247)*256+b1+108); args[arg_count] = new Integer(item); arg_count++; //System.err.println(item+" "); continue; } if (b0 >= 251 && b0 <= 254) { char b1 = getCard8(); short item = (short) (-(b0-251)*256-b1-108); args[arg_count] = new Integer(item); arg_count++; //System.err.println(item+" "); continue; } if (b0 == 30) { String item = ""; boolean done = false; char buffer = 0; byte avail = 0; int nibble = 0; while (!done) { // get a nibble if (avail==0) { buffer = getCard8(); avail=2; } if (avail==1) { nibble = (buffer / 16); avail--; } if (avail==2) { nibble = (buffer % 16); avail--; } switch (nibble) { case 0xa: item += "." ; break; case 0xb: item += "E" ; break; case 0xc: item += "E-"; break; case 0xe: item += "-" ; break; case 0xf: done=true ; break; default: if (nibble >= 0 && nibble <= 9) item += String.valueOf(nibble); else { item += "<NIBBLE ERROR: " + nibble + '>'; done = true; } break; } } args[arg_count] = item; arg_count++; //System.err.println(" real=["+item+"]"); continue; } if (b0 <= 21) { gotKey=true; if (b0 != 12) key = operatorNames[b0]; else key = operatorNames[32 + getCard8()]; //for (int i=0; i<arg_count; i++) // System.err.print(args[i].toString()+" "); //System.err.println(key+" ;"); continue; } } } /** List items for the linked list that builds the new CID font. */ protected static abstract class Item { protected int myOffset = -1; /** remember the current offset and increment by item's size in bytes. */ public void increment(int[] currentOffset) { myOffset = currentOffset[0]; } /** Emit the byte stream for this item. */ public void emit(byte[] buffer) {} /** Fix up cross references to this item (applies only to markers). */ public void xref() {} } protected static abstract class OffsetItem extends Item { public int value; /** set the value of an offset item that was initially unknown. * It will be fixed up latex by a call to xref on some marker. */ public void set(int offset) { this.value = offset; } } /** A range item. */ protected static final class RangeItem extends Item { public int offset, length; private RandomAccessFileOrArray buf; public RangeItem(RandomAccessFileOrArray buf, int offset, int length) { this.offset = offset; this.length = length; this.buf = buf; } public void increment(int[] currentOffset) { super.increment(currentOffset); currentOffset[0] += length; } public void emit(byte[] buffer) { //System.err.println("range emit offset "+offset+" size="+length); try { buf.seek(offset); for (int i=myOffset; i<myOffset+length; i++) buffer[i] = buf.readByte(); } catch (Exception e) { throw new ExceptionConverter(e); } //System.err.println("finished range emit"); } } /** An index-offset item for the list. * The size denotes the required size in the CFF. A positive * value means that we need a specific size in bytes (for offset arrays) * and a negative value means that this is a dict item that uses a * variable-size representation. */ static protected final class IndexOffsetItem extends OffsetItem { public final int size; public IndexOffsetItem(int size, int value) {this.size=size; this.value=value;} public IndexOffsetItem(int size) {this.size=size; } public void increment(int[] currentOffset) { super.increment(currentOffset); currentOffset[0] += size; } public void emit(byte[] buffer) { int i=0; switch (size) { case 4: buffer[myOffset+i] = (byte) ((value >>> 24) & 0xff); i++; case 3: buffer[myOffset+i] = (byte) ((value >>> 16) & 0xff); i++; case 2: buffer[myOffset+i] = (byte) ((value >>> 8) & 0xff); i++; case 1: buffer[myOffset+i] = (byte) ((value >>> 0) & 0xff); i++; } /* int mask = 0xff; for (int i=size-1; i>=0; i--) { buffer[myOffset+i] = (byte) (value & mask); mask <<= 8; } */ } } static protected final class IndexBaseItem extends Item { public IndexBaseItem() {} } static protected final class IndexMarkerItem extends Item { private OffsetItem offItem; private IndexBaseItem indexBase; public IndexMarkerItem(OffsetItem offItem, IndexBaseItem indexBase) { this.offItem = offItem; this.indexBase = indexBase; } public void xref() { //System.err.println("index marker item, base="+indexBase.myOffset+" my="+this.myOffset); offItem.set(this.myOffset-indexBase.myOffset+1); } } /** * TODO To change the template for this generated type comment go to * Window - Preferences - Java - Code Generation - Code and Comments */ static protected final class SubrMarkerItem extends Item { private OffsetItem offItem; private IndexBaseItem indexBase; public SubrMarkerItem(OffsetItem offItem, IndexBaseItem indexBase) { this.offItem = offItem; this.indexBase = indexBase; } public void xref() { //System.err.println("index marker item, base="+indexBase.myOffset+" my="+this.myOffset); offItem.set(this.myOffset-indexBase.myOffset); } } /** an unknown offset in a dictionary for the list. * We will fix up the offset later; for now, assume it's large. */ static protected final class DictOffsetItem extends OffsetItem { public final int size; public DictOffsetItem() {this.size=5; } public void increment(int[] currentOffset) { super.increment(currentOffset); currentOffset[0] += size; } // this is incomplete! public void emit(byte[] buffer) { if (size==5) { buffer[myOffset] = 29; buffer[myOffset+1] = (byte) ((value >>> 24) & 0xff); buffer[myOffset+2] = (byte) ((value >>> 16) & 0xff); buffer[myOffset+3] = (byte) ((value >>> 8) & 0xff); buffer[myOffset+4] = (byte) ((value >>> 0) & 0xff); } } } /** Card24 item. */ static protected final class UInt24Item extends Item { public int value; public UInt24Item(int value) {this.value=value;} public void increment(int[] currentOffset) { super.increment(currentOffset); currentOffset[0] += 3; } // this is incomplete! public void emit(byte[] buffer) { buffer[myOffset+0] = (byte) ((value >>> 16) & 0xff); buffer[myOffset+1] = (byte) ((value >>> 8) & 0xff); buffer[myOffset+2] = (byte) ((value >>> 0) & 0xff); } } /** Card32 item. */ static protected final class UInt32Item extends Item { public int value; public UInt32Item(int value) {this.value=value;} public void increment(int[] currentOffset) { super.increment(currentOffset); currentOffset[0] += 4; } // this is incomplete! public void emit(byte[] buffer) { buffer[myOffset+0] = (byte) ((value >>> 24) & 0xff); buffer[myOffset+1] = (byte) ((value >>> 16) & 0xff); buffer[myOffset+2] = (byte) ((value >>> 8) & 0xff); buffer[myOffset+3] = (byte) ((value >>> 0) & 0xff); } } /** A SID or Card16 item. */ static protected final class UInt16Item extends Item { public char value; public UInt16Item(char value) {this.value=value;} public void increment(int[] currentOffset) { super.increment(currentOffset); currentOffset[0] += 2; } // this is incomplete! public void emit(byte[] buffer) { buffer[myOffset+0] = (byte) ((value >>> 8) & 0xff); buffer[myOffset+1] = (byte) ((value >>> 0) & 0xff); } } /** A Card8 item. */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -