2312skia,12画布包与路径包

2023-12-03 07:12
文章标签 路径 2312skia 布包

本文主要是介绍2312skia,12画布包与路径包,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

画布包

Skia现在提供了,在Web上轻松部署图形APIWebAssembly构建,即CanvasKit.
CanvasKit提供了测试新的CanvasSVG平台API的地基,从而在Web平台上,实现快节奏开发.还可用作要求如SkiaLottie动画支持等边角特征的自定义Web应用的部署机制.

特征

1,按允许直接绘画到HTML画布的SkSurface封装的WebGL环境
2,提供Skiacanvas/paint/path/text接口的核心集,见绑定
3,绘画到硬件加速的后端
4,使用Skia模糊安全测试

下载

NPM上取CanvasKit这里.可在npm包的types/子目录中或Skia仓库中找到文档ts定义.

另见快速入门指南.

路径包.

Skia已用WebAssemblyasm.js提供其SkPath对象和许多相关方法给JS客户(如Web浏览器).

特征

仍在快速开发PathKit,因此确切API可能会变化.
主要特点是:
1,API兼容性(如直接替换)与2D路径
2,可输出到SVG/Canvas/Path2D
3,公开各种路径特效.

示例代码

npm包中的example.html,可查找如何使用PathKit这里.

应用接口

该库的主要特征是SkPath对象.可从如下创建:
1,从PathKit.FromSVGString(str)路径的SVG
2,从动词和参数PathKit.FromCmds(cmds)二维数组.
3,FromPathKit.NewPath()(将为空)
4,现有带path.copy()PathKit.NewPath(path)SkPath的副本
可导出为:
1,SVG串:path.toSVGString()
2,Path2D对象:path.toPath2D()
3,直接到2D画布环境:path.toCanvas(ctx)
4,动词和参数的二维数组:path.toCmds()

创建SkPath对象后,可如下与之交互:
1,通过Path2D操作(moveTo,lineTo,rect,arc,等)
2,与使用opPathKit.MakeFromOp(p1,p2,op)其他路径组合.
如,path1.op(path2,PathKit.PathOp.INTERSECT)会设置path1path1path2重叠(相交)所表示的区域.
PathKit.MakeFromOp(path1,path2,PathKit.PathOp.INTERSECT)将同样,但按新的SkPath对象返回.
3,使用一些(修剪,破折号,描边等)特效调整.

重要提示:离开域时,必须使用path.delete()清理创建的(SkPath,SkOpBuilder等)对象,以避免泄漏WASM堆中的内存.
这包括构造器,copy()或以"make"前缀的函数.

路径包

FromSVGString(str)

str:表示SVGPath这里的串
返回一个动作和参数SVG串相同的SkPath,如果失败,则返回null.
例:

let path = PathKit.FromSVGString('M150 0 L75 200 L225 200 Z');`path`表示一个`三角形`,出域时,记得执行`path.delete()`.
FromCmds(cmds)

cmds2D命令数组的Array<Array<Number>>,其中命令是一个动词加其参数.
返回包含列表动作和参数SkPath,如果失败,则返回null.
比多次调用.moveTo(),.lineTo()等更快.
例:

    let cmds = [[PathKit.MOVE_VERB, 0, 10],[PathKit.LINE_VERB, 30, 40],[PathKit.QUAD_VERB, 20, 50, 45, 60],];let path = PathKit.FromCmds(cmds);//`path`与用户完成路径相同//let path = PathKit.NewPath().moveTo(0, 10).lineTo(30, 40).quadTo(20, 50, 45, 60);//出域时,记得执行`path.delete()`

NewPath()

返回一个空的SkPath对象.
例:

    let path = PathKit.NewPath();path.moveTo(0, 10).lineTo(30, 40).quadTo(20, 50, 45, 60);//也可let path = new PathKit.SkPath();

(pathToCopy)新路径

pathToCopy:要复制的SkPath路径.
返回在SkPath中传递的副本的SkPath.
例:

    let otherPath = ...;let clone = PathKit.NewPath(otherPath);clone.simplify();//也可let clone = new PathKit.SkPath(otherPath);//或let clone = otherPath.copy();
