在PPAPI插件中使用Skia画图介绍了怎样在PPAPI中使用Skia,文末说回头要提供一个简单的涂鸦板插件,这次我来兑现承诺了。

foruok原创,关注微信订阅号“程序视界”可联系foruok。

演示样例非常easy,先看看效果:

涂鸦插件功能说明

功能列表:

  • 使用鼠标左键绘制线条
  • 撤销、清除功能
  • 支持CTRL+Z组合键撤销,支持ESC清除

项目说明

项目与在PPAPI插件中使用Skia画图这个文章里的几乎相同,仅仅只是多了几个文件。VS2013中的项目视图例如以下:

做一点点说明吧。

ppapi_doodle.cpp

这个文件实现了PPAPI插件的入口。它获取浏览器側接口并保存在一个类型为GlobalPPBInterface(PPBInterface.h)的全局变量中。它完毕与浏览器的交互,而且将事件派发到某个实例。

与之前相比。更干净了,我把其他功能都移走了。

PluginInstance.h(.cpp)

这是我抽象出来的代表插件实例的类。

PluginInstance这个类主要做了以下几件事:

  • 定义了与PPAPI交互的接口
  • 抽象了鼠标和键盘事件。定义了可供派生类重写的接口
  • 融合了Skia,简单分离了画图操作。提供给派生类自我绘制的接口

PluginInstance能够实例化。但就是画个白色背景,其他什么事儿也不干。所以,我另外实现了DoodleInstance类来实现涂鸦功能。

DoodleInstance.h(.cpp)

DoodleInstance继承了PluginInstance,重写了下列方法:

  • void paint(const PP_Rect *rect);
  • PP_Bool mouseEvent(const MouseEvent &evMouse);
  • PP_Bool keyboardEvent(const KeyboardEvent &evKeyboard);

假设要实现其他的插件,重写上面几个函数也是必须的。

另外我还利用Skia里的SkPath来保存“从鼠标左键按下到释放”这“一笔”画出的全部东西。配套一个SkPaint,能够定制线条颜色、粗细、线型(没实现哈哈)。这两者被我放在了一个ElementGroup类里,DoodleInstance的m_paths是一个集合,当中的每一个元素都代表了一个“一笔画”。paint函数里会把这些“一笔画”给绘制出来。

Button.h(.cpp)

观看文前那张Gif动画,里面有两个button,它们相应的实现就在这两个文件中了,类名是ImageButton。详细看代码了,比較直接。

从资源文件中载入图片

我给ppapi_doodle项目加入了两个png格式的图片,给前面提到的button用。

DLL中图片资源怎样转化为SkBitmap,在utils.cpp中实现,载入DLL中的图片资源生成Skia中的SkBitmap对象这篇文章里说过了。

项目源代码

源代码还不太完好。比方有些资源没释放。边界没考虑……没时间细整了……到这里下载吧:ppapi_doodle源代码。


其他參考文章:

