1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
|
#ifndef CC_DRAWER2D_H
#define CC_DRAWER2D_H
#include "Bitmap.h"
#include "Constants.h"
/* Performs a variety of drawing operations on bitmaps, and converts bitmaps into textures.
Copyright 2014-2023 ClassiCube | Licensed under BSD-3
*/
enum FONT_FLAGS { FONT_FLAGS_NONE = 0x00, FONT_FLAGS_BOLD = 0x01, FONT_FLAGS_UNDERLINE = 0x02, FONT_FLAGS_PADDING = 0x04 };
struct FontDesc { void* handle; cc_uint16 size, flags; int height; };
struct DrawTextArgs { cc_string text; struct FontDesc* font; cc_bool useShadow; };
struct Context2D { struct Bitmap bmp; int width, height; void* meta; };
struct Texture;
struct IGameComponent;
extern struct IGameComponent Drawer2D_Component;
#define DRAWER2D_MAX_TEXT_LENGTH 256
CC_VAR extern struct _Drawer2DData {
/* Whether text should be drawn and measured using the currently set font bitmap */
/* If false, then text is instead draw using platform/system fonts */
cc_bool BitmappedText;
/* Whether the shadows behind text (that uses shadows) is fully black */
cc_bool BlackTextShadows;
/* List of all colors (An A of 0 means the color is not used) */
BitmapCol Colors[DRAWER2D_MAX_COLORS];
} Drawer2D;
#define Drawer2D_GetColor(c) Drawer2D.Colors[(cc_uint8)c]
void DrawTextArgs_Make(struct DrawTextArgs* args, STRING_REF const cc_string* text, struct FontDesc* font, cc_bool useShadow);
void DrawTextArgs_MakeEmpty(struct DrawTextArgs* args, struct FontDesc* font, cc_bool useShadow);
/* Clamps the given rectangle to lie inside the bitmap */
/* Returns false if rectangle is completely outside bitmap's rectangle */
cc_bool Drawer2D_Clamp(struct Context2D* ctx, int* x, int* y, int* width, int* height);
/* Allocates a new context for 2D drawing */
/* Note: Allocates a power-of-2 sized backing bitmap equal to or greater than the given size */
CC_API void Context2D_Alloc(struct Context2D* ctx, int width, int height);
/* Allocates a new context for 2D drawing, using an existing bimap as backing bitmap */
CC_API void Context2D_Wrap(struct Context2D* ctx, struct Bitmap* bmp);
/* Frees/Releases a previously allocatedcontext for 2D drawing */
CC_API void Context2D_Free(struct Context2D* ctx);
/* Creates a texture consisting of the pixels from the backing bitmap of the given 2D context */
CC_API void Context2D_MakeTexture(struct Texture* tex, struct Context2D* ctx);
/* Draws text using the given font at the given coordinates */
CC_API void Context2D_DrawText(struct Context2D* ctx, struct DrawTextArgs* args, int x, int y);
/* Fills the given area using pixels from the source bitmap */
CC_API void Context2D_DrawPixels(struct Context2D* ctx, int x, int y, struct Bitmap* src);
/* Fills the area with the given color */
CC_API void Context2D_Clear(struct Context2D* ctx, BitmapCol color,
int x, int y, int width, int height);
/* Fills the given area with a simple noisy pattern */
/* Variation determines how 'visible/obvious' the noise is */
CC_API void Gradient_Noise(struct Context2D* ctx, BitmapCol color, int variation,
int x, int y, int width, int height);
/* Fills the given area with a vertical gradient, linerarly interpolating from a to b */
/* First drawn row is filled with 'a', while last drawn is filled with 'b' */
CC_API void Gradient_Vertical(struct Context2D* ctx, BitmapCol a, BitmapCol b,
int x, int y, int width, int height);
/* Blends the given area with the given color */
/* Note that this only blends RGB, A is not blended */
CC_API void Gradient_Blend(struct Context2D* ctx, BitmapCol color, int blend,
int x, int y, int width, int height);
/* Returns how wide the given text would be when drawn */
CC_API int Drawer2D_TextWidth(struct DrawTextArgs* args);
/* Returns how tall the given text would be when drawn */
/* NOTE: Height returned only depends on the font. (see Font_CalcHeight) */
CC_API int Drawer2D_TextHeight(struct DrawTextArgs* args);
/* Similar to Context2D_DrawText, but trims the text with trailing ".." if wider than maxWidth */
void Drawer2D_DrawClippedText(struct Context2D* ctx, struct DrawTextArgs* args,
int x, int y, int maxWidth);
/* Creates a texture consisting only of the given text drawn onto it */
/* NOTE: The returned texture is always padded up to nearest power of two dimensions */
CC_API void Drawer2D_MakeTextTexture(struct Texture* tex, struct DrawTextArgs* args);
/* Returns whether the given color code is used/valid */
/* NOTE: This can change if the server defines custom color codes */
cc_bool Drawer2D_ValidColorCodeAt(const cc_string* text, int i);
/* Whether text is empty or consists purely of valid color codes */
cc_bool Drawer2D_IsEmptyText(const cc_string* text);
/* Copies all characters from str into src, except for used color codes */
/* NOTE: Ampersands not followed by a used color code are still copied */
void Drawer2D_WithoutColors(cc_string* str, const cc_string* src);
/* Returns the last valid color code in the given input, or \0 if not found */
char Drawer2D_LastColor(const cc_string* text, int start);
/* Returns whether the color code is f, F or \0 */
cc_bool Drawer2D_IsWhiteColor(char c);
cc_bool Drawer2D_UNSAFE_NextPart(cc_string* left, cc_string* part, char* colorCode);
/* Divides R/G/B by 4 */
#define SHADOW_MASK ((0x3F << BITMAPCOLOR_R_SHIFT) | (0x3F << BITMAPCOLOR_G_SHIFT) | (0x3F << BITMAPCOLOR_B_SHIFT))
static CC_INLINE BitmapCol GetShadowColor(BitmapCol c) {
if (Drawer2D.BlackTextShadows) return BITMAPCOLOR_BLACK;
/* Initial layout: aaaa_aaaa|rrrr_rrrr|gggg_gggg|bbbb_bbbb */
/* Shift right 2: 00aa_aaaa|aarr_rrrr|rrgg_gggg|ggbb_bbbb */
/* And by 3f3f3f: 0000_0000|00rr_rrrr|00gg_gggg|00bb_bbbb */
/* Or by alpha : aaaa_aaaa|00rr_rrrr|00gg_gggg|00bb_bbbb */
return (c & BITMAPCOLOR_A_MASK) | ((c >> 2) & SHADOW_MASK);
}
/* Allocates a new instance of the default font using the given size and flags */
/* Uses Font_MakeBitmapped or SysFont_MakeDefault depending on Drawer2D_BitmappedText */
CC_API void Font_Make(struct FontDesc* desc, int size, int flags);
/* Frees an allocated font */
CC_API void Font_Free(struct FontDesc* desc);
/* Returns the line height for drawing text using the given font */
int Font_CalcHeight(const struct FontDesc* font, cc_bool useShadow);
/* Adjusts height to be closer to system fonts */
int Drawer2D_AdjHeight(int point);
void Drawer2D_ReducePadding_Tex(struct Texture* tex, int point, int scale);
void Drawer2D_ReducePadding_Height(int* height, int point, int scale);
/* Quickly fills the given box region */
void Drawer2D_Fill(struct Bitmap* bmp, int x, int y, int width, int height, BitmapCol color);
/* Sets the bitmap used for drawing bitmapped fonts. (i.e. default.png) */
/* The bitmap must be square and consist of a 16x16 tile layout */
cc_bool Font_SetBitmapAtlas(struct Bitmap* bmp);
/* Sets padding for a bitmapped font */
void Font_SetPadding(struct FontDesc* desc, int amount);
/* Initialises the given font for drawing bitmapped text using default.png */
void Font_MakeBitmapped(struct FontDesc* desc, int size, int flags);
#endif
|