MakeFromOp(pathOne, pathTwo, op)

1,pathOne,SkPath路径.
2,pathTwo,SkPath路径.
3,op,PathOp要应用的运算

返回一个给定的PathOp应用至第一个和第二个路径的结果(顺序很重要)的新的SkPath.
例:

    let pathOne = PathKit.NewPath().moveTo(0, 20).lineTo(10, 10).lineTo(20, 20).close();let pathTwo = PathKit.NewPath().moveTo(10, 20).lineTo(20, 10).lineTo(30, 20).close();let mountains = PathKit.MakeFromOp(pathOne, pathTwo, PathKit.PathOp.UNION);

用户也可执行pathOne.op(pathTwo,PathKit.PathOp.UNION);生成路径存储pathOne中,来避免分配另一个对象.

cubicYFromX(cpx1, cpy1, cpx2, cpy2, X)

cpx1,cpy1,cpx2,cpy2:控制点的坐标数字.
X:要找相应Y坐标X坐标数字.
快速求值三次缓入/缓出曲线.按单位正方形内的参数化立方曲线定义.做出以下假设:

1,pt[0]隐式{0,0}
2,pt[3]隐式{1,1}
3,pts[1,2]单位正方形内

返回给定X坐标Y坐标.

cubicPtFromT(cpx1, cpy1, cpx2, cpy2, T)

cpx1,cpy1,cpx2,cpy2控制点的坐标数字.
T数字,要查找相应(X,Y)坐标的T参数.

快速求值三次缓入/缓出曲线.按单位正方形内的参数化立方曲线定义.做出以下假设:
1,pt[0]隐式{0,0}
2,pt[3]隐式{1,1}
3,pts[1,2]单位正方形内

长度为2的数组返回给定T值(X,Y)坐标.

SkPath (object)

addPath(otherPath)

otherPath,要附加到此路径的SkPath路径

给定路径添加到此路径,然后返回此路径链接.

addPath(otherPath, transform)

otherPath,要追加到此路径的SkPath路径.
transform,在追加它之前应用至otherPathSVGMatrix转换在此.

应用转换后,把给定路径添加到此路径,然后返回此路径以链接.细节,见Path2D.addPath()这里.

addPath(otherPath, a, b, c, d, e, f)

otherPath,要追加到此路径的SkPath路径.
a,b,c,d,e,f:数字,定义附加转换前,应用至otherPath转换的SVGMatrix六个组件.

应用转换后,把给定路径添加到此路径,然后返回此路径以链接.细节,见Path2D.addPath()这里.
例:

    let box = PathKit.NewPath().rect(0, 0, 100, 100);let moreBoxes = PathKit.NewPath();// 加未转换框(i.e. at 0, 0)moreBoxes.addPath(box)// 参数填充了一个类似如下2d矩阵://     a c e//     b d f//     0 0 1//向右添加了300个点的框.addPath(box, 1, 0, 0, 1, 300, 0)//添加一个双向缩小50%的框..addPath(box, 0.5, 0, 0, 0.5, 0, 0);//现在moreBoxes附加了3个路径
addPath(otherPath, scaleX, skewX, transX, skewY, scaleY, transY, pers0, pers1, pers2)

otherPath,追加到此路径的SkPath路径.
scaleX,skewX,transX,skewY,scaleY,transY,pers0,pers1,pers2数字,仿射矩阵的九个分量,用来定义,在附加前应用至otherPath变换.
应用转换后,把给定路径添加到此路径,然后返回此路径以链接.

例:

    let box = PathKit.NewPath().rect(0, 0, 100, 100);let moreBoxes = PathKit.NewPath();moreBoxes.addPath(box)// 加未转换框(i.e. at 0, 0)// 参数填充了一个类似如下2d矩阵://     a c e//     b d f//     0 0 1//向右添加了300个点的框.addPath(box, 1, 0, 0,0, 1, 300,0, 0 ,1)//添加一个双向缩小50%的框..addPath(box, 0.5, 0,   0,0,   0.5, 0,0,   0,   1)//现在moreBoxes附加了3个路径

