Index: src/core/SkStream.cpp |
=================================================================== |
--- src/core/SkStream.cpp (revision 8205) |
+++ src/core/SkStream.cpp (working copy) |
@@ -13,6 +13,14 @@ |
#include "SkString.h" |
#include "SkOSFile.h" |
+#if SK_MMAP_SUPPORT |
+ #include <unistd.h> |
+ #include <sys/mman.h> |
+ #include <fcntl.h> |
+ #include <errno.h> |
+ #include <unistd.h> |
+#endif |
+ |
SK_DEFINE_INST_COUNT(SkStream) |
SK_DEFINE_INST_COUNT(SkWStream) |
SK_DEFINE_INST_COUNT(SkFILEStream) |
@@ -789,3 +797,59 @@ |
#endif |
return true; |
} |
+ |
+/////////////////////////////////////////////////////////////////////////////// |
+/////////////////////////////////////////////////////////////////////////////// |
+ |
+static bool mmap_filename(const char path[], void** addrPtr, size_t* sizePtr) { |
+#if SK_MMAP_SUPPORT |
+ int fd = open(path, O_RDONLY); |
+ if (fd < 0) { |
+ return false; |
+ } |
+ |
+ off_t offset = lseek(fd, 0, SEEK_END); // find the file size |
+ if (offset == -1) { |
+ close(fd); |
+ return false; |
+ } |
+ (void)lseek(fd, 0, SEEK_SET); // restore file offset to beginning |
+ |
+ // to avoid a 64bit->32bit warning, I explicitly create a size_t size |
+ size_t size = static_cast<size_t>(offset); |
+ |
+ void* addr = mmap(NULL, size, PROT_READ, MAP_SHARED, fd, 0); |
+ close(fd); |
+ |
+ if (MAP_FAILED == addr) { |
+ return false; |
+ } |
+ |
+ *addrPtr = addr; |
+ *sizePtr = size; |
+ return true; |
+#else |
+ return false; |
+#endif |
+} |
+ |
+SkStream* SkStream::NewFromFile(const char path[]) { |
+ void* addr; |
+ size_t size; |
+ if (mmap_filename(path, &addr, &size)) { |
+ SkAutoTUnref<SkData> data(SkData::NewFromMMap(addr, size)); |
+ if (data.get()) { |
+ return SkNEW_ARGS(SkMemoryStream, (data.get())); |
+ } |
+ } |
+ |
+ // If we get here, then our attempt at using mmap failed, so try normal |
+ // file access. |
+ SkFILEStream* stream = SkNEW_ARGS(SkFILEStream, (path)); |
+ if (!stream->isValid()) { |
+ stream->unref(); |
+ stream = NULL; |
+ } |
+ return stream; |
+} |
+ |