aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorRoman Nurik <romannurik@google.com>2011-07-27 23:39:32 -0700
committerRoman Nurik <romannurik@google.com>2011-07-28 16:17:59 -0700
commite9e11f07c4c0490007a6984a3ae03042190217fd (patch)
tree62de65090d55503ab9924d86143ac1b94768d227
parenta7fae9fb391c88c41141df74708e135d2f8ad0c1 (diff)
downloadsdk-e9e11f07c4c0490007a6984a3ae03042190217fd.zip
sdk-e9e11f07c4c0490007a6984a3ae03042190217fd.tar.gz
sdk-e9e11f07c4c0490007a6984a3ae03042190217fd.tar.bz2
Add a text rendering utility class to the Asset Studio library.
Add a text rendering utility class to the Asset Studio library. Also fix a tiny edge-case bug in image scaling. The text rendering class allows rendering a String with some options to a BufferedImage, for input as the sourceImage to a GraphicGenerator. Change-Id: I8e17e9a25ac2e48fa55e2994706aeb572da54223
-rw-r--r--assetstudio/src/com/android/assetstudiolib/TextRenderUtil.java110
-rw-r--r--assetstudio/src/com/android/assetstudiolib/Util.java8
2 files changed, 114 insertions, 4 deletions
diff --git a/assetstudio/src/com/android/assetstudiolib/TextRenderUtil.java b/assetstudio/src/com/android/assetstudiolib/TextRenderUtil.java
new file mode 100644
index 0000000..a103701
--- /dev/null
+++ b/assetstudio/src/com/android/assetstudiolib/TextRenderUtil.java
@@ -0,0 +1,110 @@
+/*
+ * Copyright (C) 2011 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.assetstudiolib;
+
+import java.awt.Font;
+import java.awt.Graphics2D;
+import java.awt.font.FontRenderContext;
+import java.awt.font.TextAttribute;
+import java.awt.geom.Rectangle2D;
+import java.awt.image.BufferedImage;
+import java.util.Hashtable;
+import java.util.Map;
+
+/**
+ * A set of utility classes for rendering text to a {@link BufferedImage}, suitable for use as a
+ * source image to {@link GraphicGenerator} objects.
+ */
+public class TextRenderUtil {
+ /**
+ * Renders the given string with the provided {@link Options} to a {@link BufferedImage}.
+ *
+ * @param text The text to render.
+ * @param options The optional parameters for rendering the text.
+ * @return An image, suitable for use as an input to a {@link GraphicGenerator}.
+ */
+ public static BufferedImage renderTextImage(String text, Options options) {
+ if (options == null) {
+ options = new Options();
+ }
+
+ BufferedImage tempImage = Util.newArgbBufferedImage(1, 1);
+ if (text == null || text.equals("")) {
+ return tempImage;
+ }
+
+ Graphics2D tempG = (Graphics2D) tempImage.getGraphics();
+
+ Font font = options.font;
+ if (font == null) {
+ font = new Font(options.fontName, options.fontStyle, options.fontSize);
+ // Map<TextAttribute, Object> map = new Hashtable<TextAttribute, Object>();
+ // map.put(TextAttribute.TRACKING, 0.3);
+ // font = font.deriveFont(map);
+ }
+
+ FontRenderContext frc = tempG.getFontRenderContext();
+
+ Rectangle2D bounds = font.getStringBounds(text, frc);
+
+ BufferedImage image = Util.newArgbBufferedImage(
+ Math.max(1, (int) bounds.getWidth()), Math.max(1, (int) bounds.getHeight()));
+ Graphics2D g = (Graphics2D) image.getGraphics();
+ g.setFont(font);
+ g.drawString(text, 0, (float) -bounds.getY());
+
+ return image;
+ }
+
+ /**
+ * The parameters for text rendering. There are no required values so a <code>new
+ * Options()</code> object is considered valid.
+ */
+ public static class Options {
+ // We use a large default font size to reduce the need to scale generated images up.
+ // TODO: Instead, a graphic generator should use a different source image for each density.
+ private static final int DEFAULT_FONT_SIZE = 512;
+
+ /**
+ * The optional {@link Font} to use. If null, a {@link Font} object will be generated using
+ * the other options.
+ */
+ public Font font = null;
+
+ /**
+ * The optional font name. Defaults to {@link Font#SERIF}.
+ *
+ * @see Font#Font(String, int, int)
+ */
+ public String fontName = Font.SERIF;
+
+ /**
+ * The optional font styling (bold and/or italic). Defaults to no styling.
+ *
+ * @see Font#Font(String, int, int)
+ */
+ public int fontStyle = 0;
+
+ /**
+ * The optional font size, in points. Defaults to a very large font size, to prevent
+ * up-scaling rendered text.
+ *
+ * @see Font#Font(String, int, int)
+ */
+ public int fontSize = DEFAULT_FONT_SIZE;
+ }
+}
diff --git a/assetstudio/src/com/android/assetstudiolib/Util.java b/assetstudio/src/com/android/assetstudiolib/Util.java
index 82299a4..1a6b00e 100644
--- a/assetstudio/src/com/android/assetstudiolib/Util.java
+++ b/assetstudio/src/com/android/assetstudiolib/Util.java
@@ -325,8 +325,8 @@ public class Util {
final int srcWidth = source.getWidth();
final int srcHeight = source.getHeight();
if (srcWidth * 1.0 / srcHeight > dstRect.width * 1.0 / dstRect.height) {
- final int scaledWidth = dstRect.width;
- final int scaledHeight = dstRect.width * srcHeight / srcWidth;
+ final int scaledWidth = Math.max(1, dstRect.width);
+ final int scaledHeight = Math.max(1, dstRect.width * srcHeight / srcWidth);
Image scaledImage = scaledImage(source, scaledWidth, scaledHeight);
g.drawImage(scaledImage,
dstRect.x,
@@ -339,8 +339,8 @@ public class Util {
0 + scaledHeight,
null);
} else {
- final int scaledWidth = dstRect.height * srcWidth / srcHeight;
- final int scaledHeight = dstRect.height;
+ final int scaledWidth = Math.max(1, dstRect.height * srcWidth / srcHeight);
+ final int scaledHeight = Math.max(1, dstRect.height);
Image scaledImage = scaledImage(source, scaledWidth, scaledHeight);
g.drawImage(scaledImage,
dstRect.x + (dstRect.width - scaledWidth) / 2,