mirror of
https://github.com/RGBCube/serenity
synced 2025-05-31 14:28:12 +00:00
Font: Clean up AK::MappedFile and use it for mapping font files.
This commit is contained in:
parent
ab6bd3872b
commit
3dc3754cde
5 changed files with 48 additions and 37 deletions
|
@ -1,15 +1,16 @@
|
||||||
#include "MappedFile.h"
|
#include <AK/MappedFile.h>
|
||||||
#include <sys/mman.h>
|
#include <sys/mman.h>
|
||||||
#include <sys/stat.h>
|
#include <sys/stat.h>
|
||||||
#include <fcntl.h>
|
#include <fcntl.h>
|
||||||
#include <cstdio>
|
#include <unistd.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
|
||||||
namespace AK {
|
namespace AK {
|
||||||
|
|
||||||
MappedFile::MappedFile(String&& file_name)
|
MappedFile::MappedFile(const String& file_name)
|
||||||
: m_file_name(std::move(file_name))
|
: m_file_name(file_name)
|
||||||
{
|
{
|
||||||
m_file_length = 1024;
|
m_file_length = PAGE_SIZE;
|
||||||
m_fd = open(m_file_name.characters(), O_RDONLY);
|
m_fd = open(m_file_name.characters(), O_RDONLY);
|
||||||
|
|
||||||
if (m_fd != -1) {
|
if (m_fd != -1) {
|
||||||
|
@ -22,19 +23,29 @@ MappedFile::MappedFile(String&& file_name)
|
||||||
perror("");
|
perror("");
|
||||||
}
|
}
|
||||||
|
|
||||||
printf("MappedFile{%s} := { m_fd=%d, m_file_length=%zu, m_map=%p }\n", m_file_name.characters(), m_fd, m_file_length, m_map);
|
dbgprintf("MappedFile{%s} := { m_fd=%d, m_file_length=%zu, m_map=%p }\n", m_file_name.characters(), m_fd, m_file_length, m_map);
|
||||||
}
|
}
|
||||||
|
|
||||||
MappedFile::~MappedFile()
|
MappedFile::~MappedFile()
|
||||||
{
|
{
|
||||||
if (m_map != (void*)-1) {
|
unmap();
|
||||||
ASSERT(m_fd != -1);
|
}
|
||||||
munmap(m_map, m_file_length);
|
|
||||||
}
|
void MappedFile::unmap()
|
||||||
|
{
|
||||||
|
if (!is_valid())
|
||||||
|
return;
|
||||||
|
ASSERT(m_fd != -1);
|
||||||
|
int rc = munmap(m_map, m_file_length);
|
||||||
|
ASSERT(rc == 0);
|
||||||
|
m_file_name = { };
|
||||||
|
m_file_length = 0;
|
||||||
|
m_fd = -1;
|
||||||
|
m_map = (void*)-1;
|
||||||
}
|
}
|
||||||
|
|
||||||
MappedFile::MappedFile(MappedFile&& other)
|
MappedFile::MappedFile(MappedFile&& other)
|
||||||
: m_file_name(std::move(other.m_file_name))
|
: m_file_name(move(other.m_file_name))
|
||||||
, m_file_length(other.m_file_length)
|
, m_file_length(other.m_file_length)
|
||||||
, m_fd(other.m_fd)
|
, m_fd(other.m_fd)
|
||||||
, m_map(other.m_map)
|
, m_map(other.m_map)
|
||||||
|
@ -44,5 +55,17 @@ MappedFile::MappedFile(MappedFile&& other)
|
||||||
other.m_map = (void*)-1;
|
other.m_map = (void*)-1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
MappedFile& MappedFile::operator=(MappedFile&& other)
|
||||||
|
{
|
||||||
|
if (this == &other)
|
||||||
|
return *this;
|
||||||
|
unmap();
|
||||||
|
swap(m_file_name, other.m_file_name);
|
||||||
|
swap(m_file_length, other.m_file_length);
|
||||||
|
swap(m_fd, other.m_fd);
|
||||||
|
swap(m_map, other.m_map);
|
||||||
|
return *this;
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -7,11 +7,14 @@ namespace AK {
|
||||||
class MappedFile {
|
class MappedFile {
|
||||||
public:
|
public:
|
||||||
MappedFile() { }
|
MappedFile() { }
|
||||||
explicit MappedFile(String&& file_name);
|
explicit MappedFile(const String& file_name);
|
||||||
MappedFile(MappedFile&&);
|
MappedFile(MappedFile&&);
|
||||||
~MappedFile();
|
~MappedFile();
|
||||||
|
|
||||||
|
MappedFile& operator=(MappedFile&&);
|
||||||
|
|
||||||
bool is_valid() const { return m_map != (void*)-1; }
|
bool is_valid() const { return m_map != (void*)-1; }
|
||||||
|
void unmap();
|
||||||
|
|
||||||
void* pointer() { return m_map; }
|
void* pointer() { return m_map; }
|
||||||
const void* pointer() const { return m_map; }
|
const void* pointer() const { return m_map; }
|
||||||
|
|
|
@ -4,6 +4,7 @@ AK_OBJS = \
|
||||||
../AK/StringBuilder.o \
|
../AK/StringBuilder.o \
|
||||||
../AK/FileSystemPath.o \
|
../AK/FileSystemPath.o \
|
||||||
../AK/StdLibExtras.o \
|
../AK/StdLibExtras.o \
|
||||||
|
../AK/MappedFile.o \
|
||||||
../AK/kmalloc.o
|
../AK/kmalloc.o
|
||||||
|
|
||||||
LIBC_OBJS = \
|
LIBC_OBJS = \
|
||||||
|
|
|
@ -2,7 +2,7 @@
|
||||||
#include <AK/kmalloc.h>
|
#include <AK/kmalloc.h>
|
||||||
#include <AK/BufferStream.h>
|
#include <AK/BufferStream.h>
|
||||||
#include <AK/StdLibExtras.h>
|
#include <AK/StdLibExtras.h>
|
||||||
|
#include <AK/MappedFile.h>
|
||||||
#include <LibC/unistd.h>
|
#include <LibC/unistd.h>
|
||||||
#include <LibC/stdio.h>
|
#include <LibC/stdio.h>
|
||||||
#include <LibC/fcntl.h>
|
#include <LibC/fcntl.h>
|
||||||
|
@ -90,10 +90,6 @@ Font::Font(const String& name, unsigned* rows, byte* widths, bool is_fixed_width
|
||||||
|
|
||||||
Font::~Font()
|
Font::~Font()
|
||||||
{
|
{
|
||||||
if (m_mmap_ptr) {
|
|
||||||
int rc = munmap(m_mmap_ptr, 4096 * 3);
|
|
||||||
ASSERT(rc == 0);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
RetainPtr<Font> Font::load_from_memory(const byte* data)
|
RetainPtr<Font> Font::load_from_memory(const byte* data)
|
||||||
|
@ -119,25 +115,12 @@ RetainPtr<Font> Font::load_from_memory(const byte* data)
|
||||||
|
|
||||||
RetainPtr<Font> Font::load_from_file(const String& path)
|
RetainPtr<Font> Font::load_from_file(const String& path)
|
||||||
{
|
{
|
||||||
int fd = open(path.characters(), O_RDONLY, 0644);
|
MappedFile mapped_file(path);
|
||||||
if (fd < 0) {
|
if (!mapped_file.is_valid())
|
||||||
dbgprintf("open(%s) got fd=%d, failed: %s\n", path.characters(), fd, strerror(errno));
|
|
||||||
perror("open");
|
|
||||||
return nullptr;
|
return nullptr;
|
||||||
}
|
|
||||||
|
|
||||||
auto* mapped_file = (byte*)mmap(nullptr, 4096 * 3, PROT_READ, MAP_SHARED, fd, 0);
|
auto font = load_from_memory((const byte*)mapped_file.pointer());
|
||||||
if (mapped_file == MAP_FAILED) {
|
font->m_mapped_file = move(mapped_file);
|
||||||
int rc = close(fd);
|
|
||||||
ASSERT(rc == 0);
|
|
||||||
return nullptr;
|
|
||||||
}
|
|
||||||
|
|
||||||
auto font = load_from_memory(mapped_file);
|
|
||||||
font->m_mmap_ptr = mapped_file;
|
|
||||||
|
|
||||||
int rc = close(fd);
|
|
||||||
ASSERT(rc == 0);
|
|
||||||
return font;
|
return font;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -4,6 +4,7 @@
|
||||||
#include <AK/Retainable.h>
|
#include <AK/Retainable.h>
|
||||||
#include <AK/RetainPtr.h>
|
#include <AK/RetainPtr.h>
|
||||||
#include <AK/AKString.h>
|
#include <AK/AKString.h>
|
||||||
|
#include <AK/MappedFile.h>
|
||||||
#include <AK/Types.h>
|
#include <AK/Types.h>
|
||||||
|
|
||||||
// FIXME: Make a MutableGlyphBitmap buddy class for FontEditor instead?
|
// FIXME: Make a MutableGlyphBitmap buddy class for FontEditor instead?
|
||||||
|
@ -47,8 +48,6 @@ public:
|
||||||
|
|
||||||
RetainPtr<Font> clone() const;
|
RetainPtr<Font> clone() const;
|
||||||
|
|
||||||
static RetainPtr<Font> load_from_memory(const byte*);
|
|
||||||
|
|
||||||
static RetainPtr<Font> load_from_file(const String& path);
|
static RetainPtr<Font> load_from_file(const String& path);
|
||||||
bool write_to_file(const String& path);
|
bool write_to_file(const String& path);
|
||||||
|
|
||||||
|
@ -78,11 +77,13 @@ public:
|
||||||
private:
|
private:
|
||||||
Font(const String& name, unsigned* rows, byte* widths, bool is_fixed_width, byte glyph_width, byte glyph_height);
|
Font(const String& name, unsigned* rows, byte* widths, bool is_fixed_width, byte glyph_width, byte glyph_height);
|
||||||
|
|
||||||
|
static RetainPtr<Font> load_from_memory(const byte*);
|
||||||
|
|
||||||
String m_name;
|
String m_name;
|
||||||
|
|
||||||
unsigned* m_rows { nullptr };
|
unsigned* m_rows { nullptr };
|
||||||
byte* m_glyph_widths { nullptr };
|
byte* m_glyph_widths { nullptr };
|
||||||
void* m_mmap_ptr { nullptr };
|
MappedFile m_mapped_file;
|
||||||
|
|
||||||
byte m_glyph_width { 0 };
|
byte m_glyph_width { 0 };
|
||||||
byte m_glyph_height { 0 };
|
byte m_glyph_height { 0 };
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue