am 6714e677
: Merge "Ninepatch tweaks for better interop"
* commit '6714e6774063aae7a8a7a80c36c89ec60170cb27': Ninepatch tweaks for better interop
This commit is contained in:
committed by
Android Git Automerger
commit
a84d29cb04
@ -96,6 +96,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 \
|
||||
|
59
core/jni/android/graphics/NinePatchPeeker.cpp
Normal file
59
core/jni/android/graphics/NinePatchPeeker.cpp
Normal file
@ -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
|
||||
}
|
46
core/jni/android/graphics/NinePatchPeeker.h
Normal file
46
core/jni/android/graphics/NinePatchPeeker.h
Normal file
@ -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
|
Reference in New Issue
Block a user