PPAPI+Skia实现的涂鸦板
在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实现的涂鸦板的更多相关文章
- iOS_Quartz2D之涂鸦板
响应者对象:继承了UIResponder的对象 触摸事件:一根或多根手指: 开始触摸: - (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent ...
- 重新想象 Windows 8 Store Apps (51) - 输入: 涂鸦板
[源码下载] 重新想象 Windows 8 Store Apps (51) - 输入: 涂鸦板 作者:webabcd 介绍重新想象 Windows 8 Store Apps 之 涂鸦板 通过 Poin ...
- Android应用开发实例篇(1)-----简易涂鸦板
链接地址:http://www.cnblogs.com/lknlfy/archive/2012/03/03/2378328.html 一.概述 这次要做一个简单的涂鸦板应用,以前在Qt上实现过,突然想 ...
- HTML5实现涂鸦板
原文:HTML5实现涂鸦板 最近闲的,看了看html5,强大的绘图功能让我惊奇,于是,写了个小玩意---涂鸦板,能实现功能有:画画,改色,调整画笔大小 html5的绘图可以分为点,线,面,圆,图片等, ...
- 实现简单的手写涂鸦板(demo源码)
在一些软件系统中,需要用到手写涂鸦的功能,然后可以将涂鸦的结果保存为图片,并可以将"真迹"通过网络发送给对方.这种手写涂鸦功能是如何实现的了?最直接的,我们可以使用Windows提 ...
- 背水一战 Windows 10 (60) - 控件(媒体类): Pointer 涂鸦板, InkCanvas 涂鸦板
[源码下载] 背水一战 Windows 10 (60) - 控件(媒体类): Pointer 涂鸦板, InkCanvas 涂鸦板 作者:webabcd 介绍背水一战 Windows 10 之 控件( ...
- mooc上学习acllib后写的包含背景音乐的小涂鸦板(初入江湖,大佬勿喷)
#include "acllib.h"ACL_Sound sound1;ACL_Image img;//开始图ACL_Image img1;//涂鸦图ACL_Color c=RED ...
- 【Android】自己定义View、画家(画布)Canvas与画笔Paint的应用——绘图、涂鸦板app的实现
利用一个简单的绘图app来说明安卓的图形处理类与自己定义View的应用. 例如以下图,有一个供用户自己随意绘图.涂鸦的app. 这里不做那么花俏了,仅提供黑白两色.但能够改变笔尖的粗细. 实质上这里的 ...
- qt练习10 涂鸦板源代码
源代码下载: http://files.cnblogs.com/hnrainll/doodle.zip http://www.cnblogs.com/hnrainll/archive/2011/05/ ...
随机推荐
- axure笔记--内置变量
部件变量: This:当前变量名称 Target:目标变量的名称 x,y表示组件左上角的位置 name:获取当前组件标签命名 Top:获取组件上边界到x轴的距离 bottom:获取组件下边界到x轴的距 ...
- python爬虫入门四:BeautifulSoup库(转)
正则表达式可以从html代码中提取我们想要的数据信息,它比较繁琐复杂,编写的时候效率不高,但我们又最好是能够学会使用正则表达式. 我在网络上发现了一篇关于写得很好的教程,如果需要使用正则表达式的话,参 ...
- PAT Basic 1023
1023 组个最小数 给定数字0-9各若干个.你可以以任意顺序排列这些数字,但必须全部使用.目标是使得最后得到的数尽可能小(注意0不能做首位).例如:给定两个0,两个1,三个5,一个8,我们得到的最小 ...
- skkyk:线段树浅谈
推荐前辈学姐博客文章,写的很细 https://www.cnblogs.com/TheRoadToTheGold/p/6254255.html 学学半,此随笔主要是加深自己对线段树的理解 题目:洛谷P ...
- 服务不支持 chkconfig 的解决方法
“服务不支持 chkconfig”: 请注意检查脚本的前面,是否有完整的两行:#chkconfig: 2345 80 90 #description:auto_run 在脚本前面这两行是不能少的 ...
- Codeforces Round #417 (Div. 2) 花式被虐
A. Sagheer and Crossroads time limit per test 1 second memory limit per test 256 megabytes input sta ...
- System.TypeInitializationException
在连接数据库时,提示System.TypeInitializationException 数据库的连接字符串放在config文件中,而config中有两个文件,起初放在debug.comfig中,启动 ...
- 高精度&&FFT
ACM-高精度模板(综合篇) 时间:-- :: 阅读: 评论: 收藏: [点我收藏+] 标签:高精度 在这里,我们约定,能用int表示的数据视为单精度,否则为高精度.所有函数的设计均采用带返回值的形式 ...
- [BZOJ3545] [ONTAK2010]Peaks(线段树合并 + 离散化)
传送门 由于困难值小于等于x这个很恶心,可以离线处理,将边权,和询问时的x排序. 每到一个询问的时候,将边权小于等于x的都合并起来再询问. .. 有重复元素的线段树合并的时间复杂度是nlog^2n # ...
- 刷题总结——art2(ssoj)
题目: 题解: o(n)复杂度扫一遍再用一个stack维护就可以了·····mdzz这道题都不会做·· 代码: #include<iostream> #include<cstdio& ...