arc(x,y,radius,startAngle,endAngle,ccw=false)
x,y:数字,圆弧中心坐标.
radius:数字,圆弧半径.
startAngle,endAngle:数字,角度起点和终点,以弧度为单位,从正x轴顺时针测量.
ccw:布尔值,可选参数,指定是否应默认在起角尾角之间用逆时针而不是默认的顺时针绘画弧.

描述的弧添加到此弧中,然后返回此弧以链接.细节,见Path2D.arc()这里.

例:

    let path = PathKit.NewPath();path.moveTo(20, 120);.arc(20, 120, 18, 0, 1.75 * Math.PI);.lineTo(20, 120);// 路径像一个去除了1/8切片的馅饼.
arcTo(x1, y1, x2, y2, radius)

x1,y1,x2,y2数字,定义控制点坐标.
radius数字,圆弧半径.
描述的弧添加到此弧中,(如果需要,附加一行),然后返回此弧以链接.细节Path2D.arcTo().

close()closePath()

返回到当前子路径开头,然后返回此值以链接.细节,见Path2D.closePath()这里.

computeTightBounds()

返回一个表示此路径最小和最大面积SkRect.细节,见SkPath参考.

conicTo(x1, y1, x2, y2, w)

x1,y1,x2,y2:数字,定义控制点和终点坐标.
w:数字,圆锥的权重.

把描述的圆锥线添加到此值(如果需要,请附加一行),然后返回此行以链接.细节,见SkPath参考.

复制()/copy()

返回此路径的副本.

cubicTo(cp1x, cp1y, cp2x, cp2y, x, y)
bezierCurveTo(cp1x, cp1y, cp2x, cp2y, x, y)

cp1x,cp1y,cp2x,cp2y数字,定义控制点坐标.
x,y数字,定义终点坐标

把描述的立方线添加到此值(如果需要,请附加一行),然后返回此值以链接.细节,见Path2D.bezierCurveTo这里.

dash(on, off, phase)

on,off:数字,应打开(绘画)和关闭(空白)的破折号的像素数.
phase:数字,开/关应偏移的像素数(模on+off)

对此应用虚线路径特效,然后返回此值以链接.有关视觉示例,见上面的"Dash"特效.

例:

    let box = PathKit.NewPath().rect(0, 0, 100, 100);box.dash(20, 10, 3);//box现在是一个将绘画20像素然后停止10像素的`虚线矩形`.因为相位为3,因此`第一行`不会从(0,0)开始,而是从路径(3,0)周围的3个像素开始.
ellipse(x, y, radiusX, radiusY, rotation, startAngle, endAngle, ccw=false)

x,y:数字,椭圆中心坐标.
radiusX,radiusY:数字,X和Y方向半径.
rotation:数字,该椭圆的弧度旋转.
startAngle,endAngle:数字,要绘画起始角和结束角,以正x轴弧度为单位.
ccw:布尔值,指定是否应在起角尾角之间逆时针而不是默认的顺时针绘画椭圆的可选参数.
把描述椭圆添加到,然后返回此椭圆以链接.细节,见Path2D.ellipse这里.

equals(otherPath)

otherPath:要比较的SkPath路径.
根据此路径是否等于otherPath返回布尔值.

getBounds()

返回表示此路径的最小和最大面积SkRect.细节,见SkPath参考.

getFillType()

根据此路径返回FillType.默认为PathKit.FillType.WINDING,但可能会随op()simplify()更改.
客户一般需要getFillTypeString(),因为可直接传递该值SVGCanvas.

getFillTypeString()

返回一个表示此路径fillTypeString.这些值为"nonzero""evenodd".
例:

    let path = ...;let ctx = document.getElementById('canvas1').getContext('2d');ctx.strokeStyle = 'green';ctx.fill(path.toPath2D(), path.getFillTypeString());
moveTo(x, y)

x,y:数字,笔应移动到的目标位置坐标.
移动笔(不绘画)到给定坐标,然后返回此坐标以链接.细节,见Path2D.moveTo这里.

lineTo(x, y)

x,y:数字,笔应移动到的目标位置坐标.
绘画一条给定坐标直线,然后返回此直线以链接.细节,见Path2D.lineTo这里.

