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 月

相关新闻

OMV配置文件管理:Git版本控制与自动化同步方案实践

OMV配置文件管理:Git版本控制与自动化同步方案实践

1. 项目概述:为什么我们需要一个“聪明”的配置文件共享方案?在折腾家庭服务器或者小型工作室NAS(网络附加存储)的过程中,很多人都会选择OpenMediaVault(OMV)这款基于Debian的开源NAS操作系统。…

2026/10/22 11:59:08 阅读更多 →
浏览器自动化实战:利用Playwright实现Cookie跨浏览器登录迁移

浏览器自动化实战:利用Playwright实现Cookie跨浏览器登录迁移

1. 项目概述:一个被低估的浏览器自动化场景“利用本地cookie跨浏览器登录”,这个标题听起来像是一个技术宅才会鼓捣的偏门技巧,但如果你深入理解其背后的逻辑,会发现它解决的是一个非常普遍且高频的痛点。想象一下这个场景&#x…

2026/10/22 4:44:36 阅读更多 →
从「越用越差」到「越用越强」—锂电池早期容量异常上升的工程启示

从「越用越差」到「越用越强」—锂电池早期容量异常上升的工程启示

TL;DR锂离子电池在日历老化和循环老化早期阶段,容量并非单调下降—部分条件下会出现可测量的容量回升,即"异常容量增长"(abnormal capacity rise)。浙江大学 Cheng 等人的综述文章系统梳理了这一现象的三大机制&#xf…

2026/10/22 5:28:13 阅读更多 →

最新新闻

Electron桌面应用开发实战:从环境搭建到打包发布全流程

Electron桌面应用开发实战:从环境搭建到打包发布全流程

做前端这些年,我大部分时间都在跟浏览器标签页打交道,直到第一次把桌面应用跑起来,才发现原来自己一直被限制在地址栏和刷新按钮围起来的框框里。Electron这个词,最开始是在某段时间频繁出现在同事的讨论里,一个用HTML…

2026/10/22 10:18:38 阅读更多 →
滑盖智能锁T109深度解析:结构原理、安装调试与故障排查

滑盖智能锁T109深度解析:结构原理、安装调试与故障排查

简介:亚太天能T109滑盖智能锁产品说明书是一份PDF格式的官方技术文档,主要面向智能锁安装人员、终端用户及售后维护者,帮助快速掌握产品安装、配置与常见故障处理。全包仅1个PDF文件,大小4.37MB,内容结构清晰&#xff…

2026/10/22 11:01:53 阅读更多 →
PMSM弱磁控制原理与Simulink建模:高速AGV驱动系统设计指南

PMSM弱磁控制原理与Simulink建模:高速AGV驱动系统设计指南

上个月我在调试一台高速AGV的驱动系统,整车要求空载跑到8m/s,电机转速已经拉到额定点,驱动器的输出电压也顶到了母线电压极限附近。再往上踩速度指令,转速纹丝不动,三相电流反而开始震荡。那会儿我的第一反应就是&…

2026/10/22 9:44:47 阅读更多 →
C++核心知识点:从内存管理到STL的实战指南

C++核心知识点:从内存管理到STL的实战指南

C 这门语言我前前后后折腾了十几年,用它写过嵌入式驱动、做过游戏服务端,也搭过基础组件库。每次看到新人一头扎进"C 核心知识点"这个搜索词,我其实挺感慨的——这门语言的难点从来不是语法多,而是知识点之间的耦合太深…

2026/10/22 10:42:00 阅读更多 →
T109滑盖智能锁怎么装?安装调试与故障排查全攻略

T109滑盖智能锁怎么装?安装调试与故障排查全攻略

简介:亚太天能T109滑盖智能锁产品说明书以PDF格式发布,适合智能锁用户、安装人员与售后维修人员阅读。内容围绕T109系列指纹密码刷卡锁展开,先介绍前面板、后面板、锁体、机械钥匙、电池盒盖等部件名称与功能,再给出完整安装步骤&…

2026/10/22 10:40:08 阅读更多 →
LLM知识降熵:从信息垄断到理解权下放

LLM知识降熵:从信息垄断到理解权下放

你有没有过这种经历:翻开源码注释、论文摘要或者一份专业报告,每个字都认识,连在一起却像天书。想找人聊聊,身边要么没人懂,要么懂的懒得跟你解释。后来我试着把同一段内容丢给一个大语言模型,几秒钟之后&a…

2026/10/22 10:56:37 阅读更多 →

日新闻

周新闻

基于GMM的语音识别系统原理与MATLAB实现详解

基于GMM的语音识别系统原理与MATLAB实现详解

说到基于高斯混合模型(GMM)的语音识别系统,很多人第一反应就是一堆数学公式,觉得门槛很高。但如果你真的在MATLAB里把它落地跑通,会发现核心其实就是三件事:把声音变成特征向量,用GMM给每个类别…

2026/10/22 1:47:45 阅读更多 →
数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理这四个字听起来挺唬人,但落到具体操作上,无非就是让计算机按你的想法“摆弄”像素。我在一个模拟项目X里用了一套特别经典的基础处理流程:对图像做反白、改调色板、彩色转灰度,最后把像素数据导出成txt文件。单看每一…

2026/10/21 21:32:28 阅读更多 →
机器人大脑技术盘点:具身智能的感知、决策与数据闭环

机器人大脑技术盘点:具身智能的感知、决策与数据闭环

如果你的信息流最近也天天刷到“机器人大脑”这个词,你会发现一个很有意思的现象:每个人说的“大脑”根本不是同一个东西。有人指的是大语言模型,有人指的是运动控制系统,还有人指的是能理解物理世界的端到端模型。在2026年这个时…

2026/10/22 5:12:39 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/21 21:50:56 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/21 21:51:55 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/21 16:24:48 阅读更多 →