nothings/stb

GitHub: nothings/stb

一套易于集成的单文件 C/C++ 公共领域库,涵盖图像编解码、字体渲染、音频处理等常用功能。

Stars: 32757 | Forks: 8015

# stb 用于 C/C++ 的单文件公共领域(或 MIT 许可)库 # 本项目在 Github Issues 和 Pull Requests 中公开讨论安全相关的 bug,且安全修复的实施或合并可能需要大量时间。如果这对您的项目造成不可接受的风险,请勿使用 stb 库。 值得关注: * 图像加载器:[stb_image.h](stb_image.h) * 图像写入器:[stb_image_write.h](stb_image_write.h) * 图像缩放器:[stb_image_resize2.h](stb_image_resize2.h) * 字体文本光栅化器:[stb_truetype.h](stb_truetype.h) * 类型安全容器:[stb_ds.h](stb_ds.h) 大多数库由 stb 编写,例外:stb_dxt 由 Fabian "ryg" Giesen 编写,原始 stb_image_resize 由 Jorge L. "VinoBS" Rodriguez 编写,stb_image_resize2 和 stb_sprintf 由 Jeff Roberts 编写。 库 | 最新版本 | 类别 | LoC | 描述 --------------------- | ---- | -------- | --- | -------------------------------- **[stb_vorbis.c](stb_vorbis.c)** | 1.22 | 音频 | 5584 | 从文件/内存解码 ogg vorbis 文件到 float/16-bit 有符号输出 **[stb_hexwave.h](stb_hexwave.h)** | 0.5 | 音频 | 680 | 音频波形合成器 **[stb_image.h](stb_image.h)** | 2.30 | 图形 | 7988 | 从文件/内存加载/解码图像:JPG, PNG, TGA, BMP, PSD, GIF, HDR, PIC **[stb_truetype.h](stb_truetype.h)** | 1.26 | 图形 | 5079 | 解析、解码和光栅化 truetype 字体中的字符 **[stb_image_write.h](stb_image_write.h)** | 1.16 | 图形 | 1724 | 将图像写入磁盘:PNG, TGA, BMP **[stb_image_resize2.h](stb_image_resize2.h)** | 2.16 | 图形 | 10650 | 高质量调整图像大小(放大/缩小) **[stb_rect_pack.h](stb_rect_pack.h)** | 1.01 | 图形 | 623 | 简单的 2D 矩形装箱器,质量不错 **[stb_perlin.h](stb_perlin.h)** | 0.5 | 图形 | 428 | Perlin 修订版单纯形噪声,支持不同种子 **[stb_ds.h](stb_ds.h)** | 0.67 | 实用工具 | 1895 | C 语言的类型安全动态数组和哈希表,可在 C++ 中编译 **[stb_sprintf.h](stb_sprintf.h)** | 1.10 | 实用工具 | 1906 | 快速 sprintf, snprintf,用于 C/C++ **[stb_textedit.h](stb_textedit.h)** | 1.14 | 用户界面 | 1429 | 用于游戏等的文本编辑器核心,从头实现 **[stb_voxel_render.h](stb_voxel_render.h)** | 0.89 | 3D 图形 | 3807 | Minecraft 风格的体素渲染“引擎”,具有更多功能 **[stb_dxt.h](stb_dxt.h)** | 1.12 | 3D 图形 | 719 | Fabian "ryg" Giesen 的实时 DXT 压缩器 **[stb_easy_font.h](stb_easy_font.h)** | 1.1 | 3D 图形 | 305 | 快速且易部署的位图字体,用于打印帧率等 **[stb_tilemap_editor.h](stb_tilemap_editor.h)** | 0.42 | 游戏开发 | 4187 | 可嵌入的瓦片地图编辑器 **[stb_herringbone_wa...](stb_herringbone_wang_tile.h)** | 0.7 | 游戏开发 | 1221 | 人字形王氏瓦片地图生成器 **[stb_c_lexer.h](stb_c_lexer.h)** | 0.12 | 解析 | 941 | 简化类 C 语言解析器的编写 **[stb_divide.h](stb_divide.h)** | 0.94 | 数学 | 433 | 更有用的 32 位模运算,例如“欧几里得除法” **[stb_connected_comp...](stb_connected_components.h)** | 0.96 | 杂项 | 1049 | 在网格上增量计算可达性 **[stb_leakcheck.h](stb_leakcheck.h)** | 0.6 | 杂项 | 194 | 快速简陋的 malloc/free 泄漏检查 **[stb_include.h](stb_include.h)** | 0.02 | 杂项 | 295 | 实现递归 #include 支持,特别是针对 GLSL 库总数:21 C 代码总行数:51137 ## 常见问题 #### 许可证是什么? 这些库属于公共领域。您可以用它们做任何您想做的事。您没有法律义务做其他任何事情,尽管我感谢注明出处。 如果您的律师对公共领域不满意,它们也根据 MIT 开源许可证授权。每个源文件都包含一个明确的双重许可证供您选择。 #### 如何使用这些库? 单头文件库背后的理念是它们易于分发和部署,因为所有代码都包含在一个文件中。默认情况下,这里的 .h 文件充当它们自己的头文件,即它们声明文件中包含的函数,但实际上不会编译任何代码。 因此,此外,您应该选择_恰好一个_ C/C++ 源文件来实际实例化代码,最好是您不经常编辑的文件。此文件应定义一个特定的宏(每个库都有文档说明)以实际启用函数定义。 例如,要使用 stb_image,您应该恰好有一个 C/C++ 文件,它不是常规包含 stb_image.h,而是这样做 ``` #define STB_IMAGE_IMPLEMENTATION #include "stb_image.h" ``` 每个库的顶部都指出了要定义的正确宏。 #### 是否有其他具有最小依赖项的单文件公共领域/开源库? [是的。](https://github.com/nothings/single_file_libs) #### 如果我将 stb 库封装在一个新库中,新库是否必须是公共领域/MIT? 不,因为它是公共领域,您可以自由地将其重新许可为您的新库想要的任何许可证。 #### 在基于 GCC 的编译器中 SSE 支持是怎么回事? stb_image 将使用 SSE2(如果您使用 -msse2 编译)或根本不使用任何 SIMD,而不是尝试在运行时检测处理器并正确处理。据我了解,GCC 中用于运行时检测的批准路径要求您使用多个源文件,每个 CPU 配置一个。 因为 stb_image 是一个仅在单个源文件中编译的头文件库,所以没有批准的方法来同时构建启用 SSE 和非启用 SSE 的变体。 虽然我们尝试解决此问题,但多年来由于特定版本的 gcc 破坏了我们所做的工作,我们遇到了多个问题,因此我们放弃了。有关示例,请参阅 https://github.com/nothings/stb/issues/280 和 https://github.com/nothings/stb/issues/410。 #### 其中一些库似乎与现有的开源库重复。它们在某种程度上更好吗? 通常,它们之所以更好,只是因为它们更易于集成、更易于使用且更易于发布(单文件;良好的 API;无署名要求)。它们可能功能更少、速度更慢和/或使用更多内存。如果您已经在使用等效的库,则可能没有充分的理由切换。 #### 我可以直接链接到 stb 库列表吗? 您可以使用 [此 URL](https://github.com/nothings/stb#stb_libs) 直接链接到该列表。 #### 为什么要列出“代码行数”?这是一个糟糕的指标。 只是为了让您对库的内部复杂性有一些了解,帮助您管理期望,或者让您知道您将面临什么。虽然并非所有库都以相同的风格编写,但它们肯定是相似的风格,因此库之间的比较可能仍然是有意义的。 请注意,这些行确实包括实现、对应于头文件的部分以及文档。 #### 为什么要用单文件头文件? Windows 没有库所在的标准目录。这使得在 Windows 中部署库比 Unix 衍生系统上的开源开发人员通常意识到的要痛苦得多。(这也使得 Windows 中的库依赖关系更加糟糕。) Windows 中还有一个常见的问题,即库是针对不同版本运行时库构建的,这会导致链接冲突和混淆。将库作为头文件提供意味着您通常只需将它们直接编译到您的项目中,而无需制作库,从而避开了该问题。 将它们制作成单个文件使得将它们放入需要它们的项目中变得非常容易。(当然,如果您愿意,您仍然可以将它们放在适当的共享库树中。) 为什么不使用两个文件,一个头文件和一个实现? 10 个文件和 9 个文件之间的区别并不大,但 2 个文件和 1 个文件之间的区别很大。您不需要压缩或打包文件,不必记得附上*两个*文件等等。 #### 为什么叫“stb”?这与机顶盒有关吗? 不,它们只是我名字的首字母,Sean T. Barrett。 这不是出于自大,而是作为一种适度 sane 的方式来命名空间文件名和源函数名。 #### 您会向 stb_image.h 添加更多图像类型吗? 不。随着 stb_image 使用的增长,对我们来说,专注于代码库的安全性变得更加重要。添加新的图像格式会增加我们需要保护的代码量,因此不再值得添加新格式。 #### 您对如何创建我自己的单文件库有什么建议吗? 是的。https://github.com/nothings/stb/blob/master/docs/stb_howto.txt #### 为什么是公共领域? 出于多种原因,我更喜欢它而不是 GPL、LGPL、BSD、zlib 等。 其中一些列在这里: https://github.com/nothings/stb/blob/master/docs/why_public_domain.md #### 为什么是 C? 主要是,因为我使用 C,而不是 C++。但这确实也使其他人更容易从其他语言使用它们。 #### 为什么不是 C99?stdint.h、随处声明等。 我仍然使用 MSVC 6 (1998) 作为我的 IDE,因为对我而言,它比更高版本的 MSVC 具有更好的人机工程学。
标签:C/C++, MIT协议, Ogg Vorbis, Perlin噪声, stb_image, stb_truetype, TrueType, 事务性I/O, 公共域, 单头文件库, 图像处理, 图像编码, 图像解码, 图形学, 多媒体开发, 字体光栅化, 客户端加密, 客户端加密, 开源库, 搜索引擎爬虫, 数据结构, 游戏开发, 轻量级库, 音频解码