bella 01/07/04 23:29:22
Modified: sources/org/apache/batik/gvt/text
BidiAttributedCharacterIterator.java
Log:
added support for mirrored glyphs and uses the ArabicTextHandler to Arabic form
attributes
Revision Changes Path
1.2 +227 -9
xml-batik/sources/org/apache/batik/gvt/text/BidiAttributedCharacterIterator.java
Index: BidiAttributedCharacterIterator.java
===================================================================
RCS file:
/home/cvs/xml-batik/sources/org/apache/batik/gvt/text/BidiAttributedCharacterIterator.java,v
retrieving revision 1.1
retrieving revision 1.2
diff -u -r1.1 -r1.2
--- BidiAttributedCharacterIterator.java 2001/06/12 23:49:46 1.1
+++ BidiAttributedCharacterIterator.java 2001/07/05 06:29:21 1.2
@@ -14,6 +14,7 @@
import java.awt.font.TextAttribute;
import java.awt.font.FontRenderContext;
import java.util.Map;
+import java.util.HashMap;
import java.util.Set;
/**
@@ -24,7 +25,7 @@
* in a text run will all have the same bidi level.
*
* @author <a href="mailto:[EMAIL PROTECTED]">Bella Robinson</a>
- * @version $Id: BidiAttributedCharacterIterator.java,v 1.1 2001/06/12 23:49:46
bella Exp $
+ * @version $Id: BidiAttributedCharacterIterator.java,v 1.2 2001/07/05 06:29:21
bella Exp $
*/
public class BidiAttributedCharacterIterator implements AttributedCharacterIterator
{
@@ -32,6 +33,17 @@
private AttributedCharacterIterator reorderedACI;
private FontRenderContext frc;
+ private final static Map mirroredGlyphs = new HashMap(50);
+
+
+ /**
+ * Constructs a character iterator that represents the visual display order
+ * of characters within bidirectional text.
+ *
+ * @param aci The character iterator containing the characters in logical
+ * order.
+ * @param frc The current font render context
+ */
public BidiAttributedCharacterIterator(AttributedCharacterIterator aci,
FontRenderContext frc) {
this.frc = frc;
@@ -44,7 +56,8 @@
for (int i = 0; i < numChars; i++) {
as.addAttribute(GVTAttributedCharacterIterator.TextAttribute.BIDI_LEVEL,
new Integer(tl.getCharacterLevel(i)), i, i+1);
- }
+ }
+
this.aci = as.getIterator();
// work out the new character order
@@ -56,13 +69,27 @@
}
int[] newCharOrder = doBidiReorder(charIndices, charLevels, numChars);
- // now construct the string in the new order
+ // construct the string in the new order
String reorderedString = "";
+ char c;
for (int i = 0; i < numChars; i++) {
- reorderedString += this.aci.setIndex(newCharOrder[i]);
+ c = this.aci.setIndex(newCharOrder[i]);
+
+ // check for mirrored char
+ int bidiLevel = tl.getCharacterLevel(newCharOrder[i]);
+ if (Math.floor(bidiLevel/2.0) != Math.floor((bidiLevel+1)/2.0)) {
+ // bidi level is odd so writing dir is right to left
+ Integer mirrorChar = (Integer)mirroredGlyphs.get(new
Integer((int)c));
+ if (mirrorChar != null) {
+ // replace with the mirror char
+ c = (char)mirrorChar.intValue();
+ }
+ }
+
+ reorderedString += c;
}
- // now construct the reordered ACI
+ // construct the reordered ACI
AttributedString reorderedAS = new AttributedString(reorderedString);
for (int i = 0; i < numChars; i++) {
this.aci.setIndex(newCharOrder[i]);
@@ -70,7 +97,7 @@
reorderedAS.addAttributes(attributes, i, i+1);
}
- // transfer any position atttributs to the new first char
+ // transfer any position atttributes to the new first char
this.aci.first();
Float x = (Float) this.aci.getAttribute(
GVTAttributedCharacterIterator.TextAttribute.X);
@@ -87,9 +114,23 @@
new Float(Float.NaN), newCharOrder[0], newCharOrder[0]+1);
reorderedAS.addAttribute(GVTAttributedCharacterIterator.TextAttribute.Y, y, 0, 1);
}
+
+ // assign arabic form attributes to any arabic chars in the string
+ reorderedAS = ArabicTextHandler.assignArabicForms(reorderedAS);
+
reorderedACI = reorderedAS.getIterator();
}
+ /**
+ * Calculates the display order of the characters based on the specified
+ * character levels. This method is recursive.
+ *
+ * @param charIndices An array contianing the original indices of each char.
+ * @param charLevels An array containing the current levels of each char.
+ * @param numChars The number of chars to reorder.
+ *
+ * @return An array contianing the reordered character indices.
+ */
private int[] doBidiReorder(int[] charIndices, int[] charLevels, int numChars) {
// check if all levels are 0, if so then just return the current
charIndicies
@@ -142,8 +183,10 @@
}
return doBidiReorder(charIndices, charLevels, numChars);
}
+
+
- /**
+ /**
* Get the keys of all attributes defined on the iterator's text range.
*/
public Set getAllAttributeKeys() {
@@ -219,47 +262,222 @@
public int getRunStart(Set attributes) {
return reorderedACI.getRunStart(attributes);
}
-
-
+ /**
+ * Creates a copy of this iterator.
+ */
public Object clone() {
return new
BidiAttributedCharacterIterator((AttributedCharacterIterator)aci.clone(), frc);
}
+ /**
+ * Gets the character at the current position (as returned by getIndex()).
+ */
public char current() {
return reorderedACI.current();
}
+ /**
+ * Sets the position to getBeginIndex() and returns the character at
+ * that position.
+ */
public char first() {
return reorderedACI.first();
}
+ /**
+ * Returns the start index of the text.
+ */
public int getBeginIndex() {
return reorderedACI.getBeginIndex();
}
+ /**
+ * Returns the end index of the text.
+ */
public int getEndIndex() {
return reorderedACI.getEndIndex();
}
+ /**
+ * Returns the current index.
+ */
public int getIndex() {
return reorderedACI.getIndex();
}
+ /**
+ * Sets the position to getEndIndex()-1 (getEndIndex() if the text is empty)
+ * and returns the character at that position.
+ */
public char last() {
return reorderedACI.last();
}
+ /**
+ * Increments the iterator's index by one and returns the character at
+ * the new index.
+ */
public char next() {
return reorderedACI.next();
}
+ /**
+ * Decrements the iterator's index by one and returns the character at the new
index.
+ */
public char previous() {
return reorderedACI.previous();
}
+ /**
+ * Sets the position to the specified position in the text and returns that
character.
+ */
public char setIndex(int position) {
return reorderedACI.setIndex(position);
+ }
+
+ static {
+ // set up the mirrored glyph hash map
+ mirroredGlyphs.put(new Integer(0x0028), new Integer(0x0029)); //LEFT
PARENTHESIS
+ mirroredGlyphs.put(new Integer(0x0029), new Integer(0x0028)); //RIGHT
PARENTHESIS
+ mirroredGlyphs.put(new Integer(0x003C), new Integer(0x003E)); //LESS-THAN
SIGN
+ mirroredGlyphs.put(new Integer(0x003E), new Integer(0x003C));
//GREATER-THAN SIGN
+ mirroredGlyphs.put(new Integer(0x005B), new Integer(0x005D)); //LEFT SQUARE
BRACKET
+ mirroredGlyphs.put(new Integer(0x005D), new Integer(0x005B)); //RIGHT
SQUARE BRACKET
+ mirroredGlyphs.put(new Integer(0x007B), new Integer(0x007D)); //LEFT CURLY
BRACKET
+ mirroredGlyphs.put(new Integer(0x007D), new Integer(0x007B)); //RIGHT CURLY
BRACKET
+ mirroredGlyphs.put(new Integer(0x00AB), new Integer(0x00BB));
//LEFT-POINTING DOUBLE ANGLE QUOTATION MARK
+ mirroredGlyphs.put(new Integer(0x00BB), new Integer(0x00AB));
//RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK
+ mirroredGlyphs.put(new Integer(0x2039), new Integer(0x203A)); //SINGLE
LEFT-POINTING ANGLE QUOTATION MARK
+ mirroredGlyphs.put(new Integer(0x203A), new Integer(0x2039)); //SINGLE
RIGHT-POINTING ANGLE QUOTATION MARK
+ mirroredGlyphs.put(new Integer(0x2045), new Integer(0x2046)); //LEFT SQUARE
BRACKET WITH QUILL
+ mirroredGlyphs.put(new Integer(0x2046), new Integer(0x2045)); //RIGHT
SQUARE BRACKET WITH QUILL
+ mirroredGlyphs.put(new Integer(0x207D), new Integer(0x207E)); //SUPERSCRIPT
LEFT PARENTHESIS
+ mirroredGlyphs.put(new Integer(0x207E), new Integer(0x207D)); //SUPERSCRIPT
RIGHT PARENTHESIS
+ mirroredGlyphs.put(new Integer(0x208D), new Integer(0x208E)); //SUBSCRIPT
LEFT PARENTHESIS
+ mirroredGlyphs.put(new Integer(0x208E), new Integer(0x208D)); //SUBSCRIPT
RIGHT PARENTHESIS
+ mirroredGlyphs.put(new Integer(0x2208), new Integer(0x220B)); //ELEMENT OF
+ mirroredGlyphs.put(new Integer(0x2209), new Integer(0x220C)); //NOT AN
ELEMENT OF
+ mirroredGlyphs.put(new Integer(0x220A), new Integer(0x220D)); //SMALL
ELEMENT OF
+ mirroredGlyphs.put(new Integer(0x220B), new Integer(0x2208)); //CONTAINS AS
MEMBER
+ mirroredGlyphs.put(new Integer(0x220C), new Integer(0x2209)); //DOES NOT
CONTAIN AS MEMBER
+ mirroredGlyphs.put(new Integer(0x220D), new Integer(0x220A)); //SMALL
CONTAINS AS MEMBER
+ mirroredGlyphs.put(new Integer(0x223C), new Integer(0x223D)); //TILDE
OPERATOR
+ mirroredGlyphs.put(new Integer(0x223D), new Integer(0x223C)); //REVERSED
TILDE
+ mirroredGlyphs.put(new Integer(0x2243), new Integer(0x22CD));
//ASYMPTOTICALLY EQUAL TO
+ mirroredGlyphs.put(new Integer(0x2252), new Integer(0x2253));
//APPROXIMATELY EQUAL TO OR THE IMAGE OF
+ mirroredGlyphs.put(new Integer(0x2253), new Integer(0x2252)); //IMAGE OF OR
APPROXIMATELY EQUAL TO
+ mirroredGlyphs.put(new Integer(0x2254), new Integer(0x2255)); //COLON EQUALS
+ mirroredGlyphs.put(new Integer(0x2255), new Integer(0x2254)); //EQUALS COLON
+ mirroredGlyphs.put(new Integer(0x2264), new Integer(0x2265)); //LESS-THAN
OR EQUAL TO
+ mirroredGlyphs.put(new Integer(0x2265), new Integer(0x2264));
//GREATER-THAN OR EQUAL TO
+ mirroredGlyphs.put(new Integer(0x2266), new Integer(0x2267)); //LESS-THAN
OVER EQUAL TO
+ mirroredGlyphs.put(new Integer(0x2267), new Integer(0x2266));
//GREATER-THAN OVER EQUAL TO
+ mirroredGlyphs.put(new Integer(0x2268), new Integer(0x2269)); //[BEST FIT]
LESS-THAN BUT NOT EQUAL TO
+ mirroredGlyphs.put(new Integer(0x2269), new Integer(0x2268)); //[BEST FIT]
GREATER-THAN BUT NOT EQUAL TO
+ mirroredGlyphs.put(new Integer(0x226A), new Integer(0x226B)); //MUCH
LESS-THAN
+ mirroredGlyphs.put(new Integer(0x226B), new Integer(0x226A)); //MUCH
GREATER-THAN
+ mirroredGlyphs.put(new Integer(0x226E), new Integer(0x226F)); //[BEST FIT]
NOT LESS-THAN
+ mirroredGlyphs.put(new Integer(0x226F), new Integer(0x226E)); //[BEST FIT]
NOT GREATER-THAN
+ mirroredGlyphs.put(new Integer(0x2270), new Integer(0x2271)); //[BEST FIT]
NEITHER LESS-THAN NOR EQUAL TO
+ mirroredGlyphs.put(new Integer(0x2271), new Integer(0x2270)); //[BEST FIT]
NEITHER GREATER-THAN NOR EQUAL TO
+ mirroredGlyphs.put(new Integer(0x2272), new Integer(0x2273)); //[BEST FIT]
LESS-THAN OR EQUIVALENT TO
+ mirroredGlyphs.put(new Integer(0x2273), new Integer(0x2272)); //[BEST FIT]
GREATER-THAN OR EQUIVALENT TO
+ mirroredGlyphs.put(new Integer(0x2274), new Integer(0x2275)); //[BEST FIT]
NEITHER LESS-THAN NOR EQUIVALENT TO
+ mirroredGlyphs.put(new Integer(0x2275), new Integer(0x2274)); //[BEST FIT]
NEITHER GREATER-THAN NOR EQUIVALENT TO
+ mirroredGlyphs.put(new Integer(0x2276), new Integer(0x2277)); //LESS-THAN
OR GREATER-THAN
+ mirroredGlyphs.put(new Integer(0x2277), new Integer(0x2276));
//GREATER-THAN OR LESS-THAN
+ mirroredGlyphs.put(new Integer(0x2278), new Integer(0x2279)); //NEITHER
LESS-THAN NOR GREATER-THAN
+ mirroredGlyphs.put(new Integer(0x2279), new Integer(0x2278)); //NEITHER
GREATER-THAN NOR LESS-THAN
+ mirroredGlyphs.put(new Integer(0x227A), new Integer(0x227B)); //PRECEDES
+ mirroredGlyphs.put(new Integer(0x227B), new Integer(0x227A)); //SUCCEEDS
+ mirroredGlyphs.put(new Integer(0x227C), new Integer(0x227D)); //PRECEDES OR
EQUAL TO
+ mirroredGlyphs.put(new Integer(0x227D), new Integer(0x227C)); //SUCCEEDS OR
EQUAL TO
+ mirroredGlyphs.put(new Integer(0x227E), new Integer(0x227F)); //[BEST FIT]
PRECEDES OR EQUIVALENT TO
+ mirroredGlyphs.put(new Integer(0x227F), new Integer(0x227E)); //[BEST FIT]
SUCCEEDS OR EQUIVALENT TO
+ mirroredGlyphs.put(new Integer(0x2280), new Integer(0x2281)); //[BEST FIT]
DOES NOT PRECEDE
+ mirroredGlyphs.put(new Integer(0x2281), new Integer(0x2280)); //[BEST FIT]
DOES NOT SUCCEED
+ mirroredGlyphs.put(new Integer(0x2282), new Integer(0x2283)); //SUBSET OF
+ mirroredGlyphs.put(new Integer(0x2283), new Integer(0x2282)); //SUPERSET OF
+ mirroredGlyphs.put(new Integer(0x2284), new Integer(0x2285)); //[BEST FIT]
NOT A SUBSET OF
+ mirroredGlyphs.put(new Integer(0x2285), new Integer(0x2284)); //[BEST FIT]
NOT A SUPERSET OF
+ mirroredGlyphs.put(new Integer(0x2286), new Integer(0x2287)); //SUBSET OF
OR EQUAL TO
+ mirroredGlyphs.put(new Integer(0x2287), new Integer(0x2286)); //SUPERSET OF
OR EQUAL TO
+ mirroredGlyphs.put(new Integer(0x2288), new Integer(0x2289)); //[BEST FIT]
NEITHER A SUBSET OF NOR EQUAL TO
+ mirroredGlyphs.put(new Integer(0x2289), new Integer(0x2288)); //[BEST FIT]
NEITHER A SUPERSET OF NOR EQUAL TO
+ mirroredGlyphs.put(new Integer(0x228A), new Integer(0x228B)); //[BEST FIT]
SUBSET OF WITH NOT EQUAL TO
+ mirroredGlyphs.put(new Integer(0x228B), new Integer(0x228A)); //[BEST FIT]
SUPERSET OF WITH NOT EQUAL TO
+ mirroredGlyphs.put(new Integer(0x228F), new Integer(0x2290)); //SQUARE
IMAGE OF
+ mirroredGlyphs.put(new Integer(0x2290), new Integer(0x228F)); //SQUARE
ORIGINAL OF
+ mirroredGlyphs.put(new Integer(0x2291), new Integer(0x2292)); //SQUARE
IMAGE OF OR EQUAL TO
+ mirroredGlyphs.put(new Integer(0x2292), new Integer(0x2291)); //SQUARE
ORIGINAL OF OR EQUAL TO
+ mirroredGlyphs.put(new Integer(0x22A2), new Integer(0x22A3)); //RIGHT TACK
+ mirroredGlyphs.put(new Integer(0x22A3), new Integer(0x22A2)); //LEFT TACK
+ mirroredGlyphs.put(new Integer(0x22B0), new Integer(0x22B1)); //PRECEDES
UNDER RELATION
+ mirroredGlyphs.put(new Integer(0x22B1), new Integer(0x22B0)); //SUCCEEDS
UNDER RELATION
+ mirroredGlyphs.put(new Integer(0x22B2), new Integer(0x22B3)); //NORMAL
SUBGROUP OF
+ mirroredGlyphs.put(new Integer(0x22B3), new Integer(0x22B2)); //CONTAINS AS
NORMAL SUBGROUP
+ mirroredGlyphs.put(new Integer(0x22B4), new Integer(0x22B5)); //NORMAL
SUBGROUP OF OR EQUAL TO
+ mirroredGlyphs.put(new Integer(0x22B5), new Integer(0x22B4)); //CONTAINS AS
NORMAL SUBGROUP OR EQUAL TO
+ mirroredGlyphs.put(new Integer(0x22B6), new Integer(0x22B7)); //ORIGINAL OF
+ mirroredGlyphs.put(new Integer(0x22B7), new Integer(0x22B6)); //IMAGE OF
+ mirroredGlyphs.put(new Integer(0x22C9), new Integer(0x22CA)); //LEFT NORMAL
FACTOR SEMIDIRECT PRODUCT
+ mirroredGlyphs.put(new Integer(0x22CA), new Integer(0x22C9)); //RIGHT
NORMAL FACTOR SEMIDIRECT PRODUCT
+ mirroredGlyphs.put(new Integer(0x22CB), new Integer(0x22CC)); //LEFT
SEMIDIRECT PRODUCT
+ mirroredGlyphs.put(new Integer(0x22CC), new Integer(0x22CB)); //RIGHT
SEMIDIRECT PRODUCT
+ mirroredGlyphs.put(new Integer(0x22CD), new Integer(0x2243)); //REVERSED
TILDE EQUALS
+ mirroredGlyphs.put(new Integer(0x22D0), new Integer(0x22D1)); //DOUBLE
SUBSET
+ mirroredGlyphs.put(new Integer(0x22D1), new Integer(0x22D0)); //DOUBLE
SUPERSET
+ mirroredGlyphs.put(new Integer(0x22D6), new Integer(0x22D7)); //LESS-THAN
WITH DOT
+ mirroredGlyphs.put(new Integer(0x22D7), new Integer(0x22D6));
//GREATER-THAN WITH DOT
+ mirroredGlyphs.put(new Integer(0x22D8), new Integer(0x22D9)); //VERY MUCH
LESS-THAN
+ mirroredGlyphs.put(new Integer(0x22D9), new Integer(0x22D8)); //VERY MUCH
GREATER-THAN
+ mirroredGlyphs.put(new Integer(0x22DA), new Integer(0x22DB)); //LESS-THAN
EQUAL TO OR GREATER-THAN
+ mirroredGlyphs.put(new Integer(0x22DB), new Integer(0x22DA));
//GREATER-THAN EQUAL TO OR LESS-THAN
+ mirroredGlyphs.put(new Integer(0x22DC), new Integer(0x22DD)); //EQUAL TO OR
LESS-THAN
+ mirroredGlyphs.put(new Integer(0x22DD), new Integer(0x22DC)); //EQUAL TO OR
GREATER-THAN
+ mirroredGlyphs.put(new Integer(0x22DE), new Integer(0x22DF)); //EQUAL TO OR
PRECEDES
+ mirroredGlyphs.put(new Integer(0x22DF), new Integer(0x22DE)); //EQUAL TO OR
SUCCEEDS
+ mirroredGlyphs.put(new Integer(0x22E0), new Integer(0x22E1)); //[BEST FIT]
DOES NOT PRECEDE OR EQUAL
+ mirroredGlyphs.put(new Integer(0x22E1), new Integer(0x22E0)); //[BEST FIT]
DOES NOT SUCCEED OR EQUAL
+ mirroredGlyphs.put(new Integer(0x22E2), new Integer(0x22E3)); //[BEST FIT]
NOT SQUARE IMAGE OF OR EQUAL TO
+ mirroredGlyphs.put(new Integer(0x22E3), new Integer(0x22E2)); //[BEST FIT]
NOT SQUARE ORIGINAL OF OR EQUAL TO
+ mirroredGlyphs.put(new Integer(0x22E4), new Integer(0x22E5)); //[BEST FIT]
SQUARE IMAGE OF OR NOT EQUAL TO
+ mirroredGlyphs.put(new Integer(0x22E5), new Integer(0x22E4)); //[BEST FIT]
SQUARE ORIGINAL OF OR NOT EQUAL TO
+ mirroredGlyphs.put(new Integer(0x22E6), new Integer(0x22E7)); //[BEST FIT]
LESS-THAN BUT NOT EQUIVALENT TO
+ mirroredGlyphs.put(new Integer(0x22E7), new Integer(0x22E6)); //[BEST FIT]
GREATER-THAN BUT NOT EQUIVALENT TO
+ mirroredGlyphs.put(new Integer(0x22E8), new Integer(0x22E9)); //[BEST FIT]
PRECEDES BUT NOT EQUIVALENT TO
+ mirroredGlyphs.put(new Integer(0x22E9), new Integer(0x22E8)); //[BEST FIT]
SUCCEEDS BUT NOT EQUIVALENT TO
+ mirroredGlyphs.put(new Integer(0x22EA), new Integer(0x22EB)); //[BEST FIT]
NOT NORMAL SUBGROUP OF
+ mirroredGlyphs.put(new Integer(0x22EB), new Integer(0x22EA)); //[BEST FIT]
DOES NOT CONTAIN AS NORMAL SUBGROUP
+ mirroredGlyphs.put(new Integer(0x22EC), new Integer(0x22ED)); //[BEST FIT]
NOT NORMAL SUBGROUP OF OR EQUAL TO
+ mirroredGlyphs.put(new Integer(0x22ED), new Integer(0x22EC)); //[BEST FIT]
DOES NOT CONTAIN AS NORMAL SUBGROUP OR EQUAL
+ mirroredGlyphs.put(new Integer(0x22F0), new Integer(0x22F1)); //UP RIGHT
DIAGONAL ELLIPSIS
+ mirroredGlyphs.put(new Integer(0x22F1), new Integer(0x22F0)); //DOWN RIGHT
DIAGONAL ELLIPSIS
+ mirroredGlyphs.put(new Integer(0x2308), new Integer(0x2309)); //LEFT CEILING
+ mirroredGlyphs.put(new Integer(0x2309), new Integer(0x2308)); //RIGHT
CEILING
+ mirroredGlyphs.put(new Integer(0x230A), new Integer(0x230B)); //LEFT FLOOR
+ mirroredGlyphs.put(new Integer(0x230B), new Integer(0x230A)); //RIGHT FLOOR
+ mirroredGlyphs.put(new Integer(0x2329), new Integer(0x232A));
//LEFT-POINTING ANGLE BRACKET
+ mirroredGlyphs.put(new Integer(0x232A), new Integer(0x2329));
//RIGHT-POINTING ANGLE BRACKET
+ mirroredGlyphs.put(new Integer(0x3008), new Integer(0x3009)); //LEFT ANGLE
BRACKET
+ mirroredGlyphs.put(new Integer(0x3009), new Integer(0x3008)); //RIGHT ANGLE
BRACKET
+ mirroredGlyphs.put(new Integer(0x300A), new Integer(0x300B)); //LEFT DOUBLE
ANGLE BRACKET
+ mirroredGlyphs.put(new Integer(0x300B), new Integer(0x300A)); //RIGHT
DOUBLE ANGLE BRACKET
+ mirroredGlyphs.put(new Integer(0x300C), new Integer(0x300D)); //[BEST FIT]
LEFT CORNER BRACKET
+ mirroredGlyphs.put(new Integer(0x300D), new Integer(0x300C)); //[BEST FIT]
RIGHT CORNER BRACKET
+ mirroredGlyphs.put(new Integer(0x300E), new Integer(0x300F)); //[BEST FIT]
LEFT WHITE CORNER BRACKET
+ mirroredGlyphs.put(new Integer(0x300F), new Integer(0x300E)); //[BEST FIT]
RIGHT WHITE CORNER BRACKET
+ mirroredGlyphs.put(new Integer(0x3010), new Integer(0x3011)); //LEFT BLACK
LENTICULAR BRACKET
+ mirroredGlyphs.put(new Integer(0x3011), new Integer(0x3010)); //RIGHT BLACK
LENTICULAR BRACKET
+ mirroredGlyphs.put(new Integer(0x3014), new Integer(0x3015)); //[BEST FIT]
LEFT TORTOISE SHELL BRACKET
+ mirroredGlyphs.put(new Integer(0x3015), new Integer(0x3014)); //[BEST FIT]
RIGHT TORTOISE SHELL BRACKET
+ mirroredGlyphs.put(new Integer(0x3016), new Integer(0x3017)); //LEFT WHITE
LENTICULAR BRACKET
+ mirroredGlyphs.put(new Integer(0x3017), new Integer(0x3016)); //RIGHT WHITE
LENTICULAR BRACKET
+ mirroredGlyphs.put(new Integer(0x3018), new Integer(0x3019)); //LEFT WHITE
TORTOISE SHELL BRACKET
+ mirroredGlyphs.put(new Integer(0x3019), new Integer(0x3018)); //RIGHT WHITE
TORTOISE SHELL BRACKET
+ mirroredGlyphs.put(new Integer(0x301A), new Integer(0x301B)); //LEFT WHITE
SQUARE BRACKET
+ mirroredGlyphs.put(new Integer(0x301B), new Integer(0x301A)); //RIGHT WHITE
SQUARE BRACKET
}
---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]