Fixed font gamma-correction
Also did some cleanup.
This commit is contained in:
parent
8fe1b5d96f
commit
69a2357ca3
2 changed files with 20 additions and 21 deletions
27
src/Font.cpp
27
src/Font.cpp
|
@ -21,6 +21,18 @@
|
||||||
#define MIN(a,b) ((a) < (b) ? (a) : (b))
|
#define MIN(a,b) ((a) < (b) ? (a) : (b))
|
||||||
#define MAX(a,b) ((a) > (b) ? (a) : (b))
|
#define MAX(a,b) ((a) > (b) ? (a) : (b))
|
||||||
|
|
||||||
|
typedef struct FontObject
|
||||||
|
{
|
||||||
|
FT_Library library;
|
||||||
|
FT_Face face;
|
||||||
|
#ifndef DISABLE_FONT_ANTIALIASING
|
||||||
|
bool lcd_mode;
|
||||||
|
#endif
|
||||||
|
#ifdef JAPANESE
|
||||||
|
iconv_t conv;
|
||||||
|
#endif
|
||||||
|
} FontObject;
|
||||||
|
|
||||||
static unsigned long UTF8ToCode(const unsigned char *string, unsigned int *bytes_read)
|
static unsigned long UTF8ToCode(const unsigned char *string, unsigned int *bytes_read)
|
||||||
{
|
{
|
||||||
unsigned int length;
|
unsigned int length;
|
||||||
|
@ -176,21 +188,17 @@ void DrawText(FontObject *font_object, SDL_Renderer *renderer, SDL_Texture *text
|
||||||
{
|
{
|
||||||
for (int ix = MAX(-letter_x, 0); letter_x + ix < MIN(letter_x + (int)converted.width / 3, surface_width); ++ix)
|
for (int ix = MAX(-letter_x, 0); letter_x + ix < MIN(letter_x + (int)converted.width / 3, surface_width); ++ix)
|
||||||
{
|
{
|
||||||
unsigned char (*font_buffer)[converted.pitch / 3][3] = (unsigned char (*)[converted.pitch / 3][3])converted.buffer;
|
const unsigned char (*font_buffer)[converted.pitch / 3][3] = (unsigned char (*)[converted.pitch / 3][3])converted.buffer;
|
||||||
|
|
||||||
unsigned char *font_pixel = font_buffer[iy][ix];
|
const unsigned char *font_pixel = font_buffer[iy][ix];
|
||||||
unsigned char *surface_pixel = surface_buffer[letter_y + iy][letter_x + ix];
|
unsigned char *surface_pixel = surface_buffer[letter_y + iy][letter_x + ix];
|
||||||
|
|
||||||
if (font_pixel[0] || font_pixel[1] || font_pixel[2])
|
if (font_pixel[0] || font_pixel[1] || font_pixel[2])
|
||||||
{
|
{
|
||||||
for (unsigned int j = 0; j < 3; ++j)
|
for (unsigned int j = 0; j < 3; ++j)
|
||||||
{
|
{
|
||||||
unsigned char colour_accumulator = surface_pixel[j];
|
const double alpha = pow((font_pixel[j] / 255.0), 1.0 / 1.8); // Gamma correction
|
||||||
|
surface_pixel[j] = (colours[j] * alpha) + (surface_pixel[j] * (1.0 - alpha)); // Alpha blending
|
||||||
colour_accumulator = ((colours[j] * font_pixel[j]) / 0xFF) + ((colour_accumulator * (0xFF - font_pixel[j])) / 0xFF); // Alpha blending
|
|
||||||
colour_accumulator = 255.0 * pow((colour_accumulator / 255.0), 1.0 / 1.8); // Gamma correction
|
|
||||||
|
|
||||||
surface_pixel[j] = colour_accumulator;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
surface_pixel[3] = 0xFF;
|
surface_pixel[3] = 0xFF;
|
||||||
|
@ -203,8 +211,7 @@ void DrawText(FontObject *font_object, SDL_Renderer *renderer, SDL_Texture *text
|
||||||
{
|
{
|
||||||
unsigned char (*font_buffer)[converted.pitch] = (unsigned char (*)[converted.pitch])converted.buffer;
|
unsigned char (*font_buffer)[converted.pitch] = (unsigned char (*)[converted.pitch])converted.buffer;
|
||||||
|
|
||||||
const double raw_alpha = (double)font_buffer[iy][ix] / (converted.num_grays - 1);
|
const double alpha = pow((double)font_buffer[iy][ix] / (converted.num_grays - 1), 1.0 / 1.8); // Gamma-corrected
|
||||||
const double alpha = pow(raw_alpha, 1.0 / 1.8); // Gamma-corrected
|
|
||||||
|
|
||||||
unsigned char *surface_pixel = surface_buffer[letter_y + iy][letter_x + ix];
|
unsigned char *surface_pixel = surface_buffer[letter_y + iy][letter_x + ix];
|
||||||
|
|
||||||
|
|
14
src/Font.h
14
src/Font.h
|
@ -1,5 +1,7 @@
|
||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
|
#include <stdbool.h>
|
||||||
|
|
||||||
#include <iconv.h>
|
#include <iconv.h>
|
||||||
|
|
||||||
#include <ft2build.h>
|
#include <ft2build.h>
|
||||||
|
@ -7,17 +9,7 @@
|
||||||
|
|
||||||
#include "SDL.h"
|
#include "SDL.h"
|
||||||
|
|
||||||
typedef struct FontObject
|
typedef struct FontObject FontObject;
|
||||||
{
|
|
||||||
FT_Library library;
|
|
||||||
FT_Face face;
|
|
||||||
#ifndef DISABLE_FONT_ANTIALIASING
|
|
||||||
bool lcd_mode;
|
|
||||||
#endif
|
|
||||||
#ifdef JAPANESE
|
|
||||||
iconv_t conv;
|
|
||||||
#endif
|
|
||||||
} FontObject;
|
|
||||||
|
|
||||||
FontObject* LoadFont(unsigned int cell_width, unsigned int cell_height, char *font_filename);
|
FontObject* LoadFont(unsigned int cell_width, unsigned int cell_height, char *font_filename);
|
||||||
void DrawText(FontObject *font_object, SDL_Renderer *renderer, SDL_Texture *texture, int x, int y, unsigned long colour, const char *string, size_t string_length);
|
void DrawText(FontObject *font_object, SDL_Renderer *renderer, SDL_Texture *texture, int x, int y, unsigned long colour, const char *string, size_t string_length);
|
||||||
|
|
Loading…
Add table
Reference in a new issue