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