op(otherPath,操作)

otherPath:要与this路径组合的另一条SkPath路径.
operation:应用至两个路径的PathOp操作.

用给定操作与otherPath合并到此路径中,并返回此路径以链接.
例:

    let pathOne = PathKit.NewPath().moveTo(0, 20).lineTo(10, 10).lineTo(20, 20).close();let pathTwo = PathKit.NewPath().moveTo(10, 20).lineTo(20, 10).lineTo(30, 20).close();//组合两个三角形为两座山的样子let mountains = pathOne.copy().op(pathOne, pathTwo, PathKit.PathOp.UNION);//设置`pathOne`为`pathOne`和`pathTwo`重叠的小三角形pathOne.op(pathOne, pathTwo, PathKit.PathOp.INTERSECT);//既然调用了`copy()`,记得在山上调用`delete()`.
quadTo(cpx, cpy, x, y) or quadraticCurveTo(cpx, cpy, x, y)

cpx,cpy:数字,控制点坐标.
x,y:数字,终点坐标.
用给定坐标绘画二次贝塞尔曲线,然后返回此曲线以链接.细节,见Path2D.quadraticCurveTo这里.

rect(x, y, w, h)

x,y:数字,矩形左上角坐标.
w,h:数字,矩形的宽高
在此基础上绘画一个矩形,然后返回此矩形以链接.细节,见Path2D.rect这里.

setFillType(fillType)

fillType:FillType,新的fillType.

设置路径的fillType.细节,见SkPath参考.

简化(simplify)()

设置此路径为一组描述与原始路径相同区域的不重叠的等值线.有关视觉示例,见上面的"简化"特效.

stroke(opts)

opts:包含删除的StrokeOpts选项.
给定的选项划出此路径.可用来搞各种特效.有关视觉示例,见上面的"描边","增长"和"收缩"特效.
例:

    let box = PathKit.NewPath().rect(0, 0, 100, 100);//用宽度10和圆角描边路径let rounded = box.copy().stroke({width: 10, join: PathKit.StrokeJoin.ROUND});//增长特效,即在盒子周围扩展20像素let grow = box.copy().stroke({width: 20}).op(box, PathKit.PathOp.DIFFERENCE);//收缩特效,从原图像收缩,let simplified = box.copy().simplify(); // sometimes required for complicated paths//有时`复杂`路径需要它,let shrink = box.copy().stroke({width: 15, cap: PathKit.StrokeCap.BUTT}).op(simplified, PathKit.PathOp.REVERSE_DIFFERENCE);//记得在每个副本上调用delete()!
toCanvas(ctx)

ctx:要在其上绘画路径的Canvas2DContext画布.
在传递的CanvasContext上绘画此路径.

例:

    let box = PathKit.NewPath().rect(0, 0, 100, 100);let ctx = document.getElementById('canvas1').getContext('2d');ctx.strokeStyle = 'green';ctx.beginPath();box.toCanvas(ctx);ctx.stroke();  // 也可ctx.fill()

toCmds()
返回动作和参数二维数组.细节,见PathKit.FromCmds().

toPath2D()

返回与此路径相同操作的Path2D对象.
例:

    let box = PathKit.NewPath().rect(0, 0, 100, 100);let ctx = document.getElementById('canvas1').getContext('2d');ctx.strokeStyle = 'green';ctx.stroke(box.toPath2D());
toSVGString()

返回表示基于此路径的SVGPath的一个String.
例:

    let box = PathKit.NewPath().rect(0, 0, 100, 100);let svg = document.getElementById('svg1');let newPath = document.createElementNS('http://www.w3.org/2000/svg', 'path');newPath.setAttribute('stroke', 'green');newPath.setAttribute('fill', 'white');newPath.setAttribute('d', box.toSVGString());svg.appendChild(newPath);
transform(matr)

matrS:kMatrix,即仿射变换矩阵的九个数字中的Array<Number>.
this应用指定的转换,然后返回此值以链接.

transform(scaleX, skewX, transX, skewY, scaleY, transY, pers0, pers1, pers2)

