package org.geogebra.web.html5.awt.font;
import org.geogebra.common.awt.GFont;
import org.geogebra.common.awt.GGraphics2D;
import org.geogebra.common.awt.GRectangle2D;
import org.geogebra.common.awt.font.GTextLayout;
import org.geogebra.common.util.lang.Unicode;
import org.geogebra.ggbjdk.java.awt.geom.Rectangle;
import org.geogebra.web.html5.awt.GFontRenderContextW;
import org.geogebra.web.html5.awt.GFontW;
public class GTextLayoutW implements GTextLayout {
GFont font;
String str;
GFontRenderContextW frc;
boolean containsLowerCase = false;
int advance = -1;
public GTextLayoutW(String str, GFont font, GFontRenderContextW frc) {
this.font = font;
this.str = str;
this.frc = frc;
if (str.length() > 0) {
for (int i = 0; i < str.length(); i++) {
if (Unicode.charactersWithDescenders.indexOf(str.charAt(i)) > -1) {
containsLowerCase = true;
break;
}
}
}
// containsLowerCase = str.indexOf('g') > -1 || str.indexOf('y') > -1 ||
// str.indexOf('j') > -1 || str.indexOf('f') > -1;
}
@Override
public double getAdvance() {
if (advance < 0) {
advance = frc.measureText(str, ((GFontW) font).getFullFontString());
}
return advance;
}
@Override
public GRectangle2D getBounds() {
return new Rectangle((int) getAdvance(), (int) getAscent());
}
@Override
public double getAscent() {
if (containsLowerCase) {
return font.getSize() * 0.75f;
}
return font.getSize() * 0.80f;
}
@Override
public double getDescent() {
if (containsLowerCase) {
return font.getSize() * 0.25f;
}
return font.getSize() * 0.20f;
}
@Override
public void draw(GGraphics2D g2, int x, int y) {
GFont tempFont = g2.getFont();
g2.setFont(font);
g2.drawString(str, x, y);
g2.setFont(tempFont);
}
}