发布时间:2026/8/15 21:45:27
ReactOS 图形系统分析(29):DIB 引擎与 DIB 库 — gdi/dib/ + gdi/diblib ReactOS 图形系统分析29DIB 引擎与 DIB 库 — gdi/dib/ gdi/diblib/1. 概述gdi/dib/与gdi/diblib/是引擎软件渲染的像素级实现层——前面《分析_4~27》里Eng*/IntEng*软件路径最终都汇入这里按位深做逐像素/逐行/整块的位图操作。当显示驱动没有硬件加速framebuf 等时这就是写入帧缓冲的最终执行者。引擎软件路径eng/EngBitBlt/EngStretchBlt/EngAlphaBlend/EngLineTo ... ↓ DibFunctionsForBitmapFormat[位深].XXX函数表分发dib/dib.c 或 dib_new.c ├─ 旧实现 dib/手写各位深 dib1bpp.c ~ dib32bpp.c 通用 stretchblt/alphablend/floodfill └─ 新实现 diblib/USE_DIBLIB 可选编译宏模板生成全位深组合 16 种 ROP 优化 ↓ │ 位深格式BMF_1/4/8/16/24/32BPP4RLE/8RLE/JPEG/PNG 为 Dummy 桩 ↓ pvScan0 y×lDelta 直接读写像素内存或 i386 汇编加速 hline/colorfill两套实现并存[win32ss/CMakeLists.txt](file:///d:/reactos/win32ss/CMakeLists.txt#L210-L220)配置使用的文件特点USE_DIBLIB开dib/dib_new.ceng/bitblt_new.cBitBlt 走 DibLib宏模板生成位深组合全覆盖16 个 BitBlt_*.c 各优化一个 ROP默认关dib/dib.ceng/copybits.cdib8/16/32gen.c手写各位深实现 gendib 生成2. 核心机制 — DibFunctionsForBitmapFormat 函数表2.1 DIB_FUNCTIONS[dib.h](file:///d:/reactos/win32ss/gdi/dib/dib.h#L44-L56)typedefstruct{PFN_DIB_PutPixel DIB_PutPixel;// 单像素写PFN_DIB_GetPixel DIB_GetPixel;// 单像素读PFN_DIB_HLine DIB_HLine;// 水平线x1..x2, yPFN_DIB_VLine DIB_VLine;// 垂直线x, y1..y2PFN_DIB_BitBlt DIB_BitBlt;// 通用位块旧实现PFN_DIB_BitBlt DIB_BitBltSrcCopy;// SRCCOPY 快路径PFN_DIB_StretchBlt DIB_StretchBlt;// 拉伸全位深共用 XXBPPPFN_DIB_TransparentBlt DIB_TransparentBlt;// 透明色PFN_DIB_ColorFill DIB_ColorFill;// 纯色填充PFN_DIB_AlphaBlend DIB_AlphaBlend;// alpha 混合16/24/32 专用其余共用 XXBPP}DIB_FUNCTIONS;externDIB_FUNCTIONS DibFunctionsForBitmapFormat[];// 按 BMF_* 索引索引 位图格式[dib.c](file:///d:/reactos/win32ss/gdi/dib/dib.c#L20-L88)索引格式实现1~6BMF_1/4/8/16/24/32BPP各自位深专用函数DIB_32BPP_*等0, 7~100 / BMF_4RLE / 8RLE / JPEG / PNG全部 Dummy 桩返回 FALSE/空操作——RLE 需先解压《分析_28》JPEG/PNG 由 DIB 引擎不支持直接绘制2.2 dib.c vs dib_new.cdib.c默认DIB_BitBlt/DIB_BitBltSrcCopy/DIB_ColorFill填入手写实现dib_new.cUSE_DIBLIB这三项填NULL0——BitBlt 不再经函数表而由 [bitblt_new.c](file:///d:/reactos/win32ss/gdi/eng/bitblt_new.c#L97-L142) 的EngBitBlt直接构造BLTDATA调 DibLib 函数。3. BLTINFO 与 DIB_DoRop[dib.h](file:///d:/reactos/win32ss/gdi/dib/dib.h#L20-L32) / [dib.c](file:///d:/reactos/win32ss/gdi/dib/dib.c#L91-L192)3.1 BLTINFO — 位块传输上下文typedefstruct_BLTINFO{SURFOBJ*DestSurface;SURFOBJ*SourceSurface;SURFOBJ*PatternSurface;// 图案画刷表面XLATEOBJ*XlateSourceToDest;// 源→目标颜色转换XLATEOBJ*XlatePatternToDest;RECTL DestRect;POINTL SourcePoint;BRUSHOBJ*Brush;POINTL BrushOrigin;ROP4 Rop4;}BLTINFO,*PBLTINFO;diblib 版的等价物是BLTDATA见第 6 节。3.2 DIB_DoRop — 通用 ROP 计算ULONGDIB_DoRop(ULONG Rop,ULONG Dest,ULONG Source,ULONG Pattern){/* 16 个命名 ROP 走优化分支SRCCOPY 直接返回 Source 等 */caseR3_OPINDEX_SRCCOPY:returnSource;caseR3_OPINDEX_SRCINVERT:returnDest^Source;.../* 其余任意 ROP4 位并行布尔运算 */Rop|(Rop24)|(Rop16)|(Rop8);// ROP3 扩展成 4 字节for(i0;i8;i){/* 用 ExpandDest/Source/Pattern[16] 把 4 位值展开成 32 位掩码 一次布尔运算同时算出 4 个像素位的 ROP 结果 */ResultNibbleRopExpandDest[Dest0xF]ExpandSource[Source0xF]ExpandPattern[Pattern0xF];...}}设计16 个常用 ROP3 用位运算直达任意 ROP用4 位并行技巧每 4 位查一张 32 位展开表一次 计算 4 位结果兼顾速度与通用性。4. 各位深实现模式以 [dib32bpp.c](file:///d:/reactos/win32ss/gdi/dib/dib32bpp.c) 为例4.1 像素原语 — 直接内存寻址DIB_32BPP_PutPixel(SurfObj,x,y,c)// pvScan0 y*lDelta x*4 → *(PDWORD) cDIB_32BPP_GetPixel(SurfObj,x,y)// 同址读DIB_32BPP_VLine(...)// 沿 lDelta 步进整列写DIB_32BPP_HLine(...)// 整行连续写i386 有汇编加速版1bpp/4bpp 额外处理位打包1bpp 用notmask[]/MASK1BPP(x)位掩码4bpp 每字节两像素高/低半字节。4.2 BitBltSrcCopy — 源位深分发DIB_32BPP_BitBltSrcCopy内部按源表面位深1/4/8/16/24/32bppswitch 分发逐行/逐像素读取源经DIB_GetSource宏 XLATEOBJ_iXlate转目标色写入目标同时处理负 lDeltabottom-up 位图与翻转bLeftToRight/bTopToBottom源与目标同表面时的方向处理。4.3 i386 汇编加速[i386/](file:///d:/reactos/win32ss/gdi/dib/i386)汇编文件加速点dib32bpp_hline.s32bpp 水平线SSE/字长优化整行填充dib24bpp_hline.s24bpp 水平线dib32bpp_colorfill.s32bpp 纯色填充非 x86 平台用 C 版dib24bppc.c/dib32bppc.c替代。5. 通用 XXBPP 函数全位深共用函数位置说明DIB_XXBPP_StretchBlt[stretchblt.c](file:///d:/reactos/win32ss/gdi/dib/stretchblt.c)拉伸采样放大/缩小DibFunctionsForBitmapFormat[*].DIB_StretchBlt全部指向它DIB_XXBPP_AlphaBlend[alphablend.c](file:///d:/reactos/win32ss/gdi/dib/alphablend.c)通用 alpha 混合AC_SRC_OVER内部建 3 个 EXLATEOBJ 在 RGB 与源/目标间往返DIB_XXBPP_FloodFillSolid[floodfill.c](file:///d:/reactos/win32ss/gdi/dib/floodfill.c)洪水填充FillRgn 边界填充算法dib*gen.c构建期生成native-gendib工具sdk/tools按位深生成 8/16/32bpp 变体6. DibLib — 新 DIB 库USE_DIBLIB6.1 设计目标消灭手写重复BitBlt 有 6 个位深 × 源/目标组合 16 种 ROP手写爆炸。DibLib 用宏模板DibLib.h按位深参数化一次定义全组合。6.2 像素宏族[DibLib.h](file:///d:/reactos/win32ss/gdi/diblib/DibLib.h#L43-L82)#define_ReadPixel_1(pjSource,jShift)(((*(pjSource))(jShift))1)#define_WritePixel_1(pjDest,jShift,ulColor)...#define_ReadPixel_4/8/16/24/32...// 每种位深的读/写/步进/右向左步进#define_NextPixel_32(ppj,pjShift)(void)(*(ppj)4)配合__DIB_FUNCTION_NAME_SRCDST(name, src_bpp, dst_bpp)宏自动生成Dib_XXX_S1_D32这类函数名——同一份模板代码实例化为 36 种源/目标位深组合。6.3 BLTDATA 与函数表[DibLib_interface.h](file:///d:/reactos/win32ss/gdi/diblib/DibLib_interface.h)typedefstruct{ULONG iFormat;PBYTE pvScan0;PBYTE pjBase;LONG lDelta;...BYTE jBpp;}SURFINFO;typedefstruct{SURFINFO siSrc/siDst/siPat/siMsk;ULONG ulWidth/ulHeight;...ROP4;PFN_DOROP apfnDoRop[2];}BLTDATA;externconstPFN_DIBFUNCTION gapfnDibFunction[];// 按 ROP3 索引的 256 项分发表externconstPFN_DIBFUNCTION gapfnMaskFunction[8];// 掩码组合表6.4 新 EngBitBlt[bitblt_new.c](file:///d:/reactos/win32ss/gdi/eng/bitblt_new.c#L97-L142)EngBitBltUSE_DIBLIB 版本 ├─ 填充 BLTDATArop4 → apfnDoRop[2] 取 gapfnRop 前后景函数pxlo → pfnXlate ├─ ROP4_USES_SOURCE/PATTERN/MASK 检查并锁定对应表面 ├─ CalculateCoordinates按裁剪矩形计算源/图案/掩码起始像素地址含 bottom-up/右到左修正 ├─ 裁剪三档TRIVIAL 一次 / RECT 求交 / COMPLEX 枚举矩形同表面选方向 └─ 每块按 ROP掩码查 gapfnDibFunction/gapfnMaskFunction → Dib_*_Sxx_Dyy 执行6.5 ROP 优化文件族文件内容BitBlt_SRCCOPY.c等 15 个每个常用 ROP3 一个优化实现Dib_BitBlt_SRCCOPY_Sxx_Dyy整行/整块快速路径BitBlt_other.c通用 4 位并行 ROP 兜底含纯色预转换RopFunctions.c/hgapfnRop[256]ROP3→函数指针、Dib_DoRop等价物MaskBlt.cMaskCopy/MaskPaint/MaskPatBlt/...掩码参与的 8 种组合gapfnMaskFunction[8]7. 与《架构分析》标注对照标注核对架构图第 72 行gdi/dib/ gdi/diblib/软件渲染准确。补充dib/ 是手写各位深旧实现DibFunctionsForBitmapFormat函数表diblib/ 是宏模板生成的新实现BLTDATAgapfnDibFunction由USE_DIBLIB条件编译切换8. 源码索引文件关键内容[dib.h](file:///d:/reactos/win32ss/gdi/dib/dib.h)DIB_FUNCTIONS 表、BLTINFO、ROP4 宏ROP4_SRCCOPY 等、DIB_GetSource 宏[dib.c](file:///d:/reactos/win32ss/gdi/dib/dib.c)DibFunctionsForBitmapFormat 初始化、DIB_DoRopExpand* 表 4 位并行、Dummy_* 桩[dib_new.c](file:///d:/reactos/win32ss/gdi/dib/dib_new.c)USE_DIBLIB 版函数表BitBlt 项为 NULL[dib1bpp.c ~ dib32bpp.c](file:///d:/reactos/win32ss/gdi/dib/dib32bpp.c)各位深 PutPixel/GetPixel/H/VLine/BitBlt/BitBltSrcCopy[stretchblt.c](file:///d:/reactos/win32ss/gdi/dib/stretchblt.c) / [alphablend.c](file:///d:/reactos/win32ss/gdi/dib/alphablend.c) / [floodfill.c](file:///d:/reactos/win32ss/gdi/dib/floodfill.c)DIB_XXBPP_* 通用实现[i386/](file:///d:/reactos/win32ss/gdi/dib/i386)汇编加速24/32bpp hline、32bpp colorfill[diblib/DibLib.h](file:///d:/reactos/win32ss/gdi/diblib/DibLib.h)像素宏族、函数名生成宏、BLTDATA 相关[diblib/DibLib_interface.h](file:///d:/reactos/win32ss/gdi/diblib/DibLib_interface.h)SURFINFO/BLTDATA、gapfnDibFunction/gapfnMaskFunction[diblib/BitBlt*.c](file:///d:/reactos/win32ss/gdi/diblib/BitBlt_SRCCOPY.c) / MaskBlt.c / RopFunctions.cROP 优化实现、掩码组合、ROP 函数表[bitblt_new.c](file:///d:/reactos/win32ss/gdi/eng/bitblt_new.c)USE_DIBLIB 版 EngBitBltBLTDATA CalculateCoordinates关联模块引擎入口《分析_4》3.1EngBitBlt 双层、《分析_17/26/27》FillSolid/AlphaBlend/StretchBlt 的 DIB 调用颜色转换XLATEOBJ_iXlate《分析_19》RLE 位图需先经DecompressBitmap《分析_28》rlecomp.c解压表面来源EngCreateBitmapsurface.cBMF_* 格式本文档基于 ReactOS 源代码win32ss/gdi/dib/、gdi/diblib/及关联模块分析2026 年 8 月

相关新闻

2026/8/15 21:45:27

基于Kimi与OpenClaw的飞书AI助手:本地部署与智能工作流实战

1. 项目概述:从零到一,构建你的智能工作流中枢 最近在折腾AI应用落地的朋友,估计都绕不开一个词:OpenClaw。这玩意儿本质上是一个开源的AI智能体(Agent)框架,你可以把它理解为一个“万能接线员…

2026/8/15 21:45:27

Meta开源Muse Glimmer模型:从权重加载到LoRA微调的完整实践指南

在探索人工智能前沿领域时,开源社区总能带来惊喜。近期,Meta 发布了一款名为Muse Glimmer的开源权重模型,再次引发了开发者对下一代 AI 架构和“个人超级智能”可能性的热烈讨论。对于技术从业者而言,这不仅仅是一个新闻事件&…

2026/8/15 21:40:26

Python requests乱码全解析:从编码原理到五种实战解决方案

1. 项目概述:一个看似简单却高频的“坑” 做爬虫或者调用API, requests 库几乎是每个Python开发者的首选工具,简单、强大、优雅。但不知道你有没有遇到过这种情况:你兴冲冲地写了几行代码, response.text 一打印出…

2026/8/15 23:40:34

第二讲:CSP-J及NOIP普及组知识大纲

这一讲,主要聊一下CSP-J及NOIP普及组知识大纲。 官方的大纲,也就是全国青少年信息学奥林匹克系列竞赛大纲已经由该系列(NOI系列)的主办方中国计算机学会(CCF)发布了,感兴趣的读者可以自行找渠道…

2026/8/15 23:40:34

OMO 同步课如何落地?从课堂连接到教学交付闭环

OMO 同步课如何落地?从课堂连接到教学交付闭环 OMO 不是简单给线下课堂加一条直播链路。对于教培机构而言,线上线下学员是否能同步参与、老师和助教能否协同、课后数据是否沉淀,决定了同步课能不能成为稳定业务。本文梳理 OMO 方案落地时值得…

2026/8/15 23:40:34

服务器CPU常用测试工具(Linux)

一 ,CPU 工具:stress和stress-ng stress 和 stress-ng 是 Linux 系统下两款经典的压力测试工具。它们的主要用途是给系统施加可配置的 CPU、内存、I/O 或磁盘负载,用于评估系统在极端条件下的稳定性和表现,帮助发现那些只在重负载…

2026/8/15 23:40:34

GLM ZCode AI编程助手实战:从安装配置到项目开发全指南

最近,很多开发者朋友在群里讨论一个事儿:智谱AI的GLM大模型和ZCode编程助手,突然宣布对百万用户“重置用量”,并且伴随着新一轮的“价格战”。消息一出,有人欢呼“羊毛来了”,也有人疑惑“这是不是套路&…

2026/8/15 23:35:34

全网19套热门表情包整理:从筛选逻辑到高效使用全攻略

1. 项目缘起:为什么我要做表情包整理这件事不知道你有没有这样的经历:在群里聊天,想表达一个“无语”或者“震惊”的情绪,翻遍自己的表情库,发现要么是几年前的老古董,要么就是画风不搭,总感觉差…

2026/8/15 9:46:30

如何快速生成中国车牌图片:Python开源工具完整指南

如何快速生成中国车牌图片:Python开源工具完整指南 【免费下载链接】chinese_license_plate_generator 中国车牌生成器 项目地址: https://gitcode.com/gh_mirrors/ch/chinese_license_plate_generator 中国车牌生成器是一个基于Python的开源项目&#xff0c…

2026/8/15 7:22:41

当 LLM 遇见大文档:主流开源项目如何处理上下文超限

从 Agentic Loop 到 Repo Map,七种策略与六类陷阱引言:128K vs 10MB 的硬冲突 2026 年的 LLM 上下文窗口已达到 128K ~ 1M token(≈ 0.5MB ~ 4MB 文本),但 LLM 想要处理的真实数据规模远远超过这个量级:真实…

2026/8/15 0:04:00

AI 电动婴儿车智能功率 辅助控制、电源管理的完整选型方案

2026年随着 AI 技术在电动孕婴童用品中的深度渗透(如智能避障、自适应速度控制、能量回收),电动婴儿车对功率器件提出更高要求:高效率、小型化、低功耗、高可靠性。微碧半导体(VBsemi)基于 Trench 及 SGT 工…

2026/8/15 0:04:00

论文AIGC检测不达标完整教程!低门槛用5款工具逐步复检!

论文提交前自己先查一遍AI率,是2026年毕业生的常规动作。学校要求论文AI率低于30%,乃至于20%才能答辩… 很多同学发现一个尴尬的事情:同一篇论文,知网查出来AI率35%,维普查可能是48%,大雅、朱雀又是另外的数…

2026/8/15 9:46:39

实测才敢推 AI论文网站 2026最新测评与推荐

2026年真正好用的AI论文网站,核心看生成的论文质量、低AI味、格式正确、学术适配四大指标。综合实测,千笔AI、ThouPen、豆包、DeepSeek、Grammarly 是当前最值得推荐的梯队,覆盖从免费到付费、从中文到英文、从文科到理工的全场景需求。一、综…

2026/8/15 4:56:16

2026必备!AI论文网站测评:最新推荐与深度对比

2026年真正好用的AI论文网站,核心看生成的论文质量、低AI味、格式正确、学术适配四大指标。综合实测,千笔AI、ThouPen、豆包、DeepSeek、Grammarly 是当前最值得推荐的梯队,覆盖从免费到付费、从中文到英文、从文科到理工的全场景需求。 一、…

2026/8/15 9:46:30

摆脱论文困扰!盘点2026年全网爆红的的AI论文写作工具

一天写完毕业论文在2026年已不再是天方夜谭。2026年最炸裂、实测能大幅提速的AI论文写作工具,覆盖选题构思、文献整理、内容生成、格式排版等核心场景,真正帮你高效搞定论文难题。 一、全流程王者:一站式搞定论文全链路(一天定稿首…