Index: src/uk/me/parabola/mkgmap/osmstyle/function/FunctionFactory.java
===================================================================
--- src/uk/me/parabola/mkgmap/osmstyle/function/FunctionFactory.java	(revision 2654)
+++ src/uk/me/parabola/mkgmap/osmstyle/function/FunctionFactory.java	(working copy)
@@ -36,6 +36,9 @@
 		if ("is_complete".equals(name)) {
 			return new IsCompleteFunction();
 		}
+		if ("garmin_area".equals(name))
+			return new GarminAreaFunction();
+		
 		return null;
 	}
 }
Index: src/uk/me/parabola/mkgmap/osmstyle/function/GarminAreaFunction.java
===================================================================
--- src/uk/me/parabola/mkgmap/osmstyle/function/GarminAreaFunction.java	(revision 0)
+++ src/uk/me/parabola/mkgmap/osmstyle/function/GarminAreaFunction.java	(revision 0)
@@ -0,0 +1,38 @@
+package uk.me.parabola.mkgmap.osmstyle.function;
+
+import java.text.DecimalFormat;
+import java.text.DecimalFormatSymbols;
+import java.util.Locale;
+
+import uk.me.parabola.mkgmap.reader.osm.Element;
+import uk.me.parabola.mkgmap.reader.osm.MultiPolygonRelation;
+import uk.me.parabola.mkgmap.reader.osm.Way;
+
+/**
+ * Calculates the area size of a polygon in garmin units ^ 2.
+ * @author WanMil
+ */
+public class GarminAreaFunction extends CachedFunction {
+
+	private final DecimalFormat nf = new DecimalFormat("0.0#####################", DecimalFormatSymbols.getInstance(Locale.US));
+
+	public GarminAreaFunction() {
+		super(null);
+	}
+
+	protected String calcImpl(Element el) {
+		if (el instanceof Way) {
+			Way w = (Way)el;
+			if (w.isClosed() == false) {
+				return "0";
+			}
+			return nf.format(MultiPolygonRelation.calcAreaSize(((Way) el).getPoints()));
+		}
+		return null;
+	}
+
+	public boolean supportsWay() {
+		return true;
+	}
+
+}
