library: vendors/stb_image + vendors/stb_truetype — stb ships with sx
The stb headers move from the repo-root vendors/ (resolvable only with CWD = sx repo) into library/vendors/ following the sqlite convention — bindings module + c/ sources + provenance README — so '#import "vendors/stb_image/stb_image.sx"' (image v2.30 + image_write v1.16) and '#import "vendors/stb_truetype/stb_truetype.sx"' (v1.26) work from any consumer via the stdlib search paths. modules/ffi/stb.sx dissolves into the stb_image vendor; modules/ffi/stb_truetype.sx keeps its non-stb text-shaping companions and re-imports the vendored unit. examples/1625 pins a deterministic in-memory BMP decode; examples/1626 pins font init + metric invariants against the system Helvetica.
This commit is contained in:
@@ -1,5 +1,5 @@
|
|||||||
#import "modules/std.sx";
|
#import "modules/std.sx";
|
||||||
stb :: #import "modules/ffi/stb.sx";
|
stb :: #import "vendors/stb_image/stb_image.sx";
|
||||||
|
|
||||||
main :: () -> i32 {
|
main :: () -> i32 {
|
||||||
w: i32 = 0;
|
w: i32 = 0;
|
||||||
|
|||||||
35
examples/1625-vendor-stb-image-decode.sx
Normal file
35
examples/1625-vendor-stb-image-decode.sx
Normal file
@@ -0,0 +1,35 @@
|
|||||||
|
// The sx library ships stb_image: `#import "vendors/stb_image/
|
||||||
|
// stb_image.sx"` resolves through the stdlib search paths and the
|
||||||
|
// implementation compiles through the object cache. Decodes a 2x2
|
||||||
|
// 24-bit BMP built in memory — fully deterministic: dimensions,
|
||||||
|
// channel count, and the top-left pixel (blue) are pinned.
|
||||||
|
#import "modules/std.sx";
|
||||||
|
stb :: #import "vendors/stb_image/stb_image.sx";
|
||||||
|
|
||||||
|
main :: () -> i32 {
|
||||||
|
// BITMAPFILEHEADER (14) + BITMAPINFOHEADER (40) + 2 rows of
|
||||||
|
// 2 BGR pixels padded to 4-byte rows (8 each) = 70 bytes.
|
||||||
|
// Bottom row: red, green; top row: blue, white (BMP is bottom-up).
|
||||||
|
bmp : [70]u8 = .{
|
||||||
|
66, 77, 70, 0, 0, 0, 0, 0, 0, 0, 54, 0, 0, 0,
|
||||||
|
40, 0, 0, 0, 2, 0, 0, 0, 2, 0, 0, 0, 1, 0, 24, 0,
|
||||||
|
0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||||
|
0, 0, 0, 0, 0, 0, 0, 0,
|
||||||
|
0, 0, 255, 0, 255, 0, 0, 0,
|
||||||
|
255, 0, 0, 255, 255, 255, 0, 0,
|
||||||
|
};
|
||||||
|
|
||||||
|
w : i32 = 0;
|
||||||
|
h : i32 = 0;
|
||||||
|
ch : i32 = 0;
|
||||||
|
img := stb.stbi_load_from_memory(@bmp[0], 70, @w, @h, @ch, 3);
|
||||||
|
if xx img == 0 {
|
||||||
|
print("decode failed\n");
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
p : [*]u8 = xx img;
|
||||||
|
print("decoded {}x{} ({} channels)\n", w, h, ch);
|
||||||
|
print("top-left pixel: {} {} {}\n", p[0], p[1], p[2]);
|
||||||
|
stb.stbi_image_free(xx img);
|
||||||
|
0
|
||||||
|
}
|
||||||
36
examples/1626-vendor-stb-truetype-metrics.sx
Normal file
36
examples/1626-vendor-stb-truetype-metrics.sx
Normal file
@@ -0,0 +1,36 @@
|
|||||||
|
// The sx library ships stb_truetype: `#import "vendors/stb_truetype/
|
||||||
|
// stb_truetype.sx"` resolves through the stdlib search paths and the
|
||||||
|
// implementation compiles through the object cache. Loads the system
|
||||||
|
// Helvetica collection and pins INVARIANTS only (font versions vary
|
||||||
|
// across macOS releases): init succeeds, the pixel-height scale is
|
||||||
|
// positive, the ascender is positive and the descender negative.
|
||||||
|
#import "modules/std.sx";
|
||||||
|
fs :: #import "modules/std/fs.sx";
|
||||||
|
tt :: #import "vendors/stb_truetype/stb_truetype.sx";
|
||||||
|
|
||||||
|
main :: () -> i32 {
|
||||||
|
data := fs.read_file("/System/Library/Fonts/Helvetica.ttc");
|
||||||
|
if data == null {
|
||||||
|
print("font missing\n");
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
bytes := data!;
|
||||||
|
|
||||||
|
off := tt.stbtt_GetFontOffsetForIndex(bytes.ptr, 0);
|
||||||
|
print("font offset >= 0: {}\n", off >= 0);
|
||||||
|
|
||||||
|
info : *void = xx context.allocator.alloc_bytes(256);
|
||||||
|
ok := tt.stbtt_InitFont(info, bytes.ptr, off);
|
||||||
|
print("init ok: {}\n", ok != 0);
|
||||||
|
|
||||||
|
px : f32 = 32.0;
|
||||||
|
scale := tt.stbtt_ScaleForPixelHeight(info, px);
|
||||||
|
print("scale > 0: {}\n", scale > 0.0);
|
||||||
|
|
||||||
|
ascent : i32 = 0;
|
||||||
|
descent : i32 = 0;
|
||||||
|
linegap : i32 = 0;
|
||||||
|
tt.stbtt_GetFontVMetrics(info, @ascent, @descent, @linegap);
|
||||||
|
print("ascent > 0, descent < 0: {} {}\n", ascent > 0, descent < 0);
|
||||||
|
0
|
||||||
|
}
|
||||||
1
examples/expected/1625-vendor-stb-image-decode.exit
Normal file
1
examples/expected/1625-vendor-stb-image-decode.exit
Normal file
@@ -0,0 +1 @@
|
|||||||
|
0
|
||||||
2
examples/expected/1625-vendor-stb-image-decode.stdout
Normal file
2
examples/expected/1625-vendor-stb-image-decode.stdout
Normal file
@@ -0,0 +1,2 @@
|
|||||||
|
decoded 2x2 (3 channels)
|
||||||
|
top-left pixel: 0 0 255
|
||||||
1
examples/expected/1626-vendor-stb-truetype-metrics.exit
Normal file
1
examples/expected/1626-vendor-stb-truetype-metrics.exit
Normal file
@@ -0,0 +1 @@
|
|||||||
|
0
|
||||||
@@ -0,0 +1,4 @@
|
|||||||
|
font offset >= 0: true
|
||||||
|
init ok: true
|
||||||
|
scale > 0: true
|
||||||
|
ascent > 0, descent < 0: true true
|
||||||
@@ -1,7 +0,0 @@
|
|||||||
#import c {
|
|
||||||
#include "vendors/stb_image/stb_image.h";
|
|
||||||
#source "vendors/stb_image/stb_image_impl.c";
|
|
||||||
|
|
||||||
#include "vendors/stb_image/stb_image_write.h";
|
|
||||||
#source "vendors/stb_image/stb_image_write_impl.c";
|
|
||||||
};
|
|
||||||
@@ -1,7 +1,10 @@
|
|||||||
#import c {
|
// Font stack for the ui modules: the sx-shipped stb_truetype
|
||||||
#include "vendors/stb_truetype/stb_truetype.h";
|
// (vendors/stb_truetype/) plus the in-repo text-shaping companions
|
||||||
#source "vendors/stb_truetype/stb_truetype_impl.c";
|
// (file_utils, kb_text_shape — repo-root vendors/, not yet promoted
|
||||||
|
// to the library).
|
||||||
|
#import "vendors/stb_truetype/stb_truetype.sx";
|
||||||
|
|
||||||
|
#import c {
|
||||||
#include "vendors/file_utils/file_utils.h";
|
#include "vendors/file_utils/file_utils.h";
|
||||||
#source "vendors/file_utils/file_utils.c";
|
#source "vendors/file_utils/file_utils.c";
|
||||||
|
|
||||||
|
|||||||
@@ -4,7 +4,7 @@
|
|||||||
#import "modules/gpu/types.sx";
|
#import "modules/gpu/types.sx";
|
||||||
#import "modules/gpu/api.sx";
|
#import "modules/gpu/api.sx";
|
||||||
#import "modules/ffi/stb_truetype.sx";
|
#import "modules/ffi/stb_truetype.sx";
|
||||||
#import "modules/ffi/stb.sx";
|
#import "vendors/stb_image/stb_image.sx";
|
||||||
#import "modules/ui/types.sx";
|
#import "modules/ui/types.sx";
|
||||||
|
|
||||||
// Cached glyph data with UV coordinates into the atlas texture
|
// Cached glyph data with UV coordinates into the atlas texture
|
||||||
|
|||||||
20
library/vendors/stb_image/README.md
vendored
Normal file
20
library/vendors/stb_image/README.md
vendored
Normal file
@@ -0,0 +1,20 @@
|
|||||||
|
# vendors/stb_image — image decode/encode for sx programs
|
||||||
|
|
||||||
|
- stb_image: **v2.30**; stb_image_write: **v1.16** (version comments at
|
||||||
|
the top of each header)
|
||||||
|
- Source: <https://github.com/nothings/stb> (`stb_image.h`,
|
||||||
|
`stb_image_write.h`)
|
||||||
|
- License: public domain / MIT, dual (see the headers' license blocks)
|
||||||
|
- Files: `c/stb_image.h` + `c/stb_image_impl.c`, `c/stb_image_write.h`
|
||||||
|
+ `c/stb_image_write_impl.c` (each impl .c defines the
|
||||||
|
`*_IMPLEMENTATION` macro and includes its header)
|
||||||
|
|
||||||
|
`#import "vendors/stb_image/stb_image.sx"` resolves through the stdlib
|
||||||
|
search paths; the decls (`stbi_load`, `stbi_load_from_memory`,
|
||||||
|
`stbi_image_free`, `stbi_write_png`, …) are synthesized from the
|
||||||
|
headers, and the implementation compiles once per machine through sx's
|
||||||
|
object cache. `examples/1625-vendor-stb-image-decode.sx` pins an
|
||||||
|
in-memory BMP decode in the sx suite.
|
||||||
|
|
||||||
|
To upgrade: replace the headers under `c/` with newer upstream copies,
|
||||||
|
update this file, and rebuild (the object cache keys on source bytes).
|
||||||
19
library/vendors/stb_image/stb_image.sx
vendored
Normal file
19
library/vendors/stb_image/stb_image.sx
vendored
Normal file
@@ -0,0 +1,19 @@
|
|||||||
|
// =====================================================================
|
||||||
|
// vendors/stb_image — Sean Barrett's stb_image (decode) and
|
||||||
|
// stb_image_write (encode) as one `#import c` unit (c/, see README.md
|
||||||
|
// for versions + provenance).
|
||||||
|
//
|
||||||
|
// `#import "vendors/stb_image/stb_image.sx"` gives any sx program
|
||||||
|
// image decode/encode with no system dependency and no build flags:
|
||||||
|
// the decls are synthesized from the headers, and the implementation
|
||||||
|
// compiles through sx's content-addressed object cache — once per
|
||||||
|
// machine, not once per run.
|
||||||
|
// =====================================================================
|
||||||
|
|
||||||
|
#import c {
|
||||||
|
#include "c/stb_image.h";
|
||||||
|
#source "c/stb_image_impl.c";
|
||||||
|
|
||||||
|
#include "c/stb_image_write.h";
|
||||||
|
#source "c/stb_image_write_impl.c";
|
||||||
|
};
|
||||||
20
library/vendors/stb_truetype/README.md
vendored
Normal file
20
library/vendors/stb_truetype/README.md
vendored
Normal file
@@ -0,0 +1,20 @@
|
|||||||
|
# vendors/stb_truetype — font parsing/rasterization for sx programs
|
||||||
|
|
||||||
|
- Version: **v1.26** (version comment at the top of the header)
|
||||||
|
- Source: <https://github.com/nothings/stb> (`stb_truetype.h`)
|
||||||
|
- License: public domain / MIT, dual (see the header's license block)
|
||||||
|
- Files: `c/stb_truetype.h` + `c/stb_truetype_impl.c` (the impl .c
|
||||||
|
defines `STB_TRUETYPE_IMPLEMENTATION` and includes the header)
|
||||||
|
|
||||||
|
`#import "vendors/stb_truetype/stb_truetype.sx"` resolves through the
|
||||||
|
stdlib search paths; the decls (`stbtt_InitFont`,
|
||||||
|
`stbtt_ScaleForPixelHeight`, `stbtt_GetFontVMetrics`,
|
||||||
|
`stbtt_MakeGlyphBitmap`, …) are synthesized from the header, and the
|
||||||
|
implementation compiles once per machine through sx's object cache.
|
||||||
|
`stbtt_fontinfo` is opaque on the sx side: allocate a 256-byte blob
|
||||||
|
and pass its pointer (modules/ui/glyph_cache.sx is the reference
|
||||||
|
consumer; `examples/1626-vendor-stb-truetype-metrics.sx` pins font
|
||||||
|
init + metrics in the sx suite).
|
||||||
|
|
||||||
|
To upgrade: replace `c/stb_truetype.h` with a newer upstream copy,
|
||||||
|
update this file, and rebuild (the object cache keys on source bytes).
|
||||||
17
library/vendors/stb_truetype/stb_truetype.sx
vendored
Normal file
17
library/vendors/stb_truetype/stb_truetype.sx
vendored
Normal file
@@ -0,0 +1,17 @@
|
|||||||
|
// =====================================================================
|
||||||
|
// vendors/stb_truetype — Sean Barrett's stb_truetype (TTF/TTC
|
||||||
|
// parsing, glyph metrics, bitmap rasterization) as a `#import c` unit
|
||||||
|
// (c/, see README.md for version + provenance).
|
||||||
|
//
|
||||||
|
// `#import "vendors/stb_truetype/stb_truetype.sx"` gives any sx
|
||||||
|
// program font loading with no system dependency: the decls are
|
||||||
|
// synthesized from the header, and the implementation compiles
|
||||||
|
// through sx's content-addressed object cache. `stbtt_fontinfo` is
|
||||||
|
// opaque on the sx side — allocate a 256-byte blob and pass its
|
||||||
|
// pointer (see modules/ui/glyph_cache.sx for the established idiom).
|
||||||
|
// =====================================================================
|
||||||
|
|
||||||
|
#import c {
|
||||||
|
#include "c/stb_truetype.h";
|
||||||
|
#source "c/stb_truetype_impl.c";
|
||||||
|
};
|
||||||
Reference in New Issue
Block a user