1 26 27 package it.stefanochizzolini.clown.documents.contents.fonts; 28 29 import it.stefanochizzolini.clown.documents.Document; 30 import it.stefanochizzolini.clown.files.File; 31 import it.stefanochizzolini.clown.objects.IPdfNumber; 32 import it.stefanochizzolini.clown.objects.PdfArray; 33 import it.stefanochizzolini.clown.objects.PdfDictionary; 34 import it.stefanochizzolini.clown.objects.PdfDirectObject; 35 import it.stefanochizzolini.clown.objects.PdfName; 36 import it.stefanochizzolini.clown.objects.PdfObjectWrapper; 37 import it.stefanochizzolini.clown.objects.PdfReference; 38 import it.stefanochizzolini.clown.objects.PdfStream; 39 40 import java.util.EnumSet ; 41 import java.util.Hashtable ; 42 43 46 public abstract class Font 47 extends PdfObjectWrapper<PdfDictionary> 48 { 49 54 public enum FlagsEnum 55 { 56 62 FixedPitch(0x1), 63 66 Serif(0x2), 67 70 Symbolic(0x4), 71 74 Script(0x8), 75 78 Nonsymbolic(0x20), 79 82 Italic(0x40), 83 86 AllCap(0x10000), 87 90 SmallCap(0x20000), 91 94 ForceBold(0x40000); 95 98 105 private int code; 106 108 private FlagsEnum( 110 int code 111 ) 112 {this.code = code;} 113 115 public int getCode( 118 ) 119 {return code;} 120 } 125 127 133 public static final double getScalingFactor( 134 double size 135 ) 136 {return (0.001 * size);} 137 138 143 public static final Font wrap( 144 PdfReference reference 145 ) 146 { 147 150 if(reference == null) 151 return null; 152 153 PdfDictionary fontData = (PdfDictionary)reference.getDataObject(); 154 PdfName fontType = (PdfName)fontData.get(PdfName.Subtype); 155 156 { 157 162 Hashtable cache = reference.getIndirectObject().getFile().getDocument().cache; 163 if(cache.containsKey(reference)) 164 {return (Font)cache.get(reference);} 165 } 166 167 if(fontType.equals(PdfName.Type1)) { 170 if(fontData.get(PdfName.FirstChar) == null) {return new StandardType1Font(reference);} 173 else { 175 PdfDictionary fontDescriptor = (PdfDictionary)File.resolve(fontData.get(PdfName.FontDescriptor)); 176 if(fontDescriptor.containsKey(PdfName.FontFile)) {return new Type1Font(reference);} 179 else { 181 PdfName fontFileSubtype = (PdfName)((PdfStream)File.resolve(fontDescriptor.get(PdfName.FontFile3))).getHeader().get(PdfName.Subtype); 182 if(fontFileSubtype.equals(PdfName.Type1C)) {return new Type1Font(reference);} 184 else if(fontFileSubtype.equals(PdfName.OpenType)) {return new OpenTypeFont(reference);} 186 else {return null;} 188 } 189 } 190 } 191 else if(fontType.equals(PdfName.TrueType)) {return new OpenTypeFont(reference);} 194 else {return null;} 196 } 197 201 protected Font( 204 Document context 205 ) 206 { 207 super( 208 context.getFile(), 209 new PdfDictionary( 210 new PdfName[]{PdfName.Type}, 211 new PdfDirectObject[]{PdfName.Font} 212 ) 213 ); 214 initialize(); 215 } 216 217 protected Font( 218 PdfDirectObject baseObject 219 ) 220 { 221 super( 222 baseObject, 223 null ); 225 initialize(); 226 } 227 229 public final boolean equals( 232 Font object 233 ) 234 { 235 return ( 236 getType() == object.getType() 237 && getName() == object.getName() 238 ); 239 } 240 241 244 public double getAscent( 245 double size 246 ) 247 { 248 return (((IPdfNumber)File.resolve( 249 ((PdfDictionary)File.resolve( 250 getBaseDataObject().get(PdfName.FontDescriptor) 251 )).get(PdfName.Ascent) 252 )).getNumberValue()) * getScalingFactor(size); 253 } 254 255 258 public double getDescent( 259 double size 260 ) 261 { 262 return (((IPdfNumber)File.resolve( 263 ((PdfDictionary)File.resolve( 264 getBaseDataObject().get(PdfName.FontDescriptor) 265 )).get(PdfName.Descent) 266 )).getNumberValue()) * getScalingFactor(size); 267 } 268 269 272 public EnumSet <FlagsEnum> getFlags( 273 ) 274 { 275 int flagMask = (int)((IPdfNumber)File.resolve( 276 ((PdfDictionary)File.resolve( 277 getBaseDataObject().get(PdfName.FontDescriptor) 278 )).get(PdfName.Flags) 279 )).getNumberValue(); 280 281 EnumSet <FlagsEnum> flags = EnumSet.noneOf(FlagsEnum.class); 282 for(FlagsEnum flag : FlagsEnum.values()) 283 { 284 if((flag.getCode() & flagMask) != 0) 285 {flags.add(flag);} 286 } 287 288 return flags; 289 } 290 291 294 public final double getKernedWidth( 295 String text, 296 double size 297 ) 298 {return (getWidth(text) + getKerning(text)) * getScalingFactor(size);} 299 300 303 public abstract int getKerning( 304 char textChar1, 305 char textChar2 306 ); 307 308 311 public abstract int getKerning( 312 String text 313 ); 314 315 318 public final double getKerning( 319 String text, 320 double size 321 ) 322 {return getKerning(text) * getScalingFactor(size);} 323 324 327 public double getLineHeight( 328 double size 329 ) 330 { 331 PdfDictionary descriptor = (PdfDictionary)File.resolve( 332 getBaseDataObject().get(PdfName.FontDescriptor) 333 ); 334 335 return ( 336 ((IPdfNumber)File.resolve( 337 descriptor.get(PdfName.Ascent) 338 )).getNumberValue() 339 + Math.abs(((IPdfNumber)File.resolve( 340 descriptor.get(PdfName.Descent) 341 )).getNumberValue()) 342 ) * getScalingFactor(size); 343 } 344 345 348 public final String getName( 349 ) 350 {return ((PdfName)getBaseDataObject().get(PdfName.BaseFont)).toString();} 351 352 355 public final String getType( 356 ) 357 {return ((PdfName)getBaseDataObject().get(PdfName.Subtype)).toString();} 358 359 362 public abstract int getWidth( 363 char textChar 364 ); 365 366 369 public abstract int getWidth( 370 String text 371 ); 372 373 376 public final double getWidth( 377 String text, 378 double size 379 ) 380 {return getWidth(text) * getScalingFactor(size);} 381 383 private void initialize( 385 ) 386 { 387 392 getDocument().cache.put((PdfReference)getBaseObject(),this); 393 } 394 } | Popular Tags |