Index: skia/ext/SkFontHost_fontconfig.cpp |
diff --git a/skia/ext/SkFontHost_fontconfig.cpp b/skia/ext/SkFontHost_fontconfig.cpp |
index 46d8d454423bc3f0a7d24f8a2be58bf8f317c3fb..3d19bef831a1f77ee35ba477672af31e936497b0 100644 |
--- a/skia/ext/SkFontHost_fontconfig.cpp |
+++ b/skia/ext/SkFontHost_fontconfig.cpp |
@@ -29,6 +29,7 @@ |
#include <unistd.h> |
#include <sys/stat.h> |
+#include <sys/mman.h> |
tony
2009/08/28 20:11:29
Nit: Sort these?
|
#include "SkFontHost.h" |
#include "SkStream.h" |
@@ -235,17 +236,28 @@ uint32_t SkFontHost::NextLogicalFont(SkFontID fontID) { |
class SkFileDescriptorStream : public SkStream { |
public: |
- SkFileDescriptorStream(int fd) |
- : fd_(fd) { |
+ SkFileDescriptorStream(int fd) { |
+ memory_ = NULL; |
+ offset_ = 0; |
+ |
+ struct stat st; |
+ if (fstat(fd, &st)) |
+ return; |
+ |
+ void* memory = mmap(NULL, st.st_size, PROT_READ, MAP_SHARED, fd, 0); |
+ if (memory == MAP_FAILED) |
+ return; |
+ |
+ memory_ = reinterpret_cast<uint8_t*>(memory); |
+ length_ = st.st_size; |
} |
~SkFileDescriptorStream() { |
- close(fd_); |
+ munmap(const_cast<uint8_t*>(memory_), length_); |
} |
virtual bool rewind() { |
- if (lseek(fd_, 0, SEEK_SET) == -1) |
- return false; |
+ offset_ = 0; |
return true; |
} |
@@ -253,33 +265,34 @@ class SkFileDescriptorStream : public SkStream { |
virtual size_t read(void* buffer, size_t size) { |
if (!buffer && !size) { |
// This is request for the length of the stream. |
- struct stat st; |
- if (fstat(fd_, &st) == -1) |
- return 0; |
- return st.st_size; |
+ return length_; |
} |
if (!buffer) { |
// This is a request to skip bytes. |
- const off_t current_position = lseek(fd_, 0, SEEK_CUR); |
- if (current_position == -1) |
- return 0; |
- const off_t new_position = lseek(fd_, size, SEEK_CUR); |
- if (new_position == -1) |
- return 0; |
- if (new_position < current_position) { |
- lseek(fd_, current_position, SEEK_SET); |
- return 0; |
- } |
- return new_position; |
+ if (offset_ + size < offset_) |
+ return offset_; |
+ offset_ += size; |
+ if (offset_ > length_) |
+ offset_ = length_; |
+ return offset_; |
} |
- // This is a request to read bytes. |
- return ::read(fd_, buffer, size); |
+ size_t remaining = length_ - offset_; |
+ if (size > remaining) |
+ size = remaining; |
+ memcpy(buffer, memory_ + offset_, size); |
+ offset_ += size; |
+ return size; |
+ } |
+ |
+ virtual const void* getMemoryBase() { |
+ return memory_; |
} |
private: |
- const int fd_; |
+ const uint8_t* memory_; |
+ size_t offset_, length_; |
}; |
/////////////////////////////////////////////////////////////////////////////// |