13a31ac1cf5d7d37da5a77ce18c43a62bf0781154reed@google.com
2ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com/*
3ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com * Copyright 2011 Google Inc.
4ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.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.
73a31ac1cf5d7d37da5a77ce18c43a62bf0781154reed@google.com */
83a31ac1cf5d7d37da5a77ce18c43a62bf0781154reed@google.com
93a31ac1cf5d7d37da5a77ce18c43a62bf0781154reed@google.com
10ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com
113a31ac1cf5d7d37da5a77ce18c43a62bf0781154reed@google.com#ifndef SkData_DEFINED
123a31ac1cf5d7d37da5a77ce18c43a62bf0781154reed@google.com#define SkData_DEFINED
133a31ac1cf5d7d37da5a77ce18c43a62bf0781154reed@google.com
14da30055b296faa5a100e474e0406ef4296c14241reed@google.com#include "SkRefCnt.h"
153a31ac1cf5d7d37da5a77ce18c43a62bf0781154reed@google.com
169711e446676e6bf84b3fff916fd1d7537933a110commit-bot@chromium.orgstruct SkFILE;
179711e446676e6bf84b3fff916fd1d7537933a110commit-bot@chromium.org
183a31ac1cf5d7d37da5a77ce18c43a62bf0781154reed@google.com/**
193a31ac1cf5d7d37da5a77ce18c43a62bf0781154reed@google.com *  SkData holds an immutable data buffer. Not only is the data immutable,
203a31ac1cf5d7d37da5a77ce18c43a62bf0781154reed@google.com *  but the actual ptr that is returned (by data() or bytes()) is guaranteed
213a31ac1cf5d7d37da5a77ce18c43a62bf0781154reed@google.com *  to always be the same for the life of this instance.
223a31ac1cf5d7d37da5a77ce18c43a62bf0781154reed@google.com */
23da30055b296faa5a100e474e0406ef4296c14241reed@google.comclass SK_API SkData : public SkRefCnt {
243a31ac1cf5d7d37da5a77ce18c43a62bf0781154reed@google.compublic:
2515e9d3e66e161ce23df30bc13f8a0c87d196b463robertphillips@google.com    SK_DECLARE_INST_COUNT(SkData)
2615e9d3e66e161ce23df30bc13f8a0c87d196b463robertphillips@google.com
273a31ac1cf5d7d37da5a77ce18c43a62bf0781154reed@google.com    /**
283a31ac1cf5d7d37da5a77ce18c43a62bf0781154reed@google.com     *  Returns the number of bytes stored.
293a31ac1cf5d7d37da5a77ce18c43a62bf0781154reed@google.com     */
303a31ac1cf5d7d37da5a77ce18c43a62bf0781154reed@google.com    size_t size() const { return fSize; }
313a31ac1cf5d7d37da5a77ce18c43a62bf0781154reed@google.com
32dbc936dff3357f74fc60e124d912a2179b909b0dreed@google.com    bool isEmpty() const { return 0 == fSize; }
33dbc936dff3357f74fc60e124d912a2179b909b0dreed@google.com
343a31ac1cf5d7d37da5a77ce18c43a62bf0781154reed@google.com    /**
353a31ac1cf5d7d37da5a77ce18c43a62bf0781154reed@google.com     *  Returns the ptr to the data.
363a31ac1cf5d7d37da5a77ce18c43a62bf0781154reed@google.com     */
373a31ac1cf5d7d37da5a77ce18c43a62bf0781154reed@google.com    const void* data() const { return fPtr; }
383a31ac1cf5d7d37da5a77ce18c43a62bf0781154reed@google.com
393a31ac1cf5d7d37da5a77ce18c43a62bf0781154reed@google.com    /**
403a31ac1cf5d7d37da5a77ce18c43a62bf0781154reed@google.com     *  Like data(), returns a read-only ptr into the data, but in this case
413a31ac1cf5d7d37da5a77ce18c43a62bf0781154reed@google.com     *  it is cast to uint8_t*, to make it easy to add an offset to it.
423a31ac1cf5d7d37da5a77ce18c43a62bf0781154reed@google.com     */
433a31ac1cf5d7d37da5a77ce18c43a62bf0781154reed@google.com    const uint8_t* bytes() const {
443a31ac1cf5d7d37da5a77ce18c43a62bf0781154reed@google.com        return reinterpret_cast<const uint8_t*>(fPtr);
453a31ac1cf5d7d37da5a77ce18c43a62bf0781154reed@google.com    }
463a31ac1cf5d7d37da5a77ce18c43a62bf0781154reed@google.com
473a31ac1cf5d7d37da5a77ce18c43a62bf0781154reed@google.com    /**
483a31ac1cf5d7d37da5a77ce18c43a62bf0781154reed@google.com     *  Helper to copy a range of the data into a caller-provided buffer.
493a31ac1cf5d7d37da5a77ce18c43a62bf0781154reed@google.com     *  Returns the actual number of bytes copied, after clamping offset and
503a31ac1cf5d7d37da5a77ce18c43a62bf0781154reed@google.com     *  length to the size of the data. If buffer is NULL, it is ignored, and
513a31ac1cf5d7d37da5a77ce18c43a62bf0781154reed@google.com     *  only the computed number of bytes is returned.
523a31ac1cf5d7d37da5a77ce18c43a62bf0781154reed@google.com     */
533a31ac1cf5d7d37da5a77ce18c43a62bf0781154reed@google.com    size_t copyRange(size_t offset, size_t length, void* buffer) const;
543a31ac1cf5d7d37da5a77ce18c43a62bf0781154reed@google.com
553a31ac1cf5d7d37da5a77ce18c43a62bf0781154reed@google.com    /**
56dbc936dff3357f74fc60e124d912a2179b909b0dreed@google.com     *  Returns true if these two objects have the same length and contents,
57dbc936dff3357f74fc60e124d912a2179b909b0dreed@google.com     *  effectively returning 0 == memcmp(...)
58dbc936dff3357f74fc60e124d912a2179b909b0dreed@google.com     */
59dbc936dff3357f74fc60e124d912a2179b909b0dreed@google.com    bool equals(const SkData* other) const;
60dbc936dff3357f74fc60e124d912a2179b909b0dreed@google.com
61dbc936dff3357f74fc60e124d912a2179b909b0dreed@google.com    /**
623a31ac1cf5d7d37da5a77ce18c43a62bf0781154reed@google.com     *  Function that, if provided, will be called when the SkData goes out
633a31ac1cf5d7d37da5a77ce18c43a62bf0781154reed@google.com     *  of scope, allowing for custom allocation/freeing of the data.
643a31ac1cf5d7d37da5a77ce18c43a62bf0781154reed@google.com     */
653a31ac1cf5d7d37da5a77ce18c43a62bf0781154reed@google.com    typedef void (*ReleaseProc)(const void* ptr, size_t length, void* context);
66fbfcd5602128ec010c82cb733c9cdc0a3254f9f3rmistry@google.com
673a31ac1cf5d7d37da5a77ce18c43a62bf0781154reed@google.com    /**
683a31ac1cf5d7d37da5a77ce18c43a62bf0781154reed@google.com     *  Create a new dataref by copying the specified data
693a31ac1cf5d7d37da5a77ce18c43a62bf0781154reed@google.com     */
703a31ac1cf5d7d37da5a77ce18c43a62bf0781154reed@google.com    static SkData* NewWithCopy(const void* data, size_t length);
71fbfcd5602128ec010c82cb733c9cdc0a3254f9f3rmistry@google.com
72dbc936dff3357f74fc60e124d912a2179b909b0dreed@google.com    /**
73dbc936dff3357f74fc60e124d912a2179b909b0dreed@google.com     *  Create a new dataref by copying the specified c-string
74fd59d1200073604c0a5dafe14edbb6f3833e1c3dreed@google.com     *  (a null-terminated array of bytes). The returned SkData will have size()
75fd59d1200073604c0a5dafe14edbb6f3833e1c3dreed@google.com     *  equal to strlen(cstr) + 1. If cstr is NULL, it will be treated the same
76fd59d1200073604c0a5dafe14edbb6f3833e1c3dreed@google.com     *  as "".
77dbc936dff3357f74fc60e124d912a2179b909b0dreed@google.com     */
78dbc936dff3357f74fc60e124d912a2179b909b0dreed@google.com    static SkData* NewWithCString(const char cstr[]);
79fbfcd5602128ec010c82cb733c9cdc0a3254f9f3rmistry@google.com
803a31ac1cf5d7d37da5a77ce18c43a62bf0781154reed@google.com    /**
813a31ac1cf5d7d37da5a77ce18c43a62bf0781154reed@google.com     *  Create a new dataref, taking the data ptr as is, and using the
823a31ac1cf5d7d37da5a77ce18c43a62bf0781154reed@google.com     *  releaseproc to free it. The proc may be NULL.
833a31ac1cf5d7d37da5a77ce18c43a62bf0781154reed@google.com     */
843a31ac1cf5d7d37da5a77ce18c43a62bf0781154reed@google.com    static SkData* NewWithProc(const void* data, size_t length,
853a31ac1cf5d7d37da5a77ce18c43a62bf0781154reed@google.com                               ReleaseProc proc, void* context);
863a31ac1cf5d7d37da5a77ce18c43a62bf0781154reed@google.com
873a31ac1cf5d7d37da5a77ce18c43a62bf0781154reed@google.com    /**
881f1db4cc5b62fc74efc01a4c92cbc1f7bddce241reed@google.com     *  Create a new dataref from a pointer allocated by malloc. The Data object
891f1db4cc5b62fc74efc01a4c92cbc1f7bddce241reed@google.com     *  takes ownership of that allocation, and will handling calling sk_free.
908a85d0c4938173476d037d7af0ee3b9436a1234ereed@google.com     */
918a85d0c4938173476d037d7af0ee3b9436a1234ereed@google.com    static SkData* NewFromMalloc(const void* data, size_t length);
927fb5373fb76951b7e8b534f04d508dd51e21be6eskia.committer@gmail.com
93792bbd14c63f217f2de0e6b2f8df99acb1928eeamike@reedtribe.org    /**
94792bbd14c63f217f2de0e6b2f8df99acb1928eeamike@reedtribe.org     *  Create a new dataref the file with the specified path.
95792bbd14c63f217f2de0e6b2f8df99acb1928eeamike@reedtribe.org     *  If the file cannot be opened, this returns NULL.
96792bbd14c63f217f2de0e6b2f8df99acb1928eeamike@reedtribe.org     */
97792bbd14c63f217f2de0e6b2f8df99acb1928eeamike@reedtribe.org    static SkData* NewFromFileName(const char path[]);
987fb5373fb76951b7e8b534f04d508dd51e21be6eskia.committer@gmail.com
998a85d0c4938173476d037d7af0ee3b9436a1234ereed@google.com    /**
1009711e446676e6bf84b3fff916fd1d7537933a110commit-bot@chromium.org     *  Create a new dataref from a SkFILE.
1019711e446676e6bf84b3fff916fd1d7537933a110commit-bot@chromium.org     *  This does not take ownership of the SkFILE, nor close it.
10211c9a55afd95078d14ab8cd7c1c5c0032af2a498bungeman@google.com     *  The caller is free to close the SkFILE at its convenience.
1039711e446676e6bf84b3fff916fd1d7537933a110commit-bot@chromium.org     *  The SkFILE must be open for reading only.
1049711e446676e6bf84b3fff916fd1d7537933a110commit-bot@chromium.org     *  Returns NULL on failure.
105e1575aa21619e252f6c6514317041c32d00ce5a6reed@google.com     */
1069711e446676e6bf84b3fff916fd1d7537933a110commit-bot@chromium.org    static SkData* NewFromFILE(SkFILE* f);
1078eaddb0089a170760e157646192813bd940c26e7skia.committer@gmail.com
108e1575aa21619e252f6c6514317041c32d00ce5a6reed@google.com    /**
10911c9a55afd95078d14ab8cd7c1c5c0032af2a498bungeman@google.com     *  Create a new dataref from a file descriptor.
11011c9a55afd95078d14ab8cd7c1c5c0032af2a498bungeman@google.com     *  This does not take ownership of the file descriptor, nor close it.
11111c9a55afd95078d14ab8cd7c1c5c0032af2a498bungeman@google.com     *  The caller is free to close the file descriptor at its convenience.
11211c9a55afd95078d14ab8cd7c1c5c0032af2a498bungeman@google.com     *  The file descriptor must be open for reading only.
11311c9a55afd95078d14ab8cd7c1c5c0032af2a498bungeman@google.com     *  Returns NULL on failure.
11411c9a55afd95078d14ab8cd7c1c5c0032af2a498bungeman@google.com     */
11511c9a55afd95078d14ab8cd7c1c5c0032af2a498bungeman@google.com    static SkData* NewFromFD(int fd);
11611f2b444500d552031fcae0b381a0770600400fdskia.committer@gmail.com
11711c9a55afd95078d14ab8cd7c1c5c0032af2a498bungeman@google.com    /**
1183a31ac1cf5d7d37da5a77ce18c43a62bf0781154reed@google.com     *  Create a new dataref using a subset of the data in the specified
1193a31ac1cf5d7d37da5a77ce18c43a62bf0781154reed@google.com     *  src dataref.
1203a31ac1cf5d7d37da5a77ce18c43a62bf0781154reed@google.com     */
1213a31ac1cf5d7d37da5a77ce18c43a62bf0781154reed@google.com    static SkData* NewSubset(const SkData* src, size_t offset, size_t length);
1223a31ac1cf5d7d37da5a77ce18c43a62bf0781154reed@google.com
1233a31ac1cf5d7d37da5a77ce18c43a62bf0781154reed@google.com    /**
1243a31ac1cf5d7d37da5a77ce18c43a62bf0781154reed@google.com     *  Returns a new empty dataref (or a reference to a shared empty dataref).
1253a31ac1cf5d7d37da5a77ce18c43a62bf0781154reed@google.com     *  New or shared, the caller must see that unref() is eventually called.
1263a31ac1cf5d7d37da5a77ce18c43a62bf0781154reed@google.com     */
1273a31ac1cf5d7d37da5a77ce18c43a62bf0781154reed@google.com    static SkData* NewEmpty();
1283a31ac1cf5d7d37da5a77ce18c43a62bf0781154reed@google.com
1293a31ac1cf5d7d37da5a77ce18c43a62bf0781154reed@google.comprivate:
1303a31ac1cf5d7d37da5a77ce18c43a62bf0781154reed@google.com    ReleaseProc fReleaseProc;
1313a31ac1cf5d7d37da5a77ce18c43a62bf0781154reed@google.com    void*       fReleaseProcContext;
1323a31ac1cf5d7d37da5a77ce18c43a62bf0781154reed@google.com
1333a31ac1cf5d7d37da5a77ce18c43a62bf0781154reed@google.com    const void* fPtr;
1343a31ac1cf5d7d37da5a77ce18c43a62bf0781154reed@google.com    size_t      fSize;
1353a31ac1cf5d7d37da5a77ce18c43a62bf0781154reed@google.com
1363a31ac1cf5d7d37da5a77ce18c43a62bf0781154reed@google.com    SkData(const void* ptr, size_t size, ReleaseProc, void* context);
13759f46b81f8bdd1b524f5cc43bc27603f9604c71arobertphillips@google.com    virtual ~SkData();
13859f46b81f8bdd1b524f5cc43bc27603f9604c71arobertphillips@google.com
1391f81fd6546c111e21bc665657e976b9d842192dfcommit-bot@chromium.org    // Called the first time someone calls NewEmpty to initialize the singleton.
14097de357270e54be53acb17e1cb4b4d5e25bacc01commit-bot@chromium.org    static SkData* NewEmptyImpl();
14197de357270e54be53acb17e1cb4b4d5e25bacc01commit-bot@chromium.org    static void DeleteEmpty(SkData*);
1421f81fd6546c111e21bc665657e976b9d842192dfcommit-bot@chromium.org
143da30055b296faa5a100e474e0406ef4296c14241reed@google.com    typedef SkRefCnt INHERITED;
1443a31ac1cf5d7d37da5a77ce18c43a62bf0781154reed@google.com};
1453a31ac1cf5d7d37da5a77ce18c43a62bf0781154reed@google.com
1466f4cf2a19553b69d5bb10c5cd1005706a9fc6e22bungeman@google.com/** Typedef of SkAutoTUnref<SkData> for automatically unref-ing a SkData. */
1476f4cf2a19553b69d5bb10c5cd1005706a9fc6e22bungeman@google.comtypedef SkAutoTUnref<SkData> SkAutoDataUnref;
1488a85d0c4938173476d037d7af0ee3b9436a1234ereed@google.com
1493a31ac1cf5d7d37da5a77ce18c43a62bf0781154reed@google.com#endif
150