diff options
author | Narayan Kamath <narayan@google.com> | 2014-03-03 17:12:03 +0000 |
---|---|---|
committer | Narayan Kamath <narayan@google.com> | 2014-03-10 10:00:02 +0000 |
commit | 6381dd4ff212a95be30d2b445d40ff419ab076b4 (patch) | |
tree | ea96f7e229cafae41f7be46a3cf0345edd2dc869 /include | |
parent | 3fc3b9fd1bf71351bf1ff2d49d6e10b6acabf068 (diff) | |
download | frameworks_base-6381dd4ff212a95be30d2b445d40ff419ab076b4.zip frameworks_base-6381dd4ff212a95be30d2b445d40ff419ab076b4.tar.gz frameworks_base-6381dd4ff212a95be30d2b445d40ff419ab076b4.tar.bz2 |
LP64: Make 9 patches architecture agnostic.
The Res_png_9patch struct had several pointer members
whose size differed between 32 and 64 bit platforms.
These members have been replaced by uint32_t offsets
to serialized data. The serialized form for 9patches
places a Res_png_9patch object at the beginning of
serialized data, followed by int32_t arrays of xDivs,
yDivs and colors.
Note that these offsets are not strictly required,
since they can be computed from the values of numXDivs,
numYDivs & numColors, however they are called in tight
loops so having them computed once is a beneficial.
This change also removed the unused patch_equals function
from aapt's Image.cpp.
Change-Id: I3b9ac8ae5c05510d41377cae4dff1c69b40c2531
Diffstat (limited to 'include')
-rw-r--r-- | include/androidfw/ResourceTypes.h | 69 |
1 files changed, 44 insertions, 25 deletions
diff --git a/include/androidfw/ResourceTypes.h b/include/androidfw/ResourceTypes.h index a0bae12..b334aab 100644 --- a/include/androidfw/ResourceTypes.h +++ b/include/androidfw/ResourceTypes.h @@ -79,7 +79,7 @@ namespace android { * two stretchable slices is exactly the ratio of their corresponding * segment lengths. * - * xDivs and yDivs point to arrays of horizontal and vertical pixel + * xDivs and yDivs are arrays of horizontal and vertical pixel * indices. The first pair of Divs (in either array) indicate the * starting and ending points of the first stretchable segment in that * axis. The next pair specifies the next stretchable segment, etc. So @@ -92,32 +92,31 @@ namespace android { * go to xDiv[0] and slices 2, 6 and 10 start at xDiv[1] and end at * xDiv[2]. * - * The array pointed to by the colors field lists contains hints for - * each of the regions. They are ordered according left-to-right and - * top-to-bottom as indicated above. For each segment that is a solid - * color the array entry will contain that color value; otherwise it - * will contain NO_COLOR. Segments that are completely transparent - * will always have the value TRANSPARENT_COLOR. + * The colors array contains hints for each of the regions. They are + * ordered according left-to-right and top-to-bottom as indicated above. + * For each segment that is a solid color the array entry will contain + * that color value; otherwise it will contain NO_COLOR. Segments that + * are completely transparent will always have the value TRANSPARENT_COLOR. * * The PNG chunk type is "npTc". */ struct Res_png_9patch { - Res_png_9patch() : wasDeserialized(false), xDivs(NULL), - yDivs(NULL), colors(NULL) { } + Res_png_9patch() : wasDeserialized(false), xDivsOffset(0), + yDivsOffset(0), colorsOffset(0) { } int8_t wasDeserialized; int8_t numXDivs; int8_t numYDivs; int8_t numColors; - // These tell where the next section of a patch starts. - // For example, the first patch includes the pixels from - // 0 to xDivs[0]-1 and the second patch includes the pixels - // from xDivs[0] to xDivs[1]-1. - // Note: allocation/free of these pointers is left to the caller. - int32_t* xDivs; - int32_t* yDivs; + // The offset (from the start of this structure) to the xDivs & yDivs + // array for this 9patch. To get a pointer to this array, call + // getXDivs or getYDivs. Note that the serialized form for 9patches places + // the xDivs, yDivs and colors arrays immediately after the location + // of the Res_png_9patch struct. + uint32_t xDivsOffset; + uint32_t yDivsOffset; int32_t paddingLeft, paddingRight; int32_t paddingTop, paddingBottom; @@ -129,22 +128,42 @@ struct Res_png_9patch // The 9 patch segment is completely transparent. TRANSPARENT_COLOR = 0x00000000 }; - // Note: allocation/free of this pointer is left to the caller. - uint32_t* colors; + + // The offset (from the start of this structure) to the colors array + // for this 9patch. + uint32_t colorsOffset; // Convert data from device representation to PNG file representation. void deviceToFile(); // Convert data from PNG file representation to device representation. void fileToDevice(); - // Serialize/Marshall the patch data into a newly malloc-ed block - void* serialize(); - // Serialize/Marshall the patch data - void serialize(void* outData); + + // Serialize/Marshall the patch data into a newly malloc-ed block. + static void* serialize(const Res_png_9patch& patchHeader, const int32_t* xDivs, + const int32_t* yDivs, const uint32_t* colors); + // Serialize/Marshall the patch data into |outData|. + static void serialize(const Res_png_9patch& patchHeader, const int32_t* xDivs, + const int32_t* yDivs, const uint32_t* colors, void* outData); // Deserialize/Unmarshall the patch data - static Res_png_9patch* deserialize(const void* data); + static Res_png_9patch* deserialize(void* data); // Compute the size of the serialized data structure - size_t serializedSize(); -}; + size_t serializedSize() const; + + // These tell where the next section of a patch starts. + // For example, the first patch includes the pixels from + // 0 to xDivs[0]-1 and the second patch includes the pixels + // from xDivs[0] to xDivs[1]-1. + inline int32_t* getXDivs() const { + return reinterpret_cast<int32_t*>(reinterpret_cast<uintptr_t>(this) + xDivsOffset); + } + inline int32_t* getYDivs() const { + return reinterpret_cast<int32_t*>(reinterpret_cast<uintptr_t>(this) + yDivsOffset); + } + inline uint32_t* getColors() const { + return reinterpret_cast<uint32_t*>(reinterpret_cast<uintptr_t>(this) + colorsOffset); + } + +} __attribute__((packed)); /** ******************************************************************** * Base Types |