1f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin/* 2f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin * Copyright (C) 2010 The Android Open Source Project 3f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin * 4f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin * Licensed under the Apache License, Version 2.0 (the "License"); 5f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin * you may not use this file except in compliance with the License. 6f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin * You may obtain a copy of the License at 7f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin * 8f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin * http://www.apache.org/licenses/LICENSE-2.0 9f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin * 10f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin * Unless required by applicable law or agreed to in writing, software 11f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin * distributed under the License is distributed on an "AS IS" BASIS, 12f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin * See the License for the specific language governing permissions and 14f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin * limitations under the License. 15f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin */ 16f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 17a4eae1abb4f2547dfbda84301ee764ce35464881John Reckpackage com.android.gallery3d.glrenderer; 18f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 19f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Linimport android.graphics.Rect; 20f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 21f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Linimport java.nio.ByteBuffer; 22f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Linimport java.nio.ByteOrder; 23f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 24f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin// See "frameworks/base/include/utils/ResourceTypes.h" for the format of 25f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin// NinePatch chunk. 26f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Linclass NinePatchChunk { 27f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 28f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin public static final int NO_COLOR = 0x00000001; 29f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin public static final int TRANSPARENT_COLOR = 0x00000000; 30f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 31f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin public Rect mPaddings = new Rect(); 32f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 33f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin public int mDivX[]; 34f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin public int mDivY[]; 35f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin public int mColor[]; 36f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 37f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin private static void readIntArray(int[] data, ByteBuffer buffer) { 38f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin for (int i = 0, n = data.length; i < n; ++i) { 39f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin data[i] = buffer.getInt(); 40f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 41f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 42f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 43f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin private static void checkDivCount(int length) { 44f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin if (length == 0 || (length & 0x01) != 0) { 45f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin throw new RuntimeException("invalid nine-patch: " + length); 46f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 47f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 48f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 49f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin public static NinePatchChunk deserialize(byte[] data) { 50f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin ByteBuffer byteBuffer = 51f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin ByteBuffer.wrap(data).order(ByteOrder.nativeOrder()); 52f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 53f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin byte wasSerialized = byteBuffer.get(); 54f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin if (wasSerialized == 0) return null; 55f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 56f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin NinePatchChunk chunk = new NinePatchChunk(); 57f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin chunk.mDivX = new int[byteBuffer.get()]; 58f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin chunk.mDivY = new int[byteBuffer.get()]; 59f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin chunk.mColor = new int[byteBuffer.get()]; 60f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 61f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin checkDivCount(chunk.mDivX.length); 62f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin checkDivCount(chunk.mDivY.length); 63f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 64f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin // skip 8 bytes 65f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin byteBuffer.getInt(); 66f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin byteBuffer.getInt(); 67f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 68f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin chunk.mPaddings.left = byteBuffer.getInt(); 69f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin chunk.mPaddings.right = byteBuffer.getInt(); 70f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin chunk.mPaddings.top = byteBuffer.getInt(); 71f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin chunk.mPaddings.bottom = byteBuffer.getInt(); 72f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 73f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin // skip 4 bytes 74f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin byteBuffer.getInt(); 75f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 76f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin readIntArray(chunk.mDivX, byteBuffer); 77f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin readIntArray(chunk.mDivY, byteBuffer); 78f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin readIntArray(chunk.mColor, byteBuffer); 79f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 80f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin return chunk; 81f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 82f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin}