lexlib/
c.rs

1// Copyright 2023 alexevier <alexevier@proton.me>
2// licensed under the zlib license <https://www.zlib.net/zlib_license.html>
3
4//! Direct interface with the C part.
5//!
6//! this is not stable and is subject to changes.
7
8use crate::color::{Color8, ColorF, Color16};
9use crate::image::Image;
10use crate::time;
11use core::ffi::c_void;
12use core::ffi::c_char;
13use core::ffi::c_uchar;
14use core::ffi::c_int;
15use core::ffi::c_uint;
16
17
18
19// cfile.h //
20
21extern "C" {
22	pub fn lexlibCFileMap(file: *mut libc::FILE) -> *mut c_void;
23	pub fn lexlibCFileMode(file: *mut libc::FILE) -> u8;
24	pub fn lexlibCFileSize(file: *mut libc::FILE) -> i64;
25	pub fn lexlibCFileType(file: *mut libc::FILE) -> u16;
26}
27
28// ..cfile.h.. //
29
30
31
32// color.h //
33
34// modes
35// LEXLIB_NONE is defined in defines.h
36pub const LEXLIB_ADD: u8 = 0x01;
37pub const LEXLIB_SUB: u8 = 0x02;
38pub const LEXLIB_MUL: u8 = 0x04;
39pub const LEXLIB_DIV: u8 = 0x08;
40pub const LEXLIB_MOD: u8 = 0x10;
41pub const LEXLIB_BLEND: u8 = 0x80;
42
43// limits
44pub const LEXLIB_COLOR_MIN: u8 = 0x00;
45pub const LEXLIB_COLOR_MAX: u8 = 0xFF;
46pub const LEXLIB_COLORF_MIN: f32 = 0.0;
47pub const LEXLIB_COLORF_MAX: f32 = 1.0;
48pub const LEXLIB_COLOR16_MIN: u16 = 0x0000;
49pub const LEXLIB_COLOR16_MAX: u16 = 0xFFFF;
50
51extern "C" {
52	// performs a color blend depending on the mode.
53	// if mode is invalid LEXLIB_ADD is performed.
54	pub fn lexlibColorBlend(dst: Color8, src: Color8, mode: u8) -> Color8;
55	pub fn lexlibColorFBlend(dst: ColorF, src: ColorF, mode: u8) -> ColorF;
56	pub fn lexlibColor16Blend(dst: Color16, src: Color16, mode: u8) -> Color16;
57
58	// convert to gray scale, premultiplies the alpha.
59	pub fn lexlibColorGray(color: Color8) -> u8;
60	pub fn lexlibColorFGray(color: ColorF) -> f32;
61	pub fn lexlibColor16Gray(color: Color16) -> u16;
62
63	// convert to gray scale preserves the alpha.
64	pub fn lexlibColorGrayAlpha(color: Color8) -> Color8;
65	pub fn lexlibColorFGrayAlpha(color: ColorF) -> ColorF;
66	pub fn lexlibColor16GrayAlpha(color: Color16) -> Color16;
67
68	// premultiply alpha.
69	pub fn lexlibColorPremultiply(color: Color8) -> Color8;
70	pub fn lexlibColorFPremultiply(color: ColorF) -> ColorF;
71	pub fn lexlibColor16Premultiply(color: Color16) -> Color16;
72
73	// clamps a LexlibColorF to be in the range  0..1
74	pub fn lexlibColorFClamp(color: ColorF) -> ColorF;
75
76	// convertions from Color
77	pub fn lexlibColorToF(color: Color8) -> ColorF;
78	pub fn lexlibColorTo16(color: Color8) -> Color16;
79
80	// convertions from ColorF
81	pub fn lexlibColorFTo8(color: ColorF) -> Color8;
82	pub fn lexlibColorFTo16(color: ColorF) -> Color16;
83
84	// convertions from Color16
85	pub fn lexlibColor16To8(color: Color16) -> Color8;
86	pub fn lexlibColor16ToF(color: Color16) -> ColorF;
87}
88
89// ..color.h.. //
90
91
92
93// defines.h //
94
95/// represents a true or false type explicitly.
96pub type LexlibBool = c_uchar;
97pub const LEXLIB_TRUE: u8 = 1;
98pub const LEXLIB_FALSE: u8 = 0;
99
100// misc
101pub const LEXLIB_NONE: u8 = 0x00;
102
103// errors : limited to u8 range.
104pub const LEXLIB_OK: u8 = 0x00;
105pub const LEXLIB_INVALID_VALUE: u8 = 0xB0;
106pub const LEXLIB_INVALID_OPERATION: u8 = 0xB1;
107pub const LEXLIB_INVALID_REQUEST: u8 = 0xB2;
108pub const LEXLIB_INVALID_ARG: u8 = 0xB3;
109pub const LEXLIB_INVALID_DIR: u8 = 0xB4;
110pub const LEXLIB_INVALID_LEN: u8 = 0xB5;
111pub const LEXLIB_INVALID_MSG: u8 = 0xB6;
112pub const LEXLIB_INVALID_SIZE: u8 = 0xB7;
113pub const LEXLIB_INVALID_FILE: u8 = 0xB8;
114pub const LEXLIB_INVALID_PATH: u8 = 0xB9;
115pub const LEXLIB_INVALID_NAME: u8 = 0xBA;
116pub const LEXLIB_INVALID_TYPE: u8 = 0xBB;
117pub const LEXLIB_INVALID_CHAR: u8 = 0xBC;
118pub const LEXLIB_INVALID_DATA: u8 = 0xBD;
119pub const LEXLIB_CORRUPT_DATA: u8 = 0xC0;
120pub const LEXLIB_EOF: u8 = 0xC1;
121pub const LEXLIB_EXIST: u8 = 0xFF;
122pub const LEXLIB_CANT_OPEN: u8 = 0xC3;
123pub const LEXLIB_CANT_CLOSE: u8 = 0xC4;
124pub const LEXLIB_CANT_READ: u8 = 0xC5;
125pub const LEXLIB_CANT_WRITE: u8 = 0xC6;
126pub const LEXLIB_PARTIAL_READ: u8 = 0xC7;
127pub const LEXLIB_PARTIAL_WRITE: u8 = 0xC8;
128pub const LEXLIB_RESET: u8 = 0xE0;
129pub const LEXLIB_ABORT: u8 = 0xE1;
130pub const LEXLIB_BUSY: u8 = 0xE2;
131pub const LEXLIB_DENIED: u8 = 0xE3;
132pub const LEXLIB_CANCEL: u8 = 0xE4;
133pub const LEXLIB_BROKEN: u8 = 0xE5;
134pub const LEXLIB_BLOCKING: u8 = 0xE6;
135pub const LEXLIB_UNAVAILABLE: u8 = 0xE7;
136pub const LEXLIB_INTERRUPTED: u8 = 0xE8;
137pub const LEXLIB_LIMIT: u8 = 0xE9;
138pub const LEXLIB_NOT_FOUND: u8 = 0xEA;
139pub const LEXLIB_UNSUPORTED: u8 = 0xF0;
140pub const LEXLIB_OUT_OF_DISK: u8 = 0xFD;
141pub const LEXLIB_OUT_OF_MEMORY: u8 = 0xFE;
142pub const LEXLIB_ERROR: u8 = 0xFF;
143
144// access permissions
145pub const LEXLIB_RD: u8 = 0x01;
146pub const LEXLIB_WR: u8 = 0x02;
147pub const LEXLIB_RDWR: u8 = 0x03;
148pub const LEXLIB_APPEND: u8 = 0x04;
149pub const LEXLIB_CREATE: u8 = 0x08;
150pub const LEXLIB_OVERWRITE: u8 = 0x10;
151
152/// different file types recognised by lexlib.
153#[repr(C)]
154#[allow(non_camel_case_types)]
155pub enum LexlibFileType {
156	LEXLIB_FILETYPE_UNKNOWN = 0,
157	LEXLIB_FILETYPE_BMP,
158	LEXLIB_FILETYPE_JPG,
159	LEXLIB_FILETYPE_PNG,
160	LEXLIB_FILETYPE_SCRIPT,
161}
162
163// ..defines.h.. //
164
165
166
167// image.h //
168pub const LEXLIB_FLIP_X: u8 = 0x01;
169pub const LEXLIB_FLIP_Y: u8 = 0x02;
170pub const LEXLIB_ALPHA: u8 = 0x80;
171
172pub const LEXLIB_BMP_CORE: u8 = 0x0C;
173pub const LEXLIB_BMP_INFO: u8 = 0x28;
174pub const LEXLIB_BMP_INFO_V3: u8 = 0x38;
175
176extern "C" {
177	pub fn lexlibImageNew(image: *mut Image, width: u32, height: u32, colorProfile: u8, bpc: u8) -> u8;
178	pub fn lexlibImageDelete(image: *mut Image);
179	pub fn lexlibImageCopy(copy: *mut Image, original: *const Image) -> u8;
180	pub fn lexlibImageValidate(image: *const Image) -> u8;
181	pub fn lexlibImageFlip(image: *mut Image, flags: u8) -> u8;
182	pub fn lexlibImageProfileChange(image: *mut Image, profile: u8) -> u8;
183	pub fn lexlibImageFillArea(image: *mut Image, x: u32, y: u32, w: u32, h: u32, color: Color8, blendmode: u8) -> u8;
184	pub fn lexlibImagePixel(image: *const Image, x: u32, y: u32, color: *mut Color8) -> u8;
185	pub fn lexlibImagePixel16(image: *const Image, x: u32, y: u32, color: *mut Color16) -> u8;
186	pub fn lexlibImagePixelSet(image: *mut Image, x: u32, y: u32, color: Color8, blendmode: u8) -> u8;
187	pub fn lexlibImagePixel16Set(image: *mut Image, x: u32, y: u32, color: Color16, blendmode: u8) -> u8;
188	pub fn lexlibImageLoad(image: *mut Image, filename: *const c_char) -> u8;
189	pub fn lexlibImageSave(image: *const Image, filename: *const c_char) -> u8;
190	pub fn lexlibImageLoadBmp(image: *mut Image, filename: *const c_char) -> u8;
191	pub fn lexlibImageLoadBmpMem(image: *mut Image, mem: *const c_void, size: usize) -> u8;
192	pub fn lexlibImageSaveBmp(image: *const Image, filename: *const c_char) -> u8;
193	pub fn lexlibImageSaveBmpEx(image: *const Image, filename: *const c_char, profile: u8, header: u8) -> u8;
194	pub fn lexlibImageLoadPng(image: *mut Image, filename: *const c_char) -> u8;
195	pub fn lexlibImageSavePng(image: *const Image, filename: *const c_char) -> u8;
196	#[cfg(feature = "experimental")]
197	pub fn lexlibImageRepairStruct(image: *mut Image) -> u8;
198}
199// ..image.h.. //
200
201
202
203// mem.h //
204
205extern "C" {
206	pub fn lexlibMemUnmap(mem: *mut c_void, size: usize);
207}
208
209// ..mem.h.. //
210
211
212
213// os.h //
214
215extern "C" {
216	pub fn lexlibSleep(seconds: c_uint);
217	pub fn lexlibSleepMs(millis: c_uint);
218	pub fn lexlibRandom() -> c_uint;
219	pub fn lexlibRamSize() -> u64;
220}
221
222// ..os.h.. //
223
224
225
226// str.h //
227
228extern "C" {
229	pub fn lexlibStrCat(str1: *const c_char, str2: *const c_char) -> *mut c_char;
230	pub fn lexlibStrCopy(str: *const c_char) -> *mut c_char;
231	pub fn lexlibStrFile(filename: *const c_char) -> *mut c_char;
232	pub fn lexlibStrPathNew(str: *const c_char) -> *mut c_char;
233	pub fn lexlibStrPathPush(str: *mut *mut c_char, add: *const c_char) -> u8;
234	pub fn lexlibStrPathPop(str: *mut *mut c_char) -> u8;
235	pub fn lexlibStrPathAsDir(str: *mut *mut c_char) -> u8;
236	pub fn lexlibStrPathAsFile(str: *mut *mut c_char) -> u8;
237}
238
239// ..str.h.. //
240
241
242
243// time.h //
244
245extern "C" {
246	pub fn lexlibTimeNanos() -> u64;
247	pub fn lexlibTimeMicros() -> u64;
248	pub fn lexlibTimeMillis() -> u64;
249	pub fn lexlibTimeSeconds() -> u64;
250
251	pub fn lexlibThrdNanos() -> u64;
252	pub fn lexlibThrdMicros() -> u64;
253	pub fn lexlibThrdMillis() -> u64;
254	pub fn lexlibThrdSeconds() -> u64;
255
256	pub fn lexlibProcNanos() -> u64;
257	pub fn lexlibProcMicros() -> u64;
258	pub fn lexlibProcMillis() -> u64;
259	pub fn lexlibProcSeconds() -> u64;
260
261	pub fn lexlibTimerNew(ms: u64) -> time::Timer;
262	pub fn lexlibTimerSet(timer: *mut time::Timer, ms: u64);
263	pub fn lexlibTimerAdd(timer: *mut time::Timer, ms: u64);
264	pub fn lexlibTimerStart(timer: *mut time::Timer);
265	pub fn lexlibTimerUpdate(timer: *mut time::Timer);
266	pub fn lexlibTimerDone(timer: *mut time::Timer) -> LexlibBool;
267	pub fn lexlibTimerUntilDone(timer: *mut time::Timer);
268	pub fn lexlibTimerFinished(timer: *const time::Timer) -> LexlibBool;
269}
270
271// ..time.h.. //
272
273
274
275// vec.h //
276
277extern "C" {
278	pub fn lexlibVecNew_(len: usize, typeSize: usize) -> *mut c_void;
279	pub fn lexlibVecDelete(vec: *mut c_void);
280	pub fn lexlibVecGet(vec: *const c_void, index: usize) -> *mut c_void;
281	pub fn lexlibVecPush_(vec: *mut *mut c_void, obj: *const c_void) -> c_int;
282	pub fn lexlibVecPop(vec: *mut c_void);
283	pub fn lexlibVecInsert_(vec: *mut *mut c_void, index: usize, obj: *mut c_void) -> c_int;
284	pub fn lexlibVecRemove(vec: *mut c_void, index: usize) -> c_int;
285	pub fn lexlibVecResize(vec: *mut *mut c_void, newcap: usize) -> c_int;
286	pub fn lexlibVecFind(vec: *const c_void, obj: *const c_void) -> *mut c_void;
287	pub fn lexlibVecSwap(vec: *mut c_void, a: usize, b: usize) -> c_int;
288	pub fn lexlibVecClear(vec: *mut c_void);
289	pub fn lexlibVecLen(vec: *const c_void) -> usize;
290	pub fn lexlibVecCap(vec: *const c_void) -> usize;
291}
292
293// ..vec.h.. //