feat: TrueType (TTF) font rendering, many new desktop applications and DOOM support, among other improvements
This commit is contained in:
@@ -0,0 +1,95 @@
|
||||
/*
|
||||
* stb_math.h
|
||||
* Math functions for stb_truetype in freestanding environment
|
||||
* Copyright (c) 2026 Daniel Hammer
|
||||
*/
|
||||
|
||||
#ifndef STB_MATH_H
|
||||
#define STB_MATH_H
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
static inline double stb_floor(double x) {
|
||||
double i = (double)(long long)x;
|
||||
return (x < i) ? i - 1.0 : i;
|
||||
}
|
||||
|
||||
static inline double stb_ceil(double x) {
|
||||
double f = stb_floor(x);
|
||||
return (x > f) ? f + 1.0 : f;
|
||||
}
|
||||
|
||||
static inline double stb_fabs(double x) {
|
||||
return x < 0.0 ? -x : x;
|
||||
}
|
||||
|
||||
static inline double stb_fmod(double x, double y) {
|
||||
if (y == 0.0) return 0.0;
|
||||
return x - (double)((long long)(x / y)) * y;
|
||||
}
|
||||
|
||||
static inline double stb_sqrt(double x) {
|
||||
if (x <= 0.0) return 0.0;
|
||||
double guess = x;
|
||||
for (int i = 0; i < 30; i++)
|
||||
guess = (guess + x / guess) * 0.5;
|
||||
return guess;
|
||||
}
|
||||
|
||||
static inline double stb_pow(double base, double exp) {
|
||||
if (exp == 0.0) return 1.0;
|
||||
if (exp == 1.0) return base;
|
||||
if (base == 0.0) return 0.0;
|
||||
// Integer exponent fast path
|
||||
if (exp == (double)(long long)exp) {
|
||||
long long e = (long long)exp;
|
||||
int neg = 0;
|
||||
if (e < 0) { neg = 1; e = -e; }
|
||||
double r = 1.0;
|
||||
double b = base;
|
||||
while (e > 0) {
|
||||
if (e & 1) r *= b;
|
||||
b *= b;
|
||||
e >>= 1;
|
||||
}
|
||||
return neg ? 1.0 / r : r;
|
||||
}
|
||||
return 0.0;
|
||||
}
|
||||
|
||||
static inline double stb_cos(double x) {
|
||||
// Reduce to [0, 2*pi]
|
||||
const double PI = 3.14159265358979323846;
|
||||
const double TWO_PI = 6.28318530717958647692;
|
||||
x = stb_fmod(stb_fabs(x), TWO_PI);
|
||||
// Taylor series: cos(x) = 1 - x^2/2! + x^4/4! - x^6/6! + ...
|
||||
double x2 = x * x;
|
||||
double term = 1.0;
|
||||
double result = 1.0;
|
||||
for (int i = 1; i <= 10; i++) {
|
||||
term *= -x2 / (double)((2 * i - 1) * (2 * i));
|
||||
result += term;
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
static inline double stb_acos(double x) {
|
||||
// Clamp input
|
||||
if (x <= -1.0) return 3.14159265358979323846;
|
||||
if (x >= 1.0) return 0.0;
|
||||
// Polynomial approximation (Abramowitz & Stegun style)
|
||||
double ax = stb_fabs(x);
|
||||
double result = (-0.0187293 * ax + 0.0742610) * ax - 0.2121144;
|
||||
result = (result * ax + 1.5707288) * stb_sqrt(1.0 - ax);
|
||||
if (x < 0.0)
|
||||
return 3.14159265358979323846 - result;
|
||||
return result;
|
||||
}
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif // STB_MATH_H
|
||||
Reference in New Issue
Block a user