242 gtx = font.getTransform();
243 gtx.scale(ptSize, ptSize);
244 delta = new Point2D.Float((float)gtx.getTranslateX(),
245 (float)gtx.getTranslateY());
246 gtx.setTransform(gtx.getScaleX(), gtx.getShearY(),
247 gtx.getShearX(), gtx.getScaleY(),
248 0, 0);
249 gtx.preConcatenate(dtx);
250 } else {
251 delta = ZERO_DELTA;
252 gtx = new AffineTransform(dtx);
253 gtx.scale(ptSize, ptSize);
254 }
255
256 /* Similar logic to that used in SunGraphics2D.checkFontInfo().
257 * Whether a grey (AA) strike is needed is size dependent if
258 * AA mode is 'gasp'.
259 */
260 int aa =
261 FontStrikeDesc.getAAHintIntVal(frc.getAntiAliasingHint(),
262 FontManager.getFont2D(font),
263 (int)Math.abs(ptSize));
264 int fm = FontStrikeDesc.getFMHintIntVal
265 (frc.getFractionalMetricsHint());
266 sd = new FontStrikeDesc(dtx, gtx, font.getStyle(), aa, fm);
267 }
268
269 private static final Point2D.Float ZERO_DELTA = new Point2D.Float();
270
271 private static
272 SoftReference<ConcurrentHashMap<SDKey, SDCache>> cacheRef;
273
274 private static final class SDKey {
275 private final Font font;
276 private final FontRenderContext frc;
277 private final int hash;
278
279 SDKey(Font font, FontRenderContext frc) {
280 this.font = font;
281 this.frc = frc;
282 this.hash = font.hashCode() ^ frc.hashCode();
390 int lim = offset + count;
391
392 int min = 0;
393 int max = text.length;
394 if (flags != 0) {
395 if ((flags & Font.LAYOUT_RIGHT_TO_LEFT) != 0) {
396 _typo_flags |= 0x80000000; // RTL
397 }
398
399 if ((flags & Font.LAYOUT_NO_START_CONTEXT) != 0) {
400 min = offset;
401 }
402
403 if ((flags & Font.LAYOUT_NO_LIMIT_CONTEXT) != 0) {
404 max = lim;
405 }
406 }
407
408 int lang = -1; // default for now
409
410 Font2D font2D = FontManager.getFont2D(font);
411
412 _textRecord.init(text, offset, lim, min, max);
413 int start = offset;
414 if (font2D instanceof CompositeFont) {
415 _scriptRuns.init(text, offset, count); // ??? how to handle 'common' chars
416 _fontRuns.init((CompositeFont)font2D, text, offset, lim);
417 while (_scriptRuns.next()) {
418 int limit = _scriptRuns.getScriptLimit();
419 int script = _scriptRuns.getScriptCode();
420 while (_fontRuns.next(script, limit)) {
421 Font2D pfont = _fontRuns.getFont();
422 /* layout can't deal with NativeFont instances. The
423 * native font is assumed to know of a suitable non-native
424 * substitute font. This currently works because
425 * its consistent with the way NativeFonts delegate
426 * in other cases too.
427 */
428 if (pfont instanceof NativeFont) {
429 pfont = ((NativeFont)pfont).getDelegateFont();
430 }
|
242 gtx = font.getTransform();
243 gtx.scale(ptSize, ptSize);
244 delta = new Point2D.Float((float)gtx.getTranslateX(),
245 (float)gtx.getTranslateY());
246 gtx.setTransform(gtx.getScaleX(), gtx.getShearY(),
247 gtx.getShearX(), gtx.getScaleY(),
248 0, 0);
249 gtx.preConcatenate(dtx);
250 } else {
251 delta = ZERO_DELTA;
252 gtx = new AffineTransform(dtx);
253 gtx.scale(ptSize, ptSize);
254 }
255
256 /* Similar logic to that used in SunGraphics2D.checkFontInfo().
257 * Whether a grey (AA) strike is needed is size dependent if
258 * AA mode is 'gasp'.
259 */
260 int aa =
261 FontStrikeDesc.getAAHintIntVal(frc.getAntiAliasingHint(),
262 FontUtilities.getFont2D(font),
263 (int)Math.abs(ptSize));
264 int fm = FontStrikeDesc.getFMHintIntVal
265 (frc.getFractionalMetricsHint());
266 sd = new FontStrikeDesc(dtx, gtx, font.getStyle(), aa, fm);
267 }
268
269 private static final Point2D.Float ZERO_DELTA = new Point2D.Float();
270
271 private static
272 SoftReference<ConcurrentHashMap<SDKey, SDCache>> cacheRef;
273
274 private static final class SDKey {
275 private final Font font;
276 private final FontRenderContext frc;
277 private final int hash;
278
279 SDKey(Font font, FontRenderContext frc) {
280 this.font = font;
281 this.frc = frc;
282 this.hash = font.hashCode() ^ frc.hashCode();
390 int lim = offset + count;
391
392 int min = 0;
393 int max = text.length;
394 if (flags != 0) {
395 if ((flags & Font.LAYOUT_RIGHT_TO_LEFT) != 0) {
396 _typo_flags |= 0x80000000; // RTL
397 }
398
399 if ((flags & Font.LAYOUT_NO_START_CONTEXT) != 0) {
400 min = offset;
401 }
402
403 if ((flags & Font.LAYOUT_NO_LIMIT_CONTEXT) != 0) {
404 max = lim;
405 }
406 }
407
408 int lang = -1; // default for now
409
410 Font2D font2D = FontUtilities.getFont2D(font);
411
412 _textRecord.init(text, offset, lim, min, max);
413 int start = offset;
414 if (font2D instanceof CompositeFont) {
415 _scriptRuns.init(text, offset, count); // ??? how to handle 'common' chars
416 _fontRuns.init((CompositeFont)font2D, text, offset, lim);
417 while (_scriptRuns.next()) {
418 int limit = _scriptRuns.getScriptLimit();
419 int script = _scriptRuns.getScriptCode();
420 while (_fontRuns.next(script, limit)) {
421 Font2D pfont = _fontRuns.getFont();
422 /* layout can't deal with NativeFont instances. The
423 * native font is assumed to know of a suitable non-native
424 * substitute font. This currently works because
425 * its consistent with the way NativeFonts delegate
426 * in other cases too.
427 */
428 if (pfont instanceof NativeFont) {
429 pfont = ((NativeFont)pfont).getDelegateFont();
430 }
|