summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--core/jni/Android.mk1
-rw-r--r--core/jni/android/graphics/BitmapFactory.cpp60
-rw-r--r--core/jni/android/graphics/NinePatchPeeker.cpp59
-rw-r--r--core/jni/android/graphics/NinePatchPeeker.h42
4 files changed, 103 insertions, 59 deletions
diff --git a/core/jni/Android.mk b/core/jni/Android.mk
index 2ed938adc0aa..8d327b8e2b42 100644
--- a/core/jni/Android.mk
+++ b/core/jni/Android.mk
@@ -99,6 +99,7 @@ LOCAL_SRC_FILES:= \
android/graphics/Movie.cpp \
android/graphics/NinePatch.cpp \
android/graphics/NinePatchImpl.cpp \
+ android/graphics/NinePatchPeeker.cpp \
android/graphics/Paint.cpp \
android/graphics/Path.cpp \
android/graphics/PathMeasure.cpp \
diff --git a/core/jni/android/graphics/BitmapFactory.cpp b/core/jni/android/graphics/BitmapFactory.cpp
index 491a3884bf51..1034fbde5052 100644
--- a/core/jni/android/graphics/BitmapFactory.cpp
+++ b/core/jni/android/graphics/BitmapFactory.cpp
@@ -1,6 +1,7 @@
#define LOG_TAG "BitmapFactory"
#include "BitmapFactory.h"
+#include "NinePatchPeeker.h"
#include "SkImageDecoder.h"
#include "SkImageRef_ashmem.h"
#include "SkImageRef_GlobalPool.h"
@@ -47,65 +48,6 @@ static jfieldID gFileDescriptor_descriptor;
using namespace android;
-class NinePatchPeeker : public SkImageDecoder::Peeker {
- SkImageDecoder* fHost;
-public:
- NinePatchPeeker(SkImageDecoder* host) {
- // the host lives longer than we do, so a raw ptr is safe
- fHost = host;
- fPatchIsValid = false;
- }
-
- ~NinePatchPeeker() {
- if (fPatchIsValid) {
- free(fPatch);
- }
- }
-
- bool fPatchIsValid;
- Res_png_9patch* fPatch;
-
- virtual bool peek(const char tag[], const void* data, size_t length) {
- if (strcmp("npTc", tag) == 0 && length >= sizeof(Res_png_9patch)) {
- Res_png_9patch* patch = (Res_png_9patch*) data;
- size_t patchSize = patch->serializedSize();
- assert(length == patchSize);
- // You have to copy the data because it is owned by the png reader
- Res_png_9patch* patchNew = (Res_png_9patch*) malloc(patchSize);
- memcpy(patchNew, patch, patchSize);
- // this relies on deserialization being done in place
- Res_png_9patch::deserialize(patchNew);
- patchNew->fileToDevice();
- if (fPatchIsValid) {
- free(fPatch);
- }
- fPatch = patchNew;
- //printf("9patch: (%d,%d)-(%d,%d)\n",
- // fPatch.sizeLeft, fPatch.sizeTop,
- // fPatch.sizeRight, fPatch.sizeBottom);
- fPatchIsValid = true;
-
- // now update our host to force index or 32bit config
- // 'cause we don't want 565 predithered, since as a 9patch, we know
- // we will be stretched, and therefore we want to dither afterwards.
- static const SkBitmap::Config gNo565Pref[] = {
- SkBitmap::kIndex8_Config,
- SkBitmap::kIndex8_Config,
- SkBitmap::kARGB_8888_Config,
- SkBitmap::kARGB_8888_Config,
- SkBitmap::kARGB_8888_Config,
- SkBitmap::kARGB_8888_Config,
- };
- fHost->setPrefConfigTable(gNo565Pref);
- } else {
- fPatch = NULL;
- }
- return true; // keep on decoding
- }
-};
-
-///////////////////////////////////////////////////////////////////////////////
-
static inline int32_t validOrNeg1(bool isValid, int32_t value) {
// return isValid ? value : -1;
SkASSERT((int)isValid == 0 || (int)isValid == 1);
diff --git a/core/jni/android/graphics/NinePatchPeeker.cpp b/core/jni/android/graphics/NinePatchPeeker.cpp
new file mode 100644
index 000000000000..365d985ba632
--- /dev/null
+++ b/core/jni/android/graphics/NinePatchPeeker.cpp
@@ -0,0 +1,59 @@
+/*
+ * 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.
+ */
+
+#include "NinePatchPeeker.h"
+
+#include "SkBitmap.h"
+
+using namespace android;
+
+bool NinePatchPeeker::peek(const char tag[], const void* data, size_t length) {
+ if (strcmp("npTc", tag) == 0 && length >= sizeof(Res_png_9patch)) {
+ Res_png_9patch* patch = (Res_png_9patch*) data;
+ size_t patchSize = patch->serializedSize();
+ assert(length == patchSize);
+ // You have to copy the data because it is owned by the png reader
+ Res_png_9patch* patchNew = (Res_png_9patch*) malloc(patchSize);
+ memcpy(patchNew, patch, patchSize);
+ // this relies on deserialization being done in place
+ Res_png_9patch::deserialize(patchNew);
+ patchNew->fileToDevice();
+ if (fPatchIsValid) {
+ free(fPatch);
+ }
+ fPatch = patchNew;
+ //printf("9patch: (%d,%d)-(%d,%d)\n",
+ // fPatch.sizeLeft, fPatch.sizeTop,
+ // fPatch.sizeRight, fPatch.sizeBottom);
+ fPatchIsValid = true;
+
+ // now update our host to force index or 32bit config
+ // 'cause we don't want 565 predithered, since as a 9patch, we know
+ // we will be stretched, and therefore we want to dither afterwards.
+ static const SkBitmap::Config gNo565Pref[] = {
+ SkBitmap::kIndex8_Config,
+ SkBitmap::kIndex8_Config,
+ SkBitmap::kARGB_8888_Config,
+ SkBitmap::kARGB_8888_Config,
+ SkBitmap::kARGB_8888_Config,
+ SkBitmap::kARGB_8888_Config,
+ };
+ fHost->setPrefConfigTable(gNo565Pref);
+ } else {
+ fPatch = NULL;
+ }
+ return true; // keep on decoding
+}
diff --git a/core/jni/android/graphics/NinePatchPeeker.h b/core/jni/android/graphics/NinePatchPeeker.h
new file mode 100644
index 000000000000..1f37b8b01631
--- /dev/null
+++ b/core/jni/android/graphics/NinePatchPeeker.h
@@ -0,0 +1,42 @@
+/*
+ * 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.
+ */
+
+#include "SkImageDecoder.h"
+#include <utils/ResourceTypes.h>
+
+using namespace android;
+
+class NinePatchPeeker : public SkImageDecoder::Peeker {
+ SkImageDecoder* fHost;
+public:
+ NinePatchPeeker(SkImageDecoder* host) {
+ // the host lives longer than we do, so a raw ptr is safe
+ fHost = host;
+ fPatchIsValid = false;
+ }
+
+ ~NinePatchPeeker() {
+ if (fPatchIsValid) {
+ free(fPatch);
+ }
+ }
+
+ bool fPatchIsValid;
+ Res_png_9patch* fPatch;
+
+ virtual bool peek(const char tag[], const void* data, size_t length);
+};
+