/*
* Copyright (C) 2014 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.
*/
package com.android.builder.png;
import com.android.annotations.NonNull;
import com.android.annotations.VisibleForTesting;
import java.nio.ByteBuffer;
import java.nio.IntBuffer;
/**
* Builder for the NinePatch chunk.
*/
class NinePatchChunkBuilder {
/**
* Chunk Type for the chunk containing the 9-patch info.
* This is part of the 9-patch 'spec' (if there was one).
*/
private static final byte[] sChunkType = new byte[] { 'n', 'p', 'T', 'c' };
private final int mPaddingLeft;
private final int mPaddingRight;
private final int mPaddingTop;
private final int mPaddingBottom;
@NonNull
private final byte[] mXDivs;
@NonNull
private final byte[] mYDivs;
@NonNull
private final byte [] mColors;
NinePatchChunkBuilder(@NonNull int[] xDivs, int numXDivs, @NonNull int[] yDivs, int numYDivs,
@NonNull int[] colors,
int paddingLeft, int paddingRight, int paddingTop, int paddingBottom) {
// fill the bytes array from the int array
mXDivs = intToByteArray(xDivs, numXDivs);
mYDivs = intToByteArray(yDivs, numYDivs);
mColors = intToByteArray(colors, colors.length);
mPaddingLeft = paddingLeft;
mPaddingRight = paddingRight;
mPaddingTop = paddingTop;
mPaddingBottom = paddingBottom;
}
@VisibleForTesting
@NonNull
static byte[] intToByteArray(@NonNull int[] array, int length) {
byte[] byteArray = new byte[length * 4];
ByteBuffer byteBuffer = ByteBuffer.wrap(byteArray);
IntBuffer intBuffer = byteBuffer.asIntBuffer();
intBuffer.put(array, 0, length);
return byteArray;
}
/**
* Creates and returns a {@link com.android.builder.png.Chunk}
*/
@NonNull
Chunk getChunk() {
int size = computeSize();
ByteBuffer buffer = ByteBuffer.allocate(size);
buffer.put((byte) 0); // was deserialized
buffer.put((byte) (mXDivs.length / 4));
buffer.put((byte) (mYDivs.length / 4));
buffer.put((byte) (mColors.length / 4));
// skip the pointers.
buffer.putInt(0);
buffer.putInt(0);
buffer.putInt(mPaddingLeft);
buffer.putInt(mPaddingRight);
buffer.putInt(mPaddingTop);
buffer.putInt(mPaddingBottom);
// skip more pointers
buffer.putInt(0);
buffer.put(mXDivs);
buffer.put(mYDivs);
buffer.put(mColors);
return new Chunk(sChunkType, buffer.array());
}
private int computeSize() {
// The size of this struct is 32 bytes on the 32-bit target system
// 4 * int8_t
// 4 * int32_t
// 3 * pointer
return 32 + mXDivs.length + mYDivs.length + mColors.length;
}
}