mirror of
https://github.com/xiaoqidun/ofdgo.git
synced 2026-10-29 08:46:55 +08:00
This commit is contained in:
1 parent
bcb9f98f8b
commit
3959664448
52 files changed
+1864
-407
No files matched your search
@@ -30,6 +30,7 @@ type shdPaint struct {
|
||||
extend int
|
||||
mapType string
|
||||
period float64
|
||||
sample func(float64) color.RGBA
|
||||
}
|
||||
|
||||
// repeatAxialGradient 轴向重复渐变
|
||||
@@ -135,6 +136,9 @@ func resolveShdPaint(ctx *canvas.Context, paint any) (any, *canvas.Path, canvas.
|
||||
if clip != nil && s.view != canvas.Identity {
|
||||
clip = clip.Transform(s.view)
|
||||
}
|
||||
if s.sample != nil {
|
||||
return s.sampledRaster(), clip, s.view
|
||||
}
|
||||
if s.mapType == "Repeat" {
|
||||
return &repeatAxialGradient{LinearGradient: g, period: s.period}, clip, s.view
|
||||
}
|
||||
@@ -154,18 +158,16 @@ func resolveShdPaint(ctx *canvas.Context, paint any) (any, *canvas.Path, canvas.
|
||||
d, dr := g.C1.Sub(g.C0), g.R1-g.R0
|
||||
length := d.Length()
|
||||
if length >= math.Abs(dr) || s.mapType == "Repeat" {
|
||||
stops := make([]ColorStop, len(g.Grad))
|
||||
for i, stop := range g.Grad {
|
||||
stops[i] = ColorStop{Offset: stop.Offset, Color: stop.Color}
|
||||
}
|
||||
gradient := &RasterGradient{Kind: RasterRadial, Start: rasterPoint(g.C0), End: rasterPoint(g.C1), R0: g.R0, R1: g.R1, Stops: stops, Spread: &RasterSpread{Extend: s.extend, MapType: s.mapType, Period: s.period}}
|
||||
return rasterGradientCanvas{gradient: gradient}, nil, s.view
|
||||
return s.sampledRaster(), nil, s.view
|
||||
}
|
||||
bounds := shdCanvasBounds(ctx).Transform(s.view.Inv())
|
||||
clip := radialShdClip(g, s.extend, bounds)
|
||||
if clip != nil && s.view != canvas.Identity {
|
||||
clip = clip.Transform(s.view)
|
||||
}
|
||||
if s.sample != nil {
|
||||
return s.sampledRaster(), clip, s.view
|
||||
}
|
||||
if s.mapType != "Reflect" {
|
||||
return g, clip, s.view
|
||||
}
|
||||
@@ -192,6 +194,25 @@ func resolveShdPaint(ctx *canvas.Context, paint any) (any, *canvas.Path, canvas.
|
||||
return s.gradient, nil, s.view
|
||||
}
|
||||
|
||||
// sampledRaster 保留原双圆或轴向几何与周期,不把ICC采样器降为端点渐变
|
||||
// 返回: rasterGradientCanvas 局部坐标采样器
|
||||
func (s *shdPaint) sampledRaster() rasterGradientCanvas {
|
||||
gradient := &RasterGradient{Sample: s.sample, Spread: &RasterSpread{Extend: s.extend, MapType: s.mapType, Period: s.period}}
|
||||
var stops canvas.Grad
|
||||
switch g := s.gradient.(type) {
|
||||
case *canvas.LinearGradient:
|
||||
gradient.Start, gradient.End, stops = rasterPoint(g.Start), rasterPoint(g.End), g.Grad
|
||||
case *canvas.RadialGradient:
|
||||
gradient.Kind = RasterRadial
|
||||
gradient.Start, gradient.End, gradient.R0, gradient.R1, stops = rasterPoint(g.C0), rasterPoint(g.C1), g.R0, g.R1, g.Grad
|
||||
}
|
||||
gradient.Stops = make([]ColorStop, len(stops))
|
||||
for i, stop := range stops {
|
||||
gradient.Stops[i] = ColorStop{Offset: stop.Offset, Color: stop.Color}
|
||||
}
|
||||
return rasterGradientCanvas{gradient: gradient}
|
||||
}
|
||||
|
||||
// transformShdPaint 应用渐变的父级坐标变换
|
||||
// 入参: paint 画刷, parentCTM 父级变换矩阵, bx 边界X坐标, by 边界Y坐标, pageH 页面高度, boundaryInCTM 边界是否参与父级变换
|
||||
func transformShdPaint(paint any, parentCTM *Matrix, bx, by, pageH float64, boundaryInCTM bool) {
|
||||
|
||||
Reference in new issue
Block a user