2018-07-15 21:04:12 +03:00
|
|
|
/*******************************************************************************************
|
|
|
|
*
|
2022-07-20 02:28:37 +03:00
|
|
|
* raylib [text] example - Font SDF loading
|
2018-07-15 21:04:12 +03:00
|
|
|
*
|
2022-07-20 02:28:37 +03:00
|
|
|
* Example originally created with raylib 1.3, last time updated with raylib 4.0
|
2018-07-15 21:04:12 +03:00
|
|
|
*
|
2022-07-20 02:28:37 +03:00
|
|
|
* Example licensed under an unmodified zlib/libpng license, which is an OSI-certified,
|
|
|
|
* BSD-like license that allows static linking with closed source software
|
|
|
|
*
|
2023-01-01 18:00:56 +03:00
|
|
|
* Copyright (c) 2015-2023 Ramon Santamaria (@raysan5)
|
2018-07-15 21:04:12 +03:00
|
|
|
*
|
|
|
|
********************************************************************************************/
|
|
|
|
|
|
|
|
#include "raylib.h"
|
|
|
|
|
2019-05-17 02:17:40 +03:00
|
|
|
#if defined(PLATFORM_DESKTOP)
|
|
|
|
#define GLSL_VERSION 330
|
|
|
|
#else // PLATFORM_RPI, PLATFORM_ANDROID, PLATFORM_WEB
|
|
|
|
#define GLSL_VERSION 100
|
|
|
|
#endif
|
|
|
|
|
BREAKING CHANGE: Read description
Changes:
- Font structure has been redesigned, CharInfo structure contained character rectangle within font texture, it has not much sense, considering that it was an information relative to the font atlas generated and not the character itself, so character rectangles have been moved out from CharInfo to Font.
- CharInfo included a data parameters to contain character pixel data (usually grayscale), generated on TTF font generation. It was inconsistent with other fonts types, so, now CharInfo includes directly an Image of the glyph.
- REDESIGNED: GenImageFontAtlas(), additional recs parameter added, loaded and filled inside the function to export atlas characters rectangles, instead of silently modify the input CharInfo data.
- REVIEWED: ImageTextEx(), funtion retrieved the font atlas image from the GPU, that was slow and problematic in several platforms. Now it uses directly the CharInfo image. Support for unicode codepoints has also been added.
- REDESIGNED: ImageDraw(), now it includes an additional parameter, the color tint, not only it could be useful for several situations but also function signature is more consistent with similar functions.
- ADDED: ImageFromImage() to generate a new image from a piece of another image.
- REVIEWED: GetNextCodepoint(), renamed parameters to be more clear.
Also all examples and games that were affected by those changes have been reviewed.
2019-07-24 16:05:14 +03:00
|
|
|
#include <stdlib.h>
|
|
|
|
|
2022-06-21 20:53:18 +03:00
|
|
|
//------------------------------------------------------------------------------------
|
|
|
|
// Program main entry point
|
|
|
|
//------------------------------------------------------------------------------------
|
2019-05-20 17:36:42 +03:00
|
|
|
int main(void)
|
2018-07-15 21:04:12 +03:00
|
|
|
{
|
|
|
|
// Initialization
|
|
|
|
//--------------------------------------------------------------------------------------
|
2019-05-20 17:36:42 +03:00
|
|
|
const int screenWidth = 800;
|
|
|
|
const int screenHeight = 450;
|
2018-07-15 21:04:12 +03:00
|
|
|
|
|
|
|
InitWindow(screenWidth, screenHeight, "raylib [text] example - SDF fonts");
|
|
|
|
|
|
|
|
// NOTE: Textures/Fonts MUST be loaded after Window initialization (OpenGL context is required)
|
2019-05-20 17:36:42 +03:00
|
|
|
|
2018-07-15 21:04:12 +03:00
|
|
|
const char msg[50] = "Signed Distance Fields";
|
2021-04-22 19:55:24 +03:00
|
|
|
|
2020-09-14 20:20:38 +03:00
|
|
|
// Loading file to memory
|
|
|
|
unsigned int fileSize = 0;
|
|
|
|
unsigned char *fileData = LoadFileData("resources/anonymous_pro_bold.ttf", &fileSize);
|
2018-07-15 21:04:12 +03:00
|
|
|
|
|
|
|
// Default font generation from TTF font
|
|
|
|
Font fontDefault = { 0 };
|
|
|
|
fontDefault.baseSize = 16;
|
2021-09-02 01:35:55 +03:00
|
|
|
fontDefault.glyphCount = 95;
|
2021-04-22 19:55:24 +03:00
|
|
|
|
2020-09-14 20:20:38 +03:00
|
|
|
// Loading font data from memory data
|
2021-09-02 01:35:55 +03:00
|
|
|
// Parameters > font size: 16, no glyphs array provided (0), glyphs count: 95 (autogenerate chars array)
|
|
|
|
fontDefault.glyphs = LoadFontData(fileData, fileSize, 16, 0, 95, FONT_DEFAULT);
|
|
|
|
// Parameters > glyphs count: 95, font size: 16, glyphs padding in image: 4 px, pack method: 0 (default)
|
|
|
|
Image atlas = GenImageFontAtlas(fontDefault.glyphs, &fontDefault.recs, 95, 16, 4, 0);
|
2018-07-15 21:04:12 +03:00
|
|
|
fontDefault.texture = LoadTextureFromImage(atlas);
|
|
|
|
UnloadImage(atlas);
|
2019-05-20 17:36:42 +03:00
|
|
|
|
2018-07-15 21:04:12 +03:00
|
|
|
// SDF font generation from TTF font
|
|
|
|
Font fontSDF = { 0 };
|
|
|
|
fontSDF.baseSize = 16;
|
2021-09-02 01:35:55 +03:00
|
|
|
fontSDF.glyphCount = 95;
|
|
|
|
// Parameters > font size: 16, no glyphs array provided (0), glyphs count: 0 (defaults to 95)
|
|
|
|
fontSDF.glyphs = LoadFontData(fileData, fileSize, 16, 0, 0, FONT_SDF);
|
|
|
|
// Parameters > glyphs count: 95, font size: 16, glyphs padding in image: 0 px, pack method: 1 (Skyline algorythm)
|
|
|
|
atlas = GenImageFontAtlas(fontSDF.glyphs, &fontSDF.recs, 95, 16, 0, 1);
|
2018-07-15 21:04:12 +03:00
|
|
|
fontSDF.texture = LoadTextureFromImage(atlas);
|
|
|
|
UnloadImage(atlas);
|
2021-04-22 19:55:24 +03:00
|
|
|
|
2020-12-24 15:51:24 +03:00
|
|
|
UnloadFileData(fileData); // Free memory from loaded file
|
2019-05-20 17:36:42 +03:00
|
|
|
|
2018-07-15 21:04:12 +03:00
|
|
|
// Load SDF required shader (we use default vertex shader)
|
2020-08-16 12:28:15 +03:00
|
|
|
Shader shader = LoadShader(0, TextFormat("resources/shaders/glsl%i/sdf.fs", GLSL_VERSION));
|
2021-08-26 01:14:34 +03:00
|
|
|
SetTextureFilter(fontSDF.texture, TEXTURE_FILTER_BILINEAR); // Required for SDF font
|
2018-07-15 21:04:12 +03:00
|
|
|
|
2021-03-23 09:51:52 +03:00
|
|
|
Vector2 fontPosition = { 40, screenHeight/2.0f - 50 };
|
2019-05-27 01:18:15 +03:00
|
|
|
Vector2 textSize = { 0.0f, 0.0f };
|
2018-07-15 21:04:12 +03:00
|
|
|
float fontSize = 16.0f;
|
2019-05-20 17:36:42 +03:00
|
|
|
int currentFont = 0; // 0 - fontDefault, 1 - fontSDF
|
2021-04-22 19:55:24 +03:00
|
|
|
|
2019-05-20 17:36:42 +03:00
|
|
|
SetTargetFPS(60); // Set our game to run at 60 frames-per-second
|
|
|
|
//--------------------------------------------------------------------------------------
|
|
|
|
|
2018-07-15 21:04:12 +03:00
|
|
|
// Main game loop
|
|
|
|
while (!WindowShouldClose()) // Detect window close button or ESC key
|
|
|
|
{
|
|
|
|
// Update
|
|
|
|
//----------------------------------------------------------------------------------
|
|
|
|
fontSize += GetMouseWheelMove()*8.0f;
|
2019-05-20 17:36:42 +03:00
|
|
|
|
2018-07-15 21:04:12 +03:00
|
|
|
if (fontSize < 6) fontSize = 6;
|
2019-05-20 17:36:42 +03:00
|
|
|
|
2018-07-15 21:04:12 +03:00
|
|
|
if (IsKeyDown(KEY_SPACE)) currentFont = 1;
|
|
|
|
else currentFont = 0;
|
2019-05-20 17:36:42 +03:00
|
|
|
|
2018-07-15 21:04:12 +03:00
|
|
|
if (currentFont == 0) textSize = MeasureTextEx(fontDefault, msg, fontSize, 0);
|
|
|
|
else textSize = MeasureTextEx(fontSDF, msg, fontSize, 0);
|
2019-05-20 17:36:42 +03:00
|
|
|
|
2018-07-15 21:04:12 +03:00
|
|
|
fontPosition.x = GetScreenWidth()/2 - textSize.x/2;
|
|
|
|
fontPosition.y = GetScreenHeight()/2 - textSize.y/2 + 80;
|
|
|
|
//----------------------------------------------------------------------------------
|
2019-05-20 17:36:42 +03:00
|
|
|
|
2018-07-15 21:04:12 +03:00
|
|
|
// Draw
|
|
|
|
//----------------------------------------------------------------------------------
|
|
|
|
BeginDrawing();
|
2019-05-20 17:36:42 +03:00
|
|
|
|
2018-07-15 21:04:12 +03:00
|
|
|
ClearBackground(RAYWHITE);
|
2019-05-20 17:36:42 +03:00
|
|
|
|
2018-07-15 21:04:12 +03:00
|
|
|
if (currentFont == 1)
|
|
|
|
{
|
|
|
|
// NOTE: SDF fonts require a custom SDf shader to compute fragment color
|
|
|
|
BeginShaderMode(shader); // Activate SDF font shader
|
|
|
|
DrawTextEx(fontSDF, msg, fontPosition, fontSize, 0, BLACK);
|
|
|
|
EndShaderMode(); // Activate our default shader for next drawings
|
2019-05-20 17:36:42 +03:00
|
|
|
|
2018-07-15 21:04:12 +03:00
|
|
|
DrawTexture(fontSDF.texture, 10, 10, BLACK);
|
|
|
|
}
|
2019-05-20 17:36:42 +03:00
|
|
|
else
|
2018-07-15 21:04:12 +03:00
|
|
|
{
|
|
|
|
DrawTextEx(fontDefault, msg, fontPosition, fontSize, 0, BLACK);
|
|
|
|
DrawTexture(fontDefault.texture, 10, 10, BLACK);
|
|
|
|
}
|
2019-05-20 17:36:42 +03:00
|
|
|
|
2018-07-15 21:24:18 +03:00
|
|
|
if (currentFont == 1) DrawText("SDF!", 320, 20, 80, RED);
|
|
|
|
else DrawText("default font", 315, 40, 30, GRAY);
|
2018-07-15 21:04:12 +03:00
|
|
|
|
|
|
|
DrawText("FONT SIZE: 16.0", GetScreenWidth() - 240, 20, 20, DARKGRAY);
|
2020-08-16 12:28:15 +03:00
|
|
|
DrawText(TextFormat("RENDER SIZE: %02.02f", fontSize), GetScreenWidth() - 240, 50, 20, DARKGRAY);
|
2018-07-15 21:04:12 +03:00
|
|
|
DrawText("Use MOUSE WHEEL to SCALE TEXT!", GetScreenWidth() - 240, 90, 10, DARKGRAY);
|
|
|
|
|
2019-05-31 17:42:16 +03:00
|
|
|
DrawText("HOLD SPACE to USE SDF FONT VERSION!", 340, GetScreenHeight() - 30, 20, MAROON);
|
2019-05-20 17:36:42 +03:00
|
|
|
|
2018-07-15 21:04:12 +03:00
|
|
|
EndDrawing();
|
|
|
|
//----------------------------------------------------------------------------------
|
|
|
|
}
|
|
|
|
|
|
|
|
// De-Initialization
|
|
|
|
//--------------------------------------------------------------------------------------
|
|
|
|
UnloadFont(fontDefault); // Default font unloading
|
|
|
|
UnloadFont(fontSDF); // SDF font unloading
|
2019-05-20 17:36:42 +03:00
|
|
|
|
2018-07-15 21:04:12 +03:00
|
|
|
UnloadShader(shader); // Unload SDF shader
|
2019-05-20 17:36:42 +03:00
|
|
|
|
2018-07-15 21:04:12 +03:00
|
|
|
CloseWindow(); // Close window and OpenGL context
|
|
|
|
//--------------------------------------------------------------------------------------
|
2019-05-20 17:36:42 +03:00
|
|
|
|
2018-07-15 21:04:12 +03:00
|
|
|
return 0;
|
|
|
|
}
|