diff --git a/www-client/src/main/java/fr/agrometinfo/www/client/ui/chart/LogoPlugin.java b/www-client/src/main/java/fr/agrometinfo/www/client/ui/chart/LogoPlugin.java index ad540cbb32c96cbef0918109ade384756bc8d054..05ce1f1b50749a246841a311ca099c73789fe363 100644 --- a/www-client/src/main/java/fr/agrometinfo/www/client/ui/chart/LogoPlugin.java +++ b/www-client/src/main/java/fr/agrometinfo/www/client/ui/chart/LogoPlugin.java @@ -7,9 +7,10 @@ import org.pepstock.charba.client.plugins.AbstractPlugin; import com.google.gwt.canvas.client.Canvas; import com.google.gwt.core.client.GWT; -import com.google.gwt.dom.client.Document; import com.google.gwt.dom.client.ImageElement; +import fr.agrometinfo.www.client.util.ApplicationUtils; + /** * Append RF+AgroMetInfo logo on the chart. * @@ -33,18 +34,11 @@ public final class LogoPlugin extends AbstractPlugin { */ private static final double LOGO_SIZE_RATIO = 2.1087; - /** - * The application logo. - */ - private final ImageElement logoImg = Document.get().createImageElement(); - /** * Constructor. */ public LogoPlugin() { super("Logo"); - // Load the image once for all - logoImg.setSrc("app/img/logo_etat-agrometinfo.svg"); } @Override @@ -56,6 +50,7 @@ public final class LogoPlugin extends AbstractPlugin { // Charba Canvas only accept a canvas as image // 1. create a GWT canvas with the logo final Canvas logoCanvas = Canvas.createIfSupported(); + final ImageElement logoImg = ApplicationUtils.getApplicationLogo(); logoCanvas.getContext2d().drawImage(logoImg, // 0d, // 0d, // diff --git a/www-client/src/main/java/fr/agrometinfo/www/client/ui/map/CanvasTitle.java b/www-client/src/main/java/fr/agrometinfo/www/client/ui/map/CanvasTitle.java index 9615a5c9ed9ff7ecb9d0c1e15c4cb6db0cb736ee..c51ad112f25b79a778b79bf7db8086d517979ccc 100644 --- a/www-client/src/main/java/fr/agrometinfo/www/client/ui/map/CanvasTitle.java +++ b/www-client/src/main/java/fr/agrometinfo/www/client/ui/map/CanvasTitle.java @@ -7,11 +7,11 @@ import java.util.StringJoiner; import com.google.gwt.canvas.dom.client.Context2d; import com.google.gwt.canvas.dom.client.Context2d.TextAlign; import com.google.gwt.canvas.dom.client.TextMetrics; -import com.google.gwt.dom.client.Document; import com.google.gwt.dom.client.ImageElement; import com.google.gwt.i18n.client.NumberFormat; import elemental2.dom.DomGlobal; +import fr.agrometinfo.www.client.util.ApplicationUtils; import fr.agrometinfo.www.client.util.UiUtils; import fr.agrometinfo.www.client.util.color.ColorInterval; import ol.Map; @@ -82,11 +82,6 @@ public final class CanvasTitle extends CanvasWidget { */ private List<ColorInterval> colorIntervals; - /** - * The application logo. - */ - private final ImageElement logoImg = Document.get().createImageElement(); - /** * Constructor. * @@ -94,8 +89,6 @@ public final class CanvasTitle extends CanvasWidget { */ public CanvasTitle(final Map map) { super(map); - // Load the image once for all - logoImg.setSrc("app/img/logo_etat-agrometinfo.svg"); } /** @@ -150,6 +143,7 @@ public final class CanvasTitle extends CanvasWidget { */ private void drawLogo() { final Context2d ctx = getCanvas().getContext2d(); + final ImageElement logoImg = ApplicationUtils.getApplicationLogo(); ctx.drawImage(logoImg, // 0d + BORDER_SIZE + PADDING, // 0d + BORDER_SIZE + PADDING, // diff --git a/www-client/src/main/java/fr/agrometinfo/www/client/util/ApplicationUtils.java b/www-client/src/main/java/fr/agrometinfo/www/client/util/ApplicationUtils.java index b2ff87a8d51b2134f79ded1ec784613e28a93cdf..63170447a6ddc67ef1babd23eb562515560adf6a 100644 --- a/www-client/src/main/java/fr/agrometinfo/www/client/util/ApplicationUtils.java +++ b/www-client/src/main/java/fr/agrometinfo/www/client/util/ApplicationUtils.java @@ -5,15 +5,52 @@ import java.util.HashMap; import java.util.Map; import com.google.gwt.core.client.GWT; +import com.google.gwt.dom.client.Document; +import com.google.gwt.dom.client.ImageElement; import com.google.gwt.i18n.client.DateTimeFormat; import com.google.gwt.user.client.DOM; +import elemental2.dom.XMLHttpRequest; + /** * Helper class. * * @author Olivier Maury */ public final class ApplicationUtils { + + /** + * The application logo, retrieved once. + */ + private static final ImageElement LOGO_IMG = Document.get().createImageElement(); + + /** + * @param b string to encode + * @return base64-encoded string + */ + private static native String base64encode(String b) /*-{ + return window.btoa(b); + }-*/; + + /** + * Create and return a unique img element with SVG source, ready to export as + * image from map an chart. + * + * @return HTML img element with SVG source as data in src attribute. + */ + public static ImageElement getApplicationLogo() { + if (LOGO_IMG.getSrc() == null || LOGO_IMG.getSrc().isEmpty()) { + final XMLHttpRequest xhr = new XMLHttpRequest(); + xhr.onload = e -> { + final String resp = xhr.responseText; + LOGO_IMG.setSrc("data:image/svg+xml;base64," + base64encode(resp)); + }; + xhr.open("GET", "app/img/logo_etat-agrometinfo.svg"); + xhr.send(); + } + return LOGO_IMG; + } + /** * @return root path of application. */