From c3e168caa444618700859b0fbd2b3d2232dddaf9 Mon Sep 17 00:00:00 2001 From: Ryan Oldenburg Date: Sun, 18 Jul 2021 16:49:55 -0500 Subject: [PATCH] paint has opacity --- src/pixie/internal.nim | 12 ++++ src/pixie/paints.nim | 68 ++++++++++++------ src/pixie/paths.nim | 51 +++++++++---- tests/fonts/diffs/image_paint_fill.png | Bin 2703 -> 2757 bytes tests/fonts/rendered/image_paint_fill.png | Bin 2798 -> 2798 bytes tests/images/paths/gradientAngular.png | Bin 5096 -> 5459 bytes tests/images/paths/gradientAngularOpacity.png | Bin 0 -> 6405 bytes tests/images/paths/gradientLinear.png | Bin 3680 -> 3572 bytes tests/images/paths/gradientRadial.png | Bin 5622 -> 6048 bytes tests/images/paths/opacityFill.png | Bin 0 -> 1583 bytes tests/images/paths/opacityStroke.png | Bin 0 -> 3047 bytes tests/images/paths/paintImageOpacity.png | Bin 0 -> 14181 bytes tests/images/paths/paintImageTiledOpacity.png | Bin 0 -> 15563 bytes tests/test_paints.nim | 53 ++++++++++++++ tests/test_paths.nim | 24 +++++++ 15 files changed, 174 insertions(+), 34 deletions(-) create mode 100644 tests/images/paths/gradientAngularOpacity.png create mode 100644 tests/images/paths/opacityFill.png create mode 100644 tests/images/paths/opacityStroke.png create mode 100644 tests/images/paths/paintImageOpacity.png create mode 100644 tests/images/paths/paintImageTiledOpacity.png diff --git a/src/pixie/internal.nim b/src/pixie/internal.nim index ecd0544..ff8ff8e 100644 --- a/src/pixie/internal.nim +++ b/src/pixie/internal.nim @@ -23,6 +23,18 @@ proc gaussianKernel*(radius: int): seq[uint32] = for i, f in floats: result[i] = round(f * 255 * 1024).uint32 +proc applyOpacity*(color: ColorRGBX, opacity: float32): ColorRGBX = + if opacity == 0: + rgbx(0, 0, 0, 0) + else: + let + x = round(opacity * 255).uint32 + r = ((color.r * x) div 255).uint8 + g = ((color.g * x) div 255).uint8 + b = ((color.b * x) div 255).uint8 + a = ((color.a * x) div 255).uint8 + rgbx(r, g, b, a) + proc toStraightAlpha*(data: var seq[ColorRGBA | ColorRGBX]) = ## Converts an image from premultiplied alpha to straight alpha. ## This is expensive for large images. diff --git a/src/pixie/paints.nim b/src/pixie/paints.nim index 93ed8a7..62a12d4 100644 --- a/src/pixie/paints.nim +++ b/src/pixie/paints.nim @@ -1,4 +1,4 @@ -import blends, chroma, common, images, vmath +import blends, chroma, common, images, internal, options, vmath type PaintKind* = enum @@ -21,6 +21,7 @@ type gradientHandlePositions*: seq[Vec2] ## Gradient positions (image space). gradientStops*: seq[ColorStop] ## Color stops (gradient space). blendMode*: BlendMode ## Blend mode. + opacityOption: Option[float32] ColorStop* = object ## Color stop on a gradient curve. @@ -41,37 +42,55 @@ converter parseSomePaint*(paint: SomePaint): Paint {.inline.} = elif type(paint) is Paint: paint +proc opacity*(paint: Paint): float32 = + ## Paint opacity (applies with color or image opacity). + if paint.opacityOption.isSome: + paint.opacityOption.get() + else: + 1 + +proc `opacity=`*(paint: var Paint, opacity: float32) = + ## Set the paint opacity (applies with color or image opacity). + if opacity >= 0 and opacity <= 1: + paint.opacityOption = some(opacity) + else: + raise newException(PixieError, "Invalid opacity: " & $opacity) + proc toLineSpace(at, to, point: Vec2): float32 {.inline.} = ## Convert position on to where it would fall on a line between at and to. let d = to - at det = d.x * d.x + d.y * d.y - return (d.y * (point.y - at.y) + d.x * (point.x - at.x)) / det + (d.y * (point.y - at.y) + d.x * (point.x - at.x)) / det -proc gradientPut(image: Image, x, y: int, a: float32, stops: seq[ColorStop]) = - ## Put an gradient color based on the "a" - were are we related to a line. +proc gradientPut( + image: Image, paint: Paint, x, y: int, t: float32, stops: seq[ColorStop] +) = + ## Put an gradient color based on `t` - where are we related to a line. var index = -1 for i, stop in stops: - if stop.position < a: + if stop.position < t: index = i - if stop.position > a: + if stop.position > t: break - var color: Color + var color: ColorRGBX if index == -1: # first stop solid - color = stops[0].color.color + color = stops[0].color elif index + 1 >= stops.len: # last stop solid - color = stops[index].color.color + color = stops[index].color else: let gs1 = stops[index] - gs2 = stops[index+1] - color = mix( - gs1.color.color, - gs2.color.color, - (a - gs1.position) / (gs2.position - gs1.position) + gs2 = stops[index + 1] + color = lerp( + gs1.color, + gs2.color, + (t - gs1.position) / (gs2.position - gs1.position) ) + if paint.opacity != 0: + color = color.applyOpacity(paint.opacity) image.setRgbaUnsafe(x, y, color.rgba.rgbx()) proc fillGradientLinear*(image: Image, paint: Paint) = @@ -86,6 +105,9 @@ proc fillGradientLinear*(image: Image, paint: Paint) = if paint.gradientStops.len == 0: raise newException(PixieError, "Gradient must have at least 1 color stop") + if paint.opacity == 0: + return + let at = paint.gradientHandlePositions[0] to = paint.gradientHandlePositions[1] @@ -93,8 +115,8 @@ proc fillGradientLinear*(image: Image, paint: Paint) = for x in 0 ..< image.width: let xy = vec2(x.float32, y.float32) - a = toLineSpace(at, to, xy) - image.gradientPut(x, y, a, paint.gradientStops) + t = toLineSpace(at, to, xy) + image.gradientPut(paint, x, y, t, paint.gradientStops) proc fillGradientRadial*(image: Image, paint: Paint) = ## Fills a radial gradient. @@ -108,6 +130,9 @@ proc fillGradientRadial*(image: Image, paint: Paint) = if paint.gradientStops.len == 0: raise newException(PixieError, "Gradient must have at least 1 color stop") + if paint.opacity == 0: + return + let center = paint.gradientHandlePositions[0] edge = paint.gradientHandlePositions[1] @@ -124,8 +149,8 @@ proc fillGradientRadial*(image: Image, paint: Paint) = for x in 0 ..< image.width: let xy = vec2(x.float32, y.float32) - b = (mat * xy).length() - image.gradientPut(x, y, b, paint.gradientStops) + t = (mat * xy).length() + image.gradientPut(paint, x, y, t, paint.gradientStops) proc fillGradientAngular*(image: Image, paint: Paint) = ## Fills an angular gradient. @@ -139,6 +164,9 @@ proc fillGradientAngular*(image: Image, paint: Paint) = if paint.gradientStops.len == 0: raise newException(PixieError, "Gradient must have at least 1 color stop") + if paint.opacity == 0: + return + let center = paint.gradientHandlePositions[0] edge = paint.gradientHandlePositions[1] @@ -149,5 +177,5 @@ proc fillGradientAngular*(image: Image, paint: Paint) = let xy = vec2(x.float32, y.float32) angle = normalize(xy - center).angle() - a = (angle + gradientAngle + PI/2).fixAngle() / 2 / PI + 0.5 - image.gradientPut(x, y, a, paint.gradientStops) + t = (angle + gradientAngle + PI / 2).fixAngle() / 2 / PI + 0.5 + image.gradientPut(paint, x, y, t, paint.gradientStops) diff --git a/src/pixie/paths.nim b/src/pixie/paths.nim index 688ce1e..790b0a7 100644 --- a/src/pixie/paths.nim +++ b/src/pixie/paths.nim @@ -1,5 +1,4 @@ -import blends, bumpy, chroma, common, images, masks, paints, pixie/internal, - strutils, vmath +import blends, bumpy, chroma, common, images, masks, paints, internal, strutils, vmath when defined(amd64) and not defined(pixieNoSimd): import nimsimd/sse2 @@ -1780,11 +1779,17 @@ proc fillPath*( windingRule = wrNonZero ) = ## Fills a path. + if paint.opacity == 0: + return + if paint.kind == pkSolid: if paint.color.a > 0 or paint.blendMode == bmOverwrite: var shapes = parseSomePath(path, true, transform.pixelScale()) shapes.transform(transform) - image.fillShapes(shapes, paint.color, windingRule, paint.blendMode) + var color = paint.color + if paint.opacity != 1: + color = color.applyOpacity(paint.opacity) + image.fillShapes(shapes, color, windingRule, paint.blendMode) return let @@ -1793,19 +1798,25 @@ proc fillPath*( mask.fillPath(path, transform, windingRule) + var paintOpaque = paint + paintOpaque.opacity = 1 + case paint.kind: of pkSolid: discard # Handled above of pkImage: - fill.draw(paint.image, paint.imageMat) + fill.draw(paintOpaque.image, paintOpaque.imageMat) of pkImageTiled: - fill.drawTiled(paint.image, paint.imageMat) + fill.drawTiled(paintOpaque.image, paintOpaque.imageMat) of pkGradientLinear: - fill.fillGradientLinear(paint) + fill.fillGradientLinear(paintOpaque) of pkGradientRadial: - fill.fillGradientRadial(paint) + fill.fillGradientRadial(paintOpaque) of pkGradientAngular: - fill.fillGradientAngular(paint) + fill.fillGradientAngular(paintOpaque) + + if paint.opacity != 1: + mask.applyOpacity(paint.opacity) fill.draw(mask) image.draw(fill, blendMode = paint.blendMode) @@ -1845,6 +1856,9 @@ proc strokePath*( dashes: seq[float32] = @[] ) = ## Strokes a path. + if paint.opacity == 0: + return + if paint.kind == pkSolid: if paint.color.a > 0 or paint.blendMode == bmOverwrite: var strokeShapes = strokeShapes( @@ -1856,7 +1870,10 @@ proc strokePath*( dashes ) strokeShapes.transform(transform) - image.fillShapes(strokeShapes, paint.color, wrNonZero, paint.blendMode) + var color = paint.color + if paint.opacity != 1: + color = color.applyOpacity(paint.opacity) + image.fillShapes(strokeShapes, color, wrNonZero, paint.blendMode) return let @@ -1873,19 +1890,25 @@ proc strokePath*( dashes ) + var paintOpaque = paint + paintOpaque.opacity = 1 + case paint.kind: of pkSolid: discard # Handled above of pkImage: - fill.draw(paint.image, paint.imageMat) + fill.draw(paintOpaque.image, paintOpaque.imageMat) of pkImageTiled: - fill.drawTiled(paint.image, paint.imageMat) + fill.drawTiled(paintOpaque.image, paintOpaque.imageMat) of pkGradientLinear: - fill.fillGradientLinear(paint) + fill.fillGradientLinear(paintOpaque) of pkGradientRadial: - fill.fillGradientRadial(paint) + fill.fillGradientRadial(paintOpaque) of pkGradientAngular: - fill.fillGradientAngular(paint) + fill.fillGradientAngular(paintOpaque) + + if paint.opacity != 1: + mask.applyOpacity(paint.opacity) fill.draw(mask) image.draw(fill, blendMode = paint.blendMode) diff --git a/tests/fonts/diffs/image_paint_fill.png b/tests/fonts/diffs/image_paint_fill.png index 5561a1ce48b960de1db638fa920848c8aeb7419c..aa1cbaa87da391cdba5d28a50affc2ce20d373f1 100644 GIT binary patch literal 2757 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 F{Rh$`<}d&N literal 2703 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 ZLEe=9E>eHI|M$l-=xZBm)j%C1{{uyFS`+{P literal 2798 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 diff --git a/tests/images/paths/gradientAngular.png b/tests/images/paths/gradientAngular.png index 260e7d5fcaafa806f5bcfe5e97b395cffa60aa45..6b20de1c8a461754cec49149e1447f80c7557182 100644 GIT binary patch literal 5459 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 F{{c{M6Se>V literal 5096 zcmai&=OY_j*v1hf2x3RABxc15tr<#DtEkeNwNgqo)TkXbi;CL2D2;lws1dVj3pFc! zs`hBD6t!ZM(l^ih2fXix`&&EE=7wx6msn_MXxNO6^lww^`~L-yky<|f zo^4G-!~Nb^U)MT>cDu;tk=PxcXMgK5w@BeTWvUZ7GGPj3!QFsFCNL1@lon;?=Bq=n znLz+y;&DsyM>Jd?j~9kXc3}=veX$*y#~{_?Ta?#!_s?Ol+p>Y{pXT#+u*ofQ0hVXXT9v00 z8Dy*}LGnl`Bp2E(_#nzcWR5D``k(pH4dnlBO#Oci`1v*%5uk{h+eHZpOn> zB*{v`Y{X?dDE1zI;ev3RBoL8jqL*|(^&t7=x}JQ@K%?D&r)+3WotMmZL_DSU4kPO4{e;bCkblU#8UG7|7{SZm734SQojQb$N*j&101W~fvF z9+QAS{7Kq$=ipQ@Iaf7(P)>^EDgHhqHlHI3<`Z-*^oxAq-5}(H;%nG4V=BKI@;U2X zCtOk@kss~cxzw^d`OFW=41i6^m=+i&LxV!iYceL^nkp#2;!R99(wtRuaFV`B|1L(I zg=i-#5<4eFvS;&Zf$5#f%~+lC9LM#BvKPiCh~cqZrAMu0saF4Eqhhw9eEiVIYy5elhM9W2Xxda=ZUID*s!ZQK(0TI>XR$gsvN z8<{rDpkOV`?)v*SF(> z@Do8t8BO$+?gJhRPw8eCJc?hmkJGtuxQ+HYCa$7))|dQ4&d|{m`XpU4k1>KvPjPXy zE=V~hl2|Ch;%d!6 zAs{yn@;{W}J0#UB_7g9l?a3eVouQklx(E()p23N7)5QisYR+x;Ycx{Pr~ezhpc7nwgTHMnmj>Uo*r9L#Ccn zvzS(x{?J~0We&M=;DWs+t@AjenN4i{Qlyf>FnYL^!J{|F8c+M;+X}d!xFqny`3c}) zWJ7uX<-p9EYZ+vN>7YvkCzobYG-b-FBwoZFImRh;kyM(k%3?t45VbtZ!#!1tGMq5J z{iv0n_zQEY?N6DWgEG!UJpc^{A&oiw9)Z`QR0#WBOm+&KgfarOmz00O06W=!qK$+3 z#IAPr&(%tVbR}R|@)!REd%6jQf*dWm)nQ<Ur&^$@Az*w2fq?uk9dgQRE-_OVpo7w@(Hc59GLCIi;V zzW(N=*HmhS`jBaW0~h4+;g>{;%BQu1DRn9@!G3V5HEb;PKH*P^M|mWb932rF%giT{**VB`IGo9D2HCRNvtLnTN^ ze3}mBfs8N1FzSki7I?5-D^|}@=HSacbU{-s5c(KR#K*fYy2#26z9JaFw|^ajft%a| zI_z#7ISwoux1Sy|*A2w`Y@+1TKQdmHLFpAKsu0iA_?t0~8{IQHpiz{qD4va+=~3cC z%;LjKR*R8oI%$5oGWvm5phqsP*EgdJ|s#C%ou>iPhQ1xEUG|0E)4?y}M<~kuJt&kA3#GCcolDvK~LiW<&f# z!RLP0&U(~Bl_$vdnuvX9EtP2!g@8?*q%!!o{8~bJZ)~$ggxpI7Zb1Vyx(8Xad<Yk41e;la( zcwy|@6fp1W5aTF$u9Eg~la;wAkJENb>wmqa<9J_3J3)?}i>Ji;wN6}Jj1b(#$D9=g z0Z>IK;cQkf&DDOYLv1T|juaQpH$wQ;vyHxIZuBRn@Dmfp5|E#XG@^oO!*$P&>!1-B z*p=r__p9VXBdGI&G9G-EeOAj6S#9#3E2~^ix2wePd4jB8Q z2B-<*)MNX_61Ro7ILETECE`cGDC9V*PJlW@<%0ejQ{zPu8gQ&nk-Mh@xW-|%(7dD8 zue7I$yZZ=EJZpS{R9$J=D{je;K3qKs04A4rp}me$BquqLBiv|QUEPTXBPBW%h)$eU zl()%tsxs}Iu*@;1|NRywoNn|^Kb{_8zeUSA(v`AImL1krYj1vjJSo55bhstKBSfp% z!I;2_roe6}zfK$lRgEXk!YJy0zRa&XzGj=@!^_v@?z(<uAPg%V zziEkrRFO<&rQS)|Lk>)3x6c_S_WXQhp}dH)$3_m~}9cXr2%Gbu}Kq z?uAbVixKbrR-XsD$;``p)z!bZ;!o0@Kt5Nq^EQENS&bk4+vEz+ER&bJlyh|VNd9pJ z{MH|j0J1V#D`^kn<`MzRGJQH}gwGZvrCfYfPf%nTS5{!L5DIfE21OXm#_5`wi*^madexh`p306<{2jW2MU9WL~VK&=Y0gAcXYrVYJ}_XQQ=G<*9?VU zYMg4n!y8byfg)DrhZa zoFbY-mk0NbkLePrIzwj8RmbU;Le_zk5DH<$e%%5W|5*j$W~sTe#n*kq{CNSTV`WT& zC)GZ$AG1&0WtxPvRVKfJEWz}t(DS5!caFiq*XHQs38lNNm3Yewq_ z>-KMbP{Yrdn%)p8=37BBL>P(M8CKNpXTFjASia>=68dtvcu{1%uu)Dl>^mH-l{^x+ z{6PMsiEACaHhccz6%C7kJuq}oi&Yt(?pXNX36^9ve}cTE;!oP;8Sfluv`DV#zFP&i zs2Q|19CpB|A`?U9VxX#L0l=$)YtDNB%&VyCT4Y`DR1EGdnEkD9p61XFU1_y=Fc+vJ`>YX$3r#*}Sh)R@@zG72 zrL(EVt*@7z5w96b?V_KzulDTqtrQAuVz7N%ux#XNI1nq_JHo*5S(KY^_WRVjb@@7C z`UBuzbPD;>6EbTgRPvMjTQpj#zSgskTVS}fXm=U*wmFwvF1MP)0f>xhsQ&gmKuRhE- z&QDf6@SzP_$Smgtg;MY4RmB|H^_NSO0Z+ezK#==yz_m|WOqAa@>aue5#>@!cZ zBuhT!s@PZ&0E8&N5*;+tmwwiNGVzuYC=vdl^Ifgqy@Yp^httjG>Yo}WwhMSOL;JY% z1<~Qag`FgxB5m2e)ylU!yEUi?bEkB^>=Mi3%bfH-N#Pd}^&feq_d}N@2WKG>>BwA^ zK~REhXM*jE3%J;{3C|UW=Wi*Ye1(FK$&e6RTQ?>=4`aFogo_EgS7J3(K* zqx1mG5onD1$VRR2usX^=`ts^$2nVbZl51MNC^NmjQlrItvl4m{(X&4EXG&n5Tcu^N z>akzR>K^1g1gF*v*OiWhf?I@Wu|axI?xEdooYhyfM4(Xa)J9#u@87b|Gcr7b*KWIy zvQXXkd9EI=+qFM-cE;$YxD#`?%)0y=LgKwk3CKzwh%?&xR?lzoOUc^#rBZQ^vi#A? z$i@$RF^*xpeoOn02p#n}XU`bb7sy@^^*jiEui<<~) zAG124)9pIsJULUA&DDeRmCIn2pxBoj1#WN5!2g(9uo(-APb+lPokNyJzq=)1+;DYk zN%tnibfdI=cJnxiIPR09oDhWqMXKiy}9P2_?w^*F#X+j@iAdXBKAb-#OdjXYKiu)81*9&T?>d zawX0ETz>c1eFclGqy%)%`8xX17v6ny54>xUAbRTvP5-ASjkh9Sfs5!rRtS|XfrtW^ zPK{4q_M3Jqu(I7B|EC4wHe)9lL(^G%H&Y~Q&LU{HA)4pY2(P+yasTLk&5}@k-VcU4 z^$?$3TabD~e`5N5evATlPCm5jn9rMZelhQQHqDMO-$28@H*uHhfNNJAxxXQx8}-0hsN>S~6Q>XQbhds2%&uq_ z`qFV|5K(Q7V!X&$kA_;pO6X!qZ;Lj$ z(1ibj?SagOx-PDbVk>vnIH8BNtZs=fzHR|E(ynkmEz7_b*wLA3e)Z}cQ2EDn{2P8; zTv)!+;x=i7>#{(mPZ<@z-Hd`N5ULf%=}3Mlvbv zMxr)&XFCstF9%c{rw?u097x3(Do15H2;G0vF7h&y_EfpUiUeT5f6Es)Nkx@}H~3Je zEZa0e0oFjA$u+rL;Ww97Jm{2fQ0 UEI1L=A3Pdk19SbF>n<_>1B5GxLI3~& diff --git a/tests/images/paths/gradientAngularOpacity.png b/tests/images/paths/gradientAngularOpacity.png new file mode 100644 index 0000000000000000000000000000000000000000..2f298aadd29b94060192c03d9f53466364af8055 GIT binary patch literal 6405 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 TbW3Ls00000NkvXXu0mjf3)`Be literal 0 HcmV?d00001 diff --git a/tests/images/paths/gradientLinear.png b/tests/images/paths/gradientLinear.png index e1a15fc69b8eeb34b503f4d4bf99de04fcf1da2b..944cc45b881cd908b519e3b9a22c9cb64ac42450 100644 GIT binary patch literal 3572 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 Z(-pHyjX9pZ#^2@yY%Cpc_2zieKLKAyhQI&- literal 3680 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 diff --git a/tests/images/paths/gradientRadial.png b/tests/images/paths/gradientRadial.png index cb2c7ee5a9867a2e519637da23b25ca8cff3a6c0..80ff1f1a439d3ec49ead71dbf780e22588fe3608 100644 GIT binary patch literal 6048 zcmZWtc{~&T|DO@dxqTGNxw+*Wxo5e}9dZ-q$VASBOs;I0`z%+nMMcPchUa{r`I)_P;iK zx%e^wAb8cn#PD(~%VwopmPo*v^u@VhMvm3yr_t&=F<~ z-@KU}{kff5RZe#D!g|1&f>FByrg;t^7|1UH5@PrMso zb&H48&PvbArp`YhP4ZAnjLx?Yly}}wDRPLp6MdiL_YQpxx89XIuZFdpud3U*|G4QT zIhCE-a;Jz%s?It!A0Z~^MJM$~$0&;`VtH2iNFq&}Rdd|F6;a5;>!R4|K6hq--O-b6 zUasUxBWs{5iwD`Sj&uyiHCG;heKL!efR|F!w(YgHj-89CFIeeaMn|G6iECNO(XQS- z_lt7!!paMIrbD<;M3FMPBbFmoalZS{e^FUVt!^($9UHGq0)a6?tk`2stg%dEq#FEQ zH-yD+UCBI8{{3X0Uu`gB3R0r;I=G#iliqt6^8F%}em7b<%24?OK_wu~I2E6(f%1Q<(fBkgm|-rx{W_`HHOW1!D8zMY1g;Fbz3y z0pZL1v&{4D{YfY(;~OIZ)Qw7=gd1fz&v4+PbEQc3?=+LhHA;P}F~zlkbAvJTHm43} zZuW1FexW9Vw8cqZxBoDye!)Vp8%p#;vL_#?MiNED%?x;&-OCC)&XjzxNwHquZeM@6 z@qTtrHeNGEF?`|k`=V+XypU(q_{{FzVR*(&l1~F$)w^Xx@Pfd~j{Q(w9EH~M$U*m6 z-j&dP=Ov91gC1Hnm0H^3yKT;sYbt8OTkpY=;-(ZUw2WNFUogI)t)1`%hn>n{3_1Ft z0=5pM8ee?lz8(D9wL#{ig(f2K@$8v*Yn1Yvh#Fg^kjqN*W``O$?1w;lYxGJlRi|%m zH#B+9o*fSjjU__Cem>5*=nz#g6LUdsd)=#6$HL@`avi31q2>dv0#_Ij-|f(A5Ib9s z^XXq~iA*d3;x{;p!&$f5@?ysWaBB2sqxkOa*GlBJ5tq^Pye@9cwh{!??{l^`lVZb4 z1FWAa7`p~z7rw)>@F0=d-`mzBi(A}tgZoH&)GD;-?pa-7Ao^wQ4HY$UZ$LkAMNrDV zCHAltTKoOue|D~ zbte)9+d@JV!k?`gJ-Da~0s19?=ZNqecUMOF#M@j=!i&Okoks#uf3g!6s~AQu?p~IH zdWX||FUt5*6_F)64=At%8Ve%ms3#A01bwz~BO`f8&jmVvMLKZE!Q6TS$g+`Y;?$Z@pd$*Y5{ho@=L z3{TAiAuEU;+Pl|lQx7A*|b;R+C{v> z{8U}rmpvy^(h;8FJ#$U+$njV1;bT=q?2%YpEHKycQu-WCST4LjobM~gHdHPOdkubU zq9!=k;@st~t6jL420|O2!D#6{7}fE=+$(Om&4h{z$LTlacIqyh{QySm77WwkNTpQo zlb#h=B=Og4>B(yXjw|hKC<@FRaDDsZ_%b&2^EONHegCTk{Jk?e(Qv5U)Q2kbIlA+l zl;~vdHER)X^JK_ucNb`V^efI zz!n*oerdIgi?u$LW-JqTKw!~eCB1!fh83KkokeLb*QqsY`xL@qlU*5Pyj_G@I^3J7 z(v%gRRD=E$QblMJr^^PTdN?FT`~bNu3GrReYTp$x%;7i-eD^?3yAixmg^Wu9B~*-M zd~*1izMMuOG*;^7M)pl5ccLUsl0C28q-G#M;sN6>RM{s$cB#?u`*o|6XMT3J)R0`0QFrw z4HJKSYjLfQ!B^XeZ8PP0iiia6wn+Hon>m9QqC9CzG2s8m&JIKdw^&M?0(3@f z*gd3{lGow9HneeBS^6K4L2c)sb8q9;gW%2eJpJzPCFV3&2w(jN!Mz|>70CU0{epNdth(*k^PJur&RHvUax{|E zCHGww5y&QuFL;1-X7htX;M>;)>NM8&ySMYpuX67aRXf%%3N+~_$U5>pkl{47N^t7Z z@+G(_iR64Ot!j8QQSwV$b&Nc_V$=3t`homcWJ518-@C+I7{lb)YtqC_dYVRmeM>9) z3KgvCmgMEzvCoByn+gB+rEUAdFrZW5AUUT>RuNWRqdtD?KdP6+OTMZP2K~WV#+Ocp z4y1Roi(i;@@=Dns0BQ1ctZb1Ze};HTffk1d-@LBngtK=Z9EQb1maE>8Y!!v5O`bFLEbkMVPB%e zDxT6I`To~Ap?SH6@ds%M7@yU*qm7dg1_zy7P7aL@VU20l_>GJ#^4`whUe<-yzspA{lT^BfI=;4TLg%D-4&svvhYwWIE!tzNlxoV3 zQC|F~sSohtdlQfvX$8Et;*lneHZL?SnFJQeH; zhy)}mtJhTecqq9s0c}FS15TlhQi7rW_tG2&@FtRXF2BWo>{6@oE1lVm{r2ucqUd=V_RqEsge-?l|D?ag}KyyMB6 zzrM=PWwcBeCn}L0FFz-9o%S7fDd!hnU8xn1C`_2gSdaU*rw4(O?MMA6&|~#QIDsX0 zYzRNoU1lp zl5?qn&0GE*er}!9?w6eKj9AT^l7CFOEe>c@p&dD6MHAIzm@dTM|BtI1nen5Du{1}~ zW!W`yIeP1Inq+9=S{dbl4`SQ?CDAcYKn63Ud9SU}9`U#-@4U1mJkCg_2xwmW7d)`8 znoJPB@x-3*8#-5T#=LNZT~9;h47CLN{z=S&X&Om&t*r|V(s1SwYfYTySTZ6}wEQB+ zM~LN-f$K`M6p~5^RC!$F!|6pL8>IEqw z-tdEptPI9}$7R?C)AeW^GmVcjh2}ym42rU=HiXDZYS#Ol?{dgkU(V&zDswNnO z?B`oewH+5N%QZ*sj_^?JPIm6EowsD>(q3_&1An@N7Fxl@dPs={i^13h zC{UdQ10}dp_BTyuXQO7OMdZ;;oI_{gM7I_FwLBfG8PxBCzsY%rfs?NkN|ULAsxPPd z?>k4;;QKnwd8kA6kkoAed=Mr-7JL*`o0DHBRXEFpl@}XT5bQhc?HU&Ie=NS=daRNL zyKQ52D`4hB@3>1LXEzitkF0M0^8RduF}Lt22hT@B%h(X>GQbG%8?0kXle6Q=I-$7U z^AM3(omt8{>(g#8@r8Qruxz%`j71_w=nf-PzH%YKYtZ*J0wxam&7VWS#8KH_mNA)j zX|(Pvlblmvme1J+g7Abqk*cFh<2n-P{UKou47%wQ6pg)jZTBQL#7gFq3o*j!rlw*M z?1QGWFz&)?FXARe2EbfZa#}!1*YQr54P(U@x3^hL0I{Icc1V++th7;T4EkZZY31Ld zbIn5qYaCR>9>L}c9fSAnr@H}IE}*yc@8A?%z=NH7&1E-fWlIV;+wGH9nh0xb$eF*5 z#BS(ob~#l$7C<94sF}ldQ&q%R9&jyo&J9c?)N5oDnHe`BVASPgeHb z7b&NKob*{NcFS6qlA&qudUo|CXY%KHAKHidzaENfpTw5@T_&C)5U_?iQXb22#ByybI>s6w_g;Rg6a$zb)5@ zORN%-v_XTJOCwSIsWD-!7mRgL2D}b@7OT(*Xc`$27u`$gN5;pQ<_JMJy)@Zv~Ibrb+E zCacL*?{lcLttQll(Y6^8E6Yo`ZpLZhjyJAn3<1@9d%LIq4Fz@kvgJ)ydSnaF4eQn0 z10SttD(FZ(Ty_;pGYmoA8#4FUpv%6GOD*e%rsaO0nsbPMB&k1?uEZ{210LYZE~aJ_ z;3|a*l6NMTGQ_!B)4r^f2JZ~$OR@ev#R9XnN@26(rm%Dqq#4mPq{{sEv&^6^zQEx8NXm}gY24P&1qjl^VPz|Kn_|kaQd=GR@=Zvp1aN&qLI{bB?+jBT;*wC2y-TZHO)v+&Nr>qpvbP2)tnA(xd z*#1F%9WsXTvtVOM@M&@WzZUy1@1uy z1bFzROuF?voQ46_iDGuZnylRM<5RtZ~`?g#JNeV$1C;VTtmf% zd-!N*IxP2*qgs~GCe$Bqh|(YmN$9?$XuMyzUWH(of{=0Y&vm3fwdP%vTwu3S2I+NK z#A_Aus*sOki+-i^#-aDmvJ$TOaZ{EmU3V$Ic~;i{5+E{-cU);TJk?g>F(f_c>q-^r z5>N0z@zPU)_`esqJG?I{}`hv z<>qVzyEIr`7*q$CSnAZIagvkm7W`e!5D*r(N9weqLtmo$cpe2Nc1f@wz>T3=k|I>c zD3)>lUN`{pWT>x+^S4&N+Q^aH?41$ivutOm?_QHS_ZlbV6DmNc5K?(>MyVvd(-zmG}ed+fu&;$r#TWtVEj{l4vCbe)GD47g+T(NAj zw%`k|wnoaA$r%FgFnpVIokg9y;XmQ3+>seOQEr46uVP~?nY3RLq`l8lbVRnU=} zT+iSrjo?-{o5UWBcF2xXvgeG7?-Y-cj;>W=uHXH<{vQ_q7EvJuY8K=Vu$_r66}Rko zp|A5FROARlH?*688Uu?EkBD9|*$l%gl!j)LxQ36MjZS)L)|7}Q{q*~b%3#wfo zRl8b^hr9{u-e&v~Vps|>qUD)CeQ4XC84{_C8F|91G)r1d^#mKRhdU@#*$tKeNKBPs1-zI0=_shg3Ua`|I{X6Ny1CRuda;W%TzruyEHYZWyh z*=jr={^Pm{&r?RF5W`iT@LrDjK5fwFSKHGCQ6`DN9ELKnS{vJrHCE&1R+d4v7L0mw z_4NiKkO#+5W{e3Fd`#E811gKiPpkq8f~Yi{(o5>;!3_7MSY8|i9Q-h`+v!Q{1fx>E zIOB1ob1CQ2!wYgbs>qxvs(@U<6!_-bEm>U!zM*A0m2>5tIbj1z=%~JC5u9-2BJ5M% z>^;IpVbEGe_5GKhNS}bkJqeTe(ntQ|nO5q(iF-}bht20is^w2(kWN=k42|q#!5>-- z+=T+2p>5$>_w)QF)*-~!Q;eG`ruPqa71-f-pnil7QGzx6O)%V z^YOZ*tPB3l_KdrHbrttbUx_g4BKJfgZOSdzq?<<+!UmSj5rnAvI@|GE_L&6Z`}9`b zXf{4>70Xlx_%bb4Z&#`s`YrepV#yr)Tg@i-9?I54>=iBI6>WgKiFaPc+fls*p0lW8 z>Ua=KG4@ZvwSf{4UjTXd_+&ANm+3(@?Oo)|dzag-eDo0pxFAUT1gH{zpg(rD{7sUt z@Kyrl`HqKjlZ)JGJEK(xhGDGZasabkSN&xi)RQYhr4h+`wVzQ}dxi%t8%$dqT4 zqXO)1SMYJDSbN|-Dv}kx*!G;a1~st`PHuu4g}3gE*va`p(#Nw3$`|Wr{g~&C@rZqK ztWmdk-m??*!JkiOi`xP%GVnPha`inQ5&ve@!Iy10Uj>)|Qh9vFv3^`y!){uYQ&Zt+ z+{mQ_5k{dLvmuQ|Eaw~GjIIev5o@~ykid3k8=3=Sx|fs-lc0oh0(0OC$NF+zg@Fa}&@ZofGxgPapl9p~{Pgr=XaBt(`M=l=D`OuuNr~xt)HWrOMQH-$N%C%I z|K#;BvmXup@a;fH@)UI@n=jpNMvB8-Y3e@k@8xJuSiUZ7abonE~K^dl9Bxf`o zvj~$Z*fL>uVq|_A9T$R)>q`xAS@INJmL=w2(6joQCTdQ=`%rA!b@&r}XvnP|IN*b_ z)-x(`r?2({hPe4B8!g#Jc~RCGgQD$x1JRD!BN4?)p;TEvjqtNBwFxO zl&D+ld19X2sgHtMP)OxlkU3s?k#N{;{71eA0YaaNN!2bMx4aFtj&o(%zgO5u~ z%2yU4H?^djl;nQcnuy@II)OFY_<38RVP8fTuI@Kmu#&bWpJvv-ybEL-D#vq$5g$~2V35ITZrNX zO=%S2OxV`<8#HTWvk+gPq9-pc_nZ~q)gD9KJ9g(eh{~BfiR8GETi%CSB%=h1Uw&`e z`EaNBmRc}1fV3EG0QXC+ZfUtqF{bzrnO7~Jixt;grKQ}9cGl$N%$P-SB4KClnq2m$ zM&@M*iVtho8mQB#J6K_In8tv1k;MF^I22y51>5GZM?29 zQHsKNw(Xk>&uf&oinr7uI95}nhF8^fgJcXWNME*2`%1DRNqiVkVL@VJL)wRBkK^Pz zSQXt`i(Voz@nCi>eJgqh8MlT+;1>7^vK#qE_5-RiFb#5R_Y}a}>`WuKZK`VbH%GwG zGdugCI`r>hw*~Z8)3DGi8&7*M!*Wt5pcSw<6o`G9WG9L5eMVe$#ZD)Q)5AqRhe2AK zp})lgm;rTm@Wu|jOhwZz)1+B2I5V4sQLao4(p4nY9^oKI!pTz4rSdOVjihQubnCs| zkDwZKy{gQ`IRuF~J^9|Fxv#+BcBf3T(fUDYU>NmO>qKeewkY@D6}5SQ#Y`vO0~U_W zEX>T(af%fbTL~Q&o;n!_pp;Ut$o*fiL&_VL8!?@ioPyZ%@N@N1O@XVG{4oa_-mCZg zUPq}pJJ3AE+*XLz*uZc+NcSuPh4YS88nUnf6RuQlQrO-B*X{oXGP z^Xe!}-P##HFKfjk-~Y&zoH%iVU&s5V@`8a#mUvEL z5eXjY_U;s~^TDvfU~CkC9gI8An2q!>+s~JdFh)t%{^WFZR4<}xu6=JE>!)NW=xTbR zeuxhAfr$}WXYZmR_})b~0U}OpfO$QXwZgq1n(w$vDMZVpfWT2gC#AUmEOt=?3w5-C z9O(S&2UgoXQ099vTKO}j|1?!nI6X++;Rib&CHWR%z2TDQq#BK^wi@TpD!4q)Qu;DH zNa9hZU9Fl8R@01fAXv_CW}-Z2pX^g7MCEjoDe_hsTtP7nbKjs{F}GoyuJ+^U@2^&! zaWz@*OS#TLe3R@~rK1peYO8TPvIDpekW6W`2r8pMOCc6l&lzeb?qcbhN50W~MULvO zae7S~3PmSg7g{{Va{(k%5E0T-BLj?io7~(RgH)PmfTlI@mI7Aq^-aF$!!@XXp7iB7 ztS!z1XBF3)j;p2O)B9Z={1#K6E2 z8F68G>60oY`iLm!3+8oqrMM4@xE=*015Va`7)t^?Tk_1X9Jbiu&6oMIG{{E}1)rmv zKaq4#N^yvJJFRULXrDG({_A6HH*rDUqvo}(iC&oIG&W06yjR;LF5Gr>=5?+qWJm3h zaX7tXBnk?dolmpwT7mDEP%0@29=0;Or$e!$bzxp&!6I|xYq2t(3lPx!g5KtP6mzN! zoy93W*a}Jiq9WCRyUYHyxj!=I>m>z+(aA<9iiP5>TcH_bHGg5X1kqo`MC^ds@fEgq z?tRf#sov!(69~EHY#4Op3FcPcR!RX-z|F<++#A0j%-@bX!DQ7hf*lBid&^|k=1y8e zXqqfKuQ2^tAI$I%45k9}x7kI?mN#HMB<3Nyq!dG1`j`ihSYx{3ml9ctmS8)2RISeV z^m-$HN?IXi2j|$(0Yt2+X#K`bWI~D17_iPoG7O=8CW?Aw`$|NNE?4;ng>TTiceYV1 z9%g|9?etnW=ynBX$A)3ZNP2qx*E<;7IoFt*^YRD{O*ct;&35;n_&*h9o#^zTaBB5#nYbEI_IlQbBS%=dwrrcshCCnU6>5-ll178@@Sa1?e!@sI&A)3<#}~tUYQ|XRS?JvI|1_~d%?pJY!1)++n@3@D2tHT z`uOrYnsF|+IXSmY2bgHg9JNya&>~6(P$R%_wf4tZy9(9c6>1Y*V^SySO%hUH%v~kf zNz5*gzeNC8A~3Zx!gL{YL}{^iZwJMU*U@_Pv`t5lzu(Jo{MB-Jn-F+R5ap$;a-FhT znY*QKJqjV-(6k6NGVcW-)BPa*EiY8ea^T-kFu|__}^I+_Nf@ zAQDjzuG$%TB5}*uK?HH0rwTSH<(IRp;gc*l0C%Jwu0MpYb?tnkFJwD6d3yAopdXt@ zW~T@dbBOe_!kL=F2H3TC|E%`C&B6#ed4c@j-Cx$)j(=Tij{etlH*V z9q)7E44Km1sm>gQwo+V#i%xvh$0cYOImzOjn)Xdv0b#Bu>Nf5d!kfN8HiKU~k9p{6 zo9@>-BV3p% zh$pP3dmdknA4G*cW!6i+JkJv_!uvV~sGZ<|?(CWoDP+z>)Ggfh(TuIqpDF?p) zO}ee|_5QydG;+{=Tx;?!Fh(EERZY7oOKaj|UNtMON;h`pSgGG-0iAg=I4Hpg8BHO+ zHb-}F$UA+JR7|zR-01%BrS*u#;7YkB2Gw~%S6*0n1T^>GX70YC@!Hw6cIwU( zR>t&S_R5*As7v65dpsy0aG!fA&)d|L3#LJ@&nwV5&;f+_4$>6 zmSmf*JTVS?Mon?QDeISz2*t;<^AqfCAWRl}ZKqLkW#eWAFV+hYlXBf`bbT51>JdTU z&^xz0$u}ucrGQ72A$zE>Q08I`WDg(DI!HBG`pcCQE0w{{C(Li^37CzeZyxf-RGomy zvY|CH-<~{U7IbxomKAH4AmmCh7BDyJG^=jTx~fmF0z+0c>D?`7X$>L=kw{!I|F^%S z%X{cQ!RUmjLYU_ZcgmH7aa?H(n;%6L3sI}=2VFqC<{2{gwbjjt`8l}iEx|oB|20If z{>{s8kyCiP^TqI}gVa^p^Q;_|s=-F$Tr_vdiD<*J!xs;kO{?8{;Va!p1guxNjyK_F z#x#3rSi_Xhu``LnqS&X%((XScI0sp^Z^^IAF->x4@aJBS^Vrf1s#9gR!9Iwq3 z&O=G|H#lAN*V|oN9G9-p6mS!CnO<7<%ysdidbzdcQ^i#)x355Uc_vOGbPv4;(u^8p z-@Nhq<;=>gXi|W2h&K`kFbC>2_S5YY&2U=1as?t?G{ZSvd7iWpkdl1UOj<;Kdbx6j zoQA#IgWJl#vxma~PAV~KED&`P86yTphfTV>a*+oOeFHa8g5SOhMtB_+hJ7ezvv9f# zv~rDnJL)r|;ct&-_-hdz6bH4Vq(;{>2@2M2D6&b8lxat*v+5G8yCCg`1B)(@Eip!% zIn!ds|HjctHs_Mu$J25i8_(Cw6|u74>^IJ}a=r4@_+8YLOdY29xHV91)^m zkLZ@|r>Nn9dWB1Wt&i9@9$Clw5=Ov%4ONuB3XRHSe2l!XcsmvA=l*o} z(+f`ln&IIMV!U(HY2kl$@L5~J(i4_#!%~;UQs!+oRyRbD?pAGaU zU!)0&GMqkeL<)z?DV;bHqarJ9+W+of&>~ydyHn9R@H1+(BqNE7m8oFc(LRFFty7GM z2me4@XI$KY>>B&y=bL)U4R!}YU_0mEUYIA!bP$%@Qn z&xo6Ud;NhR@f-M!1-8(Tv`}+`@rlxS?h*~(MeCaXW5A0f0A^K=zoNDL>B<6M7K+Z7 z+3516_7O~zllK%|2L$CWXZA!U=^Z5_P3c1`lPsxIk4^9mhBT4vloE}wiMuArWvR}R zbBObo4aSdX7MbxFBVUmCnC`gj3yiTAa-9OM+!SMQ`p~Y7EuA?kH;>FZAjdqcseVb_ z$vzU~cqiqKT*TKW623+)73G#)50#FndRm@&2qpNzPb($Mc^Wu`;mpEH;eL3@bL{8n zN0)r+W8keB8wEj-rXV4DNmNE>TvmH1(g@|JyMA%Wn6B^|m^OVS3chWi!^dz?SK{#QYBo C27_e) diff --git a/tests/images/paths/opacityFill.png b/tests/images/paths/opacityFill.png new file mode 100644 index 0000000000000000000000000000000000000000..a51781e057bef1efa407b04931bfc161248975ed GIT binary patch literal 1583 zcmb7F`#Tc~03EXjMT;S}k0p7`nnxZh#m43_nJ@}dYS<)MsZ=hRn_a^tm%>tMm}k22H-k{8289WxD;NIx5muyN;H6Z##7Czjco%GTkc|`INITksp!`XXubeXeP@~Cnk*vTG&;8k$O zVNmnyua%^eJGwJonFt*X?+Y9BQ{y_!CMgjP4e*1i)RK#{EfXTfYEFCGvxYd%ZJXob z!L`lMPo&s#22EqVz+|S{wj;Hg&PLFS*h!u@YrB_ETVDf1 zg?ktI$7rS9yi_JTv2#Iz$6YHwdq>4!#Ce;Cli`Z}l6C{SjF8w-XOo5CZDX^r(~qpZ z7SkFV=h-8vN$l0MU;#<-uvW+8_6$)v7S1~aiit4>9s=uyOZzZ1$Z^MoJ9u2lOpbo3 zKEWef&>AAr>L18?SSpc%g;yQzA;2RAV+{-Id0FfOsmcWX74#tP{%`}3y)+QCcH&8- zE^$Yh&a@m9cH>4^s)OcBr(I#0XbVKR(@aZLpC=!qehIkj>P2!Sw5rhP&j$}ijY??1 zWIaM__3h|DL;K&lcMG*3Lw?-+4SbUEl1w$+IJwMqC|UF6Y1uRSDZ<7ije}!}zkA?g zE2{B-*>*Nz$pM5=Y1DY9U+ue-_-Sr*c+W3~y+L!xbe<@8!zz7;)}_S&U5jGWHV^G7 z1BTV-Etq&_bU=$dUwx=4N7wdPhk@bbYw}7(gB2IG<2Le)wV8BaDRm{z#qaKN5fK*G z*114=+swZp`qA@w6eLbBqmND(JMmU0X&Qy()9V|FyN+4Yl%vzxw6C)J{HwODC{9nl zl1a5n=DWV}W3$kL^OkCPP6z1SrYw6{&QlB%O^|bA%IT)v1Gb-hwsv2YBVU`c>|pJ= zA%pNV=329ZATMW^4)kzWqjfrp_hkYu^6FyBltKHH0Z@~~wqRL)>YL9upJSLB1hJbL z3DyKtq|LIvmY)tWSN+je2Z=Ze{ziA-A|CM_Y*Y-w1dlWdiVM=;ZBqHU!99-bn>io( z6Gk)Vwd{o_pl6Hx-Z<;)3P+x)_9Axom(*8HY{Dfzet{Rl?F8;x(|zr{-8IHORY}~O zBdr2eOjmKPs!-DTTJUnk*5!R^QC=cAp_{-l6kvVAM{uV~1ryi!5#FtsTR2w4{1&5v zz#;YnNaB797;)CQk7JaplN2kf!YY2|*QG;2Ggfb!D_I}m7CFg`ULw#Nl=qHf=@RLi zDV<|mACsASdVTalXE2#5K%=wTS?#cXDm8wiON1xLW}zzW3uI46Eb47YpmA6R|A5;U zJrnq~%8lwB;73L%<8t1Ie)BApn}1#JWt)zjk3|mOuvfN1Bx;+<2VOlxpnoJmku_Bl z$g!s?=%S$@3wPCK{TbNO1>f(9{TC_2dL{+V#5pwXCeKfb;(Oq&~5#!s5Q0 zfi~dN6RS&4fIQzAz}xKzrA?JS;lnKW!i*r`&))WdQ*#5iuxPGmi98nsyJdOO{T?J5 z_r%sF^^d;=-raxzwa9@-4!hq&?7uYhc)V^QbQ7fnyaF^1 zrY;VP$+_>aj5{pLZlv_QxV?!20e3Pu-vj)=hx*S&X3>;9_3ESX@{}^gSIIuonQ}f4 ze0D^p^UU<^2+#9!^C$L6O7|J|%XG^y98vM;ZttRDfun?xbjyG5k^10*ur+yDRo literal 0 HcmV?d00001 diff --git a/tests/images/paths/opacityStroke.png b/tests/images/paths/opacityStroke.png new file mode 100644 index 0000000000000000000000000000000000000000..aaefbfd2602569ae9b6a4f6fdc0e7b1e94d4e8c6 GIT binary patch literal 3047 zcma);`9BkmAIH&Ru8%8aqwY{V)7hj|6jN?=Q+oN+;3Yo#Ocs~3iHn^{5eK{40O7tXXqzE+qs*opQZD_ShO zcc)_Yupredr}zICx&fJiIaahzq{;iWwBjNkv$c(82O(W!M3>@q?EZHdLYBeoZ;0tL zVmzXABVjpC!%8?$^VD17O3^w5U5G|Zgrs5+u9JM|7)YN)zhz#q;BEiNDW45oN9Jd2wB>$}-{YKw0z{7p8=BV#hzQXo3Copezh zpn|H)5B&5G`qAPD_yA%DPJW+PWhxZi#af<`tWV#pO72tz~`DΝ%B<_>nG&Yy8 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 A2LJ#7 literal 0 HcmV?d00001 diff --git a/tests/images/paths/paintImageOpacity.png b/tests/images/paths/paintImageOpacity.png new file mode 100644 index 0000000000000000000000000000000000000000..31f19d89365814f0d6daccaeca5b424b416084a7 GIT binary patch literal 14181 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 literal 0 HcmV?d00001 diff --git a/tests/test_paints.nim b/tests/test_paints.nim index 304f9f2..fac4748 100644 --- a/tests/test_paints.nim +++ b/tests/test_paints.nim @@ -31,6 +31,21 @@ block: ) image.writeFile("tests/images/paths/paintImage.png") +block: + var paint = Paint( + kind: pkImage, + image: decodePng(readFile("tests/images/png/baboon.png")), + imageMat: scale(vec2(0.2, 0.2)) + ) + paint.opacity = 0.5 + + let image = newImage(100, 100) + image.fillPath( + heartShape, + paint + ) + image.writeFile("tests/images/paths/paintImageOpacity.png") + block: let image = newImage(100, 100) image.fillPath( @@ -43,6 +58,21 @@ block: ) image.writeFile("tests/images/paths/paintImageTiled.png") +block: + var paint = Paint( + kind: pkImageTiled, + image: decodePng(readFile("tests/images/png/baboon.png")), + imageMat: scale(vec2(0.02, 0.02)) + ) + paint.opacity = 0.5 + + let image = newImage(100, 100) + image.fillPath( + heartShape, + paint + ) + image.writeFile("tests/images/paths/paintImageTiledOpacity.png") + block: let image = newImage(100, 100) image.fillPath( @@ -100,3 +130,26 @@ block: ) image.writeFile("tests/images/paths/gradientAngular.png") + +block: + var paint = Paint( + kind: pkGradientAngular, + gradientHandlePositions: @[ + vec2(50, 50), + vec2(100, 50), + vec2(50, 100) + ], + gradientStops: @[ + ColorStop(color: rgba(255, 0, 0, 255), position: 0), + ColorStop(color: rgba(255, 0, 0, 40), position: 1.0), + ] + ) + paint.opacity = 0.5 + + let image = newImage(100, 100) + image.fillPath( + heartShape, + paint + ) + + image.writeFile("tests/images/paths/gradientAngularOpacity.png") diff --git a/tests/test_paths.nim b/tests/test_paths.nim index 915639e..fe98c3b 100644 --- a/tests/test_paths.nim +++ b/tests/test_paths.nim @@ -568,3 +568,27 @@ block: doAssert path.strokeOverlaps(vec2(40, 20)) doAssert path.strokeOverlaps(vec2(19.8, 30.2)) doAssert not path.strokeOverlaps(vec2(19.4, 30.6)) + +block: + var path: Path + path.circle(50, 50, 30) + + var paint = Paint(kind: pkSolid, color: rgba(255, 0, 255, 255)) + paint.opacity = 0.5 + + let image = newImage(100, 100) + image.fillPath(path, paint) + + image.writeFile("tests/images/paths/opacityFill.png") + +block: + var path: Path + path.circle(50, 50, 30) + + var paint = Paint(kind: pkSolid, color: rgba(255, 0, 255, 255)) + paint.opacity = 0.5 + + let image = newImage(100, 100) + image.strokePath(path, paint, strokeWidth = 10) + + image.writeFile("tests/images/paths/opacityStroke.png")