< prev index next >

src/java.desktop/share/classes/sun/java2d/pipe/GlyphListPipe.java

Print this page




  36 
  37 /**
  38  * A delegate pipe of SG2D for drawing text.
  39  */
  40 
  41 public abstract class GlyphListPipe implements TextPipe {
  42 
  43     public void drawString(SunGraphics2D sg2d, String s,
  44                            double x, double y)
  45     {
  46         FontInfo info = sg2d.getFontInfo();
  47         if (info.pixelHeight > OutlineTextRenderer.THRESHHOLD) {
  48             SurfaceData.outlineTextRenderer.drawString(sg2d, s, x, y);
  49             return;
  50         }
  51 
  52         float devx, devy;
  53         if (sg2d.transformState >= SunGraphics2D.TRANSFORM_TRANSLATESCALE) {
  54             double origin[] = {x + info.originX, y + info.originY};
  55             sg2d.transform.transform(origin, 0, origin, 0, 1);
  56             devx = (float)origin[0];
  57             devy = (float)origin[1];
  58         } else {
  59             devx = (float)(x + info.originX + sg2d.transX);
  60             devy = (float)(y + info.originY + sg2d.transY);
  61         }
  62         /* setFromString returns false if shaping is needed, and we then back
  63          * off to a TextLayout. Such text may benefit slightly from a lower
  64          * overhead in this approach over the approach in previous releases.
  65          */
  66         GlyphList gl = GlyphList.getInstance();
  67         if (gl.setFromString(info, s, devx, devy)) {
  68             drawGlyphList(sg2d, gl);
  69             gl.dispose();
  70         } else {
  71             gl.dispose(); // release this asap.
  72             TextLayout tl = new TextLayout(s, sg2d.getFont(),
  73                                            sg2d.getFontRenderContext());
  74             tl.draw(sg2d, (float)x, (float)y);
  75         }











  76     }
  77 
  78     public void drawChars(SunGraphics2D sg2d,
  79                           char data[], int offset, int length,
  80                           int ix, int iy)
  81     {
  82         FontInfo info = sg2d.getFontInfo();
  83         float x, y;
  84         if (info.pixelHeight > OutlineTextRenderer.THRESHHOLD) {
  85             SurfaceData.outlineTextRenderer.drawChars(
  86                                         sg2d, data, offset, length, ix, iy);
  87             return;
  88         }
  89         if (sg2d.transformState >= SunGraphics2D.TRANSFORM_TRANSLATESCALE) {
  90             double origin[] = {ix + info.originX, iy + info.originY};
  91             sg2d.transform.transform(origin, 0, origin, 0, 1);
  92             x = (float) origin[0];
  93             y = (float) origin[1];
  94         } else {
  95             x = ix + info.originX + sg2d.transX;




  36 
  37 /**
  38  * A delegate pipe of SG2D for drawing text.
  39  */
  40 
  41 public abstract class GlyphListPipe implements TextPipe {
  42 
  43     public void drawString(SunGraphics2D sg2d, String s,
  44                            double x, double y)
  45     {
  46         FontInfo info = sg2d.getFontInfo();
  47         if (info.pixelHeight > OutlineTextRenderer.THRESHHOLD) {
  48             SurfaceData.outlineTextRenderer.drawString(sg2d, s, x, y);
  49             return;
  50         }
  51 
  52         float devx, devy;
  53         if (sg2d.transformState >= SunGraphics2D.TRANSFORM_TRANSLATESCALE) {
  54             double origin[] = {x + info.originX, y + info.originY};
  55             sg2d.transform.transform(origin, 0, origin, 0, 1);
  56             devx = (float) closeToHalfInteger(origin[0]);
  57             devy = (float) closeToHalfInteger(origin[1]);
  58         } else {
  59             devx = (float)(x + info.originX + sg2d.transX);
  60             devy = (float)(y + info.originY + sg2d.transY);
  61         }
  62         /* setFromString returns false if shaping is needed, and we then back
  63          * off to a TextLayout. Such text may benefit slightly from a lower
  64          * overhead in this approach over the approach in previous releases.
  65          */
  66         GlyphList gl = GlyphList.getInstance();
  67         if (gl.setFromString(info, s, devx, devy)) {
  68             drawGlyphList(sg2d, gl);
  69             gl.dispose();
  70         } else {
  71             gl.dispose(); // release this asap.
  72             TextLayout tl = new TextLayout(s, sg2d.getFont(),
  73                                            sg2d.getFontRenderContext());
  74             tl.draw(sg2d, (float)x, (float)y);
  75         }
  76     }
  77 
  78     private static final double MAX_TX_ERROR = .0001;
  79 
  80     private static double closeToHalfInteger(double value) {
  81         double d = value + 0.5;
  82         int i = (int) Math.floor(d + 0.5);
  83         if (Math.abs(d - i) < MAX_TX_ERROR) {
  84             return i - 0.5;
  85         }
  86         return value;
  87     }
  88 
  89     public void drawChars(SunGraphics2D sg2d,
  90                           char data[], int offset, int length,
  91                           int ix, int iy)
  92     {
  93         FontInfo info = sg2d.getFontInfo();
  94         float x, y;
  95         if (info.pixelHeight > OutlineTextRenderer.THRESHHOLD) {
  96             SurfaceData.outlineTextRenderer.drawChars(
  97                                         sg2d, data, offset, length, ix, iy);
  98             return;
  99         }
 100         if (sg2d.transformState >= SunGraphics2D.TRANSFORM_TRANSLATESCALE) {
 101             double origin[] = {ix + info.originX, iy + info.originY};
 102             sg2d.transform.transform(origin, 0, origin, 0, 1);
 103             x = (float) origin[0];
 104             y = (float) origin[1];
 105         } else {
 106             x = ix + info.originX + sg2d.transX;


< prev index next >