1 17 18 19 20 package org.apache.fop.render.rtf.rtflib.rtfdoc; 21 22 28 29 import java.util.Vector ; 30 import java.util.Hashtable ; 31 import java.io.IOException ; 32 33 38 39 public final class RtfColorTable { 40 44 private static final int RED = 16; 46 private static final int GREEN = 8; 47 private static final int BLUE = 0; 48 49 50 54 55 private static RtfColorTable instance = null; 56 57 58 private Hashtable colorIndex = null; 59 60 private Vector colorTable = null; 61 62 private Hashtable namedColors = null; 63 64 65 69 72 private RtfColorTable () { 73 colorTable = new Vector (); 74 colorIndex = new Hashtable (); 75 namedColors = new Hashtable (); 76 77 init (); 78 } 79 80 85 public static RtfColorTable getInstance () { 86 if (instance == null) { 87 instance = new RtfColorTable (); 88 } 89 90 return instance; 91 } 92 93 94 98 101 private void init () { 102 addNamedColor("black", getColorNumber (0, 0, 0).intValue()); 103 addNamedColor("white", getColorNumber (255, 255, 255).intValue()); 104 addNamedColor("red", getColorNumber (255, 0, 0).intValue()); 105 addNamedColor("green", getColorNumber (0, 255, 0).intValue()); 106 addNamedColor("blue", getColorNumber (0, 0, 255).intValue()); 107 addNamedColor("cyan", getColorNumber (0, 255, 255).intValue()); 108 addNamedColor("magenta", getColorNumber (255, 0, 255).intValue()); 109 addNamedColor("yellow", getColorNumber (255, 255, 0).intValue()); 110 111 getColorNumber (0, 0, 128); 112 getColorNumber (0, 128, 128); 113 getColorNumber (0, 128, 0); 114 getColorNumber (128, 0, 128); 115 getColorNumber (128, 0, 0); 116 getColorNumber (128, 128, 0); 117 getColorNumber (128, 128, 128); 118 119 addNamedColor("gray", getColorNumber(128, 128, 128).intValue()); 122 123 getColorNumber (192, 192, 192); 124 } 125 126 127 private void addNamedColor(String name, int colorNumber) { 128 namedColors.put(name.toLowerCase(), new Integer (colorNumber)); 129 } 130 131 135 139 public Integer getColorNumber (String name) { 140 return ((Integer )namedColors.get(name.toLowerCase())); 141 } 142 143 152 public Integer getColorNumber (int red, int green, int blue) { 153 Integer identifier = new Integer (determineIdentifier (red, green, blue)); 154 Object o = colorIndex.get (identifier); 155 int retVal; 156 157 if (o == null) { 158 addColor (identifier); 163 164 retVal = colorTable.size (); 165 } else { 166 retVal = ((Integer ) o).intValue () + 1; 170 } 171 172 return new Integer (retVal); 173 } 174 175 182 public void writeColors (RtfHeader header) throws IOException { 183 if (colorTable == null || colorTable.size () == 0) { 184 return; 185 } 186 187 header.newLine(); 188 header.writeGroupMark (true); 189 header.write ("\\colortbl;"); 194 195 int len = colorTable.size (); 196 197 for (int i = 0; i < len; i++) { 198 int identifier = ((Integer ) colorTable.get (i)).intValue (); 199 200 header.newLine(); 201 header.write ("\\red" + determineColorLevel (identifier, RED)); 202 header.write ("\\green" + determineColorLevel (identifier, GREEN)); 203 header.write ("\\blue" + determineColorLevel (identifier, BLUE) + ";"); 204 } 205 206 header.newLine(); 207 header.writeGroupMark (false); 208 } 209 210 211 215 220 private void addColor (Integer i) { 221 colorIndex.put (i, new Integer (colorTable.size ())); 222 colorTable.addElement (i); 223 } 224 225 234 private int determineIdentifier (int red, int green, int blue) { 235 int c = red << RED; 236 237 c += green << GREEN; 238 c += blue << BLUE; 239 240 return c; 241 } 242 243 251 private int determineColorLevel (int identifier, int color) { 252 int retVal = (byte) (identifier >> color); 253 254 return retVal < 0 ? retVal + 256 : retVal; 255 } 256 } 257 | Popular Tags |