| Index: src/core/SkData.cpp
|
| ===================================================================
|
| --- src/core/SkData.cpp (revision 9222)
|
| +++ src/core/SkData.cpp (working copy)
|
| @@ -9,16 +9,6 @@
|
| #include "SkFlattenableBuffers.h"
|
| #include "SkOSFile.h"
|
|
|
| -#if SK_MMAP_SUPPORT
|
| - #include <unistd.h>
|
| - #include <sys/mman.h>
|
| - #include <fcntl.h>
|
| - #include <errno.h>
|
| - #include <unistd.h>
|
| -#else
|
| - #include <io.h>
|
| -#endif
|
| -
|
| SK_DEFINE_INST_COUNT(SkData)
|
|
|
| SkData::SkData(const void* ptr, size_t size, ReleaseProc proc, void* context) {
|
| @@ -92,96 +82,27 @@
|
| return new SkData(data, length, proc, context);
|
| }
|
|
|
| -// assumes context is a SkData
|
| -static void sk_dataref_releaseproc(const void*, size_t, void* context) {
|
| - SkData* src = reinterpret_cast<SkData*>(context);
|
| - src->unref();
|
| +// assumes fPtr was allocated with sk_fmmap
|
| +static void sk_mmap_releaseproc(const void* addr, size_t length, void*) {
|
| + sk_fmunmap(addr, length);
|
| }
|
|
|
| -#if SK_MMAP_SUPPORT
|
| -
|
| -static void sk_munmap_releaseproc(const void* addr, size_t length, void*) {
|
| - munmap(const_cast<void*>(addr), length);
|
| -}
|
| -
|
| SkData* SkData::NewFromFILE(SkFILE* f) {
|
| - size_t size = sk_fgetsize(f);
|
| - if (0 == size) {
|
| - return NULL;
|
| - }
|
| -
|
| - int fd = fileno((FILE*)f);
|
| - if (fd < 0) {
|
| - return NULL;
|
| - }
|
| -
|
| - void* addr = mmap(NULL, size, PROT_READ, MAP_SHARED, fd, 0);
|
| - if (MAP_FAILED == addr) {
|
| - return NULL;
|
| - }
|
| -
|
| - return SkData::NewWithProc(addr, size, sk_munmap_releaseproc, NULL);
|
| -}
|
| -
|
| -#elif defined(SK_BUILD_FOR_WIN32)
|
| -
|
| -template <typename HandleType, HandleType InvalidValue, BOOL (WINAPI * Close)(HandleType)>
|
| -class SkAutoTHandle : SkNoncopyable {
|
| -public:
|
| - SkAutoTHandle(HandleType handle) : fHandle(handle) { }
|
| - ~SkAutoTHandle() { Close(fHandle); }
|
| - operator HandleType() { return fHandle; }
|
| - bool isValid() { return InvalidValue != fHandle; }
|
| -private:
|
| - HandleType fHandle;
|
| -};
|
| -typedef SkAutoTHandle<HANDLE, INVALID_HANDLE_VALUE, CloseHandle> SkAutoWinFile;
|
| -typedef SkAutoTHandle<HANDLE, NULL, CloseHandle> SkAutoWinMMap;
|
| -
|
| -static void sk_munmap_releaseproc(const void* addr, size_t, void*) {
|
| - UnmapViewOfFile(addr);
|
| -}
|
| -
|
| -SkData* SkData::NewFromFILE(SkFILE* f) {
|
| - size_t size = sk_fgetsize(f);
|
| - if (0 == size) {
|
| - return NULL;
|
| - }
|
| -
|
| - int fileno = _fileno((FILE*)f);
|
| - if (fileno < 0) {
|
| - return NULL;
|
| - }
|
| -
|
| - HANDLE file = (HANDLE)_get_osfhandle(fileno);
|
| - if (INVALID_HANDLE_VALUE == file) {
|
| - return NULL;
|
| - }
|
| -
|
| - SkAutoWinMMap mmap(CreateFileMapping(file, NULL, PAGE_READONLY, 0, 0, NULL));
|
| - if (!mmap.isValid()) {
|
| - //TODO: use SK_TRACEHR(GetLastError(), "Could not create file mapping.") to report.
|
| - return NULL;
|
| - }
|
| -
|
| - // Eventually call UnmapViewOfFile
|
| - void* addr = MapViewOfFile(mmap, FILE_MAP_READ, 0, 0, 0);
|
| + size_t size;
|
| + void* addr = sk_fmmap(f, &size);
|
| if (NULL == addr) {
|
| - //TODO: use SK_TRACEHR(GetLastError(), "Could not map view of file.") to report.
|
| return NULL;
|
| }
|
|
|
| - return SkData::NewWithProc(addr, size, sk_munmap_releaseproc, NULL);
|
| + return SkData::NewWithProc(addr, size, sk_mmap_releaseproc, NULL);
|
| }
|
|
|
| -#else
|
| -
|
| -SkData* SkData::NewFromFILE(SkFILE* f) {
|
| - return NULL;
|
| +// assumes context is a SkData
|
| +static void sk_dataref_releaseproc(const void*, size_t, void* context) {
|
| + SkData* src = reinterpret_cast<SkData*>(context);
|
| + src->unref();
|
| }
|
|
|
| -#endif
|
| -
|
| SkData* SkData::NewSubset(const SkData* src, size_t offset, size_t length) {
|
| /*
|
| We could, if we wanted/need to, just make a deep copy of src's data,
|
|
|