2 *******************************************************************************
\r
3 * Copyright (C) 1998-2004, International Business Machines Corporation and *
\r
4 * others. All Rights Reserved. *
\r
5 *******************************************************************************
\r
7 * Created on Dec 3, 2003
\r
9 *******************************************************************************
\r
11 package com.ibm.icu.dev.tool.layout;
\r
14 public /*abstract*/ class Lookup
\r
16 private int lookupType;
\r
17 private int lookupFlags;
\r
18 private LookupSubtable[] subtables;
\r
19 private int subtableCount;
\r
22 public final static int LF_ReservedBit = 0x0001;
\r
23 public final static int LF_IgnoreBaseGlyphs = 0x0002;
\r
24 public final static int LF_IgnoreLigatures = 0x0004;
\r
25 public final static int LF_IgnoreMarks = 0x0008;
\r
26 public final static int LF_ReservedMask = 0x00F0;
\r
27 public final static int LF_MarkAttachTypeMask = 0xFF00;
\r
28 public final static int LF_MarkAttachTypeShift = 8;
\r
30 // GSUB lookup types
\r
31 public final static int GSST_Single = 1;
\r
32 public final static int GSST_Multiple = 2;
\r
33 public final static int GSST_Alternate = 3;
\r
34 public final static int GSST_Ligature = 4;
\r
35 public final static int GSST_Context = 5;
\r
36 public final static int GSST_ChainingContext = 6;
\r
38 // GPOS lookup types
\r
39 public final static int GPST_Single = 1;
\r
40 public final static int GPST_Pair = 2;
\r
41 public final static int GPST_Cursive = 3;
\r
42 public final static int GPST_MarkToBase = 4;
\r
43 public final static int GPST_MarkToLigature = 5;
\r
44 public final static int GPST_MarkToMark = 6;
\r
45 public final static int GPST_Context = 7;
\r
46 public final static int GPST_ChainingContext = 8;
\r
48 public Lookup(int theLookupType, int theLookupFlags)
\r
50 lookupType = theLookupType;
\r
51 lookupFlags = theLookupFlags;
\r
53 subtables = new LookupSubtable[10];
\r
57 public void addSubtable(LookupSubtable subtable)
\r
59 if (subtableCount >= subtables.length) {
\r
60 LookupSubtable[] newSubtables = new LookupSubtable[subtables.length + 5];
\r
62 System.arraycopy(subtables, 0, newSubtables, 0, subtables.length);
\r
63 subtables = newSubtables;
\r
66 subtables[subtableCount] = subtable;
\r
70 public void writeLookup(OpenTypeTableWriter writer)
\r
72 int lookupBase = writer.getOutputIndex();
\r
74 writer.writeData(lookupType);
\r
75 writer.writeData(lookupFlags);
\r
76 writer.writeData(subtableCount);
\r
78 int subtableOffset = writer.getOutputIndex();
\r
80 for (int i = 0; i < subtableCount; i += 1) {
\r
81 writer.writeData(0);
\r
84 for (int i = 0; i < subtableCount; i += 1) {
\r
85 writer.fixOffset(subtableOffset++, lookupBase);
\r
86 subtables[i].writeLookupSubtable(writer);
\r