2312skia,11管理颜色及下载等

管理颜色

Skia使用的所有颜色空间,通过如何从该颜色空间,转换为叫XYZD50的通用"连接"颜色空间,来描述自己.可从相同描述中,推导出如何从XYZD50空间转换回原颜色空间.

XYZD50是像RGB一样以三维表示的颜色空间,但XYZ部分则根本不像RGB,而是这些通道的线性混杂.Y最接近你认为的亮度,但X和Z则更抽象.

如果熟悉,这类似YUV."D50"部分指的是该空间大约5000开尔文的白点.

所有管理颜色绘图分为六个部分,三个步骤连接源颜色到该XYZD50空间,然后三个对称步骤XYZD50连接回目标颜色空间.

一些步骤可约掉.步骤如下:

管理颜色步骤

1,如果源颜色预乘的,则取消乘法,α不参与管理颜色,如果乘了它,就要除掉.
2,使用源颜色空间传递函数来线性化源颜色
3,通过乘以3x3矩阵,把这些未预乘线性源颜色转换为XYZD50色域.
4,通过乘以3x3矩阵,来转换这些XYZD50颜色到目标色域.
5,用目标颜色空间传递函数逆函数编码该颜色.
6,如果目的预乘的,则按α预乘.

该逻辑在SkColorSpaceXformSteps类型中.会看到它有5个步骤:总是合并最里面两个运算为一个3x3矩阵乘法.

优化

画画时,跳过基本无操作步骤:
1,如果已去掉预乘源则跳过1.
2,如果已线性编码源,则跳过2
3,如果单个连接矩阵是相同(即源和目标颜色空间带相同色域),则跳过34
4,如果目标需要线性编码,则跳过5
5,如果目标想要去掉预乘,则跳过6

更高级优化:
1,如果已跳过34,则传递函数相同时,可跳过25.通过给定传递函数发送颜色,它自己的逆是无操作的
2,如果跳过了2-5的所有步骤,如果要同时1和6,则可跳过16,不必去掉预乘,再预乘.
3,根据可允许跳过更多步骤,来按未预乘或预乘对待不透明的颜色.

多数时候,都是"闲着".如果要把给定颜色空间中的不透明颜色绘画到使用相同颜色空间标记的目标位置,会注意到可跳过所有这六个步骤.

一般,如果需要转换色域,应期望所有6步都有.2和5计算成本最高的.

空针SkColorSpace默认值

现在空针SkColorSpace默认值如何融入所有这些?用该小片段作为序言:

 if (srcCS == nullptr) { srcCS = sRGB; }if (dstCS == nullptr) { dstCS = srcCS; }

顺序很重要.要点是,假设未标记来源都是sRGB.如果未标记你的表面,就会表现得好像目的地与你绘画的来源流畅匹配,这至少跳过了上面列举的2-5步骤,保持了与引入管理颜色前,复古的Skia过去的工作方式兼容的非管理颜色绘画模式.
它不是很有原则,但维护很方便.

坐标空间

概览

Skia一般有两个不同坐标空间:设备和本地坐标空间.设备坐标由要渲染的表面(或其他设备)定义.它们从表面左上角的(0,0)到右下角的(w,h),它们以像素为单位测量.

本地坐标

本地坐标空间是向SkCanvas提供几何图形着色器的方式.默认,本地和设备坐标系相同.即几何图形一般按像素指定.

在此,在(100,50)定位矩形,并指定它的宽高.
本地坐标定义和求值绘画上的SkShader.在此,定义了线性渐变着色器,从绿色(当x==0时)到蓝色(当x==50时).

着色器不随几何图形移动

现在,试在(100,50)处绘画渐变填充正方形.
记住,本地坐标空间没有改变.原点仍在曲面的左上角.应在(100,50)定位已指定几何图形,但当x0变为50时,SkShader仍产生梯度.

滑动矩形SkShader定义渐变中.着色器不会随几何图形移动.

变换本地坐标空间

为了获得期望效果,可移动位置到100150,来创建新的渐变着色器.但使着色器难以重用.相反,可用SkCanvas上的方法来更改本地坐标空间.

这会在画布变换矩阵定义的新空间中求值,所有本地坐标(几何体和着色器).

变换着色器坐标空间

最后,可转换相对画布本地坐标空间的SkShader坐标空间.为此,在创建SkShader时提供localMatrix参数.

此时,由SkCanvas矩阵转换几何图形.由SkCanvas矩阵和该着色器的localMatrix变换SkShader.另一个视角:localMatrix定义了一个映射着色器的坐标几何体坐标空间的转换.

