aboutsummaryrefslogtreecommitdiffstats
path: root/ninepatch/src/com
diff options
context:
space:
mode:
authorXavier Ducrohet <xav@android.com>2009-10-06 12:10:42 -0700
committerXavier Ducrohet <xav@android.com>2009-10-06 12:10:42 -0700
commite9b021563aa30b8e9683800c9f0c2d12d8184757 (patch)
treea502c7fe039ce04f646ad5d0e6f2f986c741203d /ninepatch/src/com
parent8c6d9a4216bcb0eb2405ec6f0e878380ed80fd74 (diff)
downloadsdk-e9b021563aa30b8e9683800c9f0c2d12d8184757.zip
sdk-e9b021563aa30b8e9683800c9f0c2d12d8184757.tar.gz
sdk-e9b021563aa30b8e9683800c9f0c2d12d8184757.tar.bz2
Add support for loading 9-patch from a stream.
This will be used by the tests. Also added the eclipse project files. Change-Id: I56443773d90594475fc3f14464d48e56d5a1bbb5
Diffstat (limited to 'ninepatch/src/com')
-rw-r--r--ninepatch/src/com/android/ninepatch/GraphicsUtilities.java6
-rw-r--r--ninepatch/src/com/android/ninepatch/NinePatch.java94
2 files changed, 70 insertions, 30 deletions
diff --git a/ninepatch/src/com/android/ninepatch/GraphicsUtilities.java b/ninepatch/src/com/android/ninepatch/GraphicsUtilities.java
index 7a823ec..e8d71d6 100644
--- a/ninepatch/src/com/android/ninepatch/GraphicsUtilities.java
+++ b/ninepatch/src/com/android/ninepatch/GraphicsUtilities.java
@@ -25,6 +25,7 @@ import java.awt.Graphics;
import java.awt.Transparency;
import java.net.URL;
import java.io.IOException;
+import java.io.InputStream;
public class GraphicsUtilities {
public static BufferedImage loadCompatibleImage(URL resource) throws IOException {
@@ -32,6 +33,11 @@ public class GraphicsUtilities {
return toCompatibleImage(image);
}
+ public static BufferedImage loadCompatibleImage(InputStream stream) throws IOException {
+ BufferedImage image = ImageIO.read(stream);
+ return toCompatibleImage(image);
+ }
+
public static BufferedImage createCompatibleImage(int width, int height) {
return getGraphicsConfiguration().createCompatibleImage(width, height);
}
diff --git a/ninepatch/src/com/android/ninepatch/NinePatch.java b/ninepatch/src/com/android/ninepatch/NinePatch.java
index 35a1824..7484fd8 100644
--- a/ninepatch/src/com/android/ninepatch/NinePatch.java
+++ b/ninepatch/src/com/android/ninepatch/NinePatch.java
@@ -21,6 +21,7 @@ import java.awt.Rectangle;
import java.awt.RenderingHints;
import java.awt.image.BufferedImage;
import java.io.IOException;
+import java.io.InputStream;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.ArrayList;
@@ -33,7 +34,7 @@ public class NinePatch {
public static final String EXTENSION_9PATCH = ".9.png";
private BufferedImage mImage;
-
+
private int mMinWidth;
private int mMinHeight;
@@ -50,7 +51,7 @@ public class NinePatch {
private Pair<Integer> mHorizontalPadding;
private Pair<Integer> mVerticalPadding;
-
+
private float mHorizontalPatchesSum;
private float mVerticalPatchesSum;
@@ -58,12 +59,10 @@ public class NinePatch {
private int mRemainderVertical;
- private final URL mFileUrl;
-
/**
* Loads a 9 patch or regular bitmap.
* @param fileUrl the URL of the file to load.
- * @param convert if <code>true</code>, non 9-patch bitmpa will be converted into a 9 patch.
+ * @param convert if <code>true</code>, non 9-patch bitmap will be converted into a 9 patch.
* If <code>false</code> and the bitmap is not a 9 patch, the method will return
* <code>null</code>.
* @return a {@link NinePatch} or <code>null</code>.
@@ -77,9 +76,46 @@ public class NinePatch {
// really this shouldn't be happening since we're not creating the URL manually.
return null;
}
-
+
boolean is9Patch = fileUrl.getPath().toLowerCase().endsWith(EXTENSION_9PATCH);
-
+
+ return load(image, is9Patch, convert);
+ }
+
+ /**
+ * Loads a 9 patch or regular bitmap.
+ * @param stream the {@link InputStream} of the file to load.
+ * @param is9Patch whether the file represents a 9-patch
+ * @param convert if <code>true</code>, non 9-patch bitmap will be converted into a 9 patch.
+ * If <code>false</code> and the bitmap is not a 9 patch, the method will return
+ * <code>null</code>.
+ * @return a {@link NinePatch} or <code>null</code>.
+ * @throws IOException
+ */
+ public static NinePatch load(InputStream stream, boolean is9Patch, boolean convert)
+ throws IOException {
+ BufferedImage image = null;
+ try {
+ image = GraphicsUtilities.loadCompatibleImage(stream);
+ } catch (MalformedURLException e) {
+ // really this shouldn't be happening since we're not creating the URL manually.
+ return null;
+ }
+
+ return load(image, is9Patch, convert);
+ }
+
+ /**
+ * Loads a 9 patch or regular bitmap.
+ * @param image the source {@link BufferedImage}.
+ * @param is9Patch whether the file represents a 9-patch
+ * @param convert if <code>true</code>, non 9-patch bitmap will be converted into a 9 patch.
+ * If <code>false</code> and the bitmap is not a 9 patch, the method will return
+ * <code>null</code>.
+ * @return a {@link NinePatch} or <code>null</code>.
+ * @throws IOException
+ */
+ public static NinePatch load(BufferedImage image, boolean is9Patch, boolean convert) {
if (is9Patch == false) {
if (convert) {
image = convertTo9Patch(image);
@@ -90,10 +126,9 @@ public class NinePatch {
ensure9Patch(image);
}
-
- return new NinePatch(fileUrl, image);
+ return new NinePatch(image);
}
-
+
public int getWidth() {
return mImage.getWidth() - 2;
}
@@ -101,9 +136,9 @@ public class NinePatch {
public int getHeight() {
return mImage.getHeight() - 2;
}
-
+
/**
- *
+ *
* @param padding array of left, top, right, bottom padding
* @return
*/
@@ -124,7 +159,7 @@ public class NinePatch {
Graphics2D g = (Graphics2D)graphics2D.create();
g.setRenderingHint(RenderingHints.KEY_INTERPOLATION,
RenderingHints.VALUE_INTERPOLATION_BILINEAR);
-
+
try {
if (mPatches.size() == 0) {
@@ -134,30 +169,30 @@ public class NinePatch {
g.translate(x, y);
x = y = 0;
-
+
computePatches(scaledWidth, scaledHeight);
-
+
int fixedIndex = 0;
int horizontalIndex = 0;
int verticalIndex = 0;
int patchIndex = 0;
-
+
boolean hStretch;
boolean vStretch;
-
+
float vWeightSum = 1.0f;
float vRemainder = mRemainderVertical;
-
+
vStretch = mVerticalStartWithPatch;
while (y < scaledHeight - 1) {
hStretch = mHorizontalStartWithPatch;
-
+
int height = 0;
float vExtra = 0.0f;
-
+
float hWeightSum = 1.0f;
float hRemainder = mRemainderHorizontal;
-
+
while (x < scaledWidth - 1) {
Rectangle r;
if (!vStretch) {
@@ -197,7 +232,7 @@ public class NinePatch {
r.x + r.width, r.y + r.height, null);
x += r.width;
}
-
+
}
hStretch = !hStretch;
}
@@ -209,12 +244,12 @@ public class NinePatch {
}
vStretch = !vStretch;
}
-
+
} finally {
g.dispose();
}
}
-
+
void computePatches(int scaledWidth, int scaledHeight) {
boolean measuredWidth = false;
boolean endRow = true;
@@ -283,14 +318,13 @@ public class NinePatch {
}
}
-
- private NinePatch(URL fileUrl, BufferedImage image) {
- mFileUrl = fileUrl;
+
+ private NinePatch(BufferedImage image) {
mImage = image;
-
+
findPatches();
}
-
+
private void findPatches() {
int width = mImage.getWidth();
int height = mImage.getHeight();
@@ -462,7 +496,7 @@ public class NinePatch {
return buffer;
}
-
+
static class Pair<E> {
E mFirst;
E mSecond;