SkWriter32.h revision 306ab9d5de38f2a547fd1d69aedbe69b5c6617cc
1ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com 28a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com/* 3ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com * Copyright 2008 The Android Open Source Project 48a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com * 5ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com * Use of this source code is governed by a BSD-style license that can be 6ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com * found in the LICENSE file. 78a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com */ 88a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 9ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com 108a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#ifndef SkWriter32_DEFINED 118a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#define SkWriter32_DEFINED 128a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 138a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#include "SkTypes.h" 148a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 158a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#include "SkScalar.h" 1694e75ee46a569cbcdf61fb7f04ee3a69d3ca0896djsollen@google.com#include "SkPath.h" 178a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#include "SkPoint.h" 188a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#include "SkRect.h" 194ed0fb768409bf97b79899c3990d8c15f5e9d784reed@google.com#include "SkRRect.h" 202b2ede3e713065e1bac461787b0aafb03eaf871fdjsollen@google.com#include "SkMatrix.h" 212b2ede3e713065e1bac461787b0aafb03eaf871fdjsollen@google.com#include "SkRegion.h" 228a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 238a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comclass SkStream; 248a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comclass SkWStream; 258a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 268a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comclass SkWriter32 : SkNoncopyable { 278a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.compublic: 28e49aca968ca27d90ca919a972a86839ecaf1224areed@google.com /** 29e49aca968ca27d90ca919a972a86839ecaf1224areed@google.com * The caller can specify an initial block of storage, which the caller manages. 30e49aca968ca27d90ca919a972a86839ecaf1224areed@google.com * SkWriter32 will not attempt to free this in its destructor. It is up to the 31e49aca968ca27d90ca919a972a86839ecaf1224areed@google.com * implementation to decide if, and how much, of the storage to utilize, and it 32e49aca968ca27d90ca919a972a86839ecaf1224areed@google.com * is possible that it may be ignored entirely. 33e49aca968ca27d90ca919a972a86839ecaf1224areed@google.com */ 34e49aca968ca27d90ca919a972a86839ecaf1224areed@google.com SkWriter32(size_t minSize, void* initialStorage, size_t storageSize); 35e49aca968ca27d90ca919a972a86839ecaf1224areed@google.com 36e1bc274295ec57cb3d3f01aaa8abff3b49c76c73vandebo@chromium.org SkWriter32(size_t minSize) 37e1bc274295ec57cb3d3f01aaa8abff3b49c76c73vandebo@chromium.org : fMinSize(minSize), 38e1bc274295ec57cb3d3f01aaa8abff3b49c76c73vandebo@chromium.org fSize(0), 39e1bc274295ec57cb3d3f01aaa8abff3b49c76c73vandebo@chromium.org fSingleBlock(NULL), 40e1bc274295ec57cb3d3f01aaa8abff3b49c76c73vandebo@chromium.org fSingleBlockSize(0), 41f56225c848cb0cd0fde4cb37558174ae096b93d1reed@google.com fWrittenBeforeLastBlock(0), 42e1bc274295ec57cb3d3f01aaa8abff3b49c76c73vandebo@chromium.org fHead(NULL), 43e49aca968ca27d90ca919a972a86839ecaf1224areed@google.com fTail(NULL), 44e49aca968ca27d90ca919a972a86839ecaf1224areed@google.com fHeadIsExternalStorage(false) {} 45e49aca968ca27d90ca919a972a86839ecaf1224areed@google.com 468a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com ~SkWriter32(); 478a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 48acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com /** 49acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com * Returns the single block backing the writer, or NULL if the memory is 50acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com * to be dynamically allocated. 51acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com */ 52acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com void* getSingleBlock() const { return fSingleBlock; } 53acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com 541cf58d03a87e1ff17cd47e9de3da4c678456618dreed@google.com // return the current offset (will always be a multiple of 4) 551cf58d03a87e1ff17cd47e9de3da4c678456618dreed@google.com uint32_t bytesWritten() const { return fSize; } 561cf58d03a87e1ff17cd47e9de3da4c678456618dreed@google.com // DEPRECATED: use byetsWritten instead 571cf58d03a87e1ff17cd47e9de3da4c678456618dreed@google.com uint32_t size() const { return this->bytesWritten(); } 581cf58d03a87e1ff17cd47e9de3da4c678456618dreed@google.com 591cf58d03a87e1ff17cd47e9de3da4c678456618dreed@google.com void reset(); 601cf58d03a87e1ff17cd47e9de3da4c678456618dreed@google.com uint32_t* reserve(size_t size); // size MUST be multiple of 4 61a27096b4740775ae141fd0abaf456d706065c5eeskia.committer@gmail.com 62acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com /** 63acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com * Specify the single block to back the writer, rathern than dynamically 64acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com * allocating the memory. If block == NULL, then the writer reverts to 65acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com * dynamic allocation (and resets). 66acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com */ 67acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com void reset(void* block, size_t size); 68e49aca968ca27d90ca919a972a86839ecaf1224areed@google.com 698a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com bool writeBool(bool value) { 708a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com this->writeInt(value); 718a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com return value; 728a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com } 73fbfcd5602128ec010c82cb733c9cdc0a3254f9f3rmistry@google.com 748a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com void writeInt(int32_t value) { 758a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com *(int32_t*)this->reserve(sizeof(value)) = value; 768a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com } 77fbfcd5602128ec010c82cb733c9cdc0a3254f9f3rmistry@google.com 788a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com void write8(int32_t value) { 798a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com *(int32_t*)this->reserve(sizeof(value)) = value & 0xFF; 808a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com } 81fbfcd5602128ec010c82cb733c9cdc0a3254f9f3rmistry@google.com 828a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com void write16(int32_t value) { 838a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com *(int32_t*)this->reserve(sizeof(value)) = value & 0xFFFF; 848a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com } 85fbfcd5602128ec010c82cb733c9cdc0a3254f9f3rmistry@google.com 868a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com void write32(int32_t value) { 878a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com *(int32_t*)this->reserve(sizeof(value)) = value; 888a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com } 89fbfcd5602128ec010c82cb733c9cdc0a3254f9f3rmistry@google.com 9051c62a6cfadc302bb65bb5a98e358c93223dc73freed@google.com void writePtr(void* ptr) { 9151c62a6cfadc302bb65bb5a98e358c93223dc73freed@google.com // Since we "know" that we're always 4-byte aligned, we can tell the 9251c62a6cfadc302bb65bb5a98e358c93223dc73freed@google.com // compiler that here, by assigning to an int32 ptr. 9351c62a6cfadc302bb65bb5a98e358c93223dc73freed@google.com int32_t* addr = (int32_t*)this->reserve(sizeof(void*)); 9451c62a6cfadc302bb65bb5a98e358c93223dc73freed@google.com if (4 == sizeof(void*)) { 9551c62a6cfadc302bb65bb5a98e358c93223dc73freed@google.com *(void**)addr = ptr; 9651c62a6cfadc302bb65bb5a98e358c93223dc73freed@google.com } else { 9751c62a6cfadc302bb65bb5a98e358c93223dc73freed@google.com memcpy(addr, &ptr, sizeof(void*)); 9851c62a6cfadc302bb65bb5a98e358c93223dc73freed@google.com } 9951c62a6cfadc302bb65bb5a98e358c93223dc73freed@google.com } 10051c62a6cfadc302bb65bb5a98e358c93223dc73freed@google.com 1018a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com void writeScalar(SkScalar value) { 1028a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com *(SkScalar*)this->reserve(sizeof(value)) = value; 1038a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com } 104fbfcd5602128ec010c82cb733c9cdc0a3254f9f3rmistry@google.com 1058a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com void writePoint(const SkPoint& pt) { 1068a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com *(SkPoint*)this->reserve(sizeof(pt)) = pt; 1078a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com } 108fbfcd5602128ec010c82cb733c9cdc0a3254f9f3rmistry@google.com 1098a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com void writeRect(const SkRect& rect) { 1108a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com *(SkRect*)this->reserve(sizeof(rect)) = rect; 1118a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com } 112306ab9d5de38f2a547fd1d69aedbe69b5c6617ccskia.committer@gmail.com 1134ed0fb768409bf97b79899c3990d8c15f5e9d784reed@google.com void writeRRect(const SkRRect& rrect) { 1144ed0fb768409bf97b79899c3990d8c15f5e9d784reed@google.com rrect.writeToMemory(this->reserve(SkRRect::kSizeInMemory)); 1154ed0fb768409bf97b79899c3990d8c15f5e9d784reed@google.com } 116306ab9d5de38f2a547fd1d69aedbe69b5c6617ccskia.committer@gmail.com 11794e75ee46a569cbcdf61fb7f04ee3a69d3ca0896djsollen@google.com void writePath(const SkPath& path) { 11894e75ee46a569cbcdf61fb7f04ee3a69d3ca0896djsollen@google.com size_t size = path.writeToMemory(NULL); 11994e75ee46a569cbcdf61fb7f04ee3a69d3ca0896djsollen@google.com SkASSERT(SkAlign4(size) == size); 12094e75ee46a569cbcdf61fb7f04ee3a69d3ca0896djsollen@google.com path.writeToMemory(this->reserve(size)); 12194e75ee46a569cbcdf61fb7f04ee3a69d3ca0896djsollen@google.com } 12294e75ee46a569cbcdf61fb7f04ee3a69d3ca0896djsollen@google.com 1232b2ede3e713065e1bac461787b0aafb03eaf871fdjsollen@google.com void writeMatrix(const SkMatrix& matrix) { 12494e75ee46a569cbcdf61fb7f04ee3a69d3ca0896djsollen@google.com size_t size = matrix.writeToMemory(NULL); 1252b2ede3e713065e1bac461787b0aafb03eaf871fdjsollen@google.com SkASSERT(SkAlign4(size) == size); 12694e75ee46a569cbcdf61fb7f04ee3a69d3ca0896djsollen@google.com matrix.writeToMemory(this->reserve(size)); 1272b2ede3e713065e1bac461787b0aafb03eaf871fdjsollen@google.com } 128fbfcd5602128ec010c82cb733c9cdc0a3254f9f3rmistry@google.com 1292b2ede3e713065e1bac461787b0aafb03eaf871fdjsollen@google.com void writeRegion(const SkRegion& rgn) { 13094e75ee46a569cbcdf61fb7f04ee3a69d3ca0896djsollen@google.com size_t size = rgn.writeToMemory(NULL); 1312b2ede3e713065e1bac461787b0aafb03eaf871fdjsollen@google.com SkASSERT(SkAlign4(size) == size); 13294e75ee46a569cbcdf61fb7f04ee3a69d3ca0896djsollen@google.com rgn.writeToMemory(this->reserve(size)); 1332b2ede3e713065e1bac461787b0aafb03eaf871fdjsollen@google.com } 1342b2ede3e713065e1bac461787b0aafb03eaf871fdjsollen@google.com 1358a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com // write count bytes (must be a multiple of 4) 1368a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com void writeMul4(const void* values, size_t size) { 1375b3d5349bedf37ec6fcf03bac04cf33129fc176areed@google.com this->write(values, size); 1385b3d5349bedf37ec6fcf03bac04cf33129fc176areed@google.com } 1395b3d5349bedf37ec6fcf03bac04cf33129fc176areed@google.com 1405b3d5349bedf37ec6fcf03bac04cf33129fc176areed@google.com /** 1415b3d5349bedf37ec6fcf03bac04cf33129fc176areed@google.com * Write size bytes from values. size must be a multiple of 4, though 1425b3d5349bedf37ec6fcf03bac04cf33129fc176areed@google.com * values need not be 4-byte aligned. 1435b3d5349bedf37ec6fcf03bac04cf33129fc176areed@google.com */ 1445b3d5349bedf37ec6fcf03bac04cf33129fc176areed@google.com void write(const void* values, size_t size) { 1458a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com SkASSERT(SkAlign4(size) == size); 1468a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com // if we could query how much is avail in the current block, we might 1478a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com // copy that much, and then alloc the rest. That would reduce the waste 1488a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com // in the current block 1498a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com memcpy(this->reserve(size), values, size); 1508a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com } 151fbfcd5602128ec010c82cb733c9cdc0a3254f9f3rmistry@google.com 1525a7c6be72b940dde8ff6ad2485a09aecd56a2660scroggo@google.com /** 1535a7c6be72b940dde8ff6ad2485a09aecd56a2660scroggo@google.com * Reserve size bytes. Does not need to be 4 byte aligned. The remaining space (if any) will be 1545a7c6be72b940dde8ff6ad2485a09aecd56a2660scroggo@google.com * filled in with zeroes. 1555a7c6be72b940dde8ff6ad2485a09aecd56a2660scroggo@google.com */ 1565a7c6be72b940dde8ff6ad2485a09aecd56a2660scroggo@google.com uint32_t* reservePad(size_t size); 1575a7c6be72b940dde8ff6ad2485a09aecd56a2660scroggo@google.com 1585a7c6be72b940dde8ff6ad2485a09aecd56a2660scroggo@google.com /** 1595a7c6be72b940dde8ff6ad2485a09aecd56a2660scroggo@google.com * Write size bytes from src, and pad to 4 byte alignment with zeroes. 1605a7c6be72b940dde8ff6ad2485a09aecd56a2660scroggo@google.com */ 1618a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com void writePad(const void* src, size_t size); 162dde0956375e87027df2fdd80d430dd819c217aacreed@google.com 163dde0956375e87027df2fdd80d430dd819c217aacreed@google.com /** 164dde0956375e87027df2fdd80d430dd819c217aacreed@google.com * Writes a string to the writer, which can be retrieved with 165dde0956375e87027df2fdd80d430dd819c217aacreed@google.com * SkReader32::readString(). 166dde0956375e87027df2fdd80d430dd819c217aacreed@google.com * The length can be specified, or if -1 is passed, it will be computed by 167dde0956375e87027df2fdd80d430dd819c217aacreed@google.com * calling strlen(). The length must be < 0xFFFF 168dde0956375e87027df2fdd80d430dd819c217aacreed@google.com */ 169dde0956375e87027df2fdd80d430dd819c217aacreed@google.com void writeString(const char* str, size_t len = (size_t)-1); 170dde0956375e87027df2fdd80d430dd819c217aacreed@google.com 171dde0956375e87027df2fdd80d430dd819c217aacreed@google.com /** 172dde0956375e87027df2fdd80d430dd819c217aacreed@google.com * Computes the size (aligned to multiple of 4) need to write the string 173dde0956375e87027df2fdd80d430dd819c217aacreed@google.com * in a call to writeString(). If the length is not specified, it will be 174dde0956375e87027df2fdd80d430dd819c217aacreed@google.com * computed by calling strlen(). 175dde0956375e87027df2fdd80d430dd819c217aacreed@google.com */ 176dde0956375e87027df2fdd80d430dd819c217aacreed@google.com static size_t WriteStringSize(const char* str, size_t len = (size_t)-1); 177dde0956375e87027df2fdd80d430dd819c217aacreed@google.com 1788a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com // return the address of the 4byte int at the specified offset (which must 1798a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com // be a multiple of 4. This does not allocate any new space, so the returned 1808a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com // address is only valid for 1 int. 1818a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com uint32_t* peek32(size_t offset); 182fbfcd5602128ec010c82cb733c9cdc0a3254f9f3rmistry@google.com 1831cf58d03a87e1ff17cd47e9de3da4c678456618dreed@google.com /** 1841cf58d03a87e1ff17cd47e9de3da4c678456618dreed@google.com * Move the cursor back to offset bytes from the beginning. 1851cf58d03a87e1ff17cd47e9de3da4c678456618dreed@google.com * This has the same restrictions as peek32: offset must be <= size() and 1861cf58d03a87e1ff17cd47e9de3da4c678456618dreed@google.com * offset must be a multiple of 4. 1871cf58d03a87e1ff17cd47e9de3da4c678456618dreed@google.com */ 1881cf58d03a87e1ff17cd47e9de3da4c678456618dreed@google.com void rewindToOffset(size_t offset); 1891cf58d03a87e1ff17cd47e9de3da4c678456618dreed@google.com 1908a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com // copy into a single buffer (allocated by caller). Must be at least size() 1918a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com void flatten(void* dst) const; 192fbfcd5602128ec010c82cb733c9cdc0a3254f9f3rmistry@google.com 1938a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com // read from the stream, and write up to length bytes. Return the actual 1948a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com // number of bytes written. 1958a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com size_t readFromStream(SkStream*, size_t length); 196fbfcd5602128ec010c82cb733c9cdc0a3254f9f3rmistry@google.com 1978a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com bool writeToStream(SkWStream*); 1988a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 1998a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comprivate: 2008a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com size_t fMinSize; 2018a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com uint32_t fSize; 202acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com 203acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com char* fSingleBlock; 204acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com uint32_t fSingleBlockSize; 205e49aca968ca27d90ca919a972a86839ecaf1224areed@google.com 206f56225c848cb0cd0fde4cb37558174ae096b93d1reed@google.com // sum of bytes written in all blocks *before* fTail 207f56225c848cb0cd0fde4cb37558174ae096b93d1reed@google.com uint32_t fWrittenBeforeLastBlock; 208f56225c848cb0cd0fde4cb37558174ae096b93d1reed@google.com 2098a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com struct Block; 2108a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com Block* fHead; 2118a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com Block* fTail; 212acd471f47ccfb97cf2f2f00dc01cd1fd45bc1ef2reed@google.com 213e49aca968ca27d90ca919a972a86839ecaf1224areed@google.com bool fHeadIsExternalStorage; 214e49aca968ca27d90ca919a972a86839ecaf1224areed@google.com 2158a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com Block* newBlock(size_t bytes); 2161cf58d03a87e1ff17cd47e9de3da4c678456618dreed@google.com 2171cf58d03a87e1ff17cd47e9de3da4c678456618dreed@google.com SkDEBUGCODE(void validate() const;) 2188a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com}; 2198a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 22051c62a6cfadc302bb65bb5a98e358c93223dc73freed@google.com/** 22151c62a6cfadc302bb65bb5a98e358c93223dc73freed@google.com * Helper class to allocated SIZE bytes as part of the writer, and to provide 22251c62a6cfadc302bb65bb5a98e358c93223dc73freed@google.com * that storage to the constructor as its initial storage buffer. 22351c62a6cfadc302bb65bb5a98e358c93223dc73freed@google.com * 22451c62a6cfadc302bb65bb5a98e358c93223dc73freed@google.com * This wrapper ensures proper alignment rules are met for the storage. 22551c62a6cfadc302bb65bb5a98e358c93223dc73freed@google.com */ 22651c62a6cfadc302bb65bb5a98e358c93223dc73freed@google.comtemplate <size_t SIZE> class SkSWriter32 : public SkWriter32 { 22751c62a6cfadc302bb65bb5a98e358c93223dc73freed@google.compublic: 22851c62a6cfadc302bb65bb5a98e358c93223dc73freed@google.com SkSWriter32(size_t minSize) : SkWriter32(minSize, fData.fStorage, SIZE) {} 229fbfcd5602128ec010c82cb733c9cdc0a3254f9f3rmistry@google.com 23051c62a6cfadc302bb65bb5a98e358c93223dc73freed@google.comprivate: 23151c62a6cfadc302bb65bb5a98e358c93223dc73freed@google.com union { 23251c62a6cfadc302bb65bb5a98e358c93223dc73freed@google.com void* fPtrAlignment; 23351c62a6cfadc302bb65bb5a98e358c93223dc73freed@google.com double fDoubleAlignment; 23451c62a6cfadc302bb65bb5a98e358c93223dc73freed@google.com char fStorage[SIZE]; 23551c62a6cfadc302bb65bb5a98e358c93223dc73freed@google.com } fData; 23651c62a6cfadc302bb65bb5a98e358c93223dc73freed@google.com}; 23751c62a6cfadc302bb65bb5a98e358c93223dc73freed@google.com 2388a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#endif 239