如,这里是渐变填充框.它首先平移了50个单位.然后,(在盒子中心)45旋转画布.旋转盒子的几何形状,及其中的渐变.
比较第二个示例.仍平移50个单位.不过,在此,仅按SkGradientShader::MakeLinear函数的localMatrix,旋转着色器45度.现在,该框保持未旋转状态,但在该框内旋转了渐变.

安装depot_toolsGit

按安装Chromiumdepot_tools中的说明下载depot_tools(包括gclient,git-clNinja).以下是摘要.

git clone 'https://chromium.googlesource.com/chromium/tools/depot_tools.git'
export PATH="${PWD}/depot_tools:${PATH}"

(如果尚未安装)depot_tools还在系统上安装Git.

安装bazelisk

如果要添加或删除文件或更改#include,则要用Bazel重新生成BUILD.bazel文件的某些部分.建议安装为你(由bazelversion指定)选取适当的Bazel版本的Bazelisk这里,而不是手动安装Bazel这里.

安装ninja

可用gclientbin/fetch-ninja提供Ninja.

克隆Skia仓库

可用git或随depot_tools一起安装的fetch工具克隆Skia.

git clone https://skia.googlesource.com/skia.git
# //或
# fetch skia
cd skia
python3 tools/git-sync-deps
bin/fetch-ninja

开始使用Skia

现在可能想要构建Skia这里构建步骤.

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/188988.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

使用ttyd为你的Anroid设备提供web版控制台

嵌入式Android设备,众所周知要调试要开adb,涉及到安全问题通常要走一系列流程,非常复杂,对于维护人员要求比较高。因此考虑有没有一个方便的调试手段。 此外,我们还需要考虑x86的嵌入式设备的方案,最好有类…

四、C语言数据类型和变量

目录 1. 数据类型介绍 1.1 字符型 1.2 整型 1.3 浮点型 1.4 布尔类型 1.5 各种数据类型的长度 1.5.1 sizeof 操作符 1.5.2 数据类型长度 2. signed 和 unsigned 3. 数据类型的取值范围 4. 变量 4.1 变量的创建 4.2 变量的分类 5. 算术操作符:、-、*、…

SpringBoot——Quartz 定时任务

优质博文&#xff1a;IT-BLOG-CN 一、Scheduled 定时任务 【1】添加Scheduled相关依赖&#xff0c;它是Spring自带的一个jar包因此引入Spring的依赖&#xff1a; <dependency><groupId>org.springframework</groupId><artifactId>spring-context-su…

MySQL图书管理系统(49-94)源码

-- 九、 子查询 -- 无关子查询 -- 比较子查询&#xff1a;能确切知道子查询返回的是单值时&#xff0c;可以用>&#xff0c;<&#xff0c;&#xff0c;>&#xff0c;<&#xff0c;!或<>等比较运算符。 -- 49、 查询与“俞心怡”在同一个部门的读者的借…

诊所小程序开发,需要包含哪些功能,有什么注意事项?

开发一个诊所预约小程序&#xff0c;可以提高口腔诊所的服务效率和客户体验。那么&#xff0c;一般小程序的流程和功能包含哪些内容&#xff1f; 注册登录&#xff1a;用户可以快速授权并登录(可定制多种登录方式) 预约挂号&#xff1a;用户可以选择科室、医生、日期和时段进行…

为什么不能用System.currentTimeMillis()计算执行时间?

1. 前提概要 System.currentTimeMillis()是系统时间&#xff0c;系统时间修改、闰秒会导致跳动。System.nanoTime()仅用于计算耗时&#xff0c;和系统时间没有强关联。System.nanoTime()单位是纳秒&#xff0c;但不保证有纳秒的精度&#xff0c;但保证精度至少比System.curren…

Unity中Shader指令优化(编译后指令解析)

文章目录 前言一、我们先创建一个简单的Shader二、编译这个Shader&#xff0c;并且打开1、编译后注意事项2、编译平台 和 编译指令数3、顶点着色器用到的信息4、顶点着色器计算的核心部分5、片元着色器用到的信息6、片元着色器核心部分 前言 我们先读懂Shader编译后代码&#…

Linux命令与shell脚本编程大全【读书笔记 + 思考总结】

Linux命令与shell脚本编程大全 第 1 章 初识Linux shellLinux的组成及关系结构图是什么&#xff1f;Linux系统内核的作用是什么&#xff1f;内核的主要功能是什么&#xff1f;&#xff08;4点&#xff09;物理内存和虚拟内存是什么关系&#xff1f;内核如何实现虚拟内存&#x…

php轻量级性能分析工具 xhprof

