`
meta
  • 浏览: 6705 次
  • 性别: Icon_minigender_1
  • 来自: 上海
最近访客 更多访客>>
社区版块
存档分类
最新评论

Chromium代码分享 第 1 回

阅读更多

Chromium最近的代码库中, 增加了一个新模块<GPU>. 随便浏览了一下这个目录, 被 cmd_buffer_common.hcmd_buffer_common.cc中的一个实用的小trick给吸引住了, 其功能就是定义一组枚举值, 同时提供了函数接口可以根据给定的枚举值获得相应的字符串名. 代码原理非常简单, 请参考以下详细代码片段:

 

 

cmd_buffer_common.h 部分:

// This macro is used to safely and convienently expand the list of commnad
// buffer commands in to various lists and never have them get out of sync. To
// add a new command, add it this list, create the corresponding structure below
// and then add a function in gapi_decoder.cc called Handle_COMMAND_NAME where
// COMMAND_NAME is the name of your command structure.
//
// NOTE: THE ORDER OF THESE MUST NOT CHANGE (their id is derived by order)
#define COMMON_COMMAND_BUFFER_CMDS(OP) \
  OP(Noop)                          /*  0 */ \
  OP(SetToken)                      /*  1 */ \
  OP(Jump)                          /*  2 */ \
  OP(JumpRelative)                  /*  3 */ \
  OP(Call)                          /*  4 */ \
  OP(CallRelative)                  /*  5 */ \
  OP(Return)                        /*  6 */ \
  OP(SetBucketSize)                 /*  7 */ \
  OP(SetBucketData)                 /*  8 */ \
  OP(SetBucketDataImmediate)        /*  9 */ \
  OP(GetBucketSize)                 /* 10 */ \
  OP(GetBucketData)                 /* 11 */ \

// Common commands.
enum CommandId {
  #define COMMON_COMMAND_BUFFER_CMD_OP(name) k ## name,

  COMMON_COMMAND_BUFFER_CMDS(COMMON_COMMAND_BUFFER_CMD_OP)

  #undef COMMON_COMMAND_BUFFER_CMD_OP

  kNumCommands,
  kLastCommonId = 255,  // reserve 256 spaces for common commands.
};

 

 

cmd_buffer_common.cc 部分:

const char* GetCommandName(CommandId command_id) {
  static const char* const names[] = {
  #define COMMON_COMMAND_BUFFER_CMD_OP(name) # name,

  COMMON_COMMAND_BUFFER_CMDS(COMMON_COMMAND_BUFFER_CMD_OP)

  #undef COMMON_COMMAND_BUFFER_CMD_OP
  };

  int id = static_cast<int>(command_id);
  return (id >= 0 && id < kNumCommands) ? names[id] : "*unknown-command*";
}

 

这种方法的后期维护代价是非常低的, 以后碰到需要用到这种功能的地方, 不妨尝试一下.

3
0
分享到:
评论
2 楼 meta 2010-01-18  
archerzz 写道
个人感觉是一种对C++的补充。C++的enum不是class,所以要sync一个enum element所有的属性,会比较麻烦。如果是一个class,可以在构造函数里面指定所有的属性,一样易于维护而且很容易扩展。
这个Macro,还是有些局限性的,如果要增加更多的属性或者更复杂的方法,可能就不能胜任了。


属性这个词, ft. 枚举值吧.

class是class, enum是enum. 不喜欢Java这种把enum搞成class的感觉. 枚举类型还实例化? 搞笑吧...
1 楼 archerzz 2010-01-17  
个人感觉是一种对C++的补充。C++的enum不是class,所以要sync一个enum element所有的属性,会比较麻烦。如果是一个class,可以在构造函数里面指定所有的属性,一样易于维护而且很容易扩展。
这个Macro,还是有些局限性的,如果要增加更多的属性或者更复杂的方法,可能就不能胜任了。

相关推荐

    window10下源码编译chromium

    断断续续下载chromium代码花了1周左右,代码约15G左右,其中遇到power shell的问题,遇到python的问题。最终编译花了11:30分。相比于Linux下的编译慢很多,系统运行的稳定性和速度也差很多。打算研究源码,一起分享...

    WebKit和Chromium源码及原理剖析.pdf

    #### 第1篇 Web开发须知的浏览器内幕:缓存与存储篇(2) **3. HTTP Cache综述** - **HTTP Cache概念**: - HTTP缓存机制遵循IETF规范设计,最新的标准文档为[RFC 7234](https://tools.ietf.org/html/rfc7234),...

    git-1.9.0.chromium.5_bin

    - 通过`git add`、`git commit`和`git push`来提交和分享自己的代码修改。 - 利用`git rebase`和`git cherry-pick`等高级功能进行代码整理和修复。 此外,`depot_tools`还提供了其他辅助工具,例如`gclient`,这是...

    cef-3325 Chromium

    **CEF(Chromium Embedded Framework)** 是一个开源框架,它允许开发者将谷歌的 **Chromium** 浏览器引擎嵌入到他们的应用程序中。这个框架使得开发者可以利用Chromium的先进特性,如高效的网页渲染、JavaScript支持...

    cef + chromium 完整源码(cef 5414 chromium 109)

    cef 版本5414chromium 版本109.0.5414.8完整源码,已经把hook同步完成 ,并且为了缩小体积把.git文件清除了,使用百度云分享直接同步的代码,release编译不过,做了很多修改才编译通过在多台机器上测试通过,可以...

    Delphi Chromium开发组件 dcef3

    ### 1. **Chromium 内核** Chromium 是 Google Chrome 浏览器背后的开源项目,以其高性能和丰富的 Web API 支持而闻名。DCEF3 将 Chromium 的这些优点带入了 Delphi 开发环境,使得开发者可以轻松地在 Delphi 应用...

    chromiumrenderingpipeline.pdf

    1. Android WebView 的渲染流程技术:文档主要探讨了利用 Chromium 引擎渲染网页的技术细节。在 Android 平台上,Webview 组件允许应用程序展示网页内容,而 Chromium 渲染管道技术分享则重点说明了其背后的工作原理...

    铬代码搜索主题「Chromium CodeSearch Theme」-crx插件

    在自定义主题中显示铬代码...分享https://chrome.google.com/webstore/detail/chromium-codesearch-theme/mfknemlbeilclnbkfelgpldgnbnekeol Github:https://github.com/chaopeng/codesearch-theme 支持语言:English

    CEF.zip_CEF_CEF1构建_cef1_cef1 下载_cef1下载

    这个"CEF1"是CEF的一个特定版本,主要用于构建基于Chromium的桌面应用。在这里,我们主要讨论CEF的基本概念、CEF1的构建过程以及如何下载和使用CEF1。 **CEF的基本概念:** CEF是一个轻量级的框架,它为开发人员...

    VSCodeUserSetup-x64-1.50.1.zip

    12. **协作与分享**:VSCode的Live Share功能允许用户实时共享代码编辑会话,与他人协同工作。 VSCodeUserSetup-x64-1.50.1.exe是这个版本的安装程序,双击运行后,会引导用户完成VSCode的安装过程。安装过程中,...

    Chromium browser automation-crx插件

    1。 CBA提供了能够从扩展端口界面设置逐步代码注入。 2.在导航网页时记录用户交互(填充表单,单击按钮,超链接和DOM元素路径计算的智能算法)。 3.在浏览器本地存储中保存项目。 4.逐步注入。 5.使用合作者导入,...

    HoTT-Theme:Chromium HotTT 主题

    【描述】描述中提到的"执照"意味着这个主题遵循特定的开源许可协议,这通常是鼓励分享、修改和再分发代码的方式。然而,具体的许可协议没有在描述中给出,通常这些协议可能包括Apache License、MIT License或GPL等。...

    Chromium_screenshot_extension

    对于隐私和安全方面,Chromium_screenshot_extension可能遵循浏览器的沙盒机制,确保扩展的操作限制在特定的权限范围内,防止恶意代码对用户数据造成威胁。同时,如果扩展需要访问用户的浏览历史或其他敏感信息,会...

    google,firefox

    Chrome的源代码可以在Chromium项目中找到,这是一个用C++编写的项目,采用了多进程架构,旨在提高稳定性和安全性。源代码的开放性使得开发者可以了解和优化浏览器性能,创建自定义版本,或者为Chrome开发插件和扩展...

    ScreenCloud 客户端的源代码.zip

    Qt 是一种用 C++ 编写的库,可以构建原生的桌面应用程序,而 Electron 则是基于 Node.js 和 Chromium 的框架,用于创建桌面应用,特别适合 Web 技术开发者。通过这些框架,开发者可以使用相同的代码库在不同操作系统...

    VSCodeUserSetup-x64-1.88.1

    - VS Code采用了Electron框架,结合了Chromium和Node.js,提供高性能的代码渲染和轻量级的内存占用。 7. **开发环境配置**: - 用户可以根据项目需求自定义工作区设置,比如代码格式化规则、快捷键映射、集成终端...

    HTM截屏截图代码例子

    Puppeteer则是由Google Chrome团队开发的Node.js库,它可以控制Chromium或Chrome浏览器,进行自动化测试、网页截图等操作。使用Puppeteer实现截屏: 1. 首先,你需要安装Puppeteer库。 ```bash npm install ...

    NiM:使用Chromium(Chrome,Edge,更多)DevTools简化Node.js调试工作流程

    如果您在与我分享电子邮件地址时遇到问题(顺便说一句,我的电话是 ),我您自己克隆/副本并更改您对代码和/或使用的内容替代解决方案(没有一个比NiM更好,但称我有偏见)。 可以随时直接与我联系并进行聊天。 与...

    Android PDF阅读器源代码

    1. **PDF库的集成与使用**:PDF阅读器的核心是能够解析和渲染PDF文件。Android系统本身并不直接支持PDF的处理,所以通常会借助第三方库,如`PDFium`(由Google开源)或`Apache PDFBox`。PDFium是Android平台常用的...

    chrome-extension:适用于Modest Vision的Google ChromeChromium和Firefox浏览器扩展

    1. **浏览器扩展**:浏览器扩展是一种小型软件应用,可安装在Google Chrome、Chromium或Firefox等现代浏览器上,以增强或修改其功能。这种扩展可以提供各种服务,例如网页增强、广告拦截、隐私保护等。 2. **Google...

Global site tag (gtag.js) - Google Analytics