scaleX,skewX,transX,skewY,scaleY,transY,pers0,pers1,pers2:数字,仿射变换矩阵的九个数字.
给此值应用指定的转换,然后返回此值以链接.

例:

    let path = PathKit.NewPath().rect(0, 0, 100, 100);//放大路径5倍,path.transform([5, 0, 0,0, 5, 0,0, 0, 1]);//向右移动路径`75`像素.path.transform(1, 0, 75,0, 1, 0,0, 0, 1);
trim(startT, stopT, isComplement=false)

startT,stopT:数字,[0,1]中,指示要绘画的路径的开始和停止"百分比"的值
isComplement:布尔值,在startTstopT之间的区域,是否应该绘画修剪部分的补码.

设置此路径原始路径子集,然后返回此路径以链接.有关视觉示例,见上面的"修剪"特效.
例:

    let box = PathKit.NewPath().rect(0, 0, 100, 100);box.trim(0.25, 1.0);//`box`现在是像(已删除`顶部段`)`U`的3个段.
SkOpBuilder (object)

此对象允许链接多个PathOps在一起.用

let builder = new PathKit.SkOpBuilder();

创建一个;创建时,内部状态为"空路径".记得在构建器resolve()的结果上调用delete().

add(path,operation)

path:要与给定规则组合的SkPath路径.
operation:应用至两个路径的PathOp操作.

路径和操作数添加到生成器.

make()resolve()

根据给定路径和操作数创建并返回新的SkPath.
返回路径出域时,记得在返回路径上调用.delete().

SkMatrix (struct)

SkMatrix,在C++结构和JS数组之间转换.带一个九元素一维数组,并转换它为3x32D仿射矩阵.

SkRect(struct)

SkRect使用以下所有值均为Number的键,在C++结构和JS对象之间转换:
fLeft:左上角的x坐标
fTop:左上角的y坐标.
fRight:右下角的x坐标
fBottom:右下角的y坐标

StrokeOpts(struct)

StrokeOpts使用以下键,在C++结构和JS对象之间转换:
width,路径线宽数.默认值1.
miter_limit,数字,斜接限制.默认为4,见SkPaint参考.
join,StrokeJoin要使用的联接.默认值为PathKit.StrokeJoin.MITER.
细节,见SkPaint参考.

cap,StrokeCap要使用的帽.默认值为PathKit.StrokeCap.BUTT.见SkPaint参考.

PathOp (enum)

公开以下枚举值.它们是通过其.value属性区分的常量对象.

PathKit.PathOp.DIFFERENCE
PathKit.PathOp.INTERSECT
PathKit.PathOp.REVERSE_DIFFERENCE
PathKit.PathOp.UNION
PathKit.PathOp.XOR

PathKit.MakeFromOp()SkPath.op()中使用它们.

FillType (enum)

公开以下枚举值.它们是通过其.value属性区分的常量对象.

PathKit.FillType.WINDING (also known as nonzero)
PathKit.FillType.EVENODD
PathKit.FillType.INVERSE_WINDING
PathKit.FillType.INVERSE_EVENODD

SkPath.getFillType()SkPath.setFillType()使用它们,但一般客户需要SkPath.getFillTypeString().

StrokeJoin (enum)

公开以下枚举值.它们是通过其.value属性区分的常量对象.

PathKit.StrokeJoin.MITER
PathKit.StrokeJoin.ROUND
PathKit.StrokeJoin.BEVEL

细节,见SkPaint参考.

StrokeCap (enum)

公开以下枚举值.它们是通过其.value属性区分的常量对象.

PathKit.StrokeCap.BUTT
PathKit.StrokeCap.ROUND
PathKit.StrokeCap.SQUARE

细节,见SkPaint参考.

常数

公开以下常量:

PathKit.MOVE_VERB = 0
PathKit.LINE_VERB = 1
PathKit.QUAD_VERB = 2
PathKit.CONIC_VERB = 3
PathKit.CUBIC_VERB=4
PathKit.CLOSE_VERB=5

PathKit.FromCmds()需要它.

仅测试的函数

