blob: d63b22beae0c42f15966991b8f9f1be4ff853c00 (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
|
/*
* 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.
*/
/* $Id$ */
package org.apache.fop.fonts;
import org.apache.xmlgraphics.fonts.Glyphs;
import org.apache.fop.util.CharUtilities;
/**
* Represents an named character with character name (from the Adobe glyph list) and a Unicode
* sequence that this character represents.
*/
public class NamedCharacter {
private String charName;
private String unicodeSequence;
/**
* Main constructor.
* @param charName the character name
* @param unicodeSequence the Unicode sequence associated with this character
*/
public NamedCharacter(String charName, String unicodeSequence) {
if (charName == null) {
throw new NullPointerException("charName must not be null");
}
this.charName = charName;
if (unicodeSequence != null) {
this.unicodeSequence = unicodeSequence;
} else {
this.unicodeSequence = Glyphs.getUnicodeSequenceForGlyphName(charName);
}
}
/**
* Simple constructor.
* @param charName the character name
*/
public NamedCharacter(String charName) {
this(charName, null);
}
/** {@inheritDoc} */
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + ((charName == null) ? 0 : charName.hashCode());
return result;
}
/** {@inheritDoc} */
public boolean equals(Object obj) {
if (this == obj) {
return true;
}
if (obj == null) {
return false;
}
if (getClass() != obj.getClass()) {
return false;
}
final NamedCharacter other = (NamedCharacter)obj;
return charName.equals(other.charName);
}
/**
* Returns the character name (as defined by the Adobe glyph list).
* @return the character name
*/
public String getName() {
return this.charName;
}
/**
* Returns the Unicode sequence associated with this character.
* @return the Unicode sequence (or null if no Unicode sequence is associated)
*/
public String getUnicodeSequence() {
return this.unicodeSequence;
}
/**
* Indicates whether a single Unicode value is associated with this character.
* @return true if exactly one Unicode value is associated with this character, false otherwise
*/
public boolean hasSingleUnicodeValue() {
return (this.unicodeSequence != null && this.unicodeSequence.length() == 1);
}
/**
* Returns the single Unicode value associated with this named character. Check
* {@link #hasSingleUnicodeValue()} before you call this method because an
* IllegalStateException is thrown is a Unicode sequence with more than one character is
* associated with this character.
* @return the single Unicode value (or FFFF ("NOT A CHARACTER") if no Unicode value is
* available)
* @throws IllegalStateException if a Unicode sequence with more than one value is associated
* with the named character
*/
public char getSingleUnicodeValue() throws IllegalStateException {
if (this.unicodeSequence == null) {
return CharUtilities.NOT_A_CHARACTER;
}
if (this.unicodeSequence.length() > 1) {
throw new IllegalStateException("getSingleUnicodeValue() may not be called for a"
+ " named character that has more than one Unicode value (a sequence)"
+ " associated with the named character!");
}
return this.unicodeSequence.charAt(0);
}
/** {@inheritDoc} */
public String toString() {
StringBuffer sb = new StringBuffer(this.unicodeSequence);
sb.append(" (");
if (this.unicodeSequence != null) {
for (int i = 0, c = this.unicodeSequence.length(); i < c; i++) {
sb.append("0x").append(Integer.toHexString(this.unicodeSequence.charAt(0)));
}
sb.append(", ");
}
sb.append(getName()).append(')');
return sb.toString();
}
}
|