From a06d86ab8177ee9e631e0ee4e39688bf42179bde Mon Sep 17 00:00:00 2001 From: Leon Scroggins Date: Wed, 2 Mar 2011 16:56:54 -0500 Subject: [PATCH] Move NinePatchPeeker into its own file. This way it can be used by other clients that want to draw ninepatches. Ultimately the goal is to allow ninepatch drawing from native code for WebView. Bug:3009375 Change-Id: Id13cef17ed7655a07e9f055586b686cf1e4af392 --- core/jni/Android.mk | 1 + core/jni/android/graphics/BitmapFactory.cpp | 60 +------------------ core/jni/android/graphics/NinePatchPeeker.cpp | 59 ++++++++++++++++++ core/jni/android/graphics/NinePatchPeeker.h | 42 +++++++++++++ 4 files changed, 103 insertions(+), 59 deletions(-) create mode 100644 core/jni/android/graphics/NinePatchPeeker.cpp create mode 100644 core/jni/android/graphics/NinePatchPeeker.h diff --git a/core/jni/Android.mk b/core/jni/Android.mk index 2ed938adc0aa8..8d327b8e2b42a 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 491a3884bf51b..1034fbde5052e 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 0000000000000..365d985ba6322 --- /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 0000000000000..1f37b8b016314 --- /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 + +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); +}; +