diff options
author | Roman Nurik <romannurik@google.com> | 2011-07-27 23:39:32 -0700 |
---|---|---|
committer | Roman Nurik <romannurik@google.com> | 2011-07-28 16:17:59 -0700 |
commit | e9e11f07c4c0490007a6984a3ae03042190217fd (patch) | |
tree | 62de65090d55503ab9924d86143ac1b94768d227 /assetstudio/src | |
parent | a7fae9fb391c88c41141df74708e135d2f8ad0c1 (diff) | |
download | sdk-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
Diffstat (limited to 'assetstudio/src')
-rw-r--r-- | assetstudio/src/com/android/assetstudiolib/TextRenderUtil.java | 110 | ||||
-rw-r--r-- | assetstudio/src/com/android/assetstudiolib/Util.java | 8 |
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, |