return peer.getBlackBoxBounds(firstEndpoint, secondEndpoint);
if( firstEndpoint < 0 || secondEndpoint > getCharacterCount() ) return new Rectangle2D.Float();  GeneralPath gp = new GeneralPath(); int i = 0; double advance = 0;   while( runIndices[i + 1][1] < firstEndpoint ) { advance += runs[i].getLogicalBounds().getWidth(); i++; }  int j = 0; if( runIndices[i][1] - runIndices[i][0] > 1 ) { while( runs[i].getGlyphCharIndex( j + 1 ) < (firstEndpoint - runIndices[i][0] ) )j++; }  gp.append(runs[i].getGlyphVisualBounds( j ), false); boolean keepGoing = true;;  do { while( j < runs[i].getNumGlyphs() && runs[i].getGlyphCharIndex( j ) + runIndices[i][0] < secondEndpoint ) { Rectangle2D r2 = (runs[i].getGlyphVisualBounds( j )). getBounds2D(); Point2D p = runs[i].getGlyphPosition( j ); r2.setRect( advance + p.getX(), r2.getY(), r2.getWidth(), r2.getHeight() ); gp.append(r2, false); j++; }  if( j >= runs[i].getNumGlyphs() ) { advance += runs[i].getLogicalBounds().getWidth(); i++; j = 0; } else keepGoing = false; } while( keepGoing );  return gp;
  public Shape getBlackBoxBounds (int firstEndpoint, int secondEndpoint)  {    return peer.getBlackBoxBounds(firstEndpoint, secondEndpoint);  }