summaryrefslogtreecommitdiffstats
path: root/core/jni/android/graphics
diff options
context:
space:
mode:
authorJean-Baptiste Queru <jbq@google.com>2011-05-12 10:02:57 -0700
committerJean-Baptiste Queru <jbq@google.com>2011-05-12 14:22:43 -0700
commit9faa34e6032e2d8759ae1ece72e78acda1730668 (patch)
treef4f25418868f74f906c1dd1b42e7c928cf90a5ec /core/jni/android/graphics
parent4770c79c340c2fb5b6b58c0a1ccf8aac96138ef6 (diff)
downloadframeworks_base-9faa34e6032e2d8759ae1ece72e78acda1730668.zip
frameworks_base-9faa34e6032e2d8759ae1ece72e78acda1730668.tar.gz
frameworks_base-9faa34e6032e2d8759ae1ece72e78acda1730668.tar.bz2
Ninepatch tweaks for better interop
Change-Id: I96781e2b27fcd6dd05d9726829e8e79ff365cbdc
Diffstat (limited to 'core/jni/android/graphics')
-rw-r--r--core/jni/android/graphics/NinePatchPeeker.cpp59
-rw-r--r--core/jni/android/graphics/NinePatchPeeker.h46
2 files changed, 105 insertions, 0 deletions
diff --git a/core/jni/android/graphics/NinePatchPeeker.cpp b/core/jni/android/graphics/NinePatchPeeker.cpp
new file mode 100644
index 0000000..365d985
--- /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 0000000..8567e23
--- /dev/null
+++ b/core/jni/android/graphics/NinePatchPeeker.h
@@ -0,0 +1,46 @@
+/*
+ * 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.
+ */
+
+#ifndef NinePatchPeeker_h
+#define NinePatchPeeker_h
+
+#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);
+};
+
+#endif // NinePatchPeeker_h