PPAPI+Skia实现的涂鸦板的更多相关文章

  1. iOS_Quartz2D之涂鸦板

    响应者对象:继承了UIResponder的对象 触摸事件:一根或多根手指: 开始触摸: - (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent ...

  2. 重新想象 Windows 8 Store Apps (51) - 输入: 涂鸦板

    [源码下载] 重新想象 Windows 8 Store Apps (51) - 输入: 涂鸦板 作者:webabcd 介绍重新想象 Windows 8 Store Apps 之 涂鸦板 通过 Poin ...

  3. Android应用开发实例篇(1)-----简易涂鸦板

    链接地址:http://www.cnblogs.com/lknlfy/archive/2012/03/03/2378328.html 一.概述 这次要做一个简单的涂鸦板应用,以前在Qt上实现过,突然想 ...

  4. HTML5实现涂鸦板

    原文:HTML5实现涂鸦板 最近闲的,看了看html5,强大的绘图功能让我惊奇,于是,写了个小玩意---涂鸦板,能实现功能有:画画,改色,调整画笔大小 html5的绘图可以分为点,线,面,圆,图片等, ...

  5. 实现简单的手写涂鸦板(demo源码)

    在一些软件系统中,需要用到手写涂鸦的功能,然后可以将涂鸦的结果保存为图片,并可以将"真迹"通过网络发送给对方.这种手写涂鸦功能是如何实现的了?最直接的,我们可以使用Windows提 ...

  6. 背水一战 Windows 10 (60) - 控件(媒体类): Pointer 涂鸦板, InkCanvas 涂鸦板

    [源码下载] 背水一战 Windows 10 (60) - 控件(媒体类): Pointer 涂鸦板, InkCanvas 涂鸦板 作者:webabcd 介绍背水一战 Windows 10 之 控件( ...

  7. mooc上学习acllib后写的包含背景音乐的小涂鸦板(初入江湖,大佬勿喷)

    #include "acllib.h"ACL_Sound sound1;ACL_Image img;//开始图ACL_Image img1;//涂鸦图ACL_Color c=RED ...

  8. 【Android】自己定义View、画家(画布)Canvas与画笔Paint的应用——绘图、涂鸦板app的实现

    利用一个简单的绘图app来说明安卓的图形处理类与自己定义View的应用. 例如以下图,有一个供用户自己随意绘图.涂鸦的app. 这里不做那么花俏了,仅提供黑白两色.但能够改变笔尖的粗细. 实质上这里的 ...

  9. qt练习10 涂鸦板源代码

    源代码下载: http://files.cnblogs.com/hnrainll/doodle.zip http://www.cnblogs.com/hnrainll/archive/2011/05/ ...

随机推荐

  1. 《linux设备驱动开发详解》笔记——11内存与IO访问

    内存访问与映射是linux驱动常见操作,操作硬件时离不开内存的映射,本章比较重要. 11.1 CPU与内存.I/O 目前的嵌入式处理器,都不提供专门的I/O空间,而仅存在内存空间:各种外设寄存器都直接 ...

  2. Wannafly挑战赛23 A 字符串

    题目描述 小N现在有一个字符串S.他把这这个字符串的所有子串都挑了出来.一个S的子串T是合法的,当且仅当T中包含了所有的小写字母.小N希望知道所有的合法的S的子串中,长度最短是多少. 输入描述: 一行 ...

  3. LeetCode695--岛屿的最大面积

    ''' 岛屿的最大面积 给定一个包含了一些 0 和 1的非空二维数组 grid , 一个 岛屿 是由四个方向 (水平或垂直) 的 1 (代表土地) 构成的组合.你可以假设二维矩阵的四个边缘都被水包围着 ...

  4. goland 快键键整理及注册

    https://my.oschina.net/lemos/blog/1358731 http://idea.lanyus.com/

  5. spring junit4 单元测试运行正常,但是数据库并无变化

    解决方案 http://blog.csdn.net/molingduzun123/article/details/49383235 原因:Spring Juint为了不污染数据,对数据的删除和更新操作 ...

  6. 【HTML/XML 1】HTML 速成总结

    导读:反反复复的看完了HTML的速成材料,前面学习了牛腩,所以这块知识只能是作为一种旧知识的复习.和机房重构时的SQLHelper一样,刚开始都是稀里糊涂的用了,后面系统的学习后,才知道为什么要那样用 ...

  7. iOS学习笔记07-运动事件和远程控制

    之前我们已经学习了触摸处理和手势识别,其实这两个同属于iOS事件的触摸事件,今天我们来学习下iOS事件的另外两个事件: 一.运动事件 运动事件,是通过加速器进行触发,和触摸事件一样,继承UIRespo ...

  8. BZOJ 2286 [Sdoi2011]消耗战 ——虚树

    虚树第一题. 大概就是建一颗只与询问有关的更小的新树,然后在虚树上DP #include <map> #include <ctime> #include <cmath&g ...

  9. BZOJ 3143 [Hnoi2013]游走 ——概率DP

    概率DP+高斯消元 与博物馆一题不同的是,最终的状态是有一定的概率到达的,但是由于不能从最终状态中出来,所以最后要把最终状态的概率置为0. 一条边$(x,y)$经过的概率是x点的概率$*x$到$y$的 ...

  10. BZOJ 3529 [Sdoi2014]数表 ——莫比乌斯反演 树状数组

    $ans=\sum_{i=1}^n\sum_{j=1}^n\sigma(gcd(i,j))$ 枚举gcd为d的所有数得到 $ans=\sum_{d<=n}\sigma(d)*g(d)$ $g(d ...