PathKit.LTRBRect(left,top,right,bottom)
left:SkRect左上角的数字x坐标.
top:SkRect左上角的数字y坐标.
right:数字,SkRect右下角的x坐标.
bottom:数字,SkRect右下角的y坐标.

返回有给定参数SkRect对象.
SkPath.dump()
打印控制台的动词参数.仅在调度/测试中可用.

这篇关于2312skia,12画布包与路径包的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



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

相关文章

python获取当前文件和目录路径的方法详解

《python获取当前文件和目录路径的方法详解》:本文主要介绍Python中获取当前文件路径和目录的方法,包括使用__file__关键字、os.path.abspath、os.path.realp... 目录1、获取当前文件路径2、获取当前文件所在目录3、os.path.abspath和os.path.re

hdu2544(单源最短路径)

模板题: //题意:求1到n的最短路径,模板题#include<iostream>#include<algorithm>#include<cstring>#include<stack>#include<queue>#include<set>#include<map>#include<stdio.h>#include<stdlib.h>#include<ctype.h>#i

poj 1734 (floyd求最小环并打印路径)

题意: 求图中的一个最小环,并打印路径。 解析: ans 保存最小环长度。 一直wa,最后终于找到原因,inf开太大爆掉了。。。 虽然0x3f3f3f3f用memset好用,但是还是有局限性。 代码: #include <iostream>#include <cstdio>#include <cstdlib>#include <algorithm>#incl

【408DS算法题】039进阶-判断图中路径是否存在

Index 题目分析实现总结 题目 对于给定的图G,设计函数实现判断G中是否含有从start结点到stop结点的路径。 分析实现 对于图的路径的存在性判断,有两种做法:(本文的实现均基于邻接矩阵存储方式的图) 1.图的BFS BFS的思路相对比较直观——从起始结点出发进行层次遍历,遍历过程中遇到结点i就表示存在路径start->i,故只需判断每个结点i是否就是stop

Android Environment 获取的路径问题

1. 以获取 /System 路径为例 /*** Return root of the "system" partition holding the core Android OS.* Always present and mounted read-only.*/public static @NonNull File getRootDirectory() {return DIR_ANDR

图的最短路径算法——《啊哈!算法》

图的实现方式 邻接矩阵法 int[][] map;// 图的邻接矩阵存储法map = new int[5][5];map[0] = new int[] {0, 1, 2, 3, 4};map[1] = new int[] {1, 0, 2, 6, 4};map[2] = new int[] {2, 999, 0, 3, 999};map[3] = new int[] {3, 7

vcpkg子包路径批量获取

获取vcpkg 子包的路径,并拼接为set(CMAKE_PREFIX_PATH “拼接路径” ) import osdef find_directories_with_subdirs(root_dir):# 构建根目录下的 "packages" 文件夹路径root_packages_dir = os.path.join(root_dir, "packages")# 如果 "packages"

jmeter依赖jar包找不到类路径

这两天我在纠结这个问题,为啥我maven打包放在jmeter路径下后,jmeter的bean Shell 就是找不到这个类。纠结很久解开了。我记录下,留给后来的朋友。   Error invoking bsh method: eval Sourced file: inline evaluation of: ``import org.apache.jmeter.protocol.http.s

运行.bat文件,如何在Dos窗口里面得到该文件的路径

把java代码打包成.jar文件,编写一个.bat文件,执行该文件,编译.jar包;(.bat,.jar放在同一个文件夹下) 运行.bat文件,如何在Dos窗口里面得到该文件的路径,并运行.jar文件: echo 当前盘符:%~d0 echo 当前路径:%cd% echo 当前执行命令行:%0 echo 当前bat文件路径:%~dp0 echo 当前bat文件短路径:%~sdp0 nc

【uva】116-Unidirectional TSP(动态规划,路径问题)

一道很基础的动态规划,不过需要考虑路径(而且是最小字典序)。 转移方程很好写: d[i][j] = min(dp[i + 1][ j] ,dp[i + 1][j - 1] ,dp[i + 1][ j - 1]) + mat[j[i]; dp[i][j]代表走到第i列第行的时候距离最后一行的最短距离; 13991881 116 Unidirectional TSP Accepted C