diff --git a/CMakeLists.txt b/CMakeLists.txt
index af368e1..d4aa351 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -1,6 +1,5 @@
cmake_minimum_required(VERSION 3.7)
-
option(VERSION_STRING "Project version string" "0.0.0")
project(antkeeper VERSION ${VERSION_STRING} LANGUAGES CXX)
diff --git a/src/type/font.cpp b/src/type/font.cpp
new file mode 100644
index 0000000..b91bede
--- /dev/null
+++ b/src/type/font.cpp
@@ -0,0 +1,25 @@
+/*
+ * Copyright (C) 2021 Christopher J. Howard
+ *
+ * This file is part of Antkeeper source code.
+ *
+ * Antkeeper source code is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * Antkeeper source code is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with Antkeeper source code. If not, see .
+ */
+
+#include "type/font.hpp"
+
+namespace type {
+
+
+} // namespace type
diff --git a/src/type/font.hpp b/src/type/font.hpp
new file mode 100644
index 0000000..0874545
--- /dev/null
+++ b/src/type/font.hpp
@@ -0,0 +1,40 @@
+/*
+ * Copyright (C) 2021 Christopher J. Howard
+ *
+ * This file is part of Antkeeper source code.
+ *
+ * Antkeeper source code is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * Antkeeper source code is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with Antkeeper source code. If not, see .
+ */
+
+#ifndef ANTKEEPER_TYPE_FONT_HPP
+#define ANTKEEPER_TYPE_FONT_HPP
+
+#include
+
+namespace type {
+
+class font
+{
+public:
+ //font();
+
+ //float measure(const std::u32string& text) const;
+
+private:
+
+};
+
+} // namespace type
+
+#endif // ANTKEEPER_TYPE_FONT_HPP
diff --git a/src/type/glyph.hpp b/src/type/glyph.hpp
new file mode 100644
index 0000000..77e45a1
--- /dev/null
+++ b/src/type/glyph.hpp
@@ -0,0 +1,39 @@
+/*
+ * Copyright (C) 2021 Christopher J. Howard
+ *
+ * This file is part of Antkeeper source code.
+ *
+ * Antkeeper source code is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * Antkeeper source code is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with Antkeeper source code. If not, see .
+ */
+
+#ifndef ANTKEEPER_TYPE_GLYPH_HPP
+#define ANTKEEPER_TYPE_GLYPH_HPP
+
+namespace type {
+
+/**
+ *
+ */
+struct glyph_metrics
+{
+ float2 size;
+ float2 bearing_h;
+ float2 bearing_v;
+ float advance_h;
+ float advance_v;
+};
+
+} // namespace type
+
+#endif // ANTKEEPER_TYPE_GLYPH_HPP
diff --git a/src/type/type.hpp b/src/type/type.hpp
new file mode 100644
index 0000000..bf12988
--- /dev/null
+++ b/src/type/type.hpp
@@ -0,0 +1,29 @@
+/*
+ * Copyright (C) 2021 Christopher J. Howard
+ *
+ * This file is part of Antkeeper source code.
+ *
+ * Antkeeper source code is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * Antkeeper source code is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with Antkeeper source code. If not, see .
+ */
+
+#ifndef ANTKEEPER_TYPE_HPP
+#define ANTKEEPER_TYPE_HPP
+
+/// Text and typography.
+namespace type {}
+
+#include "type/font.hpp"
+#include "type/unicode/unicode.hpp"
+
+#endif // ANTKEEPER_TYPE_HPP
diff --git a/src/font/unicode-block.cpp b/src/type/unicode/block.cpp
similarity index 99%
rename from src/font/unicode-block.cpp
rename to src/type/unicode/block.cpp
index b835d53..2fa21a8 100644
--- a/src/font/unicode-block.cpp
+++ b/src/type/unicode/block.cpp
@@ -17,9 +17,9 @@
* along with Antkeeper source code. If not, see .
*/
-#include "unicode-block.hpp"
+#include "type/unicode/block.hpp"
-namespace font {
+namespace type {
namespace unicode {
const block block::basic_latin{0x0, 0x7F};
@@ -344,4 +344,4 @@ const block block::supplementary_private_use_area_a{0xF0000, 0xFFFFF};
const block block::supplementary_private_use_area_b{0x100000, 0x10FFFF};
} // namespace unicode
-} // namespace font
+} // namespace type
diff --git a/src/font/unicode-block.hpp b/src/type/unicode/block.hpp
similarity index 99%
rename from src/font/unicode-block.hpp
rename to src/type/unicode/block.hpp
index 7c0fd9a..0e0dfc5 100644
--- a/src/font/unicode-block.hpp
+++ b/src/type/unicode/block.hpp
@@ -17,12 +17,10 @@
* along with Antkeeper source code. If not, see .
*/
-#ifndef ANTKEEPER_FONT_UNICODE_BLOCK_HPP
-#define ANTKEEPER_FONT_UNICODE_BLOCK_HPP
+#ifndef ANTKEEPER_TYPE_UNICODE_BLOCK_HPP
+#define ANTKEEPER_TYPE_UNICODE_BLOCK_HPP
-namespace font {
-
-/// Unicode-related functions and data
+namespace type {
namespace unicode {
/**
@@ -1001,6 +999,6 @@ struct block
};
} // namespace unicode
-} // namespace font
+} // namespace type
-#endif // ANTKEEPER_FONT_UNICODE_BLOCK_HPP
+#endif // ANTKEEPER_TYPE_UNICODE_BLOCK_HPP
diff --git a/src/type/unicode/convert.cpp b/src/type/unicode/convert.cpp
new file mode 100644
index 0000000..12228ee
--- /dev/null
+++ b/src/type/unicode/convert.cpp
@@ -0,0 +1,39 @@
+/*
+ * Copyright (C) 2021 Christopher J. Howard
+ *
+ * This file is part of Antkeeper source code.
+ *
+ * Antkeeper source code is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * Antkeeper source code is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with Antkeeper source code. If not, see .
+ */
+
+#include "type/unicode/convert.hpp"
+#include
+
+namespace font {
+namespace unicode {
+
+std::u32string u32(const std::string& u8)
+{
+ std::wstring_convert, char32_t> convert;
+ return convert.from_bytes(u8);
+}
+
+std::string u8(const std::u32string& u32)
+{
+ std::wstring_convert, char32_t> convert;
+ return convert.to_bytes(u32);
+}
+
+} // namespace unicode
+} // namespace font
diff --git a/src/type/unicode/convert.hpp b/src/type/unicode/convert.hpp
new file mode 100644
index 0000000..9014377
--- /dev/null
+++ b/src/type/unicode/convert.hpp
@@ -0,0 +1,47 @@
+/*
+ * Copyright (C) 2021 Christopher J. Howard
+ *
+ * This file is part of Antkeeper source code.
+ *
+ * Antkeeper source code is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * Antkeeper source code is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with Antkeeper source code. If not, see .
+ */
+
+#ifndef ANTKEEPER_TYPE_UNICODE_CONVERT_HPP
+#define ANTKEEPER_TYPE_UNICODE_CONVERT_HPP
+
+#include
+
+namespace type {
+namespace unicode {
+
+/**
+ * Converts a UTF-8 string to UTF-32.
+ *
+ * @param u8 UTF-8 string.
+ * @return UTF-32 string.
+ */
+std::u32string u32(const std::string& u8);
+
+/**
+ * Converts a UTF-32 string to UTF-8.
+ *
+ * @param u32 UTF-32 string.
+ * @return UTF-8 string.
+ */
+std::string u32(const std::u32string& u32);
+
+} // namespace unicode
+} // namespace type
+
+#endif // ANTKEEPER_TYPE_UNICODE_CONVERT_HPP
diff --git a/src/type/unicode/unicode.hpp b/src/type/unicode/unicode.hpp
new file mode 100644
index 0000000..11de428
--- /dev/null
+++ b/src/type/unicode/unicode.hpp
@@ -0,0 +1,33 @@
+/*
+ * Copyright (C) 2021 Christopher J. Howard
+ *
+ * This file is part of Antkeeper source code.
+ *
+ * Antkeeper source code is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * Antkeeper source code is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with Antkeeper source code. If not, see .
+ */
+
+#ifndef ANTKEEPER_TYPE_UNICODE_HPP
+#define ANTKEEPER_TYPE_UNICODE_HPP
+
+namespace type {
+
+/// Unicode-related functions and data.
+namespace unicode {}
+
+} // namespace type
+
+#include "type/unicode/block.hpp"
+#include "type/unicode/convert.hpp"
+
+#endif // ANTKEEPER_TYPE_UNICODE_HPP