Program: 76017
Project: 76017
Buggy source:
/** 
 * @param g2d
 * @param f
 * @param dX
 * @param dY
 * @param sText
 * @param iAngleInDegrees
 */
private final void showTopValue(IPrimitiveRenderer ipr,Location lo,Label la,boolean bShadow){
  final SVGGraphics2D g2d=(SVGGraphics2D)((IDeviceRenderer)ipr).getGraphicsContext();
  double dX=lo.getX(), dY=lo.getY();
  final FontDefinition fd=la.getCaption().getFont();
  final double dAngleInDegrees=fd.getRotation();
  final Color clrText=(Color)_sxs.getColor(la.getCaption().getColor());
  Color clrBackground=null;
  if (la.getBackground() != null) {
    clrBackground=(Color)_sxs.getColor((ColorDefinition)la.getBackground());
  }
  double dAngleInRadians=((-dAngleInDegrees * Math.PI) / 180.0);
  final ITextMetrics itm=new SVGTextMetrics(_sxs,la);
  final double dFW=itm.getFullWidth();
  final double dH=itm.getHeight();
  final double dD=itm.getDescent();
  final double dFH=itm.getFullHeight();
  double dXOffset=0, dW=0;
  final int iLC=itm.getLineCount();
  final Insets ins=la.getInsets().scaledInstance(_sxs.getDpiResolution() / 72d);
  final double shadowness=3 * _sxs.getDpiResolution() / 72d;
  SVGTextLayout tl;
  final HorizontalAlignment ha=la.getCaption().getFont().getAlignment().getHorizontalAlignment();
  final boolean bRightAligned=ha.getValue() == HorizontalAlignment.RIGHT;
  final boolean bCenterAligned=ha.getValue() == HorizontalAlignment.CENTER;
  dX-=dFW / 2;
  if (dAngleInDegrees == 0) {
    if (bShadow) {
      g2d.setPaint(new GradientPaint(new Point2D.Double(dX + shadowness,(dY - dFH) + shadowness),(Color)_sxs.getColor(la.getShadowColor()),new Point2D.Double(dX + shadowness + dFW,(dY - dFH) + shadowness + dFH),(Color)_sxs.getColor(la.getShadowColor().translucent())));
      g2d.fill(new Rectangle2D.Double(dX + shadowness,(dY - dFH) + shadowness,dFW,dFH));
    }
 else {
      final Rectangle2D.Double r2d=new Rectangle2D.Double(dX,(dY - dFH),dFW,dFH);
      if (clrBackground != null) {
        g2d.setColor(clrBackground);
        g2d.fill(r2d);
      }
      g2d.setColor(clrText);
      for (int i=0; i < itm.getLineCount(); i++) {
        tl=((SVGTextMetrics)itm).getLayout(iLC - i - 1);
        if (bRightAligned) {
          dW=tl.getBounds().getWidth();
          dXOffset=-ins.getLeft() + dFW - dW - ins.getRight();
        }
 else         if (bCenterAligned) {
          dW=tl.getBounds().getWidth();
          dXOffset=-ins.getLeft() + (dFW - dW) / 2;
        }
        tl.draw(g2d,(float)(dX + dXOffset + ins.getLeft()),(float)(dY - dD - dH * i - ins.getBottom()));
      }
      renderOutline(ipr,la.getOutline(),r2d);
    }
  }
 else   if (dAngleInDegrees > 0 && dAngleInDegrees < 90) {
    double dDeltaX=dFW / 2;
    dX+=dDeltaX;
    g2d.rotate(dAngleInRadians,dX,dY);
    if (bShadow) {
      g2d.setPaint(new GradientPaint(new Point2D.Double(dX + shadowness,(dY - dFH) + shadowness),(Color)_sxs.getColor(la.getShadowColor()),new Point2D.Double(dX + shadowness + dFW,(dY - dFH) + shadowness + dFH),(Color)_sxs.getColor(la.getShadowColor().translucent())));
      g2d.fill(new Rectangle2D.Double(dX + shadowness,(dY - dFH) + shadowness,dFW,dFH),false);
    }
 else {
      final Rectangle2D.Double r2d=new Rectangle2D.Double(dX,(dY - dFH),dFW,dFH);
      if (clrBackground != null) {
        g2d.setColor(clrBackground);
        g2d.fill(r2d);
      }
      g2d.setColor(clrText);
      for (int i=0; i < itm.getLineCount(); i++) {
        tl=new SVGTextLayout(itm.getLine(iLC - i - 1),g2d.getFont().getAttributes(),g2d.getFontRenderContext());
        if (bRightAligned) {
          dW=tl.getBounds().getWidth();
          dXOffset=-ins.getLeft() + dFW - dW - ins.getRight();
        }
 else         if (bCenterAligned) {
          dW=tl.getBounds().getWidth();
          dXOffset=-ins.getLeft() + (dFW - dW) / 2;
        }
        tl.draw(g2d,(float)(dX + dXOffset + ins.getLeft()),(float)(dY - dD - dH * i - ins.getBottom()));
      }
      renderOutline(ipr,la.getOutline(),r2d);
    }
    g2d.rotate(-dAngleInRadians,dX,dY);
  }
 else   if (dAngleInDegrees < 0 && dAngleInDegrees > -90) {
    double dCosTheta=Math.abs(Math.cos(dAngleInRadians));
    double dSineTheta=Math.abs(Math.sin(dAngleInRadians));
    dX-=dFW / 2 - (dFW - dFW * dCosTheta);
    dY-=dFW * dSineTheta;
    g2d.rotate(dAngleInRadians,dX,dY);
    if (bShadow) {
      g2d.setPaint(new GradientPaint(new Point2D.Double(dX + shadowness,(dY - dFH) + shadowness),(Color)_sxs.getColor(la.getShadowColor()),new Point2D.Double(dX + shadowness + dFW,(dY - dFH) + shadowness + dFH),(Color)_sxs.getColor(la.getShadowColor().translucent())));
      g2d.fill(new Rectangle2D.Double(dX + shadowness,(dY - dFH) + shadowness,dFW,dFH),false);
    }
 else {
      final Rectangle2D.Double r2d=new Rectangle2D.Double(dX,dY - dFH,dFW,dFH);
      if (clrBackground != null) {
        g2d.setColor(clrBackground);
        g2d.fill(r2d);
      }
      g2d.setColor(clrText);
      for (int i=0; i < itm.getLineCount(); i++) {
        tl=((SVGTextMetrics)itm).getLayout(iLC - i - 1);
        if (bRightAligned) {
          dW=tl.getBounds().getWidth();
          dXOffset=-ins.getLeft() + dFW - dW - ins.getRight();
        }
 else         if (bCenterAligned) {
          dW=tl.getBounds().getWidth();
          dXOffset=-ins.getLeft() + (dFW - dW) / 2;
        }
        tl.draw(g2d,(float)(dX + dXOffset + ins.getLeft()),(float)(dY - dD - dH * i - ins.getBottom()));
      }
      renderOutline(ipr,la.getOutline(),r2d);
    }
    g2d.rotate(-dAngleInRadians,dX,dY);
  }
 else   if (dAngleInDegrees == 90) {
    double dYHalfOffset=(dFH + dH) / 2.0;
    double dDeltaX=(dFW + dH) / 2;
    dX+=dDeltaX;
    g2d.rotate(dAngleInRadians,dX,dY);
    if (bShadow) {
      g2d.setPaint(new GradientPaint(new Point2D.Double(dX + shadowness,(dY - dYHalfOffset) + shadowness),(Color)_sxs.getColor(la.getShadowColor()),new Point2D.Double(dX + shadowness + dFW,(dY - dYHalfOffset) + shadowness + dFH),(Color)_sxs.getColor(la.getShadowColor().translucent())));
      g2d.fill(new Rectangle2D.Double(dX + shadowness,(dY - dYHalfOffset) + shadowness,dFW,dFH),false);
    }
 else {
      final Rectangle2D.Double r2d=new Rectangle2D.Double(dX,dY - dYHalfOffset,dFW,dFH);
      if (clrBackground != null) {
        g2d.setColor(clrBackground);
        g2d.fill(r2d);
      }
      g2d.setColor(clrText);
      for (int i=0; i < itm.getLineCount(); i++) {
        tl=((SVGTextMetrics)itm).getLayout(i);
        if (bRightAligned) {
          dW=tl.getBounds().getWidth();
          dXOffset=-ins.getLeft() + dFW - dW - ins.getRight();
        }
 else         if (bCenterAligned) {
          dW=tl.getBounds().getWidth();
          dXOffset=-ins.getLeft() + (dFW - dW) / 2;
        }
        tl.draw(g2d,(float)(dX + dXOffset + ins.getLeft()),(float)(((dY - dD) - ((itm.getLineCount() - i) * dH - (iLC + 1) * dH / 2)) + ins.getTop()));
      }
      renderOutline(ipr,la.getOutline(),r2d);
    }
    g2d.rotate(-dAngleInRadians,dX,dY);
  }
 else   if (dAngleInDegrees == -90) {
    double dYHalfOffset=(dFH + dH) / 2.0;
    double dDeltaX=(dFW - dH) / 2;
    double dDeltaY=dFW;
    dX+=dDeltaX;
    dY-=dDeltaY;
    g2d.rotate(dAngleInRadians,dX,dY);
    if (bShadow) {
      g2d.setPaint(new GradientPaint(new Point2D.Double(dX + shadowness,(dY - dYHalfOffset) + shadowness),(Color)_sxs.getColor(la.getShadowColor()),new Point2D.Double(dX + shadowness + dFW,(dY - dYHalfOffset) + shadowness + dFH),(Color)_sxs.getColor(la.getShadowColor().translucent())));
      g2d.fill(new Rectangle2D.Double(dX + shadowness,(dY - dYHalfOffset) + shadowness,dFW,dFH),false);
    }
 else {
      final Rectangle2D.Double r2d=new Rectangle2D.Double(dX,dY - dYHalfOffset,dFW,dFH);
      if (clrBackground != null) {
        g2d.setColor(clrBackground);
        g2d.fill(r2d);
      }
      g2d.setColor(clrText);
      for (int i=0; i < itm.getLineCount(); i++) {
        tl=((SVGTextMetrics)itm).getLayout(i);
        if (bRightAligned) {
          dW=tl.getBounds().getWidth();
          dXOffset=-ins.getLeft() + dFW - dW - ins.getRight();
        }
 else         if (bCenterAligned) {
          dW=tl.getBounds().getWidth();
          dXOffset=-ins.getLeft() + (dFW - dW) / 2;
        }
        tl.draw(g2d,(float)(dX + dXOffset + ins.getLeft()),(float)(((dY - dD) - ((itm.getLineCount() - i) * dH - (iLC + 1) * dH / 2)) + ins.getTop()));
      }
      renderOutline(ipr,la.getOutline(),r2d);
    }
    g2d.rotate(-dAngleInRadians,dX,dY);
  }
  itm.dispose();
}

Fixed version (ground truth):
/** 
 * @param g2d
 * @param f
 * @param dX
 * @param dY
 * @param sText
 * @param iAngleInDegrees
 */
private final void showTopValue(IPrimitiveRenderer ipr,Location lo,Label la,boolean bShadow){
  final SVGGraphics2D g2d=(SVGGraphics2D)((IDeviceRenderer)ipr).getGraphicsContext();
  double dX=lo.getX(), dY=lo.getY();
  final FontDefinition fd=la.getCaption().getFont();
  final double dAngleInDegrees=fd.getRotation();
  final Color clrText=(Color)_sxs.getColor(la.getCaption().getColor());
  Color clrBackground=null;
  if (la.getBackground() != null) {
    clrBackground=(Color)_sxs.getColor((ColorDefinition)la.getBackground());
  }
  double dAngleInRadians=((-dAngleInDegrees * Math.PI) / 180.0);
  final ITextMetrics itm=new SVGTextMetrics(_sxs,la);
  final double dFW=itm.getFullWidth();
  final double dH=itm.getHeight();
  final double dD=itm.getDescent();
  final double dFH=itm.getFullHeight();
  double dXOffset=0, dW=0;
  final int iLC=itm.getLineCount();
  final Insets ins=la.getInsets().scaledInstance(_sxs.getDpiResolution() / 72d);
  final double shadowness=3 * _sxs.getDpiResolution() / 72d;
  SVGTextLayout tl;
  final HorizontalAlignment ha=la.getCaption().getFont().getAlignment().getHorizontalAlignment();
  final boolean bRightAligned=ha.getValue() == HorizontalAlignment.RIGHT;
  final boolean bCenterAligned=ha.getValue() == HorizontalAlignment.CENTER;
  dX-=dFW / 2;
  if (dAngleInDegrees == 0) {
    if (bShadow) {
      g2d.setPaint(new GradientPaint(new Point2D.Double(dX + shadowness,(dY - dFH) + shadowness),(Color)_sxs.getColor(la.getShadowColor()),new Point2D.Double(dX + shadowness + dFW,(dY - dFH) + shadowness + dFH),(Color)_sxs.getColor(la.getShadowColor().translucent())));
      g2d.fill(new Rectangle2D.Double(dX + shadowness,(dY - dFH) + shadowness,dFW,dFH),false);
    }
 else {
      final Rectangle2D.Double r2d=new Rectangle2D.Double(dX,(dY - dFH),dFW,dFH);
      if (clrBackground != null) {
        g2d.setColor(clrBackground);
        g2d.fill(r2d);
      }
      g2d.setColor(clrText);
      for (int i=0; i < itm.getLineCount(); i++) {
        tl=((SVGTextMetrics)itm).getLayout(iLC - i - 1);
        if (bRightAligned) {
          dW=tl.getBounds().getWidth();
          dXOffset=-ins.getLeft() + dFW - dW - ins.getRight();
        }
 else         if (bCenterAligned) {
          dW=tl.getBounds().getWidth();
          dXOffset=-ins.getLeft() + (dFW - dW) / 2;
        }
        tl.draw(g2d,(float)(dX + dXOffset + ins.getLeft()),(float)(dY - dD - dH * i - ins.getBottom()));
      }
      renderOutline(ipr,la.getOutline(),r2d);
    }
  }
 else   if (dAngleInDegrees > 0 && dAngleInDegrees < 90) {
    double dDeltaX=dFW / 2;
    dX+=dDeltaX;
    g2d.rotate(dAngleInRadians,dX,dY);
    if (bShadow) {
      g2d.setPaint(new GradientPaint(new Point2D.Double(dX + shadowness,(dY - dFH) + shadowness),(Color)_sxs.getColor(la.getShadowColor()),new Point2D.Double(dX + shadowness + dFW,(dY - dFH) + shadowness + dFH),(Color)_sxs.getColor(la.getShadowColor().translucent())));
      g2d.fill(new Rectangle2D.Double(dX + shadowness,(dY - dFH) + shadowness,dFW,dFH),false);
    }
 else {
      final Rectangle2D.Double r2d=new Rectangle2D.Double(dX,(dY - dFH),dFW,dFH);
      if (clrBackground != null) {
        g2d.setColor(clrBackground);
        g2d.fill(r2d);
      }
      g2d.setColor(clrText);
      for (int i=0; i < itm.getLineCount(); i++) {
        tl=new SVGTextLayout(itm.getLine(iLC - i - 1),g2d.getFont().getAttributes(),g2d.getFontRenderContext());
        if (bRightAligned) {
          dW=tl.getBounds().getWidth();
          dXOffset=-ins.getLeft() + dFW - dW - ins.getRight();
        }
 else         if (bCenterAligned) {
          dW=tl.getBounds().getWidth();
          dXOffset=-ins.getLeft() + (dFW - dW) / 2;
        }
        tl.draw(g2d,(float)(dX + dXOffset + ins.getLeft()),(float)(dY - dD - dH * i - ins.getBottom()));
      }
      renderOutline(ipr,la.getOutline(),r2d);
    }
    g2d.rotate(-dAngleInRadians,dX,dY);
  }
 else   if (dAngleInDegrees < 0 && dAngleInDegrees > -90) {
    double dCosTheta=Math.abs(Math.cos(dAngleInRadians));
    double dSineTheta=Math.abs(Math.sin(dAngleInRadians));
    dX-=dFW / 2 - (dFW - dFW * dCosTheta);
    dY-=dFW * dSineTheta;
    g2d.rotate(dAngleInRadians,dX,dY);
    if (bShadow) {
      g2d.setPaint(new GradientPaint(new Point2D.Double(dX + shadowness,(dY - dFH) + shadowness),(Color)_sxs.getColor(la.getShadowColor()),new Point2D.Double(dX + shadowness + dFW,(dY - dFH) + shadowness + dFH),(Color)_sxs.getColor(la.getShadowColor().translucent())));
      g2d.fill(new Rectangle2D.Double(dX + shadowness,(dY - dFH) + shadowness,dFW,dFH),false);
    }
 else {
      final Rectangle2D.Double r2d=new Rectangle2D.Double(dX,dY - dFH,dFW,dFH);
      if (clrBackground != null) {
        g2d.setColor(clrBackground);
        g2d.fill(r2d);
      }
      g2d.setColor(clrText);
      for (int i=0; i < itm.getLineCount(); i++) {
        tl=((SVGTextMetrics)itm).getLayout(iLC - i - 1);
        if (bRightAligned) {
          dW=tl.getBounds().getWidth();
          dXOffset=-ins.getLeft() + dFW - dW - ins.getRight();
        }
 else         if (bCenterAligned) {
          dW=tl.getBounds().getWidth();
          dXOffset=-ins.getLeft() + (dFW - dW) / 2;
        }
        tl.draw(g2d,(float)(dX + dXOffset + ins.getLeft()),(float)(dY - dD - dH * i - ins.getBottom()));
      }
      renderOutline(ipr,la.getOutline(),r2d);
    }
    g2d.rotate(-dAngleInRadians,dX,dY);
  }
 else   if (dAngleInDegrees == 90) {
    double dYHalfOffset=(dFH + dH) / 2.0;
    double dDeltaX=(dFW + dH) / 2;
    dX+=dDeltaX;
    g2d.rotate(dAngleInRadians,dX,dY);
    if (bShadow) {
      g2d.setPaint(new GradientPaint(new Point2D.Double(dX + shadowness,(dY - dYHalfOffset) + shadowness),(Color)_sxs.getColor(la.getShadowColor()),new Point2D.Double(dX + shadowness + dFW,(dY - dYHalfOffset) + shadowness + dFH),(Color)_sxs.getColor(la.getShadowColor().translucent())));
      g2d.fill(new Rectangle2D.Double(dX + shadowness,(dY - dYHalfOffset) + shadowness,dFW,dFH),false);
    }
 else {
      final Rectangle2D.Double r2d=new Rectangle2D.Double(dX,dY - dYHalfOffset,dFW,dFH);
      if (clrBackground != null) {
        g2d.setColor(clrBackground);
        g2d.fill(r2d);
      }
      g2d.setColor(clrText);
      for (int i=0; i < itm.getLineCount(); i++) {
        tl=((SVGTextMetrics)itm).getLayout(i);
        if (bRightAligned) {
          dW=tl.getBounds().getWidth();
          dXOffset=-ins.getLeft() + dFW - dW - ins.getRight();
        }
 else         if (bCenterAligned) {
          dW=tl.getBounds().getWidth();
          dXOffset=-ins.getLeft() + (dFW - dW) / 2;
        }
        tl.draw(g2d,(float)(dX + dXOffset + ins.getLeft()),(float)(((dY - dD) - ((itm.getLineCount() - i) * dH - (iLC + 1) * dH / 2)) + ins.getTop()));
      }
      renderOutline(ipr,la.getOutline(),r2d);
    }
    g2d.rotate(-dAngleInRadians,dX,dY);
  }
 else   if (dAngleInDegrees == -90) {
    double dYHalfOffset=(dFH + dH) / 2.0;
    double dDeltaX=(dFW - dH) / 2;
    double dDeltaY=dFW;
    dX+=dDeltaX;
    dY-=dDeltaY;
    g2d.rotate(dAngleInRadians,dX,dY);
    if (bShadow) {
      g2d.setPaint(new GradientPaint(new Point2D.Double(dX + shadowness,(dY - dYHalfOffset) + shadowness),(Color)_sxs.getColor(la.getShadowColor()),new Point2D.Double(dX + shadowness + dFW,(dY - dYHalfOffset) + shadowness + dFH),(Color)_sxs.getColor(la.getShadowColor().translucent())));
      g2d.fill(new Rectangle2D.Double(dX + shadowness,(dY - dYHalfOffset) + shadowness,dFW,dFH),false);
    }
 else {
      final Rectangle2D.Double r2d=new Rectangle2D.Double(dX,dY - dYHalfOffset,dFW,dFH);
      if (clrBackground != null) {
        g2d.setColor(clrBackground);
        g2d.fill(r2d);
      }
      g2d.setColor(clrText);
      for (int i=0; i < itm.getLineCount(); i++) {
        tl=((SVGTextMetrics)itm).getLayout(i);
        if (bRightAligned) {
          dW=tl.getBounds().getWidth();
          dXOffset=-ins.getLeft() + dFW - dW - ins.getRight();
        }
 else         if (bCenterAligned) {
          dW=tl.getBounds().getWidth();
          dXOffset=-ins.getLeft() + (dFW - dW) / 2;
        }
        tl.draw(g2d,(float)(dX + dXOffset + ins.getLeft()),(float)(((dY - dD) - ((itm.getLineCount() - i) * dH - (iLC + 1) * dH / 2)) + ins.getTop()));
      }
      renderOutline(ipr,la.getOutline(),r2d);
    }
    g2d.rotate(-dAngleInRadians,dX,dY);
  }
  itm.dispose();
}