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