Tricia:

I'm not sure what JDK you are running.  FontRenderContext.getTransform
should be returning a non-null value.  Internally, in later JDKs, it uses a
null transform to represent the identity transform, so perhaps this is what
you are seeing in the debugger.  In older JDK's the Graphics2D transform
was not propagated to the FRC, but this should be ok in at least by JDK 1.4
and later-- I'm not able to check at the moment.

The FRC transform is only used to inform the TextLayout about the size and
orientation of the pixels on which it should measure and layout
glyphs.  Generally the effects of changes to the transform on line metrics
are small.  The FRC transform does not cause the text to scale or rotate,
the transform in effect on the Graphics when you render does that.  If your
text is not showing up at all, perhaps you are incorrectly scaling the
advances you get back from the TextLayout before you position it for drawing.

Doug


At 12:33 PM 7/17/2004, Tricia Crichton wrote:
---------------------- Information from the mail header
-----------------------
Sender:       Discussion list for Java 2D API <[EMAIL PROTECTED]>
Poster:       Tricia Crichton <[EMAIL PROTECTED]>
Subject:      problem with FontRenderContext's AffineTransform
-------------------------------------------------------------------------------

Hi,
    I'm trying to add labels to an image generated in the same program.
    I need labels both on the left and right sides of a chart/diagram.
    The right side is easy just using the Graphics2D.drawstring(.....)
methods.
    For the left side, I previously did the same, using an arbitrary
space from the edge of the diagram as my starting X point. That works,
but some of my labels end up closer to the diagram than I'd like (they
are the longer strings, of course).
    So I thought I'd try using a TextLayout to determine the actual size
of the string and use that measurement to position the starting X point.
   The function that manages the drawing calls several others, passing
them the Graphics2D object. This seems to work fine. My problem is that
I need to change the AffineTransform when I get to the labels to
eliminate some substantial scaling. This works fine when I use the
drawString () methods, but the changes to the Graphics2D transform are
not propigated to the FontRenderContext's AffineTransform, even if I
don't get that transform until after I make the changes. (Running in a
debugger, the return value of FontRenderContext.getTransform() is null.)
    The final result is that my left side labels are not appearing at
all. (I think they are being drawn in the UserSpace outside my image.)
    Any ideas on how I could fix this?

Thanks,
Tricia Crichton

  private void drawLabels(Graphics2D my2d){
    if (!DEBUG){  //the results of these and the following set of
println's follow the problematic code.
      System.out.println("StChart drawLabels on entry");
      System.out.println(my2d.getTransform().toString());

System.out.println(my2d.getFontRenderContext().getTransform().toString());
    }
    Row row;
    TextLayout label;
    Font f = my2d.getFont();
    float fontSize = f.getSize2D();
    //this is where I change the scale factors
    double transMatrix[] = new double [6];
    my2d.getTransform().getMatrix(transMatrix);
    transMatrix[0] = 1; //eliminate scaling
    transMatrix[3] = 1;
    my2d.setTransform(new AffineTransform(transMatrix));
    /* the above line seems to null out the nested transform:
     StChart drawLabels on entry
    AffineTransform[[44.0, 0.0, 274.75], [0.0, 44.0, 405.1001892089844]]
    AffineTransform[[44.0, 0.0, 274.75], [0.0, 44.0, 405.1001892089844]]
    StChart drawLabels after reset Transform
    AffineTransform[[1.0, 0.0, 274.75], [0.0, 1.0, 405.1001892089844]]
    AffineTransform[[1.0, 0.0, 0.0], [0.0, 1.0, 0.0]]*/
    //my2d.getTransform().setToScale(1,1);
    /* this line doesn't null out the nested transform, but it also
doesn't seem to work at all,
        the original Graphics2D transform is unchanged.
    StChart drawLabels on entry
    AffineTransform[[44.0, 0.0, 274.75], [0.0, 44.0, 405.1001892089844]]
    AffineTransform[[44.0, 0.0, 274.75], [0.0, 44.0, 405.1001892089844]]
    StChart drawLabels after reset Transform
    AffineTransform[[44.0, 0.0, 274.75], [0.0, 44.0, 405.1001892089844]]
    AffineTransform[[44.0, 0.0, 274.75], [0.0, 44.0, 405.1001892089844]] */
    if (!DEBUG){
      System.out.println("StChart drawLabels after reset Transform");
      System.out.println(my2d.getTransform().toString());

System.out.println(my2d.getFontRenderContext().getTransform().toString());
    }
    my2d.setPaint(Color.black);
    FontRenderContext frc = my2d.getFontRenderContext();
    if (frc == null) System.out.println("noFontRenderContext!!!!!");
    for (int r = 0; r < getSize(); r += 5){
      row = getRow(r);
      if (row != null){
        label = new TextLayout(row.getRowInd()
            + " (" + Integer.toString(row.getStCount()) + " sts)",f,frc);
        //my2d.drawString(label,
        //    getRightLabelX(row), getLabelY(row, fontSize));
        label.draw(my2d,
            getRightLabelX(row), getLabelY(row, fontSize));
        //my2d.drawString(Integer.toString(row.getRowInd()),  //old
(working) code
        //    getLeftLabelX(row,label), getLabelY(row, fontSize));
        label.draw(my2d,    //new (not working) code
            getLeftLabelX(row,label), getLabelY(row, fontSize));
      }
    }//close cycle rows
  }//close drawLabels

===========================================================================
To unsubscribe, send email to [EMAIL PROTECTED] and include in the body
of the message "signoff JAVA2D-INTEREST".  For general help, send email to
[EMAIL PROTECTED] and include in the body of the message "help".

=========================================================================== To unsubscribe, send email to [EMAIL PROTECTED] and include in the body of the message "signoff JAVA2D-INTEREST". For general help, send email to [EMAIL PROTECTED] and include in the body of the message "help".

Reply via email to