2023-04-17 08:56:38 +00:00
|
|
|
//*****************************************************************
|
|
|
|
//
|
|
|
|
// $file: graphics.h $
|
|
|
|
// $author: Martin Fouilleul $
|
|
|
|
// $date: 23/36/2015 $
|
|
|
|
// $revision: $
|
|
|
|
//
|
|
|
|
//*****************************************************************
|
|
|
|
#ifndef __GRAPHICS_H_
|
|
|
|
#define __GRAPHICS_H_
|
|
|
|
|
|
|
|
#include"typedefs.h"
|
2023-04-18 16:06:47 +00:00
|
|
|
#include"strings.h"
|
2023-04-17 08:56:38 +00:00
|
|
|
|
|
|
|
typedef struct g_mat2x3
|
|
|
|
{
|
|
|
|
f32 m[6];
|
|
|
|
} g_mat2x3;
|
|
|
|
|
|
|
|
typedef struct g_color
|
|
|
|
{
|
|
|
|
union
|
|
|
|
{
|
|
|
|
struct
|
|
|
|
{
|
|
|
|
f32 r;
|
|
|
|
f32 g;
|
|
|
|
f32 b;
|
|
|
|
f32 a;
|
|
|
|
};
|
|
|
|
f32 c[4];
|
|
|
|
};
|
|
|
|
} g_color;
|
|
|
|
|
|
|
|
typedef enum {G_JOINT_MITER = 0,
|
|
|
|
G_JOINT_BEVEL,
|
|
|
|
G_JOINT_NONE } g_joint_type;
|
|
|
|
|
|
|
|
typedef enum {G_CAP_NONE = 0,
|
|
|
|
G_CAP_SQUARE } g_cap_type;
|
|
|
|
|
|
|
|
typedef struct g_font { u64 h; } g_font;
|
|
|
|
|
|
|
|
typedef struct g_font_extents
|
|
|
|
{
|
|
|
|
f32 ascent; // the extent above the baseline (by convention a positive value extends above the baseline)
|
|
|
|
f32 descent; // the extent below the baseline (by convention, positive value extends below the baseline)
|
|
|
|
f32 leading; // spacing between one row's descent and the next row's ascent
|
|
|
|
f32 xHeight; // height of the lower case letter 'x'
|
|
|
|
f32 capHeight; // height of the upper case letter 'M'
|
|
|
|
f32 width; // maximum width of the font
|
|
|
|
|
|
|
|
} g_font_extents;
|
|
|
|
|
|
|
|
typedef struct g_text_extents
|
|
|
|
{
|
|
|
|
f32 xBearing;
|
|
|
|
f32 yBearing;
|
|
|
|
f32 width;
|
|
|
|
f32 height;
|
|
|
|
f32 xAdvance;
|
|
|
|
f32 yAdvance;
|
|
|
|
|
|
|
|
} g_text_extents;
|
|
|
|
|
|
|
|
//------------------------------------------------------------------------------------------
|
|
|
|
//NOTE(martin): fonts
|
|
|
|
//------------------------------------------------------------------------------------------
|
|
|
|
|
|
|
|
g_font g_font_nil();
|
|
|
|
g_font g_font_create_default();
|
|
|
|
//g_font g_font_create_from_memory(u32 size, byte* buffer, u32 rangeCount, unicode_range* ranges);
|
|
|
|
void g_font_destroy(g_font font);
|
|
|
|
|
|
|
|
//NOTE(martin): the following int valued functions return -1 if font is invalid or codepoint is not present in font//
|
|
|
|
//TODO(martin): add enum error codes
|
|
|
|
/*
|
|
|
|
g_font_extents g_font_get_extents(g_font font);
|
|
|
|
g_font_extents g_font_get_scaled_extents(g_font font, f32 emSize);
|
|
|
|
f32 g_font_get_scale_for_em_pixels(g_font font, f32 emSize);
|
|
|
|
|
|
|
|
//NOTE(martin): if you need to process more than one codepoint, first convert your codepoints to glyph indices, then use the
|
|
|
|
// glyph index versions of the functions, which can take an array of glyph indices.
|
|
|
|
|
|
|
|
str32 g_font_get_glyph_indices(g_font font, str32 codePoints, str32 backing);
|
|
|
|
str32 g_font_push_glyph_indices(g_font font, mem_arena* arena, str32 codePoints);
|
|
|
|
u32 g_font_get_glyph_index(g_font font, utf32 codePoint);
|
|
|
|
|
|
|
|
int g_font_get_codepoint_extents(g_font font, utf32 codePoint, g_text_extents* outExtents);
|
|
|
|
|
|
|
|
int g_font_get_glyph_extents(g_font font, str32 glyphIndices, g_text_extents* outExtents);
|
|
|
|
|
|
|
|
mp_rect g_text_bounding_box_utf32(g_font font, f32 fontSize, str32 text);
|
|
|
|
mp_rect g_text_bounding_box(g_font font, f32 fontSize, str8 text);
|
|
|
|
*/
|
|
|
|
//------------------------------------------------------------------------------------------
|
|
|
|
//NOTE(martin): images
|
|
|
|
//------------------------------------------------------------------------------------------
|
|
|
|
/*
|
|
|
|
g_image g_image_nil();
|
|
|
|
bool g_image_is_nil(g_image a);
|
|
|
|
|
|
|
|
g_image g_image_create(u32 width, u32 height);
|
|
|
|
g_image g_image_create_from_rgba8(u32 width, u32 height, u8* pixels);
|
|
|
|
g_image g_image_create_from_data(str8 data, bool flip);
|
|
|
|
g_image g_image_create_from_file(str8 path, bool flip);
|
|
|
|
|
|
|
|
void g_image_destroy(g_image image);
|
|
|
|
|
|
|
|
void g_image_upload_region_rgba8(g_image image, mp_rect region, u8* pixels);
|
|
|
|
vec2 g_image_size(g_image image);
|
|
|
|
*/
|
|
|
|
//------------------------------------------------------------------------------------------
|
|
|
|
//NOTE(martin): atlasing
|
|
|
|
//------------------------------------------------------------------------------------------
|
|
|
|
/*
|
|
|
|
//NOTE: rectangle allocator
|
|
|
|
typedef struct g_rect_atlas g_rect_atlas;
|
|
|
|
|
|
|
|
g_rect_atlas* g_rect_atlas_create(mem_arena* arena, i32 width, i32 height);
|
|
|
|
mp_rect g_rect_atlas_alloc(g_rect_atlas* atlas, i32 width, i32 height);
|
|
|
|
void g_rect_atlas_recycle(g_rect_atlas* atlas, mp_rect rect);
|
|
|
|
|
|
|
|
//NOTE: image atlas helpers
|
|
|
|
typedef struct g_image_region
|
|
|
|
{
|
|
|
|
g_image image;
|
|
|
|
mp_rect rect;
|
|
|
|
} g_image_region;
|
|
|
|
|
|
|
|
g_image_region g_image_atlas_alloc_from_rgba8(g_rect_atlas* atlas, g_image backingImage, u32 width, u32 height, u8* pixels);
|
|
|
|
g_image_region g_image_atlas_alloc_from_data(g_rect_atlas* atlas, g_image backingImage, str8 data, bool flip);
|
|
|
|
g_image_region g_image_atlas_alloc_from_file(g_rect_atlas* atlas, g_image backingImage, str8 path, bool flip);
|
|
|
|
void g_image_atlas_recycle(g_rect_atlas* atlas, g_image_region imageRgn);
|
|
|
|
*/
|
|
|
|
//------------------------------------------------------------------------------------------
|
|
|
|
//NOTE(martin): transform, viewport and clipping
|
|
|
|
//------------------------------------------------------------------------------------------
|
|
|
|
void g_viewport(mp_rect viewPort);
|
|
|
|
|
|
|
|
void g_matrix_push(g_mat2x3 matrix);
|
|
|
|
void g_matrix_pop();
|
|
|
|
|
|
|
|
void g_clip_push(f32 x, f32 y, f32 w, f32 h);
|
|
|
|
void g_clip_pop();
|
|
|
|
|
|
|
|
//------------------------------------------------------------------------------------------
|
|
|
|
//NOTE(martin): graphics attributes setting/getting
|
|
|
|
//------------------------------------------------------------------------------------------
|
|
|
|
void g_set_color(g_color color);
|
|
|
|
void g_set_color_rgba(f32 r, f32 g, f32 b, f32 a);
|
|
|
|
void g_set_width(f32 width);
|
|
|
|
void g_set_tolerance(f32 tolerance);
|
|
|
|
void g_set_joint(g_joint_type joint);
|
|
|
|
void g_set_max_joint_excursion(f32 maxJointExcursion);
|
|
|
|
void g_set_cap(g_cap_type cap);
|
|
|
|
void g_set_font(g_font font);
|
|
|
|
void g_set_font_size(f32 size);
|
|
|
|
void g_set_text_flip(bool flip);
|
|
|
|
|
|
|
|
/*
|
|
|
|
void g_set_image(g_image image);
|
|
|
|
void g_set_image_source_region(mp_rect region);
|
|
|
|
*/
|
|
|
|
|
|
|
|
g_color g_get_color();
|
|
|
|
f32 g_get_width();
|
|
|
|
f32 g_get_tolerance();
|
|
|
|
g_joint_type g_get_joint();
|
|
|
|
f32 g_get_max_joint_excursion();
|
|
|
|
g_cap_type g_get_cap();
|
|
|
|
g_font g_get_font();
|
|
|
|
f32 g_get_font_size();
|
|
|
|
bool g_get_text_flip();
|
|
|
|
|
|
|
|
//------------------------------------------------------------------------------------------
|
|
|
|
//NOTE(martin): path construction
|
|
|
|
//------------------------------------------------------------------------------------------
|
|
|
|
vec2 g_get_position();
|
|
|
|
void g_move_to(f32 x, f32 y);
|
|
|
|
void g_line_to(f32 x, f32 y);
|
|
|
|
void g_quadratic_to(f32 x1, f32 y1, f32 x2, f32 y2);
|
|
|
|
void g_cubic_to(f32 x1, f32 y1, f32 x2, f32 y2, f32 x3, f32 y3);
|
|
|
|
void g_close_path();
|
|
|
|
|
|
|
|
/*
|
|
|
|
mp_rect g_glyph_outlines(str32 glyphIndices);
|
|
|
|
void g_codepoints_outlines(str32 string);
|
|
|
|
*/
|
|
|
|
|
|
|
|
void g_text_outlines(str8 string);
|
|
|
|
|
|
|
|
//------------------------------------------------------------------------------------------
|
|
|
|
//NOTE(martin): clear/fill/stroke
|
|
|
|
//------------------------------------------------------------------------------------------
|
|
|
|
void g_clear();
|
|
|
|
void g_fill();
|
|
|
|
void g_stroke();
|
|
|
|
|
|
|
|
//------------------------------------------------------------------------------------------
|
|
|
|
//NOTE(martin): simple shapes helpers
|
|
|
|
//------------------------------------------------------------------------------------------
|
|
|
|
void g_rectangle_fill(f32 x, f32 y, f32 w, f32 h);
|
|
|
|
void g_rectangle_stroke(f32 x, f32 y, f32 w, f32 h);
|
|
|
|
void g_rounded_rectangle_fill(f32 x, f32 y, f32 w, f32 h, f32 r);
|
|
|
|
void g_rounded_rectangle_stroke(f32 x, f32 y, f32 w, f32 h, f32 r);
|
|
|
|
void g_ellipse_fill(f32 x, f32 y, f32 rx, f32 ry);
|
|
|
|
void g_ellipse_stroke(f32 x, f32 y, f32 rx, f32 ry);
|
|
|
|
void g_circle_fill(f32 x, f32 y, f32 r);
|
|
|
|
void g_circle_stroke(f32 x, f32 y, f32 r);
|
|
|
|
void g_arc(f32 x, f32 y, f32 r, f32 arcAngle, f32 startAngle);
|
|
|
|
|
|
|
|
//NOTE: image helpers
|
|
|
|
/*
|
|
|
|
void g_image_draw(g_image image, mp_rect rect);
|
|
|
|
void g_image_draw_region(g_image image, mp_rect srcRegion, mp_rect dstRegion);
|
|
|
|
*/
|
|
|
|
#endif //__GRAPHICS_H_
|