package org.geogebra.common.geogebra3D.euclidian3D.draw;
import org.geogebra.common.awt.GBufferedImage;
import org.geogebra.common.awt.GColor;
import org.geogebra.common.awt.GGraphics2D;
import org.geogebra.common.awt.GRectangle;
import org.geogebra.common.euclidian.EuclidianStatic;
import org.geogebra.common.euclidian.draw.DrawText;
import org.geogebra.common.factories.AwtFactory;
import org.geogebra.common.geogebra3D.euclidian3D.EuclidianView3D;
import org.geogebra.common.geogebra3D.euclidian3D.openGL.Renderer;
import org.geogebra.common.kernel.geos.GeoText;
import org.geogebra.common.kernel.geos.TextProperties;
/**
* class for drawing texts
*
* @author matthieu
*
*/
public class DrawLabel3DForText extends DrawLabel3D {
public DrawLabel3DForText(EuclidianView3D view, Drawable3D drawable) {
super(view, drawable);
}
@Override
final protected GRectangle getBounds() {
if (geo.isLaTeX()) {
return EuclidianStatic.drawMultilineLaTeX(view.getApplication(),
tempGraphics, geo, tempGraphics, font, GColor.BLACK,
GColor.WHITE, text, 0, 0,
((TextProperties) geo).isSerifFont(), getCallBack());
}
GRectangle bounds = AwtFactory.getPrototype().newRectangle();
EuclidianStatic.drawIndexedMultilineString(view.getApplication(), text,
tempGraphics, bounds, font,
((TextProperties) geo).isSerifFont(), 0, 0);
return bounds;
}
@Override
final protected GBufferedImage draw() {
GBufferedImage bimg = createBufferedImage();
GGraphics2D g2d = createGraphics2D(bimg);
if (geo.isLaTeX()) {
EuclidianStatic.drawMultilineLaTeX(view.getApplication(),
tempGraphics, geo, g2d, font, GColor.BLACK, GColor.WHITE,
text, 0, 0, ((TextProperties) geo).isSerifFont(),
getCallBack());
} else {
EuclidianStatic.drawIndexedMultilineString(view.getApplication(),
text, g2d, AwtFactory.getPrototype().newRectangle(),
g2d.getFont(), ((TextProperties) geo).isSerifFont(), 0, 0);
}
return bimg;
}
protected GeoText geo;
public void setGeo(GeoText geo) {
this.geo = geo;
}
@Override
protected void drawText(Renderer renderer) {
// draw text
super.drawText(renderer);
if (geo.doHighlighting()) {
// draw bounds if highlighted
renderer.disableTextures();
renderer.disableMultisample();
renderer.setLineWidth(geo.getLineThickness() / 2.0);
renderer.setColor(DrawText.HIGHLIGHT_COLOR);
renderer.getGeometryManager().draw(highLightIndex);
renderer.enableMultisample();
renderer.enableTextures();
}
}
private int highLightIndex = -1;
@Override
public void updatePosition(Renderer renderer) {
super.updatePosition(renderer);
if (origin == null) {
renderer.getGeometryManager().remove(highLightIndex);
highLightIndex = -1;
return;
}
int old = highLightIndex;
highLightIndex = renderer.getGeometryManager().rectangleBounds(drawX,
drawY, drawZ, width / getFontScale(), height / getFontScale(),
highLightIndex);
renderer.getGeometryManager().remove(old);
// Log.debug("highLightIndex: "+highLightIndex);
}
@Override
public void setWaitForReset() {
super.setWaitForReset();
highLightIndex = -1;
}
/**
* update draw position
*/
@Override
public void updateDrawPosition() {
if (geo.isAbsoluteScreenLocActive()) {
if (origin == null) {
return;
}
drawX = (int) (origin.getX() - drawable.getView3D().getWidth() / 2.0
+ xOffset2 / getFontScale());
drawY = (int) (drawable.getView3D().getHeight() / 2.0
- origin.getY() + yOffset2 / getFontScale());
drawZ = 0;
} else {
super.updateDrawPosition();
}
}
@Override
public void removeFromGL() {
super.removeFromGL();
view.getRenderer().getGeometryManager().remove(highLightIndex);
}
}