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