/*=============================================================================#
# Copyright (c) 2009-2016 Stephan Wahlbrink (WalWare.de) and others.
# All rights reserved. This program and the accompanying materials
# are made available under the terms of the GNU Lesser General Public License
# v2.1 which accompanies this distribution, and is available at
# http://www.gnu.org/licenses/lgpl.html
#
# Contributors:
# Stephan Wahlbrink - initial API and implementation
#=============================================================================*/
package de.walware.rj.server.gd;
import org.rosuda.javaGD.GDInterface;
import de.walware.rj.server.gr.RjsGraphic;
public final class JavaGD extends GDInterface {
private final RjsGraphic rjsGraphic;
public JavaGD() {
this.rjsGraphic = new RjsGraphic();
}
@Override
public double[] gdInit(final double width, final double height, final int unit,
double xpi, double ypi, final int canvasColor) {
if (xpi <= 0.0 || ypi <= 0.0) {
try {
final double[] ppi = this.rjsGraphic.newPagePPI();
if (ppi != null && ppi.length == 2) {
xpi = ppi[0];
ypi = ppi[1];
}
}
catch (final Exception e) {
xpi = 0.0;
ypi = 0.0;
}
}
return super.gdInit(width, height, unit, xpi, ypi, canvasColor);
}
@Override
public void gdOpen(final int devNr) {
super.gdOpen(devNr);
this.rjsGraphic.initPage(devNr, RjsGraphic.STATE_OPENED,
getWidth(), getHeight(), getCanvasColor(), isActive() );
this.rjsGraphic.setMode(0);
}
@Override
public void gdNewPage() {
this.rjsGraphic.initPage(getDeviceNumber(), RjsGraphic.STATE_PAGED,
getWidth(), getHeight(), getCanvasColor(), isActive() );
}
@Override
public boolean gdNewPageConfirm() {
return this.rjsGraphic.newPageConfirm();
}
@Override
public void gdClose() {
super.gdClose();
this.rjsGraphic.close();
}
@Override
public void gdActivate() {
super.gdActivate();
this.rjsGraphic.activate();
}
@Override
public void gdDeactivate() {
super.gdDeactivate();
this.rjsGraphic.deactivate();
}
@Override
public void gdMode(final int mode) {
this.rjsGraphic.setMode(mode);
}
@Override
public double[] gdSize() {
final double[] result = this.rjsGraphic.newPageSize();
if (result != null && result.length == 2) {
setSize(result[0], result[1], PX);
}
return new double[] { 0.0, getWidth() - 1, getHeight() - 1, 0.0 };
}
@Override
public void setSize(final double width, final double height, final int unit) {
super.setSize(width, height, unit);
if (this.rjsGraphic.getState() == RjsGraphic.STATE_OPENED) {
gdMode(1);
this.rjsGraphic.initPage(getDeviceNumber(), RjsGraphic.STATE_OPENED,
getWidth(), getHeight(), getCanvasColor(), isActive() );
gdMode(0);
}
}
@Override
public void gdClip(final double x0, final double x1, final double y0, final double y1) {
this.rjsGraphic.setClip(x0, x1, y0, y1);
}
@Override
public void gdcSetColor(final int cc) {
this.rjsGraphic.setColor(cc);
}
@Override
public void gdcSetFill(final int cc) {
this.rjsGraphic.setFill(cc);
}
@Override
public void gdcSetLine(final double lwd, final int lty,
final byte cap, final byte join, final float joinMiterLimit) {
this.rjsGraphic.setLine(lty, (float) lwd, cap, join, joinMiterLimit);
}
@Override
public double[] gdMetricInfo(final int ch) {
final double[] result = this.rjsGraphic.getMetricInfo(ch);
// System.out.println("MetricInfo: " + Arrays.toString(result) + " " + (char) ch + " (" + ch + ")");
return (result != null && result.length == 3) ? result :
new double[] { 0.0, 0.0, 8.0 };
}
@Override
public double gdStrWidth(final String str) {
final double[] result = this.rjsGraphic.getStrWidth(str);
// if (str.length() == 1) {
// System.out.println("StrWidth: " + Arrays.toString(result) + " \"" + str + "\" (" + str.codePointAt(0) + ")");
// }
// else {
// System.out.println("StrWidth: " + Arrays.toString(result) + " \"" + str + "\"");
// }
return (result != null && result.length == 1) ? result[0] :
(8 * str.length()); // rough estimate
}
@Override
public void gdcSetFont(final double cex, final double ps, final double lineheight, final int fontface, final String fontfamily) {
// System.out.println("Font: " + fontface + " \"" + fontfamily + "\"");
this.rjsGraphic.setFont(fontfamily, fontface, (float) (cex * ps), (float) lineheight);
}
@Override
public void gdLine(final double x0, final double y0, final double x1, final double y1) {
// System.out.println("Line: (" + x0 + ", " + y0 + "), (" + x1 + ", " + y1 + ")");
this.rjsGraphic.drawLine(x0, y0, x1, y1);
}
@Override
public void gdRect(final double x0, final double y0, final double x1, final double y1) {
// System.out.println("Rect: (" + x0 + ", " + y0 + "), (" + x1 + ", " + y1 + ")");
this.rjsGraphic.drawRect(x0, y0, x1, y1);
}
@Override
public void gdPolyline(final int n, final double[] x, final double[] y) {
// System.out.println("Polyline: " + n);
this.rjsGraphic.drawPolyline(x, y);
}
@Override
public void gdPolygon(final int n, final double[] x, final double[] y) {
// System.out.println("Polygon: " + n);
this.rjsGraphic.drawPolygon(x, y);
}
@Override
public void gdPath(final int nPoly, final int[] nPer, final double[] x, final double[] y, final int mode) {
// System.out.println("Path: " + Arrays.toString(nPer));
this.rjsGraphic.drawPath(nPer, x, y, mode);
}
@Override
public void gdCircle(final double x, final double y, final double r) {
// System.out.println("Circle: (" + x + ", " + y + "), " +r);
this.rjsGraphic.drawCircle(x, y, r);
}
@Override
public void gdText(final double x, final double y, final String str, final double rot, final double hadj) {
// System.out.println("Text: " + str);
this.rjsGraphic.drawText(str, x, y, rot, hadj);
}
@Override
public void gdRaster(final byte[] img, final boolean imgAlpha, final int img_w, final int img_h,
final double x, final double y, final double w, final double h,
final double rot, final boolean interpolate) {
this.rjsGraphic.drawRaster(img, imgAlpha, img_w, img_h, x, y, w, h, rot, interpolate);
}
@Override
public byte[] gdCap(final int[] dim) {
{ final int iWidth = (int) (getWidth() + 0.5);
if (dim[0] < 0 || dim[0] == iWidth) {
dim[0] = iWidth;
dim[1] = (int) (getHeight() + 0.5);
}
else {
dim[1] = (int) ((dim[0]/getWidth()) * getHeight() + 0.5);
}
}
{ final byte[] array = this.rjsGraphic.capture(dim);
return (array != null && array.length == dim[0] * dim[1] * 4) ? array : null;
}
}
@Override
public double[] gdLocator() {
final double[] xy = this.rjsGraphic.execLocator();
return (xy != null && xy.length == 2) ? xy : null;
}
@Override
public String toString() {
final StringBuilder sb = new StringBuilder();
sb.append("JavaGD RJ-GD");
if (getDeviceNumber() > 0) {
sb.append(" Nr ").append(getDeviceNumber());
}
else {
sb.append(" (not yet open)");
}
return sb.toString();
}
}