[转]Skia之二 —— SkPaint 篇

2024-01-24 01:08
文章标签 之二 skia skpaint

本文主要是介绍[转]Skia之二 —— SkPaint 篇,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

SkPaint 

 

/** \class SkPaint
The SkPaint class holds the style and color information about how to draw
 
paint1.setColor(0xFFFF0000:
paint1.setStyle(SkPaint::kFill_Style);
//笔画
paint2.setStrokeWidth(SkIntToScalar(3));  
paint3.setColor(0xFF888888);
paint3.setTextSize(SkIntToScalar(24));
paint3.setTextScaleX(SkFloatToScalar(0.75f));

 

以上显示了3种不同的paint,每个指定一种不同的风格,调用者可以自由的混用他们,也可以在使用的时候修改他们的状态

canvas.drawRect(..., paint1);
canvas.drawRect(..., paint2);
 
canvas.drawText(..., paint3);
paint3.setColor(0xFF0000FF);
canvas.drawText(..., paint3);

  

除了颜色、笔画、字体大小这样的简单属性,paint也支持effect,effect是绘图管线不同方面的子类,(每个effect都是引用计数的)当一个effect被一个paint引用的时候,将会覆盖paint的绘制管线的一些部分。

例如 ,使用gradient代替单个也是,给paint指定一个SkShader

?
SkShader* shader = SkGradientShader::CreateLinear(...);
paint.setShader(shader);
shader->unref();

  现在,所有使用这个paint绘制的东西都会使用由CreateLiner指定的gradient,CreateLiner返回的Shader对象是引用计数的。当一个像shader这样的effect对象被指定给一个paint的时候,paint会增加他的引用计数,为了平衡引用计数,上面的例子调用了shader的unref(),现在这个paint就是shader的唯一拥有者,这样,无论是出了paint作用域或者指定了其他的shader(可以为空),会自动调用shader的unref()。

 

有6种effect可以绑定到paint:

SkPathEffect

SkRasterizer

SkMaskFilter

     SkMaskFilter的使用介绍:http://www.cnblogs.com/ezhong/archive/2011/11/30/2269501.html

SkShader 例如三种过渡色方式(linear,radial,sweep),重复模式(clamp,repeat,mirror)

     linear方式GradientShader的使用介绍: http://www.cnblogs.com/ezhong/archive/2011/11/24/2261856.html

SkColorFilter  

SkXfermode

 

paint也保持SkTypeface的引用,SkTypeface代表指定的字体风格,可以用来测量和绘制文字,也就是说不仅可以用于绘制文本,还可以用来测量文本

?
paint.measureText(...);
paint.getTextBounds(...);
paint.textToGlyphs(...);
paint.getFontMetrics(...);

 

====================================================================== 

                  备注:关于引用计数                                     

?
SkShder 继承于 SkFlattenable,SkFlattenable继承于SkRefCnt
 
SkRefCnt 的成员函数 ref()和unref() 分别将fRefCnt递增1,递减1
?
void const
{
sk_atomic_inc(&fRefCnt);  }
?
void const
{
if //递减1
{
// so our destructor won't complain
this //delete this
(,shader);<code plain"="" style="white-space: pre-wrap; border-top-left-radius: 0px !important; border-top-right-radius: 0px !important; border-bottom-right-radius: 0px !important; border-bottom-left-radius: 0px !important; border: 0px !important; bottom: auto !important; float: none !important; height: auto !important; left: auto !important; line-height: 2em !important; margin: 0px !important; outline: 0px !important; overflow: visible !important; padding: 0px !important; position: static !important; right: auto !important; top: auto !important; vertical-align: baseline !important; width: auto !important; font-family: 'Courier New', Consolas, 'Bitstream Vera Sans Mono', Courier, monospace !important; min-height: inherit !important; color: rgb(0, 0, 0) !important; background-image: none !important; background-attachment: initial !important; background-color: initial !important; background-origin: initial !important; background-clip: initial !important;">pskCanvas->drawRect(r,paint);

  以上shader多调用unref(),已经删除shader所指向的对象,所以后面的drawRect没有效果。

 

 


参考:  

  http://www.cnblogs.com/ezhong/tag/skia/

 

这篇关于[转]Skia之二 —— SkPaint 篇的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/638095

相关文章

如何编写Linux PCIe设备驱动器 之二

如何编写Linux PCIe设备驱动器 之二 功能(capability)集功能(capability)APIs通过pci_bus_read_config完成功能存取功能APIs参数pos常量值PCI功能结构 PCI功能IDMSI功能电源功率管理功能 功能(capability)集 功能(capability)APIs int pcie_capability_read_wo

Pr 入门系列之二:导入与管理素材(下)

◆  ◆  ◆ 管理素材 导入素材后,项目面板中每一个媒体都只是原始素材的“链接”。 所以,视频编辑过程中一般情况下都不会破坏原始素材。 1、在不同视图模式下组织素材 项目面板提供了三大视图 View供选用:列表视图、图标视图以及自由格式视图。 A. 锁定 B. 列表视图 C. 图标视图 D. 自由格式视图 E. 缩放滑块 F. 排序图标 G. 自动匹配序列 H. 查找 I. 新建素材箱 J.

使用YOLOv10训练自定义数据集之二(数据集准备)

0x00 前言 经过上一篇环境部署的介绍【传送门】,我们已经得到了一个基本可用的YOLOv10的运行环境,还需要我们再准备一些数据,用于模型训练。 0x01 准备数据集 1. 图像标注工具 数据集是训练模型基础素材。 对于小白来说,一般推荐从一些开放网站中下载直接使用,官方推荐了一个名为Roboflow的数据集网站。Roboflow是一个免费开源数据集管理平台,它不仅提供免费的数据集,还

UICollectionView 的研究之二 :自定义 UICollectionViewFlowLayout

UICollectionView 实现各式复杂布局核心在于 UICollectionViewLayout,需要我们去自定义实现。 通过各种layout 的自定义实现,以及它们之间的切换。可以实现一些酷炫的布局,例如 (图片选自:http://www.cnblogs.com/markstray/p/5822262.html) Cover Flow 布局 堆叠布局 圆形布局

Pr 入门系列之二:导入与管理素材(上)

导入和管理素材是视频编辑流程中的关键步骤。正确导入素材确保项目中的媒体文件兼容性和稳定性,而有效管理素材则提高编辑效率,帮助你有序组织和快速访问所需资源,避免混乱和错误。 ◆  ◆  ◆ 新建项目 项目文件(.prproj)保存着视频工作流程中的所有信息。 Pr菜单:文件/新建/项目 Project 快捷键:Ctrl + Alt + N 导入页面 如上图所示,可以不选择任何素材,直接点击“创建

RedisStack十部曲之二:Redis的核心概念

文章目录 键空间修改和查询键键过期遍历键空间 客户端缓存在计算机科学中有两个难题客户端缓存的Redis实现跟踪模式的工作机制统一的键命名空间 两种连接方式缓存策略Opt-in 模式Opt-out 模式广播模式NOLOOP选项避免竟态条件当与服务器失去连接怎么办什么值得缓存 流水线请求/响应协议和往返时间(RTT)Redis管道这不仅仅是RTT的问题流水线VS脚本为什么在一台机器上进行死循环

C++笔记15•数据结构:二叉树之二叉搜索树•

二叉搜索树 1.二叉搜索树 概念: 二叉搜索树又称二叉排序树也叫二叉查找树,它可以是一棵空树。 二叉树具有以下性质: 若它的左子树不为空,则左子树上所有节点的值都小于根节点的值 若它的右子树不为空,则右子树上所有节点的值都大于根节点的值 它的左右子树也分别为二叉搜索树; 2.二叉搜索树功能 1. 二叉搜索树的查找 a 、从根开始比

【Canvas与诗词】录王昌龄诗《出塞之二》匣里金刀血未干

【成图】 【代码】 <!DOCTYPE html><html lang="utf-8"><meta http-equiv="Content-Type" content="text/html; charset=utf-8"/><head><title>匣里金刀血未干</title><style type="text/css">.centerlize{margin:0 auto;

selenium 自动化之二(1)----元素定位特殊操作复选框

针对一些相对单存定位的元素,会有个别的元素定位情况及一些元素的相关操作 checkbox的元素定位及选项,该元素属于单选或者复选等场景,那我们就需要全选或者单选或者多选 #通过xpath及css 方式定位法先找出元素checkboxs=driver.find_elements_by_xpath("//input[@type='checkbox']")checkboxs=dri

14、java 面向对象之一:面向过程与面向对象区别、对象的创建与使用、类的成员之一(属性)、类的属性之二(方法)等详解

java 面向对象之一: Ⅰ、面向过程与面向对象的区别:1、面向过程与面向对象描述:2、面向对象的两个要素:类与对象 Ⅱ、对象的创建与使用:1、面向对象思想:对象的创建与使用其一、描述:其二、代码为:其三、截图为: Ⅲ、类的成员:1、类中方法的声明和使用:其一、描述:其二、代码为:其三、截图为: 2、同类不同对象间的关系:独立堆空间其一、描述:其二、代码为:A、Person.java 与