Key event buffer overflow crash fixed; switched draw_string over to Vec2 and returning the distance measured in deltas

master
Allen Webster 2019-02-24 14:54:57 -08:00
parent 258257eb45
commit 410b90d44c
12 changed files with 341 additions and 322 deletions

View File

@ -11,6 +11,7 @@
#include <stdarg.h>
#include "4coder_base_types.h"
#include "4coder_base_types.cpp"
#include "4coder_lib/4coder_arena.h"
#include "4coder_lib/4coder_heap.h"
#include "4coder_lib/4coder_string.h"

View File

@ -1,23 +1,66 @@
/*
* Mr. 4th Dimention - Allen Webster
*
* 15.05.2015
*
* Math functions for 4coder
*
* 4coder base types
*/
// TOP
#define C_MATH 1
/*
* Scalar operators
*/
static i32
ceil32(f32 v){
return(((v)>0)?( (v == (i32)(v))?((i32)(v)):((i32)((v)+1.f)) ):( ((i32)(v)) ));
}
static i32
floor32(f32 v){
return(((v)<0)?( (v == (i32)(v))?((i32)(v)):((i32)((v)-1.f)) ):( ((i32)(v)) ));
}
static i32
round32(f32 v){
return(floor32(v + 0.5f));
}
static i32
trun32(f32 v){
return((i32)(v));
}
static i32
div_ceil(i32 n, i32 d){
return( ((n) % (d) != 0) + ((n) / (d)) );
}
static i32
l_round_up_i32(i32 x, i32 b){
i32 t = x + b - 1;
return(t - (t%b));
}
static u32
l_round_up_u32(u32 x, u32 b){
i32 t = x + b - 1;
return(t - (t%b));
}
static u32 round_up_pot_u32(u32 x){
--x;
x |= x >> 1;
x |= x >> 2;
x |= x >> 4;
x |= x >> 8;
x |= x >> 16;
++x;
return(x);
}
////////////////////////////////
// scalars
#define DEG_TO_RAD (0.0174533f)
internal f32
static f32
ABS(f32 x){
if (x < 0) x = -x;
return(x);
@ -26,7 +69,7 @@ ABS(f32 x){
#if C_MATH
#include <math.h>
internal f32
static f32
MOD(f32 x, i32 m){
f32 whole;
f32 frac = modff(x, &whole);
@ -34,30 +77,30 @@ MOD(f32 x, i32 m){
return(r);
}
internal f32
static f32
SQRT(f32 x){
f32 r = sqrtf(x);
return(r);
}
internal f32
static f32
SIN(f32 x_degrees){
f32 r = sinf(x_degrees * DEG_TO_RAD);
return(r);
}
internal f32
static f32
COS(f32 x_degrees){
f32 r = cosf(x_degrees * DEG_TO_RAD);
return(r);
}
#endif
/*
* Vectors
*/
////////////////////////////////
internal Vec2
// vectors
static Vec2
V2(f32 x, f32 y){
Vec2 result = {};
result.x = x;
@ -65,7 +108,7 @@ V2(f32 x, f32 y){
return(result);
}
internal Vec3
static Vec3
V3(f32 x, f32 y, f32 z){
Vec3 result = {};
result.x = x;
@ -74,7 +117,7 @@ V3(f32 x, f32 y, f32 z){
return(result);
}
internal Vec4
static Vec4
V4(f32 x, f32 y, f32 z, f32 w){
Vec4 result = {};
result.x = x;
@ -84,7 +127,37 @@ V4(f32 x, f32 y, f32 z, f32 w){
return(result);
}
internal Vec2_i32
static Vec2
V2(Vec2_i32 pi){
return(V2((f32)pi.x, (f32)pi.y));
}
static Vec3
V3(Vec3_i32 pi){
return(V3((f32)pi.x, (f32)pi.y, (f32)pi.z));
}
static Vec4
V4(Vec4_i32 pi){
return(V4((f32)pi.x, (f32)pi.y, (f32)pi.z, (f32)pi.w));
}
static Vec2
V2(Vec2 pi){
return(pi);
}
static Vec3
V3(Vec3 pi){
return(pi);
}
static Vec4
V4(Vec4 pi){
return(pi);
}
static Vec2_i32
V2i32(i32 x, i32 y){
Vec2_i32 result = {};
result.x = x;
@ -92,7 +165,7 @@ V2i32(i32 x, i32 y){
return(result);
}
internal Vec3_i32
static Vec3_i32
V3i32(i32 x, i32 y, i32 z){
Vec3_i32 result = {};
result.x = x;
@ -101,7 +174,7 @@ V3i32(i32 x, i32 y, i32 z){
return(result);
}
internal Vec4_i32
static Vec4_i32
V4i32(i32 x, i32 y, i32 z, i32 w){
Vec4_i32 result = {};
result.x = x;
@ -111,7 +184,37 @@ V4i32(i32 x, i32 y, i32 z, i32 w){
return(result);
}
internal Vec2
static Vec2_i32
V2i32(Vec2_f32 pi){
return(V2i32((i32)pi.x, (i32)pi.y));
}
static Vec3_i32
V3i32(Vec3_f32 pi){
return(V3i32((i32)pi.x, (i32)pi.y, (i32)pi.z));
}
static Vec4_i32
V4i32(Vec4_f32 pi){
return(V4i32((i32)pi.x, (i32)pi.y, (i32)pi.z, (i32)pi.w));
}
static Vec2_i32
V2i32(Vec2_i32 pi){
return(pi);
}
static Vec3_i32
V3i32(Vec3_i32 pi){
return(pi);
}
static Vec4_i32
V4i32(Vec4_i32 pi){
return(pi);
}
static Vec2
operator+(Vec2 a, Vec2 b){
Vec2 result;
result.x = a.x + b.x;
@ -119,7 +222,7 @@ operator+(Vec2 a, Vec2 b){
return(result);
}
internal Vec3
static Vec3
operator+(Vec3 a, Vec3 b){
Vec3 result;
result.x = a.x + b.x;
@ -128,7 +231,7 @@ operator+(Vec3 a, Vec3 b){
return(result);
}
internal Vec4
static Vec4
operator+(Vec4 a, Vec4 b){
Vec4 result;
result.x = a.x + b.x;
@ -138,7 +241,7 @@ operator+(Vec4 a, Vec4 b){
return(result);
}
internal Vec2
static Vec2
operator-(Vec2 a, Vec2 b){
Vec2 result;
result.x = a.x - b.x;
@ -146,7 +249,7 @@ operator-(Vec2 a, Vec2 b){
return(result);
}
internal Vec3
static Vec3
operator-(Vec3 a, Vec3 b){
Vec3 result;
result.x = a.x - b.x;
@ -155,7 +258,7 @@ operator-(Vec3 a, Vec3 b){
return(result);
}
internal Vec4
static Vec4
operator-(Vec4 a, Vec4 b){
Vec4 result;
result.x = a.x - b.x;
@ -165,7 +268,7 @@ operator-(Vec4 a, Vec4 b){
return(result);
}
internal Vec2
static Vec2
operator*(Vec2 a, f32 k){
Vec2 result;
result.x = a.x * k;
@ -173,7 +276,7 @@ operator*(Vec2 a, f32 k){
return(result);
}
internal Vec3
static Vec3
operator*(Vec3 a, f32 k){
Vec3 result;
result.x = a.x * k;
@ -182,7 +285,7 @@ operator*(Vec3 a, f32 k){
return(result);
}
internal Vec4
static Vec4
operator*(Vec4 a, f32 k){
Vec4 result;
result.x = a.x * k;
@ -192,7 +295,7 @@ operator*(Vec4 a, f32 k){
return(result);
}
internal Vec2
static Vec2
operator*(f32 k, Vec2 a){
Vec2 result;
result.x = a.x * k;
@ -200,7 +303,7 @@ operator*(f32 k, Vec2 a){
return(result);
}
internal Vec3
static Vec3
operator*(f32 k, Vec3 a){
Vec3 result;
result.x = a.x * k;
@ -209,7 +312,7 @@ operator*(f32 k, Vec3 a){
return(result);
}
internal Vec4
static Vec4
operator*(f32 k, Vec4 a){
Vec4 result;
result.x = a.x * k;
@ -218,142 +321,142 @@ operator*(f32 k, Vec4 a){
result.w = a.w * k;
return(result);}
internal Vec2&
static Vec2&
operator+=(Vec2 &a, Vec2 b){
a = (a + b);
return a;
}
internal Vec3&
static Vec3&
operator+=(Vec3 &a, Vec3 b){
a = (a + b);
return a;
}
internal Vec4&
static Vec4&
operator+=(Vec4 &a, Vec4 b){
a = (a + b);
return a;
}
internal Vec2&
static Vec2&
operator-=(Vec2 &a, Vec2 b){
a = (a - b);
return a;
}
internal Vec3&
static Vec3&
operator-=(Vec3 &a, Vec3 b){
a = (a - b);
return a;
}
internal Vec4&
static Vec4&
operator-=(Vec4 &a, Vec4 b){
a = (a - b);
return a;
}
internal Vec2&
static Vec2&
operator*=(Vec2 &a, f32 k){
a = (a*k);
return a;
}
internal Vec3&
static Vec3&
operator*=(Vec3 &a, f32 k){
a = (a*k);
return a;
}
internal Vec4&
static Vec4&
operator*=(Vec4 &a, f32 k){
a = (a*k);
return a;
}
internal b32
static b32
operator==(Vec2 a, Vec2 b){
return(a.x == b.x && a.y == b.y);
}
internal b32
static b32
operator!=(Vec2 a, Vec2 b){
return(!(a.x == b.x && a.y == b.y));
}
internal b32
static b32
operator==(Vec3 a, Vec3 b){
return(a.x == b.x && a.y == b.y && a.z == b.z);
}
internal b32
static b32
operator!=(Vec3 a, Vec3 b){
return(!(a.x == b.x && a.y == b.y && a.z == b.z));
}
internal b32
static b32
operator==(Vec4 a, Vec4 b){
return(a.x == b.x && a.y == b.y && a.z == b.z && a.w == b.w);
}
internal b32
static b32
operator!=(Vec4 a, Vec4 b){
return(!(a.x == b.x && a.y == b.y && a.z == b.z && a.w == b.w));
}
internal b32
static b32
operator==(Vec2_i32 a, Vec2_i32 b){
return(a.x == b.x && a.y == b.y);
}
internal b32
static b32
operator!=(Vec2_i32 a, Vec2_i32 b){
return(!(a.x == b.x && a.y == b.y));
}
internal b32
static b32
operator==(Vec3_i32 a, Vec3_i32 b){
return(a.x == b.x && a.y == b.y && a.z == b.z);
}
internal b32
static b32
operator!=(Vec3_i32 a, Vec3_i32 b){
return(!(a.x == b.x && a.y == b.y && a.z == b.z));
}
internal b32
static b32
operator==(Vec4_i32 a, Vec4_i32 b){
return(a.x == b.x && a.y == b.y && a.z == b.z && a.w == b.w);
}
internal b32
static b32
operator!=(Vec4_i32 a, Vec4_i32 b){
return(!(a.x == b.x && a.y == b.y && a.z == b.z && a.w == b.w));
}
internal f32
static f32
dot(Vec2 a, Vec2 b){
f32 result;
result = a.x*b.x + a.y*b.y;
return result;
}
internal f32
static f32
dot(Vec3 a, Vec3 b){
f32 result;
result = a.x*b.x + a.y*b.y + a.z*b.z;
return result;
}
internal f32
static f32
dot(Vec4 a, Vec4 b){
f32 result;
result = a.x*b.x + a.y*b.y + a.z*b.z + a.w*b.w;
return result;
}
internal Vec3
static Vec3
cross(Vec3 a, Vec3 b){
Vec3 result;
result.x = a.y*b.z - b.y*a.z;
@ -362,14 +465,14 @@ cross(Vec3 a, Vec3 b){
return result;
}
internal Vec2
static Vec2
hadamard(Vec2 a, Vec2 b){
a.x *= b.x;
a.y *= b.y;
return(a);
}
internal Vec3
static Vec3
hadamard(Vec3 a, Vec3 b){
a.x *= b.x;
a.y *= b.y;
@ -377,7 +480,7 @@ hadamard(Vec3 a, Vec3 b){
return(a);
}
internal Vec4
static Vec4
hadamard(Vec4 a, Vec4 b){
a.x *= b.x;
a.y *= b.y;
@ -386,17 +489,17 @@ hadamard(Vec4 a, Vec4 b){
return(a);
}
internal Vec2
static Vec2
perp(Vec2 v){
return(V2(-v.y, v.x));
}
internal Vec2
static Vec2
polar_to_cartesian(f32 theta_degrees, f32 length){
return(V2(COS(theta_degrees), SIN(theta_degrees))*length);
}
internal Vec2
static Vec2
rotate(Vec2 v, f32 theta_degrees){
f32 c = COS(theta_degrees);
f32 s = SIN(theta_degrees);
@ -404,36 +507,34 @@ rotate(Vec2 v, f32 theta_degrees){
v.x*s + v.y*c));
}
/*
*Lerps, Clamps, Thresholds, Etc
*/
////////////////////////////////
internal f32
static f32
lerp(f32 a, f32 t, f32 b){
return(a + (b-a)*t);
}
internal i32
static i32
lerp(i32 a, f32 t, i32 b){
return((i32)(lerp((f32)a, t, (f32)b)));
}
internal Vec2
static Vec2
lerp(Vec2 a, f32 t, Vec2 b){
return(a + (b-a)*t);
}
internal Vec3
static Vec3
lerp(Vec3 a, f32 t, Vec3 b){
return(a + (b-a)*t);
}
internal Vec4
static Vec4
lerp(Vec4 a, f32 t, Vec4 b){
return(a + (b-a)*t);
}
internal f32
static f32
unlerp(f32 a, f32 x, f32 b){
f32 r = x;
if (b != a){
@ -442,7 +543,7 @@ unlerp(f32 a, f32 x, f32 b){
return(r);
}
internal f32
static f32
clamp(f32 a, f32 n, f32 z){
if (n < a){
n = a;
@ -453,7 +554,7 @@ clamp(f32 a, f32 n, f32 z){
return(n);
}
internal i32
static i32
clamp(i32 a, i32 n, i32 z){
if (n < a){
n = a;
@ -464,7 +565,7 @@ clamp(i32 a, i32 n, i32 z){
return(n);
}
internal i64
static i64
clamp(i64 a, i64 n, i64 z){
if (n < a){
n = a;
@ -475,7 +576,7 @@ clamp(i64 a, i64 n, i64 z){
return(n);
}
internal u32
static u32
clamp(u32 a, u32 n, u32 z){
if (n < a){
n = a;
@ -486,7 +587,7 @@ clamp(u32 a, u32 n, u32 z){
return(n);
}
internal u64
static u64
clamp(u64 a, u64 n, u64 z){
if (n < a){
n = a;
@ -497,15 +598,12 @@ clamp(u64 a, u64 n, u64 z){
return(n);
}
#define clamp_top(a,b) Min(a,b)
#define clamp_bottom(a,b) Max(a,b)
////////////////////////////////
/*
*Color
*/
// color
// TODO(allen): Convert colors to Vec4
internal u32
static u32
color_blend(u32 a, f32 t, u32 b){
union{
u8 byte[4];
@ -523,7 +621,7 @@ color_blend(u32 a, f32 t, u32 b){
return R.comp;
}
internal Vec3
static Vec3
unpack_color3(u32 color){
Vec3 result;
result.r = ((color >> 16) & 0xFF) / 255.f;
@ -532,7 +630,7 @@ unpack_color3(u32 color){
return result;
}
internal Vec4
static Vec4
unpack_color4(u32 color){
Vec4 result;
result.a = ((color >> 24) & 0xFF) / 255.f;
@ -542,7 +640,7 @@ unpack_color4(u32 color){
return result;
}
internal u32
static u32
pack_color4(Vec4 color){
u32 result =
((u8)(color.a*255) << 24) |
@ -552,7 +650,7 @@ pack_color4(Vec4 color){
return result;
}
internal Vec4
static Vec4
rgba_to_hsla(Vec4 rgba){
Vec4 hsla = {};
f32 max, min, delta;
@ -608,7 +706,7 @@ rgba_to_hsla(Vec4 rgba){
return hsla;
}
internal Vec4
static Vec4
hsla_to_rgba(Vec4 hsla){
if (hsla.h >= 1.f){
hsla.h = 0.f;
@ -633,11 +731,9 @@ hsla_to_rgba(Vec4 hsla){
return(rgba);
}
//
// Rectangle Operations
//
////////////////////////////////
internal i32_Rect
static i32_Rect
i32R(i32 l, i32 t, i32 r, i32 b){
i32_Rect rect = {};
rect.x0 = l;
@ -647,12 +743,12 @@ i32R(i32 l, i32 t, i32 r, i32 b){
return(rect);
}
internal i32_Rect
static i32_Rect
i32R_xy_wh(i32 x, i32 y, i32 w, i32 h){
return(i32R(x, y, x + w, y + h));
}
internal i32_Rect
static i32_Rect
i32R(f32_Rect r){
i32_Rect rect = {};
rect.x0 = (i32)r.x0;
@ -662,7 +758,7 @@ i32R(f32_Rect r){
return(rect);
}
internal f32_Rect
static f32_Rect
f32R(f32 l, f32 t, f32 r, f32 b){
f32_Rect rect = {};
rect.x0 = l;
@ -672,7 +768,7 @@ f32R(f32 l, f32 t, f32 r, f32 b){
return(rect);
}
internal f32_Rect
static f32_Rect
f32R(i32_Rect r){
f32_Rect rect = {};
rect.x0 = (f32)r.x0;
@ -682,22 +778,22 @@ f32R(i32_Rect r){
return(rect);
}
internal i32
static i32
rect_equal(i32_Rect r1, i32_Rect r2){
return(r1.x0 == r2.x0 && r1.y0 == r2.y0 && r1.x1 == r2.x1 && r1.y1 == r2.y1);
}
internal i32
static i32
hit_check(i32 x, i32 y, i32 x0, i32 y0, i32 x1, i32 y1){
return(x >= x0 && x < x1 && y >= y0 && y < y1);
}
internal i32
static i32
hit_check(i32 x, i32 y, i32_Rect rect){
return(hit_check(x, y, rect.x0, rect.y0, rect.x1, rect.y1));
}
internal i32_Rect
static i32_Rect
get_inner_rect(i32_Rect outer, i32 margin){
i32_Rect r = {};
r.x0 = outer.x0 + margin;
@ -707,7 +803,7 @@ get_inner_rect(i32_Rect outer, i32 margin){
return(r);
}
internal f32_Rect
static f32_Rect
get_inner_rect(f32_Rect outer, f32 margin){
f32_Rect r = {};
r.x0 = outer.x0 + margin;
@ -717,38 +813,38 @@ get_inner_rect(f32_Rect outer, f32 margin){
return(r);
}
internal i32
static i32
rect_height(i32_Rect rect){
return(rect.y1 - rect.y0);
}
internal i32
static i32
rect_width(i32_Rect rect){
return(rect.x1 - rect.x0);
}
internal i32
static i32
fits_inside(i32_Rect rect, i32_Rect outer){
return(rect.x0 >= outer.x0 && rect.x1 <= outer.x1 && rect.y0 >= outer.y0 && rect.y1 <= outer.y1);
}
internal i32
static i32
interval_overlap(f32 a0, f32 a1, f32 b0, f32 b1){
return(a0 < b1 && b0 < a1);
}
internal i32
static i32
rect_overlap(f32_Rect a, f32_Rect b){
return(interval_overlap(a.x0, a.x1, b.x0, b.x1) &&
interval_overlap(a.y0, a.y1, b.y0, b.y1));
}
internal f32
static f32
rect_height(f32_Rect rect){
return(rect.y1 - rect.y0);
}
internal f32
static f32
rect_width(f32_Rect rect){
return(rect.x1 - rect.x0);
}

View File

@ -58,6 +58,10 @@ typedef double f64;
#define Max(a,b) (((a)>(b))?(a):(b))
#define Min(a,b) (((a)<(b))?(a):(b))
#define clamp_top(a,b) Min(a,b)
#define clamp_bottom(a,b) Max(a,b)
//#define clamp(a,x,b) Min(
////////////////////////////////
struct Vec2_f32{

View File

@ -141,7 +141,7 @@ struct Application_Links;
#define SEND_EXIT_SIGNAL_SIG(n) void n(Application_Links *app)
#define SET_WINDOW_TITLE_SIG(n) bool32 n(Application_Links *app, String title)
#define GET_MICROSECONDS_TIMESTAMP_SIG(n) Microsecond_Time_Stamp n(Application_Links *app)
#define DRAW_STRING_SIG(n) float n(Application_Links *app, Face_ID font_id, String str, int32_t x, int32_t y, int_color color, uint32_t flags, float dx, float dy)
#define DRAW_STRING_SIG(n) float n(Application_Links *app, Face_ID font_id, String str, Vec2 point, int_color color, u32 flags, Vec2 delta)
#define GET_STRING_ADVANCE_SIG(n) float n(Application_Links *app, Face_ID font_id, String str)
#define DRAW_RECTANGLE_SIG(n) void n(Application_Links *app, f32_Rect rect, int_color color)
#define DRAW_RECTANGLE_OUTLINE_SIG(n) void n(Application_Links *app, f32_Rect rect, int_color color)
@ -904,7 +904,7 @@ static bool32 is_fullscreen(Application_Links *app){return(app->is_fullscreen(ap
static void send_exit_signal(Application_Links *app){(app->send_exit_signal(app));}
static bool32 set_window_title(Application_Links *app, String title){return(app->set_window_title(app, title));}
static Microsecond_Time_Stamp get_microseconds_timestamp(Application_Links *app){return(app->get_microseconds_timestamp(app));}
static float draw_string(Application_Links *app, Face_ID font_id, String str, int32_t x, int32_t y, int_color color, uint32_t flags, float dx, float dy){return(app->draw_string(app, font_id, str, x, y, color, flags, dx, dy));}
static float draw_string(Application_Links *app, Face_ID font_id, String str, Vec2 point, int_color color, u32 flags, Vec2 delta){return(app->draw_string(app, font_id, str, point, color, flags, delta));}
static float get_string_advance(Application_Links *app, Face_ID font_id, String str){return(app->get_string_advance(app, font_id, str));}
static void draw_rectangle(Application_Links *app, f32_Rect rect, int_color color){(app->draw_rectangle(app, rect, color));}
static void draw_rectangle_outline(Application_Links *app, f32_Rect rect, int_color color){(app->draw_rectangle_outline(app, rect, color));}
@ -1055,7 +1055,7 @@ static bool32 is_fullscreen(Application_Links *app){return(app->is_fullscreen_(a
static void send_exit_signal(Application_Links *app){(app->send_exit_signal_(app));}
static bool32 set_window_title(Application_Links *app, String title){return(app->set_window_title_(app, title));}
static Microsecond_Time_Stamp get_microseconds_timestamp(Application_Links *app){return(app->get_microseconds_timestamp_(app));}
static float draw_string(Application_Links *app, Face_ID font_id, String str, int32_t x, int32_t y, int_color color, uint32_t flags, float dx, float dy){return(app->draw_string_(app, font_id, str, x, y, color, flags, dx, dy));}
static float draw_string(Application_Links *app, Face_ID font_id, String str, Vec2 point, int_color color, u32 flags, Vec2 delta){return(app->draw_string_(app, font_id, str, point, color, flags, delta));}
static float get_string_advance(Application_Links *app, Face_ID font_id, String str){return(app->get_string_advance_(app, font_id, str));}
static void draw_rectangle(Application_Links *app, f32_Rect rect, int_color color){(app->draw_rectangle_(app, rect, color));}
static void draw_rectangle_outline(Application_Links *app, f32_Rect rect, int_color color){(app->draw_rectangle_outline_(app, rect, color));}

View File

@ -418,7 +418,6 @@ cpp_token_category_from_type(Cpp_Token_Type type){
cat = CPP_TOKEN_CAT_OPERATOR;
}break;
case CPP_TOKEN_VOID:
case CPP_TOKEN_BOOL:
case CPP_TOKEN_CHAR:

View File

@ -4231,22 +4231,24 @@ DOC(Returns a microsecond resolution timestamp.)
return(system->now_time());
}
internal void
draw_helper__view_space_to_screen_space(Models *models, i32 *x, i32 *y){
internal Vec2
draw_helper__view_space_to_screen_space(Models *models, Vec2 point){
i32_Rect region = models->render_rect;
*x += region.x0;
*y += region.y0;
point.x += (f32)region.x0;
point.y += (f32)region.y0;
return(point);
}
internal void
draw_helper__view_space_to_screen_space(Models *models, f32_Rect *rect){
internal f32_Rect
draw_helper__view_space_to_screen_space(Models *models, f32_Rect rect){
i32_Rect region = models->render_rect;
f32 x_corner = (f32)region.x0;
f32 y_corner = (f32)region.y0;
rect->x0 += x_corner;
rect->y0 += y_corner;
rect->x1 += x_corner;
rect->y1 += y_corner;
rect.x0 += x_corner;
rect.y0 += y_corner;
rect.x1 += x_corner;
rect.y1 += y_corner;
return(rect);
}
// NOTE(allen): Coordinate space of draw calls:
@ -4254,64 +4256,60 @@ draw_helper__view_space_to_screen_space(Models *models, f32_Rect *rect){
// To make text scroll with the buffer users should read the view's scroll position and subtract it first.
API_EXPORT float
Draw_String(Application_Links *app, Face_ID font_id, String str, int32_t x, int32_t y, int_color color, uint32_t flags, float dx, float dy)
Draw_String(Application_Links *app, Face_ID font_id, String str, Vec2 point, int_color color, u32 flags, Vec2 delta)
{
f32 result = 0.f;
Models *models = (Models*)app->cmd_context;
if (models->render_view == 0){
float w = font_string_width(models->system, models->target, font_id, str);
return(w);
result = font_string_width(models->system, models->target, font_id, str);
}
Style *style = &models->styles.styles[0];
Theme *theme_data = &style->theme;
draw_helper__view_space_to_screen_space(models, &x, &y);
u32 actual_color = finalize_color(theme_data, color);
float w = draw_string_base(models->system, models->target, font_id, str, x, y,
actual_color, flags, dx, dy);
return(w);
else{
Style *style = &models->styles.styles[0];
Theme *theme_data = &style->theme;
point = draw_helper__view_space_to_screen_space(models, point);
u32 actual_color = finalize_color(theme_data, color);
result = draw_string(models->system, models->target, font_id, str, point, actual_color, flags, delta);
}
return(result);
}
API_EXPORT float
Get_String_Advance(Application_Links *app, Face_ID font_id, String str)
{
Models *models = (Models*)app->cmd_context;
float w = font_string_width(models->system, models->target, font_id, str);
return(w);
return(font_string_width(models->system, models->target, font_id, str));
}
API_EXPORT void
Draw_Rectangle(Application_Links *app, f32_Rect rect, int_color color)
{
Models *models = (Models*)app->cmd_context;
if (models->render_view == 0){
return;
if (models->render_view != 0){
Style *style = &models->styles.styles[0];
Theme *theme_data = &style->theme;
rect = draw_helper__view_space_to_screen_space(models, rect);
u32 actual_color = finalize_color(theme_data, color);
draw_rectangle(models->target, rect, actual_color);
}
Style *style = &models->styles.styles[0];
Theme *theme_data = &style->theme;
draw_helper__view_space_to_screen_space(models, &rect);
u32 actual_color = finalize_color(theme_data, color);
draw_rectangle(models->target, rect, actual_color);
}
API_EXPORT void
Draw_Rectangle_Outline(Application_Links *app, f32_Rect rect, int_color color)
{
Models *models = (Models*)app->cmd_context;
if (models->render_view == 0){
return;
if (models->render_view != 0){
Style *style = &models->styles.styles[0];
Theme *theme_data = &style->theme;
rect = draw_helper__view_space_to_screen_space(models, rect);
u32 actual_color = finalize_color(theme_data, color);
draw_rectangle_outline(models->target, rect, actual_color);
}
Style *style = &models->styles.styles[0];
Theme *theme_data = &style->theme;
draw_helper__view_space_to_screen_space(models, &rect);
u32 actual_color = finalize_color(theme_data, color);
draw_rectangle_outline(models->target, rect, actual_color);
}
API_EXPORT Face_ID

View File

@ -15,7 +15,7 @@
#include "4coder_API/4coder_custom.h"
#include "4ed_defines.h"
#include "4ed_math.h"
//#include "4ed_math.h"
#include "4ed_font.h"
#include "4ed_system.h"

View File

@ -101,47 +101,6 @@ typedef double f64;
#define FixSize(s) struct{ u8 __size_fixer__[s]; }
internal i32 ceil32(f32 v){
return(((v)>0)?( (v == (i32)(v))?((i32)(v)):((i32)((v)+1.f)) ):( ((i32)(v)) ));
}
internal i32 floor32(f32 v){
return(((v)<0)?( (v == (i32)(v))?((i32)(v)):((i32)((v)-1.f)) ):( ((i32)(v)) ));
}
internal i32 round32(f32 v){
return(floor32(v + 0.5f));
}
internal i32 trun32(f32 v){
return((i32)(v));
}
internal i32 div_ceil(i32 n, i32 d){
return( ((n) % (d) != 0) + ((n) / (d)) );
}
internal i32 l_round_up_i32(i32 x, i32 b){
i32 t = x + b - 1;
return(t - (t%b));
}
internal u32 l_round_up_u32(u32 x, u32 b){
i32 t = x + b - 1;
return(t - (t%b));
}
internal u32 round_up_pot_u32(u32 x){
--x;
x |= x >> 1;
x |= x >> 2;
x |= x >> 4;
x |= x >> 8;
x |= x >> 16;
++x;
return(x);
}
#define DrCase(PC) case PC: goto resumespot_##PC
#define DrYield(PC, n) { *S_ptr = S; S_ptr->__pc__ = PC; return(n); resumespot_##PC:; }
#define DrReturn(n) { *S_ptr = S; S_ptr->__pc__ = -1; return(n); }

View File

@ -120,28 +120,33 @@ draw_font_glyph(Render_Target *target, Face_ID font_id, u32 codepoint, f32 x, f3
render_end_push(target, h);
}
// TODO(allen): do(merge draw_string_base into draw_string)
internal Vec2
snap_point_to_boundary(Vec2 point){
point.x = (f32)(floor32(point.x));
point.y = (f32)(floor32(point.y));
return(point);
}
internal f32
draw_string_base(System_Functions *system, Render_Target *target, Face_ID font_id, String str_, i32 x_, i32 y_, u32 color,
u32 flags, f32 dx, f32 dy){
f32 x = 0;
draw_string(System_Functions *system, Render_Target *target, Face_ID font_id, String string, Vec2 point,
u32 color, u32 flags, Vec2 delta){
f32 total_delta = 0.f;
Font_Pointers font = system->font.get_pointers_by_id(font_id);
if (font.valid != 0){
f32 y = (f32)y_;
x = (f32)x_;
point = snap_point_to_boundary(point);
f32 byte_advance = font.metrics->byte_advance;
f32 *sub_advances = font.metrics->sub_advances;
u8 *str = (u8*)str_.str;
u8 *str_end = str + str_.size;
u8 *str = (u8*)string.str;
u8 *str_end = str + string.size;
Translation_State tran = {};
Translation_Emits emits = {};
for (u32 i = 0; str < str_end; ++str, ++i){
translating_fully_process_byte(system, font, &tran, *str, i, str_.size, &emits);
translating_fully_process_byte(system, font, &tran, *str, i, string.size, &emits);
for (TRANSLATION_DECL_EMIT_LOOP(J, emits)){
TRANSLATION_DECL_GET_STEP(step, behavior, J, emits);
@ -149,11 +154,11 @@ draw_string_base(System_Functions *system, Render_Target *target, Face_ID font_i
if (behavior.do_codepoint_advance){
u32 codepoint = step.value;
if (color != 0){
draw_font_glyph(target, font_id, codepoint, x, y, color, flags);
draw_font_glyph(target, font_id, codepoint, point.x, point.y, color, flags);
}
f32 d = font_get_glyph_advance(system, font.settings, font.metrics, font.pages, codepoint);
x += d*dx;
y += d*dy;
point += d*delta;
total_delta += d;
}
else if (behavior.do_number_advance){
u8 n = (u8)(step.value);
@ -161,70 +166,48 @@ draw_string_base(System_Functions *system, Render_Target *target, Face_ID font_i
u8 cs[3];
cs[0] = '\\';
byte_to_ascii(n, cs+1);
f32 xx = x;
f32 yy = y;
Vec2 pp = point;
for (u32 j = 0; j < 3; ++j){
draw_font_glyph(target, font_id, cs[j], xx, yy, color, flags);
xx += dx*sub_advances[j];
yy += dy*sub_advances[j];
draw_font_glyph(target, font_id, cs[j], pp.x, pp.y, color, flags);
pp += delta*sub_advances[j];
}
}
x += dx*byte_advance;
y += dy*byte_advance;
point += byte_advance*delta;
total_delta += byte_advance;
}
}
}
}
return(x);
return(total_delta);
}
internal f32
draw_string_base(System_Functions *system, Render_Target *target, Face_ID font_id, String str_, i32 x_, i32 y_, u32 color){
f32 result = draw_string_base(system, target, font_id, str_, x_, y_, color, 0, 1.f, 0.f);
return(result);
draw_string(System_Functions *system, Render_Target *target, Face_ID font_id, String string, Vec2 point,
u32 color){
return(draw_string(system, target, font_id, string, point, color, 0, V2(1.f, 0.f)));
}
internal f32
draw_string(System_Functions *system, Render_Target *target, Face_ID font_id, String str, i32 x, i32 y, u32 color,
u32 flags, f32 dx, f32 dy){
f32 w = draw_string_base(system, target, font_id, str, x, y, color, flags, dx, dy);
return(w);
draw_string(System_Functions *system, Render_Target *target, Face_ID font_id, char *str, Vec2 point,
u32 color, u32 flags, Vec2 delta){
return(draw_string(system, target, font_id, make_string_slowly(str), point, color, flags, delta));
}
internal f32
draw_string(System_Functions *system, Render_Target *target, Face_ID font_id, char *str, i32 x, i32 y, u32 color,
u32 flags, f32 dx, f32 dy){
String string = make_string_slowly(str);
f32 w = draw_string_base(system, target, font_id, string, x, y, color, flags, dx, dy);
return(w);
}
internal f32
draw_string(System_Functions *system, Render_Target *target, Face_ID font_id, String str, i32 x, i32 y, u32 color){
f32 w = draw_string(system, target, font_id, str, x, y, color, 0, 1.f, 0.f);
return(w);
}
internal f32
draw_string(System_Functions *system, Render_Target *target, Face_ID font_id, char *str, i32 x, i32 y, u32 color){
f32 w = draw_string(system, target, font_id, str, x, y, color, 0, 1.f, 0.f);
return(w);
draw_string(System_Functions *system, Render_Target *target, Face_ID font_id, char *str, Vec2 point,
u32 color){
return(draw_string(system, target, font_id, make_string_slowly(str), point, color, 0, V2(1.f, 0.f)));
}
internal f32
font_string_width(System_Functions *system, Render_Target *target, Face_ID font_id, String str){
f32 w = draw_string_base(system, target, font_id, str, 0, 0, 0);
return(w);
return(draw_string(system, target, font_id, str, V2(0, 0), 0, 0, V2(0, 0)));
}
internal f32
font_string_width(System_Functions *system, Render_Target *target, Face_ID font_id, char *str){
String string = make_string_slowly(str);
f32 w = draw_string_base(system, target, font_id, string, 0, 0, 0);
return(w);
return(draw_string(system, target, font_id, make_string_slowly(str), V2(0, 0), 0, 0, V2(0, 0)));
}
// BOTTOM

View File

@ -99,10 +99,8 @@ struct Shift_Information{
};
struct File_Bar{
f32 pos_x;
f32 pos_y;
f32 text_shift_x;
f32 text_shift_y;
Vec2 pos;
Vec2 text_shift;
i32_Rect rect;
Face_ID font_id;
};

View File

@ -98,25 +98,10 @@ do_step_file_view(System_Functions *system, Models *models, View *view, i32_Rect
////////////////////////////////
internal void
draw_text_field(System_Functions *system, Render_Target *target, View *view, Models *models, Face_ID font_id, i32_Rect rect, String p, String t){
if (target != 0){
Style *style = &models->styles.styles[0];
u32 back_color = style->theme.colors[Stag_Margin];
u32 text1_color = style->theme.colors[Stag_Default];
u32 text2_color = style->theme.colors[Stag_Pop1];
i32 x = rect.x0;
i32 y = rect.y0 + 2;
draw_rectangle(target, rect, back_color);
x = ceil32(draw_string(system, target, font_id, p, x, y, text2_color));
draw_string(system, target, font_id, t, x, y, text1_color);
}
}
internal void
intbar_draw_string(System_Functions *system, Render_Target *target, File_Bar *bar, String str, u32 char_color){
draw_string(system, target, bar->font_id, str, (i32)(bar->pos_x + bar->text_shift_x), (i32)(bar->pos_y + bar->text_shift_y), char_color);
bar->pos_x += font_string_width(system, target, bar->font_id, str);
Vec2 p = bar->pos + bar->text_shift;
bar->pos.x += draw_string(system, target, bar->font_id, str, p, char_color);
}
internal void
@ -133,10 +118,8 @@ draw_file_bar(System_Functions *system, Render_Target *target, View *view, Model
if (target != 0){
bar.font_id = file->settings.font_id;
bar.pos_x = (f32)bar.rect.x0;
bar.pos_y = (f32)bar.rect.y0;
bar.text_shift_y = 2;
bar.text_shift_x = 0;
bar.pos = V2(bar.rect.p0);
bar.text_shift = V2(0.f, 2.f);
draw_rectangle(target, bar.rect, back_color);
@ -248,11 +231,11 @@ do_render_file_view(System_Functions *system, View *view, Models *models, GUI_Sc
u32 back_color = style->theme.colors[Stag_Back];
u32 text1_color = style->theme.colors[Stag_Default];
u32 text2_color = style->theme.colors[Stag_Pop1];
i32 x = query_bar_rect.x0;
i32 y = query_bar_rect.y0 + 2;
Vec2 p = V2(query_bar_rect.p0);
p.y += 2.f;
draw_rectangle(target, query_bar_rect, back_color);
x = ceil32(draw_string(system, target, font_id, slot->query_bar->prompt, x, y, text2_color));
draw_string(system, target, font_id, slot->query_bar->string, x, y, text1_color);
p.x += draw_string(system, target, font_id, slot->query_bar->prompt, p, text2_color);
draw_string(system, target, font_id, slot->query_bar->string, p, text1_color);
}
view->widget_height = (f32)bar_count*(view->line_height + 2);
@ -298,11 +281,10 @@ do_render_file_view(System_Functions *system, View *view, Models *models, GUI_Sc
u32 margin_color = get_margin_color(style, item->activation_level);
f32_Rect inner = get_inner_rect(item_rect, 3);
draw_rectangle(target, inner, back);
i32 x = (i32)inner.x0 + 3;
i32 y = (i32)inner.y0 + line_height/2 - 1;
x = ceil32(draw_string(system, target, font_id, item->option.string, x, y, text_color));
x += (i32)font_string_width(system, target, font_id, " ");
draw_string(system, target, font_id, item->option.status, x, y, pop_color);
Vec2 p = V2(inner.p0) + V2(3.f, line_height*0.5f - 1.f);
p.x += draw_string(system, target, font_id, item->option.string, p, text_color);
p.x += font_string_width(system, target, font_id, make_lit_string(" "));
draw_string(system, target, font_id, item->option.status, p, pop_color);
draw_margin(target, item_rect, inner, margin_color);
}break;
@ -312,11 +294,10 @@ do_render_file_view(System_Functions *system, View *view, Models *models, GUI_Sc
u32 text1 = style->theme.colors[Stag_Default];
u32 text2 = style->theme.colors[Stag_Pop1];
draw_rectangle(target, item_rect, back);
i32 x = (i32)item_rect.x0;
i32 y = (i32)item_rect.y0 + 2;
x = ceil32(draw_string(system, target, font_id, item->text_field.query, x, y, text2));
x += (i32)font_string_width(system, target, font_id, " ");
draw_string(system, target, font_id, item->text_field.string, x, y, text1);
Vec2 p = V2(item_rect.p0) + V2(0.f, 2.f);
p.x += draw_string(system, target, font_id, item->text_field.query, p, text2);
p.x += font_string_width(system, target, font_id, make_lit_string(" "));
p.x += draw_string(system, target, font_id, item->text_field.string, p, text1);
}break;
case UIType_ColorTheme:
@ -334,32 +315,29 @@ do_render_file_view(System_Functions *system, View *view, Models *models, GUI_Sc
draw_margin(target, item_rect, inner, margin_color);
draw_rectangle(target, inner, back);
i32 y = (i32)inner.y0;
i32 x = (i32)inner.x0;
Vec2 p = V2(inner.p0);
String str = item->color_theme.string;
if (str.str == 0){
str = style_preview->name;
}
x = ceil32(draw_string(system, target, font_id, str, x, y, text_color));
i32 font_x = (i32)(inner.x1 - font_string_width(system, target, font_id, font_name));
if (font_x > x + 10){
draw_string(system, target, font_id, font_name, font_x, y, text_color);
p.x += draw_string(system, target, font_id, str, p, text_color);
f32 font_x = inner.x1 - font_string_width(system, target, font_id, font_name);
if (font_x > p.x + 10.f){
draw_string(system, target, font_id, font_name, V2(font_x, p.y), text_color);
}
i32 height = font.metrics->height;
x = (i32)inner.x0;
y += height;
x = ceil32(draw_string(system, target, font_id, "if", x, y, keyword_color));
x = ceil32(draw_string(system, target, font_id, "(x < ", x, y, text_color));
x = ceil32(draw_string(system, target, font_id, "0", x, y, int_constant_color));
x = ceil32(draw_string(system, target, font_id, ") { x = ", x, y, text_color));
x = ceil32(draw_string(system, target, font_id, "0", x, y, int_constant_color));
x = ceil32(draw_string(system, target, font_id, "; } ", x, y, text_color));
x = ceil32(draw_string(system, target, font_id, "// comment", x, y, comment_color));
p = V2(inner.x0, p.y + (f32)height);
p.x += draw_string(system, target, font_id, "if", p, keyword_color);
p.x += draw_string(system, target, font_id, "(x < ", p, text_color);
p.x += draw_string(system, target, font_id, "0", p, int_constant_color);
p.x += draw_string(system, target, font_id, ") { x = ", p, text_color);
p.x += draw_string(system, target, font_id, "0", p, int_constant_color);
p.x += draw_string(system, target, font_id, "; } ", p, text_color);
p.x += draw_string(system, target, font_id, "// comment", p, comment_color);
x = (i32)inner.x0;
y += height;
draw_string(system, target, font_id, "[] () {}; * -> +-/ <>= ! && || % ^", x, y, text_color);
p = V2(inner.x0, p.y + (f32)height);
draw_string(system, target, font_id, "[] () {}; * -> +-/ <>= ! && || % ^", p, text_color);
}break;
}
}

View File

@ -43,7 +43,8 @@
# include "4coder_default_bindings.cpp"
#endif
#include "4ed_math.h"
#include "4coder_base_types.cpp"
//#include "4ed_math.h"
#include "4ed_font.h"
#include "4ed_system.h"
@ -1748,12 +1749,13 @@ win32_proc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam){
b8 *control_keys = win32vars.input_chunk.pers.control_keys;
i32 control_keys_size = sizeof(win32vars.input_chunk.pers.control_keys);
Assert(*count < KEY_INPUT_BUFFER_SIZE);
data[*count].character = 0;
data[*count].character_no_caps_lock = 0;
data[*count].keycode = key;
memcpy(data[*count].modifiers, control_keys, control_keys_size);
++(*count);
if (*count < KEY_INPUT_BUFFER_SIZE){
data[*count].character = 0;
data[*count].character_no_caps_lock = 0;
data[*count].keycode = key;
memcpy(data[*count].modifiers, control_keys, control_keys_size);
++(*count);
}
win32vars.got_useful_event = true;
}
@ -1792,12 +1794,13 @@ win32_proc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam){
}
}
Assert(*count < KEY_INPUT_BUFFER_SIZE);
data[*count].character = character;
data[*count].character_no_caps_lock = character_no_caps_lock;
data[*count].keycode = character_no_caps_lock;
memcpy(data[*count].modifiers, control_keys, control_keys_size);
++(*count);
if (*count < KEY_INPUT_BUFFER_SIZE){
data[*count].character = character;
data[*count].character_no_caps_lock = character_no_caps_lock;
data[*count].keycode = character_no_caps_lock;
memcpy(data[*count].modifiers, control_keys, control_keys_size);
++(*count);
}
win32vars.got_useful_event = true;
}break;