/*
* FontDetector.java
*
* Copyright (C) 2009-12 by RStudio, Inc.
*
* Unless you have received this program directly from RStudio pursuant
* to the terms of a commercial license agreement with RStudio, then
* this program is licensed to you under the terms of version 3 of the
* GNU Affero General Public License. This program is distributed WITHOUT
* ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,
* MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the
* AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.
*
*/
package org.rstudio.core.client.widget;
import org.rstudio.core.client.Debug;
import com.google.gwt.canvas.client.Canvas;
import com.google.gwt.canvas.dom.client.Context2d;
import com.google.gwt.dom.client.Style.Overflow;
import com.google.gwt.dom.client.Style.Unit;
import com.google.gwt.dom.client.Style.Visibility;
import com.google.gwt.user.client.ui.RootPanel;
import com.google.gwt.user.client.ui.SimplePanel;
public class FontDetector
{
public static boolean isFontSupported(String fontName)
{
SimplePanel panel = null;
try
{
// default font name as a reference point
final String defaultFontName = "Arial";
if (defaultFontName.equals(fontName))
return true;
// make sure canvas is supported
if (!Canvas.isSupported())
return false;
// add a temporary div to the dom
panel = new SimplePanel();
panel.setHeight("200px");
panel.getElement().getStyle().setVisibility(Visibility.HIDDEN);
panel.getElement().getStyle().setOverflow(Overflow.SCROLL);
RootPanel.get().add(panel, -2000, -2000);
// add a canvas element to the div and get the 2d drawing context
final Canvas canvas = Canvas.createIfSupported();
canvas.setWidth("512px");
canvas.setHeight("64px");
canvas.getElement().getStyle().setLeft(400, Unit.PX);
canvas.getElement().getStyle().setBackgroundColor("#ffe");
panel.add(canvas);
final Context2d ctx = canvas.getContext2d();
ctx.setFillStyle("#000000");
// closure to generate a hash for a font
class HashGenerator {
public String getHash(String fontName)
{
ctx.setFont("57px " + fontName + ", " + defaultFontName);
int width = canvas.getOffsetWidth();
int height = canvas.getOffsetHeight();
ctx.clearRect(0, 0, width, height);
ctx.fillText("TheQuickBrownFox", 2, 50);
return canvas.toDataUrl();
}};
// get hashes and compare them
HashGenerator hashGenerator = new HashGenerator();
String defaultHash = hashGenerator.getHash(defaultFontName);
String fontHash = hashGenerator.getHash(fontName);
return !defaultHash.equals(fontHash);
}
catch(Exception ex)
{
Debug.log(ex.toString());
return false;
}
finally
{
if (panel != null)
RootPanel.get().remove(panel);
}
}
}