diff --git a/docs/FONTS.md b/docs/FONTS.md
new file mode 100644
index 0000000..fb4a0d2
--- /dev/null
+++ b/docs/FONTS.md
@@ -0,0 +1,350 @@
+## Fonts
+
+The code in imgui.cpp embeds a copy of 'ProggyClean.ttf' (by Tristan Grimmer),
+a 13 pixels high, pixel-perfect font used by default. We embed it font in source code so you can use Dear ImGui without any file system access.
+
+You may also load external .TTF/.OTF files. The files in this folder are suggested fonts, provided as a convenience.
+
+Fonts are rasterized in a single texture at the time of calling either of 
+
+- `io.Fonts->GetTexDataAsAlpha8()`
+
+- `GetTexDataAsRGBA32()/Build()`
+
+**Also read the FAQ:** https://www.dearimgui.org/faq
+
+If you have other loading/merging/adding fonts, you can post on the [Dear ImGui Getting Started forum](https://discourse.dearimgui.org/c/getting-started).
+
+
+---------------------------------------
+| Index |
+|:---------------------------------------|
+| [Readme First](#readme-first) |
+| [Using Icons](#using-icons) |
+| [Fonts Loading Instructions](#font-loading-instructions) |
+| [FreeType Rasterizer, Small Font Sizes](#freeType-rasterizer-small-font-sizes) |
+| [Building Custom Glyph Ranges](#building-custom-glyph-ranges) |
+| [Using Custom Colorful Icons](#using-custom-colorful-icons) |
+| [Embedding Fonts In Source Code](#embedding-fonts-in-source-code) |
+| [Credits/Licenses For Fonts Included In This Folder](#creditslicenses-for-fonts-included-in-this-folder) |
+| [Font Links](#font-links) |
+
+
+---------------------------------------
+ ## Readme First
+
+- You can use the style editor ImGui::ShowStyleEditor() in the "Fonts" section to browse your fonts
+  and understand what's going on if you have an issue.
+- Make sure your font ranges data are persistent (available during the call to GetTexDataAsAlpha8()/GetTexDataAsRGBA32()/Build().
+- Use C++11 u8"my text" syntax to encode literal strings as UTF-8. e.g.:
+	```
+      u8"hello"
+      u8"こんにちは"   // this will be encoded as UTF-8
+	```
+- If you want to include a backslash \ character in your string literal, you need to double them e.g. "folder\\\filename".
+- Please use the [Discourse forum](https://discourse.dearimgui.org) and not the Github issue tracker for basic font loading questions.
+
+
+---------------------------------------
+ ## Using Icons
+
+- Using an icon font (such as [FontAwesome](http://fontawesome.io) or [OpenFontIcons](https://github.com/traverseda/OpenFontIcons)) is an easy and practical way to use icons in your Dear ImGui application.
+- A common pattern is to merge the icon font within your main font, so you can embed icons directly from your strings without having to change fonts back and forth.
+- To refer to the icon UTF-8 codepoints from your C++ code, you may use those headers files created by Juliette Foucaut:
+  https://github.com/juliettef/IconFontCppHeaders
+
+**The C++11 version of those files uses the u8"" utf-8 encoding syntax + \u**
+
+  ` #define ICON_FA_SEARCH  u8"\uf002" `
+
+**The pre-C++11 version has the values directly encoded as utf-8:**
+
+  ` #define ICON_FA_SEARCH  "\xEF\x80\x82" `
+
+Example Setup:
+```cpp
+  // Merge icons into default tool font
+  #include "IconsFontAwesome.h"
+  ImGuiIO& io = ImGui::GetIO();
+  io.Fonts->AddFontDefault();
+
+  ImFontConfig config;
+  config.MergeMode = true;
+  config.GlyphMinAdvanceX = 13.0f; // Use if you want to make the icon monospaced
+  static const ImWchar icon_ranges[] = { ICON_MIN_FA, ICON_MAX_FA, 0 };
+  io.Fonts->AddFontFromFileTTF("fonts/fontawesome-webfont.ttf", 13.0f, &config, icon_ranges);
+```
+Example Usage:
+```cpp
+  // Usage, e.g.
+  ImGui::Text("%s among %d items", ICON_FA_SEARCH, count);
+  ImGui::Button(ICON_FA_SEARCH " Search");
+  // C string _literals_ can be concatenated at compilation time, e.g. "hello" " world"
+  // ICON_FA_SEARCH is defined as a string literal so this is the same as "A" "B" becoming "AB"
+```
+See Links below for other icons fonts and related tools.
+
+
+---------------------------------------
+ ## Font Loading Instructions
+
+Load default font:
+```cpp
+  ImGuiIO& io = ImGui::GetIO();
+  io.Fonts->AddFontDefault();
+```
+Load .TTF/.OTF file with:
+```cpp
+  ImGuiIO& io = ImGui::GetIO();
+  ImFont* font1 = io.Fonts->AddFontFromFileTTF("font.ttf", size_pixels);
+  ImFont* font2 = io.Fonts->AddFontFromFileTTF("anotherfont.otf", size_pixels);
+
+  // Select font at runtime
+  ImGui::Text("Hello");	// use the default font (which is the first loaded font)
+  ImGui::PushFont(font2);
+  ImGui::Text("Hello with another font");
+  ImGui::PopFont();
+```
+For advanced options create a ImFontConfig structure and pass it to the AddFont function (it will be copied internally):
+```cpp
+  ImFontConfig config;
+  config.OversampleH = 2;
+  config.OversampleV = 1;
+  config.GlyphExtraSpacing.x = 1.0f;
+  ImFont* font = io.Fonts->AddFontFromFileTTF("font.ttf", size_pixels, &config);
+```
+**Read about oversampling [here](https://github.com/nothings/stb/blob/master/tests/oversample)**
+
+- If you have very large number of glyphs or multiple fonts, the texture may become too big for your graphics API.
+- The typical result of failing to upload a texture is if every glyphs appears as white rectangles.
+- In particular, using a large range such as GetGlyphRangesChineseSimplifiedCommon() is not recommended unless you set OversampleH/OversampleV to 1 and use a small font size.
+- Mind the fact that some graphics drivers have texture size limitation.
+- If you are building a PC application, mind the fact that your users may use hardware with lower limitations than yours.
+
+Some solutions:
+
+ 1. Reduce glyphs ranges by calculating them from source localization data.
+   You can use ImFontGlyphRangesBuilder for this purpose, this will be the biggest win!
+ 2. You may reduce oversampling, e.g. config.OversampleH = config.OversampleV = 1, this will largely reduce your texture size.
+ 3. Set io.Fonts.TexDesiredWidth to specify a texture width to minimize texture height (see comment in ImFontAtlas::Build function).
+ 4. Set io.Fonts.Flags |= ImFontAtlasFlags_NoPowerOfTwoHeight; to disable rounding the texture height to the next power of two.
+
+Combine two fonts into one:
+```cpp
+  // Load a first font
+  ImFont* font = io.Fonts->AddFontDefault();
+
+  // Add character ranges and merge into the previous font
+  // The ranges array is not copied by the AddFont* functions and is used lazily
+  // so ensure it is available at the time of building or calling GetTexDataAsRGBA32().
+  static const ImWchar icons_ranges[] = { 0xf000, 0xf3ff, 0 }; // Will not be copied by AddFont* so keep in scope.
+  ImFontConfig config;
+  config.MergeMode = true;
+  io.Fonts->AddFontFromFileTTF("DroidSans.ttf", 18.0f, &config, io.Fonts->GetGlyphRangesJapanese());
+  io.Fonts->AddFontFromFileTTF("fontawesome-webfont.ttf", 18.0f, &config, icons_ranges);
+  io.Fonts->Build();
+```
+Add a fourth parameter to bake specific font ranges only:
+```cpp
+  // Basic Latin, Extended Latin
+  io.Fonts->AddFontFromFileTTF("font.ttf", size_pixels, NULL, io.Fonts->GetGlyphRangesDefault());
+
+  // Default + Selection of 2500 Ideographs used by Simplified Chinese
+  io.Fonts->AddFontFromFileTTF("font.ttf", size_pixels, NULL, io.Fonts->GetGlyphRangesChineseSimplifiedCommon());
+
+  // Default + Hiragana, Katakana, Half-Width, Selection of 1946 Ideographs
+  io.Fonts->AddFontFromFileTTF("font.ttf", size_pixels, NULL, io.Fonts->GetGlyphRangesJapanese());
+```
+See [Building Custom Glyph Ranges](#building-custom-glyph-ranges) section to create your own ranges.
+Offset font vertically by altering the io.Font->DisplayOffset value:
+```cpp
+  ImFont* font = io.Fonts->AddFontFromFileTTF("font.ttf", size_pixels);
+  font->DisplayOffset.y = 1;   // Render 1 pixel down
+```
+
+---------------------------------------
+ ## Freetype Rasterizer, Small Font Sizes
+
+- Dear ImGui uses imstb\_truetype.h to rasterize fonts (with optional oversampling). This technique and its implementation are not ideal for fonts rendered at small sizes, which may appear a little blurry or hard to read.
+- There is an implementation of the ImFontAtlas builder using FreeType that you can use in the misc/freetype/ folder.
+- FreeType supports auto-hinting which tends to improve the readability of small fonts.
+
+**Note** 
+- This code currently creates textures that are unoptimally too large (could be fixed with some work).
+- Also note that correct sRGB space blending will have an important effect on your font rendering quality.
+
+
+---------------------------------------
+ ## Building Custom Glyph Ranges
+
+You can use the ImFontGlyphRangesBuilder helper to create glyph ranges based on text input. For example: for a game where your script is known, if you can feed your entire script to it and only build the characters the game needs.
+```cpp
+  ImVector<ImWchar> ranges;
+  ImFontGlyphRangesBuilder builder;
+  builder.AddText("Hello world");                        // Add a string (here "Hello world" contains 7 unique characters)
+  builder.AddChar(0x7262);                               // Add a specific character
+  builder.AddRanges(io.Fonts->GetGlyphRangesJapanese()); // Add one of the default ranges
+  builder.BuildRanges(&ranges);                          // Build the final result (ordered ranges with all the unique characters submitted)
+
+  io.Fonts->AddFontFromFileTTF("myfontfile.ttf", size_in_pixels, NULL, ranges.Data);
+  io.Fonts->Build();                                     // Build the atlas while 'ranges' is still in scope and not deleted.
+```
+
+---------------------------------------
+## Using Custom Colorful Icons
+
+**(This is a BETA api, use if you are familiar with dear imgui and with your rendering back-end)**
+
+- You can use the ImFontAtlas::AddCustomRect() and ImFontAtlas::AddCustomRectFontGlyph() api to register rectangles that will be packed into the font atlas texture. Register them before building the atlas, then call Build().
+- You can then use ImFontAtlas::GetCustomRectByIndex(int) to query the position/size of your rectangle within the texture, and blit/copy any graphics data of your choice into those rectangles.
+
+#### Pseudo-code:
+```
+  // Add font, then register two custom 13x13 rectangles mapped to glyph 'a' and 'b' of this font
+  ImFont* font = io.Fonts->AddFontDefault();
+  int rect_ids[2];
+  rect_ids[0] = io.Fonts->AddCustomRectFontGlyph(font, 'a', 13, 13, 13+1);
+  rect_ids[1] = io.Fonts->AddCustomRectFontGlyph(font, 'b', 13, 13, 13+1);
+
+  // Build atlas
+  io.Fonts->Build();
+
+  // Retrieve texture in RGBA format
+  unsigned char* tex_pixels = NULL;
+  int tex_width, tex_height;
+  io.Fonts->GetTexDataAsRGBA32(&tex_pixels, &tex_width, &tex_height);
+
+  for (int rect_n = 0; rect_n < IM_ARRAYSIZE(rect_ids); rect_n++)
+  {
+      int rect_id = rects_ids[rect_n];
+      if (const ImFontAtlas::CustomRect* rect = io.Fonts->GetCustomRectByIndex(rect_id))
+      {
+          // Fill the custom rectangle with red pixels (in reality you would draw/copy your bitmap data here!)
+          for (int y = 0; y < rect->Height; y++)
+          {
+              ImU32* p = (ImU32*)tex_pixels + (rect->Y + y) * tex_width + (rect->X);
+              for (int x = rect->Width; x > 0; x--)
+                  *p++ = IM_COL32(255, 0, 0, 255);
+          }
+      }
+  }
+```
+
+---------------------------------------
+ ## Embedding Fonts In Source Code
+
+- Compile and use 'binary\_to\_compressed\_c.cpp' to create a compressed C style array that you can embed in source code.
+- See the documentation in binary\_to\_compressed\_c.cpp for instruction on how to use the tool.
+- You may find a precompiled version binary_to_compressed_c.exe for Windows instead of demo binaries package (see README).
+- The tool can optionally output Base85 encoding to reduce the size of _source code_ but the read-only arrays in the actual binary will be about 20% bigger.
+
+Then load the font with:
+ ` ImFont* font = io.Fonts->AddFontFromMemoryCompressedTTF(compressed_data, compressed_data_size, size_pixels, ...); `
+or
+  `ImFont* font = io.Fonts- AddFontFromMemoryCompressedBase85TTF(compressed_data_base85, size_pixels, ...);
+  `
+
+
+---------------------------------------
+ ## Credits/Licenses For Fonts Included In This Folder
+
+Roboto-Medium.ttf
+
+  Apache License 2.0
+  by Christian Robertson
+  https://fonts.google.com/specimen/Roboto
+
+Cousine-Regular.ttf
+
+  by Steve Matteson
+  Digitized data copyright (c) 2010 Google Corporation.
+  Licensed under the SIL Open Font License, Version 1.1
+  https://fonts.google.com/specimen/Cousine
+
+DroidSans.ttf
+
+  Copyright (c) Steve Matteson
+  Apache License, version 2.0
+  https://www.fontsquirrel.com/fonts/droid-sans
+
+ProggyClean.ttf
+
+  Copyright (c) 2004, 2005 Tristan Grimmer
+  MIT License
+  recommended loading setting: Size = 13.0, DisplayOffset.Y = +1
+  http://www.proggyfonts.net/
+
+ProggyTiny.ttf
+  Copyright (c) 2004, 2005 Tristan Grimmer
+  MIT License
+  recommended loading setting: Size = 10.0, DisplayOffset.Y = +1
+  http://www.proggyfonts.net/
+
+Karla-Regular.ttf
+  Copyright (c) 2012, Jonathan Pinhorn
+  SIL OPEN FONT LICENSE Version 1.1
+
+
+---------------------------------------
+ ## Font Links
+
+#### ICON FONTS
+
+  C/C++ header for icon fonts (#define with code points to use in source code string literals)
+  https://github.com/juliettef/IconFontCppHeaders
+
+  FontAwesome
+  https://fortawesome.github.io/Font-Awesome
+
+  OpenFontIcons
+  https://github.com/traverseda/OpenFontIcons
+
+  Google Icon Fonts
+  https://design.google.com/icons/
+
+  Kenney Icon Font (Game Controller Icons)
+  https://github.com/nicodinh/kenney-icon-font
+
+  IcoMoon - Custom Icon font builder
+  https://icomoon.io/app
+
+#### REGULAR FONTS
+
+  Google Noto Fonts (worldwide languages)
+  https://www.google.com/get/noto/
+
+  Open Sans Fonts
+  https://fonts.google.com/specimen/Open+Sans
+
+  (Japanese) M+ fonts by Coji Morishita are free
+  http://mplus-fonts.sourceforge.jp/mplus-outline-fonts/index-en.html
+
+#### MONOSPACE FONTS
+
+  (Pixel Perfect) Proggy Fonts, by Tristan Grimmer
+  http://www.proggyfonts.net or http://upperbounds.net
+
+  (Pixel Perfect) Sweet16, Sweet16 Mono, by Martin Sedlak (Latin + Supplemental + Extended A)
+  https://github.com/kmar/Sweet16Font
+  Also include .inl file to use directly in dear imgui.
+
+  Google Noto Mono Fonts
+  https://www.google.com/get/noto/
+
+  Typefaces for source code beautification
+  https://github.com/chrissimpkins/codeface
+
+  Programmation fonts
+  http://s9w.github.io/font_compare/
+
+  Inconsolata
+  http://www.levien.com/type/myfonts/inconsolata.html
+
+  Adobe Source Code Pro: Monospaced font family for user interface and coding environments
+  https://github.com/adobe-fonts/source-code-pro
+
+  Monospace/Fixed Width Programmer's Fonts
+  http://www.lowing.org/fonts/
+
+
+ Or use Arial Unicode or other Unicode fonts provided with Windows for full characters coverage (not sure of their licensing).
diff --git a/misc/fonts/README.txt b/misc/fonts/README.txt
deleted file mode 100644
index 0f335c7..0000000
--- a/misc/fonts/README.txt
+++ /dev/null
@@ -1,364 +0,0 @@
-----------------------------------------------------------------------
- dear imgui, v1.74 WIP
-----------------------------------------------------------------------
- misc/fonts/README.txt
- This is the Readme dedicated to fonts.
-----------------------------------------------------------------------
-
-The code in imgui.cpp embeds a copy of 'ProggyClean.ttf' (by Tristan Grimmer),
-a 13 pixels high, pixel-perfect font used by default.
-We embed it font in source code so you can use Dear ImGui without any file system access.
-
-You may also load external .TTF/.OTF files.
-The files in this folder are suggested fonts, provided as a convenience.
-
-Fonts are rasterized in a single texture at the time of calling either of io.Fonts->GetTexDataAsAlpha8()/GetTexDataAsRGBA32()/Build().
-Please read the FAQ: https://www.dearimgui.org/faq
-Please use the Discord server: http://discord.dearimgui.org and not the Github issue tracker for basic font loading questions.
-
-
----------------------------------------
- INDEX:
----------------------------------------
-
-- Readme First / FAQ
-- Using Icons
-- Fonts Loading Instructions
-- FreeType rasterizer, Small font sizes
-- Building Custom Glyph Ranges
-- Using custom colorful icons
-- Embedding Fonts in Source Code
-- Credits/Licences for fonts included in this folder
-- Fonts Links
-
-
----------------------------------------
- README FIRST / FAQ
----------------------------------------
-
-- You can use the style editor ImGui::ShowStyleEditor() in the "Fonts" section to browse your fonts
-  and understand what's going on if you have an issue.
-- Make sure your font ranges data are persistent (available during the call to GetTexDataAsAlpha8()/GetTexDataAsRGBA32()/Build().
-- Use C++11 u8"my text" syntax to encode literal strings as UTF-8. e.g.:
-      u8"hello"
-      u8"こんにちは"   // this will be encoded as UTF-8
-- If you want to include a backslash \ character in your string literal, you need to double them e.g. "folder\\filename".
-
-
----------------------------------------
- USING ICONS
----------------------------------------
-
-Using an icon font (such as FontAwesome: http://fontawesome.io or OpenFontIcons. https://github.com/traverseda/OpenFontIcons)
-is an easy and practical way to use icons in your Dear ImGui application.
-A common pattern is to merge the icon font within your main font, so you can embed icons directly from your strings without
-having to change fonts back and forth.
-
-To refer to the icon UTF-8 codepoints from your C++ code, you may use those headers files created by Juliette Foucaut:
-  https://github.com/juliettef/IconFontCppHeaders
-
-The C++11 version of those files uses the u8"" utf-8 encoding syntax + \u
-  #define ICON_FA_SEARCH  u8"\uf002"
-The pre-C++11 version has the values directly encoded as utf-8:
-  #define ICON_FA_SEARCH  "\xEF\x80\x82"
-
-Example Setup:
-
-  // Merge icons into default tool font
-  #include "IconsFontAwesome.h"
-  ImGuiIO& io = ImGui::GetIO();
-  io.Fonts->AddFontDefault();
-
-  ImFontConfig config;
-  config.MergeMode = true;
-  config.GlyphMinAdvanceX = 13.0f; // Use if you want to make the icon monospaced
-  static const ImWchar icon_ranges[] = { ICON_MIN_FA, ICON_MAX_FA, 0 };
-  io.Fonts->AddFontFromFileTTF("fonts/fontawesome-webfont.ttf", 13.0f, &config, icon_ranges);
-
-Example Usage:
-
-  // Usage, e.g.
-  ImGui::Text("%s among %d items", ICON_FA_SEARCH, count);
-  ImGui::Button(ICON_FA_SEARCH " Search");
-  // C string _literals_ can be concatenated at compilation time, e.g. "hello" " world"
-  // ICON_FA_SEARCH is defined as a string literal so this is the same as "A" "B" becoming "AB"
-
-See Links below for other icons fonts and related tools.
-
-
----------------------------------------
- FONTS LOADING INSTRUCTIONS
----------------------------------------
-
-Load default font:
-
-  ImGuiIO& io = ImGui::GetIO();
-  io.Fonts->AddFontDefault();
-
-Load .TTF/.OTF file with:
-
-  ImGuiIO& io = ImGui::GetIO();
-  ImFont* font1 = io.Fonts->AddFontFromFileTTF("font.ttf", size_pixels);
-  ImFont* font2 = io.Fonts->AddFontFromFileTTF("anotherfont.otf", size_pixels);
-
-  // Select font at runtime
-  ImGui::Text("Hello");	// use the default font (which is the first loaded font)
-  ImGui::PushFont(font2);
-  ImGui::Text("Hello with another font");
-  ImGui::PopFont();
-
-For advanced options create a ImFontConfig structure and pass it to the AddFont function (it will be copied internally):
-
-  ImFontConfig config;
-  config.OversampleH = 2;
-  config.OversampleV = 1;
-  config.GlyphExtraSpacing.x = 1.0f;
-  ImFont* font = io.Fonts->AddFontFromFileTTF("font.ttf", size_pixels, &config);
-
-Read about oversampling here:
-  https://github.com/nothings/stb/blob/master/tests/oversample
-
-If you have very large number of glyphs or multiple fonts, the texture may become too big for your graphics API.
-The typical result of failing to upload a texture is if every glyphs appears as white rectangles.
-In particular, using a large range such as GetGlyphRangesChineseSimplifiedCommon() is not recommended unless you
-set OversampleH/OversampleV to 1 and use a small font size.
-Mind the fact that some graphics drivers have texture size limitation.
-If you are building a PC application, mind the fact that your users may use hardware with lower limitations than yours.
-Some solutions:
-
- - 1) Reduce glyphs ranges by calculating them from source localization data.
-   You can use ImFontGlyphRangesBuilder for this purpose, this will be the biggest win!
- - 2) You may reduce oversampling, e.g. config.OversampleH = config.OversampleV = 1, this will largely reduce your texture size.
- - 3) Set io.Fonts.TexDesiredWidth to specify a texture width to minimize texture height (see comment in ImFontAtlas::Build function).
- - 4) Set io.Fonts.Flags |= ImFontAtlasFlags_NoPowerOfTwoHeight; to disable rounding the texture height to the next power of two.
-
-Combine two fonts into one:
-
-  // Load a first font
-  ImFont* font = io.Fonts->AddFontDefault();
-
-  // Add character ranges and merge into the previous font
-  // The ranges array is not copied by the AddFont* functions and is used lazily
-  // so ensure it is available at the time of building or calling GetTexDataAsRGBA32().
-  static const ImWchar icons_ranges[] = { 0xf000, 0xf3ff, 0 }; // Will not be copied by AddFont* so keep in scope.
-  ImFontConfig config;
-  config.MergeMode = true;
-  io.Fonts->AddFontFromFileTTF("DroidSans.ttf", 18.0f, &config, io.Fonts->GetGlyphRangesJapanese());
-  io.Fonts->AddFontFromFileTTF("fontawesome-webfont.ttf", 18.0f, &config, icons_ranges);
-  io.Fonts->Build();
-
-Add a fourth parameter to bake specific font ranges only:
-
-  // Basic Latin, Extended Latin
-  io.Fonts->AddFontFromFileTTF("font.ttf", size_pixels, NULL, io.Fonts->GetGlyphRangesDefault());
-
-  // Default + Selection of 2500 Ideographs used by Simplified Chinese
-  io.Fonts->AddFontFromFileTTF("font.ttf", size_pixels, NULL, io.Fonts->GetGlyphRangesChineseSimplifiedCommon());
-
-  // Default + Hiragana, Katakana, Half-Width, Selection of 1946 Ideographs
-  io.Fonts->AddFontFromFileTTF("font.ttf", size_pixels, NULL, io.Fonts->GetGlyphRangesJapanese());
-
-See "BUILDING CUSTOM GLYPH RANGES" section to create your own ranges.
-Offset font vertically by altering the io.Font->DisplayOffset value:
-
-  ImFont* font = io.Fonts->AddFontFromFileTTF("font.ttf", size_pixels);
-  font->DisplayOffset.y = 1;   // Render 1 pixel down
-
-
----------------------------------------
- FREETYPE RASTERIZER, SMALL FONT SIZES
----------------------------------------
-
-Dear ImGui uses imstb_truetype.h to rasterize fonts (with optional oversampling).
-This technique and its implementation are not ideal for fonts rendered at _small sizes_, which may appear a
-little blurry or hard to read.
-
-There is an implementation of the ImFontAtlas builder using FreeType that you can use in the misc/freetype/ folder.
-
-FreeType supports auto-hinting which tends to improve the readability of small fonts.
-Note that this code currently creates textures that are unoptimally too large (could be fixed with some work).
-Also note that correct sRGB space blending will have an important effect on your font rendering quality.
-
-
----------------------------------------
- BUILDING CUSTOM GLYPH RANGES
----------------------------------------
-
-You can use the ImFontGlyphRangesBuilder helper to create glyph ranges based on text input.
-For example: for a game where your script is known, if you can feed your entire script to it and only build the characters the game needs.
-
-  ImVector<ImWchar> ranges;
-  ImFontGlyphRangesBuilder builder;
-  builder.AddText("Hello world");                        // Add a string (here "Hello world" contains 7 unique characters)
-  builder.AddChar(0x7262);                               // Add a specific character
-  builder.AddRanges(io.Fonts->GetGlyphRangesJapanese()); // Add one of the default ranges
-  builder.BuildRanges(&ranges);                          // Build the final result (ordered ranges with all the unique characters submitted)
-
-  io.Fonts->AddFontFromFileTTF("myfontfile.ttf", size_in_pixels, NULL, ranges.Data);
-  io.Fonts->Build();                                     // Build the atlas while 'ranges' is still in scope and not deleted.
-
-
----------------------------------------
- USING CUSTOM COLORFUL ICONS
----------------------------------------
-
-(This is a BETA api, use if you are familiar with dear imgui and with your rendering back-end)
-
-You can use the ImFontAtlas::AddCustomRect() and ImFontAtlas::AddCustomRectFontGlyph() api to register rectangles
-that will be packed into the font atlas texture. Register them before building the atlas, then call Build().
-You can then use ImFontAtlas::GetCustomRectByIndex(int) to query the position/size of your rectangle within the
-texture, and blit/copy any graphics data of your choice into those rectangles.
-
-Pseudo-code:
-
-  // Add font, then register two custom 13x13 rectangles mapped to glyph 'a' and 'b' of this font
-  ImFont* font = io.Fonts->AddFontDefault();
-  int rect_ids[2];
-  rect_ids[0] = io.Fonts->AddCustomRectFontGlyph(font, 'a', 13, 13, 13+1);
-  rect_ids[1] = io.Fonts->AddCustomRectFontGlyph(font, 'b', 13, 13, 13+1);
-
-  // Build atlas
-  io.Fonts->Build();
-
-  // Retrieve texture in RGBA format
-  unsigned char* tex_pixels = NULL;
-  int tex_width, tex_height;
-  io.Fonts->GetTexDataAsRGBA32(&tex_pixels, &tex_width, &tex_height);
-
-  for (int rect_n = 0; rect_n < IM_ARRAYSIZE(rect_ids); rect_n++)
-  {
-      int rect_id = rects_ids[rect_n];
-      if (const ImFontAtlas::CustomRect* rect = io.Fonts->GetCustomRectByIndex(rect_id))
-      {
-          // Fill the custom rectangle with red pixels (in reality you would draw/copy your bitmap data here!)
-          for (int y = 0; y < rect->Height; y++)
-          {
-              ImU32* p = (ImU32*)tex_pixels + (rect->Y + y) * tex_width + (rect->X);
-              for (int x = rect->Width; x > 0; x--)
-                  *p++ = IM_COL32(255, 0, 0, 255);
-          }
-      }
-  }
-
-
----------------------------------------
- EMBEDDING FONTS IN SOURCE CODE
----------------------------------------
-
-Compile and use 'binary_to_compressed_c.cpp' to create a compressed C style array that you can embed in source code.
-See the documentation in binary_to_compressed_c.cpp for instruction on how to use the tool.
-You may find a precompiled version binary_to_compressed_c.exe for Windows instead of demo binaries package (see README).
-The tool can optionally output Base85 encoding to reduce the size of _source code_ but the read-only arrays in the
-actual binary will be about 20% bigger.
-
-Then load the font with:
-  ImFont* font = io.Fonts->AddFontFromMemoryCompressedTTF(compressed_data, compressed_data_size, size_pixels, ...);
-or:
-  ImFont* font = io.Fonts->AddFontFromMemoryCompressedBase85TTF(compressed_data_base85, size_pixels, ...);
-
-
----------------------------------------
- CREDITS/LICENSES FOR FONTS INCLUDED IN THIS FOLDER
----------------------------------------
-
-Roboto-Medium.ttf
-
-  Apache License 2.0
-  by Christian Robertson
-  https://fonts.google.com/specimen/Roboto
-
-Cousine-Regular.ttf
-
-  by Steve Matteson
-  Digitized data copyright (c) 2010 Google Corporation.
-  Licensed under the SIL Open Font License, Version 1.1
-  https://fonts.google.com/specimen/Cousine
-
-DroidSans.ttf
-
-  Copyright (c) Steve Matteson
-  Apache License, version 2.0
-  https://www.fontsquirrel.com/fonts/droid-sans
-
-ProggyClean.ttf
-
-  Copyright (c) 2004, 2005 Tristan Grimmer
-  MIT License
-  recommended loading setting: Size = 13.0, DisplayOffset.Y = +1
-  http://www.proggyfonts.net/
-
-ProggyTiny.ttf
-  Copyright (c) 2004, 2005 Tristan Grimmer
-  MIT License
-  recommended loading setting: Size = 10.0, DisplayOffset.Y = +1
-  http://www.proggyfonts.net/
-
-Karla-Regular.ttf
-  Copyright (c) 2012, Jonathan Pinhorn
-  SIL OPEN FONT LICENSE Version 1.1
-
-
----------------------------------------
- FONTS LINKS
----------------------------------------
-
-ICON FONTS
-
-  C/C++ header for icon fonts (#define with code points to use in source code string literals)
-  https://github.com/juliettef/IconFontCppHeaders
-
-  FontAwesome
-  https://fortawesome.github.io/Font-Awesome
-
-  OpenFontIcons
-  https://github.com/traverseda/OpenFontIcons
-
-  Google Icon Fonts
-  https://design.google.com/icons/
-
-  Kenney Icon Font (Game Controller Icons)
-  https://github.com/nicodinh/kenney-icon-font
-
-  IcoMoon - Custom Icon font builder
-  https://icomoon.io/app
-
-REGULAR FONTS
-
-  Google Noto Fonts (worldwide languages)
-  https://www.google.com/get/noto/
-
-  Open Sans Fonts
-  https://fonts.google.com/specimen/Open+Sans
-
-  (Japanese) M+ fonts by Coji Morishita are free
-  http://mplus-fonts.sourceforge.jp/mplus-outline-fonts/index-en.html
-
-MONOSPACE FONTS
-
-  (Pixel Perfect) Proggy Fonts, by Tristan Grimmer
-  http://www.proggyfonts.net or http://upperbounds.net
-
-  (Pixel Perfect) Sweet16, Sweet16 Mono, by Martin Sedlak (Latin + Supplemental + Extended A)
-  https://github.com/kmar/Sweet16Font
-  Also include .inl file to use directly in dear imgui.
-
-  Google Noto Mono Fonts
-  https://www.google.com/get/noto/
-
-  Typefaces for source code beautification
-  https://github.com/chrissimpkins/codeface
-
-  Programmation fonts
-  http://s9w.github.io/font_compare/
-
-  Inconsolata
-  http://www.levien.com/type/myfonts/inconsolata.html
-
-  Adobe Source Code Pro: Monospaced font family for user interface and coding environments
-  https://github.com/adobe-fonts/source-code-pro
-
-  Monospace/Fixed Width Programmer's Fonts
-  http://www.lowing.org/fonts/
-
-
- Or use Arial Unicode or other Unicode fonts provided with Windows for full characters coverage (not sure of their licensing).