windows版本 下载xhprof 选择最新的DLL版本&#xff0c;我写的时候最新的DLL版本是 2.3.5&#xff0c;将里面的 php_xhprof.dll 文件复制到php的扩展目录ext中。下载tgz版本&#xff0c;在同一个位置下载最新版本的即可&#xff0c;主要原因是dll版本中缺少 xhprof_html 和 xh…

Swagger各版本访问地址

2.9.x 访问地址: http://ip:port/{context-path}/swagger-ui.html 3.0.x 访问地址: http://ip:port/{context-path}/swagger-ui/index.html 3.0集成knife4j 访问地址: http://ip:port/{context-path}/doc.html

Ubuntu中MySQL安装与使用

一、安装教程&#xff1a;移步 二、通过sql文件创建表格&#xff1a; 首先进入mysql&#xff1a; mysql -u 用户 -p 回车 然后输入密码source sql文件&#xff08;路径&#xff09;;上面是sql语句哈&#xff0c;所以记得加分号。 sql文件部分截图&#xff1a; 创建成功后的部…

【android开发-04】android中activity的生命周期介绍

1&#xff0c;返回栈 android中使用任务task来管理activity&#xff0c;一个任务就是一组存放在栈里的活动的集合&#xff0c;这个栈被称为返回栈。栈是一种先进先出的数据结构。当我们启动一个新的活动&#xff0c;他会在返回栈中人栈&#xff0c;并处以栈顶的位置&#xff0…

浮点运算误差

输出所有形如aabb的4位完全平方数&#xff08;即前两位数字相等&#xff0c;后两位数字也相等&#xff09; 解决这个问题首先需要表示aabb这个变量&#xff0c;只需要定义一个变量n存储即可&#xff0c;另一个问题就是如何判断n是否为完全平方数&#xff1f; 第一种思路是先求出…

【python学习】Python 线程编程(类内多线程编程)

Python线程编程&#xff08;类内多线程编程&#xff09; 文章目录 Python线程编程&#xff08;类内多线程编程&#xff09;多线程编程的函数Function级多线程编程class级多线程编程进阶 类内多线程 多线程可以同时执行一段代码的多个程序。使用多线程可能使程序运行速度更快。 …

前端常见Linux操作命令

压缩文件 压缩 dist文件为dist.tar.gz tar -czvf dist.tar.gz dist 解压文件 tar -xzvf dist.tar.gz 列出目前工作目录所含的文件及子目录 ls 显示当前目录中的所有文件和目录&#xff0c;包括隐藏文件 ls -a 显示文件和目录的详细信息 它以长格式显示目录内容&#xff0c;包…

【Python表白系列】无限弹窗,满屏表白代码来啦(完整代码)

文章目录 满屏表白代码环境需求完整代码详细分析系列文章 满屏表白代码 环境需求 python3.11.4PyCharm Community Edition 2023.2.5pyinstaller6.2.0&#xff08;可选&#xff0c;这个库用于打包&#xff0c;使程序没有python环境也可以运行&#xff0c;如果想发给好朋友的话需…

TypeScript 的安装与使用

npm i typescript -g依赖会安装 tsc 命令 tsc -v初始化 配置 tsc --init生成 tsconfig.json tsconfig.json 配置 要支持 import 模块语法的话 rollup的配置 target 选项需要设置 ES5 module 选项需要改成 es2015 esbuild 的配置 target: ESNext module: ESNext moduleReso…

rust中动态数组Vec的简单使用

在Rust中&#xff0c;Vector&#xff08;简称Vec&#xff09;是一个动态数组数据结构&#xff0c;它可以动态地增加或减少其容量。Vec是Rust标准库中的一个常见类型&#xff0c;非常适合用于存储和操作一系列相同类型的值。 Vec其实是一个智能指针&#xff0c;用于在堆上分配内…

2022年1月14日 Go生态洞察:Go 1.18 新教程探索

&#x1f337;&#x1f341; 博主猫头虎&#xff08;&#x1f405;&#x1f43e;&#xff09;带您 Go to New World✨&#x1f341; &#x1f984; 博客首页——&#x1f405;&#x1f43e;猫头虎的博客&#x1f390; &#x1f433; 《面试题大全专栏》 &#x1f995; 文章图文…

绩效考核管理项目|记录2

给界面添加筛选条件并且把搜索功能实现 这段代码写入搜索方法里面就能实现功能。 private void bingdgv(){//筛选项&#xff1a;用户名、职位代码、是否辞职string userName txtUserName.Text.Trim();int baseTypeId (int)base_cbx.SelectedValue;bool isStop isdel_ckb.Che…