Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(311)

Unified Diff: skia/ext/SkFontHost_fontconfig.cpp

Issue 180026: Linux: use mmap fonts. (Closed)
Patch Set: Created 11 years, 4 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « no previous file | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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_;
};
///////////////////////////////////////////////////////////////////////////////
« no previous file with comments | « no previous file | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698