diff --git a/experiments/svg_cairo.nim b/experiments/svg_cairo.nim index fce1cb0..7183e01 100644 --- a/experiments/svg_cairo.nim +++ b/experiments/svg_cairo.nim @@ -1,11 +1,13 @@ ## Load and Save SVG files. -import cairo, chroma, pixie/common, pixie/images, pixie/paths, strutils, vmath, +import cairo, chroma, pixie/common, pixie/images, strutils, vmath, xmlparser, xmltree -type Path = paths.Path +include pixie/paths -proc processCommands(c: ptr Context, path: paths.Path) = +# type Path = paths.Path + +proc processCommands(c: ptr Context, path: Path) = c.newPath() c.moveTo(0, 0) for i, command in path.commands: @@ -99,8 +101,8 @@ type Ctx = object fillRule: WindingRule fill, stroke: ColorRGBA strokeWidth: float32 - strokeLineCap: paths.LineCap - strokeLineJoin: paths.LineJoin + strokeLineCap: LineCap + strokeLineJoin: LineJoin strokeMiterLimit: float32 strokeDashArray: seq[float32] transform: Mat3 @@ -319,7 +321,7 @@ proc decodeCtx(inherited: Ctx, node: XmlNode): Ctx = else: failInvalidTransform(transform) -proc cairoLineCap(lineCap: paths.LineCap): cairo.LineCap = +proc cairoLineCap(lineCap: LineCap): cairo.LineCap = case lineCap: of lcButt: LineCapButt @@ -328,7 +330,7 @@ proc cairoLineCap(lineCap: paths.LineCap): cairo.LineCap = of lcSquare: LineCapSquare -proc cairoLineJoin(lineJoin: paths.LineJoin): cairo.LineJoin = +proc cairoLineJoin(lineJoin: LineJoin): cairo.LineJoin = case lineJoin: of ljMiter: LineJoinMiter diff --git a/src/pixie/contexts.nim b/src/pixie/contexts.nim index f8e41fa..503674d 100644 --- a/src/pixie/contexts.nim +++ b/src/pixie/contexts.nim @@ -312,13 +312,11 @@ proc clip*(ctx: Context, path: Path, windingRule = wrNonZero) = ## Turns the path into the current clipping region. The previous clipping ## region, if any, is intersected with the current or given path to create ## the new clipping region. - let mask = newMask(ctx.image.width, ctx.image.height) - mask.fillPath(path, ctx.mat, windingRule) - if ctx.mask == nil: - ctx.mask = mask + ctx.mask = newMask(ctx.image.width, ctx.image.height) + ctx.mask.fillPath(path, windingRule = windingRule) else: - ctx.mask.draw(mask, blendMode = bmMask) + ctx.mask.fillPath(path, windingRule = windingRule, blendMode = bmMask) proc clip*(ctx: Context, windingRule = wrNonZero) {.inline.} = ## Turns the current path into the current clipping region. The previous diff --git a/src/pixie/images.nim b/src/pixie/images.nim index b1bfe7e..7c5fd88 100644 --- a/src/pixie/images.nim +++ b/src/pixie/images.nim @@ -535,11 +535,18 @@ proc getRgbaSmooth*(image: Image, x, y: float32, wrapped = false): ColorRGBX = x0y1 = image[x0, y1] x1y1 = image[x1, y1] - let + var topMix = x0y0 + if xFractional > 0 and x0y0 != x1y0: topMix = lerp(x0y0, x1y0, xFractional) + + var bottomMix = x0y1 + if xFractional > 0 and x0y1 != x1y1: bottomMix = lerp(x0y1, x1y1, xFractional) - lerp(topMix, bottomMix, yFractional) + if yFractional != 0 and topMix != bottomMix: + lerp(topMix, bottomMix, yFractional) + else: + topMix proc drawCorrect( a, b: Image | Mask, mat = mat3(), tiled = false, blendMode = bmNormal @@ -678,9 +685,11 @@ proc drawUber(a, b: Image | Mask, mat = mat3(), blendMode = bmNormal) = zeroMem(a.data[a.dataIndex(0, y)].addr, 4 * xMin) if smooth: + var srcPos = p + dx * xMin.float32 + dy * y.float32 + srcPos = vec2(max(0, srcPos.x), max(0, srcPos.y)) + for x in xMin ..< xMax: let - srcPos = p + dx * x.float32 + dy * y.float32 xFloat = srcPos.x - h yFloat = srcPos.y - h when type(a) is Image: @@ -701,6 +710,9 @@ proc drawUber(a, b: Image | Mask, mat = mat3(), blendMode = bmNormal) = else: # b is a Mask let sample = b.getValueSmooth(xFloat, yFloat) a.setValueUnsafe(x, y, masker(backdrop, sample)) + + srcPos += dx + else: var x = xMin when defined(amd64) and not defined(pixieNoSimd): diff --git a/src/pixie/masks.nim b/src/pixie/masks.nim index e81d16a..fdcaa01 100644 --- a/src/pixie/masks.nim +++ b/src/pixie/masks.nim @@ -173,10 +173,18 @@ proc getValueSmooth*(mask: Mask, x, y: float32): uint8 = x0y1 = mask[x0, y1] x1y1 = mask[x1, y1] + var topMix = x0y0 + if xFractional > 0 and x0y0 != x1y0: topMix = lerp(x0y0, x1y0, xFractional) + + var bottomMix = x0y1 + if xFractional > 0 and x0y1 != x1y1: bottomMix = lerp(x0y1, x1y1, xFractional) - lerp(topMix, bottomMix, yFractional) + if yFractional != 0 and topMix != bottomMix: + lerp(topMix, bottomMix, yFractional) + else: + topMix proc spread*(mask: Mask, spread: float32) = ## Grows the mask by spread. diff --git a/src/pixie/paths.nim b/src/pixie/paths.nim index c911417..ba04f0c 100644 --- a/src/pixie/paths.nim +++ b/src/pixie/paths.nim @@ -1230,6 +1230,8 @@ proc computeCoverages( proc clearUnsafe(target: Image | Mask, startX, startY, toX, toY: int) = ## Clears data from [start, to). + if startX == target.width or startY == target.height: + return let start = target.dataIndex(startX, startY) len = target.dataIndex(toX, toY) - start diff --git a/tests/benchmark_images_draw.nim b/tests/benchmark_images_draw.nim index bf4a925..3ae2443 100644 --- a/tests/benchmark_images_draw.nim +++ b/tests/benchmark_images_draw.nim @@ -40,7 +40,40 @@ block: a.fill(rgba(255, 0, 0, 255)) b.fill(rgba(0, 255, 0, 255)) - timeIt "draw big-on-bigger Smooth bmNormal": + timeIt "draw [scale 0.5]": + a.draw(b, translate(vec2(25, 25)) * scale(vec2(0.5, 0.5)), bmNormal) + keep(b) + +block: + let + a = newImage(1000, 1000) + b = newImage(500, 500) + a.fill(rgba(255, 0, 0, 255)) + b.fill(rgba(0, 255, 0, 255)) + + timeIt "draw Smooth [x translate]": + a.draw(b, translate(vec2(25.2, 0)), bmNormal) + keep(b) + +block: + let + a = newImage(1000, 1000) + b = newImage(500, 500) + a.fill(rgba(255, 0, 0, 255)) + b.fill(rgba(0, 255, 0, 255)) + + timeIt "draw Smooth [y translate]": + a.draw(b, translate(vec2(0, 25.2)), bmNormal) + keep(b) + +block: + let + a = newImage(1000, 1000) + b = newImage(500, 500) + a.fill(rgba(255, 0, 0, 255)) + b.fill(rgba(0, 255, 0, 255)) + + timeIt "draw Smooth [x + y translate]": a.draw(b, translate(vec2(25.2, 25.2)), bmNormal) keep(b) @@ -51,8 +84,8 @@ block: a.fill(rgba(255, 0, 0, 255)) b.fill(rgba(0, 255, 0, 255)) - timeIt "draw big-on-bigger bmNormal scale(0.5)": - a.draw(b, translate(vec2(25, 25)) * scale(vec2(0.5, 0.5)), bmNormal) + timeIt "draw Smooth [rotate 45 deg]": + a.draw(b, translate(vec2(0, 500)) * rotate(toRadians(45)), bmNormal) keep(b) block: diff --git a/tests/fonts/diffs/basic10.png b/tests/fonts/diffs/basic10.png new file mode 100644 index 0000000..99e1968 Binary files /dev/null and b/tests/fonts/diffs/basic10.png differ diff --git a/tests/fonts/diffs/huge1.png b/tests/fonts/diffs/huge1.png index 6d1992d..a036ba6 100644 Binary files a/tests/fonts/diffs/huge1.png and b/tests/fonts/diffs/huge1.png differ diff --git a/tests/fonts/diffs/huge1_nokern.png b/tests/fonts/diffs/huge1_nokern.png index b34abf6..ef81d2d 100644 Binary files a/tests/fonts/diffs/huge1_nokern.png and b/tests/fonts/diffs/huge1_nokern.png differ diff --git a/tests/fonts/diffs/huge2.png b/tests/fonts/diffs/huge2.png index 87400d9..9cce532 100644 Binary files a/tests/fonts/diffs/huge2.png and b/tests/fonts/diffs/huge2.png differ diff --git a/tests/fonts/diffs/huge2_nokern.png b/tests/fonts/diffs/huge2_nokern.png index 55e22a7..ba3f8c5 100644 Binary files a/tests/fonts/diffs/huge2_nokern.png and b/tests/fonts/diffs/huge2_nokern.png differ diff --git a/tests/fonts/diffs/huge3.png b/tests/fonts/diffs/huge3.png index 96c3f7f..36eefbd 100644 Binary files a/tests/fonts/diffs/huge3.png and b/tests/fonts/diffs/huge3.png differ diff --git a/tests/fonts/diffs/huge3_nokern.png b/tests/fonts/diffs/huge3_nokern.png index 30c22f5..1103fe0 100644 Binary files a/tests/fonts/diffs/huge3_nokern.png and b/tests/fonts/diffs/huge3_nokern.png differ diff --git a/tests/fonts/diffs/image_fill.png b/tests/fonts/diffs/image_fill.png new file mode 100644 index 0000000..c8ddd62 Binary files /dev/null and b/tests/fonts/diffs/image_fill.png differ diff --git a/tests/fonts/diffs/image_paint_fill.png b/tests/fonts/diffs/image_paint_fill.png new file mode 100644 index 0000000..5561a1c Binary files /dev/null and b/tests/fonts/diffs/image_paint_fill.png differ diff --git a/tests/fonts/diffs/image_stroke.png b/tests/fonts/diffs/image_stroke.png new file mode 100644 index 0000000..5c684a2 Binary files /dev/null and b/tests/fonts/diffs/image_stroke.png differ diff --git a/tests/fonts/diffs/mask_fill.png b/tests/fonts/diffs/mask_fill.png new file mode 100644 index 0000000..bbb4660 Binary files /dev/null and b/tests/fonts/diffs/mask_fill.png differ diff --git a/tests/fonts/diffs/mask_stroke.png b/tests/fonts/diffs/mask_stroke.png new file mode 100644 index 0000000..fd3da2b Binary files /dev/null and b/tests/fonts/diffs/mask_stroke.png differ diff --git a/tests/fonts/diffs/pairs1.png b/tests/fonts/diffs/pairs1.png index 14a7a6b..239955f 100644 Binary files a/tests/fonts/diffs/pairs1.png and b/tests/fonts/diffs/pairs1.png differ diff --git a/tests/fonts/diffs/pairs2.png b/tests/fonts/diffs/pairs2.png index 0fd4461..b6ee00a 100644 Binary files a/tests/fonts/diffs/pairs2.png and b/tests/fonts/diffs/pairs2.png differ diff --git a/tests/fonts/diffs/pairs3.png b/tests/fonts/diffs/pairs3.png index 6af8d07..c38f7ef 100644 Binary files a/tests/fonts/diffs/pairs3.png and b/tests/fonts/diffs/pairs3.png differ diff --git a/tests/fonts/diffs/selection_rects1.png b/tests/fonts/diffs/selection_rects1.png index 63130fc..9a2a151 100644 Binary files a/tests/fonts/diffs/selection_rects1.png and b/tests/fonts/diffs/selection_rects1.png differ diff --git a/tests/fonts/diffs/selection_rects2.png b/tests/fonts/diffs/selection_rects2.png index 5adf0a9..31836af 100644 Binary files a/tests/fonts/diffs/selection_rects2.png and b/tests/fonts/diffs/selection_rects2.png differ diff --git a/tests/fonts/diffs/selection_rects3.png b/tests/fonts/diffs/selection_rects3.png index 8349b78..34e30f1 100644 Binary files a/tests/fonts/diffs/selection_rects3.png and b/tests/fonts/diffs/selection_rects3.png differ diff --git a/tests/fonts/image_paint_fill.png b/tests/fonts/image_paint_fill.png deleted file mode 100644 index 32016d9..0000000 Binary files a/tests/fonts/image_paint_fill.png and /dev/null differ diff --git a/tests/fonts/mask_fill.png b/tests/fonts/mask_fill.png deleted file mode 100644 index 283b7e4..0000000 Binary files a/tests/fonts/mask_fill.png and /dev/null differ diff --git a/tests/fonts/mask_stroke.png b/tests/fonts/mask_stroke.png deleted file mode 100644 index 01b15c2..0000000 Binary files a/tests/fonts/mask_stroke.png and /dev/null differ diff --git a/tests/fonts/masters/basic10.png b/tests/fonts/masters/basic10.png new file mode 100644 index 0000000..675269b Binary files /dev/null and b/tests/fonts/masters/basic10.png differ diff --git a/tests/fonts/masters/huge1.png b/tests/fonts/masters/huge1.png index fb83009..dc2eab9 100644 Binary files a/tests/fonts/masters/huge1.png and b/tests/fonts/masters/huge1.png differ diff --git a/tests/fonts/masters/huge1_nokern.png b/tests/fonts/masters/huge1_nokern.png index a6200f5..0e2f82a 100644 Binary files a/tests/fonts/masters/huge1_nokern.png and b/tests/fonts/masters/huge1_nokern.png differ diff --git a/tests/fonts/masters/huge2.png b/tests/fonts/masters/huge2.png index 5f5ae91..285a597 100644 Binary files a/tests/fonts/masters/huge2.png and b/tests/fonts/masters/huge2.png differ diff --git a/tests/fonts/masters/huge2_nokern.png b/tests/fonts/masters/huge2_nokern.png index aa15e3b..5e0dcbe 100644 Binary files a/tests/fonts/masters/huge2_nokern.png and b/tests/fonts/masters/huge2_nokern.png differ diff --git a/tests/fonts/masters/huge3.png b/tests/fonts/masters/huge3.png index a646cae..51e3936 100644 Binary files a/tests/fonts/masters/huge3.png and b/tests/fonts/masters/huge3.png differ diff --git a/tests/fonts/masters/huge3_nokern.png b/tests/fonts/masters/huge3_nokern.png index 3eb6d2a..0ddb83a 100644 Binary files a/tests/fonts/masters/huge3_nokern.png and b/tests/fonts/masters/huge3_nokern.png differ diff --git a/tests/fonts/masters/image_fill.png b/tests/fonts/masters/image_fill.png new file mode 100644 index 0000000..8e80552 Binary files /dev/null and b/tests/fonts/masters/image_fill.png differ diff --git a/tests/fonts/masters/image_paint_fill.png b/tests/fonts/masters/image_paint_fill.png new file mode 100644 index 0000000..3ed63c8 Binary files /dev/null and b/tests/fonts/masters/image_paint_fill.png differ diff --git a/tests/fonts/masters/image_stroke.png b/tests/fonts/masters/image_stroke.png new file mode 100644 index 0000000..58d29a1 Binary files /dev/null and b/tests/fonts/masters/image_stroke.png differ diff --git a/tests/fonts/masters/mask_fill.png b/tests/fonts/masters/mask_fill.png new file mode 100644 index 0000000..670bf7e Binary files /dev/null and b/tests/fonts/masters/mask_fill.png differ diff --git a/tests/fonts/masters/mask_stroke.png b/tests/fonts/masters/mask_stroke.png new file mode 100644 index 0000000..16b78f5 Binary files /dev/null and b/tests/fonts/masters/mask_stroke.png differ diff --git a/tests/fonts/masters/pairs1.png b/tests/fonts/masters/pairs1.png index c8bcde9..6b15f8c 100644 Binary files a/tests/fonts/masters/pairs1.png and b/tests/fonts/masters/pairs1.png differ diff --git a/tests/fonts/masters/pairs2.png b/tests/fonts/masters/pairs2.png index 71bc2e5..fce4750 100644 Binary files a/tests/fonts/masters/pairs2.png and b/tests/fonts/masters/pairs2.png differ diff --git a/tests/fonts/masters/pairs3.png b/tests/fonts/masters/pairs3.png index 680ba3f..0caed7d 100644 Binary files a/tests/fonts/masters/pairs3.png and b/tests/fonts/masters/pairs3.png differ diff --git a/tests/fonts/masters/selection_rects1.png b/tests/fonts/masters/selection_rects1.png index a5fdfef..8826a0f 100644 Binary files a/tests/fonts/masters/selection_rects1.png and b/tests/fonts/masters/selection_rects1.png differ diff --git a/tests/fonts/masters/selection_rects2.png b/tests/fonts/masters/selection_rects2.png index 7ff88fd..4948232 100644 Binary files a/tests/fonts/masters/selection_rects2.png and b/tests/fonts/masters/selection_rects2.png differ diff --git a/tests/fonts/masters/selection_rects3.png b/tests/fonts/masters/selection_rects3.png index ed80e33..bc07354 100644 Binary files a/tests/fonts/masters/selection_rects3.png and b/tests/fonts/masters/selection_rects3.png differ diff --git a/tests/fonts/rendered/basic10.png b/tests/fonts/rendered/basic10.png new file mode 100644 index 0000000..49f8753 Binary files /dev/null and b/tests/fonts/rendered/basic10.png differ diff --git a/tests/fonts/rendered/huge1.png b/tests/fonts/rendered/huge1.png index 35937d6..f771b41 100644 Binary files a/tests/fonts/rendered/huge1.png and b/tests/fonts/rendered/huge1.png differ diff --git a/tests/fonts/rendered/huge1_nokern.png b/tests/fonts/rendered/huge1_nokern.png index 5abcf43..3c40854 100644 Binary files a/tests/fonts/rendered/huge1_nokern.png and b/tests/fonts/rendered/huge1_nokern.png differ diff --git a/tests/fonts/rendered/huge2.png b/tests/fonts/rendered/huge2.png index a5c96f5..6dc46ee 100644 Binary files a/tests/fonts/rendered/huge2.png and b/tests/fonts/rendered/huge2.png differ diff --git a/tests/fonts/rendered/huge2_nokern.png b/tests/fonts/rendered/huge2_nokern.png index 9586c13..513bfe7 100644 Binary files a/tests/fonts/rendered/huge2_nokern.png and b/tests/fonts/rendered/huge2_nokern.png differ diff --git a/tests/fonts/rendered/huge3.png b/tests/fonts/rendered/huge3.png index 6559e33..8cfbebb 100644 Binary files a/tests/fonts/rendered/huge3.png and b/tests/fonts/rendered/huge3.png differ diff --git a/tests/fonts/rendered/huge3_nokern.png b/tests/fonts/rendered/huge3_nokern.png index f4d6e7a..30cf509 100644 Binary files a/tests/fonts/rendered/huge3_nokern.png and b/tests/fonts/rendered/huge3_nokern.png differ diff --git a/tests/fonts/image_fill.png b/tests/fonts/rendered/image_fill.png similarity index 100% rename from tests/fonts/image_fill.png rename to tests/fonts/rendered/image_fill.png diff --git a/tests/fonts/rendered/image_paint_fill.png b/tests/fonts/rendered/image_paint_fill.png new file mode 100644 index 0000000..63d8515 Binary files /dev/null and b/tests/fonts/rendered/image_paint_fill.png differ diff --git a/tests/fonts/image_stroke.png b/tests/fonts/rendered/image_stroke.png similarity index 100% rename from tests/fonts/image_stroke.png rename to tests/fonts/rendered/image_stroke.png diff --git a/tests/fonts/rendered/mask_fill.png b/tests/fonts/rendered/mask_fill.png new file mode 100644 index 0000000..0079fbf Binary files /dev/null and b/tests/fonts/rendered/mask_fill.png differ diff --git a/tests/fonts/rendered/mask_stroke.png b/tests/fonts/rendered/mask_stroke.png new file mode 100644 index 0000000..17bfc7d Binary files /dev/null and b/tests/fonts/rendered/mask_stroke.png differ diff --git a/tests/fonts/rendered/pairs1.png b/tests/fonts/rendered/pairs1.png index c6ce3e4..41f37f4 100644 Binary files a/tests/fonts/rendered/pairs1.png and b/tests/fonts/rendered/pairs1.png differ diff --git a/tests/fonts/rendered/pairs2.png b/tests/fonts/rendered/pairs2.png index c3c534f..2b79a52 100644 Binary files a/tests/fonts/rendered/pairs2.png and b/tests/fonts/rendered/pairs2.png differ diff --git a/tests/fonts/rendered/pairs3.png b/tests/fonts/rendered/pairs3.png index f77bfe3..059920d 100644 Binary files a/tests/fonts/rendered/pairs3.png and b/tests/fonts/rendered/pairs3.png differ diff --git a/tests/fonts/rendered/selection_rects1.png b/tests/fonts/rendered/selection_rects1.png index b8ad7cb..44ffe5b 100644 Binary files a/tests/fonts/rendered/selection_rects1.png and b/tests/fonts/rendered/selection_rects1.png differ diff --git a/tests/fonts/rendered/selection_rects2.png b/tests/fonts/rendered/selection_rects2.png index 2beafc5..74fc315 100644 Binary files a/tests/fonts/rendered/selection_rects2.png and b/tests/fonts/rendered/selection_rects2.png differ diff --git a/tests/fonts/rendered/selection_rects3.png b/tests/fonts/rendered/selection_rects3.png index 1f58ba3..06ff77e 100644 Binary files a/tests/fonts/rendered/selection_rects3.png and b/tests/fonts/rendered/selection_rects3.png differ diff --git a/tests/images/svg/circle01.svg b/tests/images/svg/circle01.svg index bf71ce9..539560f 100644 --- a/tests/images/svg/circle01.svg +++ b/tests/images/svg/circle01.svg @@ -1,5 +1,5 @@ - Example circle01 - circle filled with red and stroked with blue diff --git a/tests/images/svg/dashes.png b/tests/images/svg/dashes.png deleted file mode 100644 index 204257b..0000000 Binary files a/tests/images/svg/dashes.png and /dev/null differ diff --git a/tests/images/svg/dashes.svg b/tests/images/svg/dashes.svg index cb340e7..6509da1 100644 --- a/tests/images/svg/dashes.svg +++ b/tests/images/svg/dashes.svg @@ -1,20 +1,22 @@ - + + + - + - + - + - + - + diff --git a/tests/images/svg/diffs/Ghostscript_Tiger.png b/tests/images/svg/diffs/Ghostscript_Tiger.png new file mode 100644 index 0000000..fdb4006 Binary files /dev/null and b/tests/images/svg/diffs/Ghostscript_Tiger.png differ diff --git a/tests/images/svg/diffs/circle01.png b/tests/images/svg/diffs/circle01.png new file mode 100644 index 0000000..37ebc3f Binary files /dev/null and b/tests/images/svg/diffs/circle01.png differ diff --git a/tests/images/svg/diffs/dashes.png b/tests/images/svg/diffs/dashes.png new file mode 100644 index 0000000..dadadf9 Binary files /dev/null and b/tests/images/svg/diffs/dashes.png differ diff --git a/tests/images/svg/diffs/ellipse01.png b/tests/images/svg/diffs/ellipse01.png new file mode 100644 index 0000000..74f9e9e Binary files /dev/null and b/tests/images/svg/diffs/ellipse01.png differ diff --git a/tests/images/svg/diffs/line01.png b/tests/images/svg/diffs/line01.png new file mode 100644 index 0000000..40abc2a Binary files /dev/null and b/tests/images/svg/diffs/line01.png differ diff --git a/tests/images/svg/diffs/miterlimit.png b/tests/images/svg/diffs/miterlimit.png new file mode 100644 index 0000000..e680a74 Binary files /dev/null and b/tests/images/svg/diffs/miterlimit.png differ diff --git a/tests/images/svg/diffs/polygon01.png b/tests/images/svg/diffs/polygon01.png new file mode 100644 index 0000000..3c6543e Binary files /dev/null and b/tests/images/svg/diffs/polygon01.png differ diff --git a/tests/images/svg/diffs/polyline01.png b/tests/images/svg/diffs/polyline01.png new file mode 100644 index 0000000..95a4575 Binary files /dev/null and b/tests/images/svg/diffs/polyline01.png differ diff --git a/tests/images/svg/diffs/quad01.png b/tests/images/svg/diffs/quad01.png new file mode 100644 index 0000000..d515fd4 Binary files /dev/null and b/tests/images/svg/diffs/quad01.png differ diff --git a/tests/images/svg/diffs/rect01.png b/tests/images/svg/diffs/rect01.png new file mode 100644 index 0000000..95a4575 Binary files /dev/null and b/tests/images/svg/diffs/rect01.png differ diff --git a/tests/images/svg/diffs/rect02.png b/tests/images/svg/diffs/rect02.png new file mode 100644 index 0000000..601ef6b Binary files /dev/null and b/tests/images/svg/diffs/rect02.png differ diff --git a/tests/images/svg/diffs/scale.png b/tests/images/svg/diffs/scale.png new file mode 100644 index 0000000..5a8faeb Binary files /dev/null and b/tests/images/svg/diffs/scale.png differ diff --git a/tests/images/svg/diffs/triangle01.png b/tests/images/svg/diffs/triangle01.png new file mode 100644 index 0000000..5a2af5e Binary files /dev/null and b/tests/images/svg/diffs/triangle01.png differ diff --git a/tests/images/svg/ellipse01.svg b/tests/images/svg/ellipse01.svg index 8403ca4..efa5902 100644 --- a/tests/images/svg/ellipse01.svg +++ b/tests/images/svg/ellipse01.svg @@ -1,5 +1,5 @@ - Example ellipse01 - examples of ellipses diff --git a/tests/images/svg/line01.svg b/tests/images/svg/line01.svg index bb1d2bf..a5e791c 100644 --- a/tests/images/svg/line01.svg +++ b/tests/images/svg/line01.svg @@ -1,5 +1,5 @@ - Example line01 - lines expressed in user coordinates diff --git a/tests/images/svg/masters/Ghostscript_Tiger.png b/tests/images/svg/masters/Ghostscript_Tiger.png new file mode 100644 index 0000000..a90a620 Binary files /dev/null and b/tests/images/svg/masters/Ghostscript_Tiger.png differ diff --git a/tests/images/svg/masters/circle01.png b/tests/images/svg/masters/circle01.png new file mode 100644 index 0000000..78a27d2 Binary files /dev/null and b/tests/images/svg/masters/circle01.png differ diff --git a/tests/images/svg/masters/dashes.png b/tests/images/svg/masters/dashes.png new file mode 100644 index 0000000..c16372e Binary files /dev/null and b/tests/images/svg/masters/dashes.png differ diff --git a/tests/images/svg/masters/ellipse01.png b/tests/images/svg/masters/ellipse01.png new file mode 100644 index 0000000..8d5a3cb Binary files /dev/null and b/tests/images/svg/masters/ellipse01.png differ diff --git a/tests/images/svg/masters/line01.png b/tests/images/svg/masters/line01.png new file mode 100644 index 0000000..76775fa Binary files /dev/null and b/tests/images/svg/masters/line01.png differ diff --git a/tests/images/svg/masters/miterlimit.png b/tests/images/svg/masters/miterlimit.png new file mode 100644 index 0000000..c0492d4 Binary files /dev/null and b/tests/images/svg/masters/miterlimit.png differ diff --git a/tests/images/svg/masters/polygon01.png b/tests/images/svg/masters/polygon01.png new file mode 100644 index 0000000..7184dcf Binary files /dev/null and b/tests/images/svg/masters/polygon01.png differ diff --git a/tests/images/svg/masters/polyline01.png b/tests/images/svg/masters/polyline01.png new file mode 100644 index 0000000..704f1e1 Binary files /dev/null and b/tests/images/svg/masters/polyline01.png differ diff --git a/tests/images/svg/masters/quad01.png b/tests/images/svg/masters/quad01.png new file mode 100644 index 0000000..6a52ce0 Binary files /dev/null and b/tests/images/svg/masters/quad01.png differ diff --git a/tests/images/svg/masters/rect01.png b/tests/images/svg/masters/rect01.png new file mode 100644 index 0000000..56dc90c Binary files /dev/null and b/tests/images/svg/masters/rect01.png differ diff --git a/tests/images/svg/masters/rect02.png b/tests/images/svg/masters/rect02.png new file mode 100644 index 0000000..3b0fec2 Binary files /dev/null and b/tests/images/svg/masters/rect02.png differ diff --git a/tests/images/svg/masters/scale.png b/tests/images/svg/masters/scale.png new file mode 100644 index 0000000..debd4eb Binary files /dev/null and b/tests/images/svg/masters/scale.png differ diff --git a/tests/images/svg/masters/triangle01.png b/tests/images/svg/masters/triangle01.png new file mode 100644 index 0000000..53a03f1 Binary files /dev/null and b/tests/images/svg/masters/triangle01.png differ diff --git a/tests/images/svg/miterlimit.png b/tests/images/svg/miterlimit.png deleted file mode 100644 index 75da14b..0000000 Binary files a/tests/images/svg/miterlimit.png and /dev/null differ diff --git a/tests/images/svg/miterlimit.svg b/tests/images/svg/miterlimit.svg index 82b9a32..fe14469 100644 --- a/tests/images/svg/miterlimit.svg +++ b/tests/images/svg/miterlimit.svg @@ -1,27 +1,24 @@ - + + + - + - + - - - - + diff --git a/tests/images/svg/polygon01.svg b/tests/images/svg/polygon01.svg index 900cf65..e34e5eb 100644 --- a/tests/images/svg/polygon01.svg +++ b/tests/images/svg/polygon01.svg @@ -1,5 +1,5 @@ - Example polygon01 - star and hexagon diff --git a/tests/images/svg/polyline01.svg b/tests/images/svg/polyline01.svg index 9ac958d..072665c 100644 --- a/tests/images/svg/polyline01.svg +++ b/tests/images/svg/polyline01.svg @@ -1,5 +1,5 @@ - Example polyline01 - increasingly larger bars diff --git a/tests/images/svg/quad01.svg b/tests/images/svg/quad01.svg index 0f30020..4e76dec 100644 --- a/tests/images/svg/quad01.svg +++ b/tests/images/svg/quad01.svg @@ -1,5 +1,5 @@ - Example quad01 - quadratic Bézier commands in path data Picture showing a "Q" a "T" command, diff --git a/tests/images/svg/rect01.svg b/tests/images/svg/rect01.svg index d61727e..dda4010 100644 --- a/tests/images/svg/rect01.svg +++ b/tests/images/svg/rect01.svg @@ -1,5 +1,5 @@ - Example rect01 - rectangle with sharp corners diff --git a/tests/images/svg/rect02.svg b/tests/images/svg/rect02.svg index b943ff4..63f6b18 100644 --- a/tests/images/svg/rect02.svg +++ b/tests/images/svg/rect02.svg @@ -1,5 +1,5 @@ - Example rect02 - rounded rectangles diff --git a/tests/images/svg/Ghostscript_Tiger.png b/tests/images/svg/rendered/Ghostscript_Tiger.png similarity index 100% rename from tests/images/svg/Ghostscript_Tiger.png rename to tests/images/svg/rendered/Ghostscript_Tiger.png diff --git a/tests/images/svg/circle01.png b/tests/images/svg/rendered/circle01.png similarity index 100% rename from tests/images/svg/circle01.png rename to tests/images/svg/rendered/circle01.png diff --git a/tests/images/svg/rendered/dashes.png b/tests/images/svg/rendered/dashes.png new file mode 100644 index 0000000..53d22e8 Binary files /dev/null and b/tests/images/svg/rendered/dashes.png differ diff --git a/tests/images/svg/ellipse01.png b/tests/images/svg/rendered/ellipse01.png similarity index 100% rename from tests/images/svg/ellipse01.png rename to tests/images/svg/rendered/ellipse01.png diff --git a/tests/images/svg/line01.png b/tests/images/svg/rendered/line01.png similarity index 100% rename from tests/images/svg/line01.png rename to tests/images/svg/rendered/line01.png diff --git a/tests/images/svg/rendered/miterlimit.png b/tests/images/svg/rendered/miterlimit.png new file mode 100644 index 0000000..81195da Binary files /dev/null and b/tests/images/svg/rendered/miterlimit.png differ diff --git a/tests/images/svg/polygon01.png b/tests/images/svg/rendered/polygon01.png similarity index 100% rename from tests/images/svg/polygon01.png rename to tests/images/svg/rendered/polygon01.png diff --git a/tests/images/svg/polyline01.png b/tests/images/svg/rendered/polyline01.png similarity index 100% rename from tests/images/svg/polyline01.png rename to tests/images/svg/rendered/polyline01.png diff --git a/tests/images/svg/quad01.png b/tests/images/svg/rendered/quad01.png similarity index 100% rename from tests/images/svg/quad01.png rename to tests/images/svg/rendered/quad01.png diff --git a/tests/images/svg/rect01.png b/tests/images/svg/rendered/rect01.png similarity index 100% rename from tests/images/svg/rect01.png rename to tests/images/svg/rendered/rect01.png diff --git a/tests/images/svg/rect02.png b/tests/images/svg/rendered/rect02.png similarity index 100% rename from tests/images/svg/rect02.png rename to tests/images/svg/rendered/rect02.png diff --git a/tests/images/svg/scale.png b/tests/images/svg/rendered/scale.png similarity index 100% rename from tests/images/svg/scale.png rename to tests/images/svg/rendered/scale.png diff --git a/tests/images/svg/triangle01.png b/tests/images/svg/rendered/triangle01.png similarity index 100% rename from tests/images/svg/triangle01.png rename to tests/images/svg/rendered/triangle01.png diff --git a/tests/images/svg/triangle01.svg b/tests/images/svg/triangle01.svg index ef65f9b..db30992 100644 --- a/tests/images/svg/triangle01.svg +++ b/tests/images/svg/triangle01.svg @@ -1,5 +1,5 @@ - Example triangle01- simple example of a 'path' A path that draws a triangle diff --git a/tests/test_fonts.nim b/tests/test_fonts.nim index e50214f..df574dc 100644 --- a/tests/test_fonts.nim +++ b/tests/test_fonts.nim @@ -21,7 +21,8 @@ block: let image = newImage(200, 100) image.fill(rgba(255, 255, 255, 255)) image.fillText(font, "fill") - image.writeFile("tests/fonts/image_fill.png") + + doDiff(image, "image_fill") block: var font = readFont("tests/fonts/Roboto-Regular_1.ttf") @@ -29,56 +30,61 @@ block: let image = newImage(200, 100) image.fill(rgba(255, 255, 255, 255)) image.strokeText(font, "stroke") - image.writeFile("tests/fonts/image_stroke.png") + + doDiff(image, "image_stroke") block: var font = readFont("tests/fonts/Roboto-Regular_1.ttf") font.size = 64 let mask = newMask(200, 100) mask.fillText(font, "fill") - writeFile("tests/fonts/mask_fill.png", mask.encodePng()) + + doDiff(newImage(mask), "mask_fill") block: var font = readFont("tests/fonts/Roboto-Regular_1.ttf") font.size = 64 let mask = newMask(200, 100) mask.strokeText(font, "stroke") - writeFile("tests/fonts/mask_stroke.png", mask.encodePng()) + + doDiff(newImage(mask), "mask_stroke") block: - var font = readFont("tests/fonts/Changa-Bold.svg") - font.size = 48 - let mask = newMask(200, 100) - mask.fillText(font, "Changa") - writeFile("tests/fonts/svg_changa.png", mask.encodePng()) + # SVG Fonts have no masters + block: + var font = readFont("tests/fonts/Changa-Bold.svg") + font.size = 48 + let mask = newMask(200, 100) + mask.fillText(font, "Changa") + writeFile("tests/fonts/svg_changa.png", mask.encodePng()) -block: - var font = readFont("tests/fonts/DejaVuSans.svg") - font.size = 48 - let mask = newMask(200, 100) - mask.fillText(font, "Deja vu ") - writeFile("tests/fonts/svg_dejavu.png", mask.encodePng()) + block: + var font = readFont("tests/fonts/DejaVuSans.svg") + font.size = 48 + let mask = newMask(200, 100) + mask.fillText(font, "Deja vu ") + writeFile("tests/fonts/svg_dejavu.png", mask.encodePng()) -block: - var font = readFont("tests/fonts/IBMPlexSans-Regular.svg") - font.size = 48 - let mask = newMask(200, 100) - mask.fillText(font, "IBM ") - writeFile("tests/fonts/svg_ibm.png", mask.encodePng()) + block: + var font = readFont("tests/fonts/IBMPlexSans-Regular.svg") + font.size = 48 + let mask = newMask(200, 100) + mask.fillText(font, "IBM ") + writeFile("tests/fonts/svg_ibm.png", mask.encodePng()) -block: - var font = readFont("tests/fonts/Moon-Bold.svg") - font.size = 48 - let mask = newMask(200, 100) - mask.fillText(font, "Moon ") - writeFile("tests/fonts/svg_moon.png", mask.encodePng()) + block: + var font = readFont("tests/fonts/Moon-Bold.svg") + font.size = 48 + let mask = newMask(200, 100) + mask.fillText(font, "Moon ") + writeFile("tests/fonts/svg_moon.png", mask.encodePng()) -block: - var font = readFont("tests/fonts/Ubuntu.svg") - font.size = 48 - let mask = newMask(200, 100) - mask.fillText(font, "Ubuntu ") - writeFile("tests/fonts/svg_ubuntu.png", mask.encodePng()) + block: + var font = readFont("tests/fonts/Ubuntu.svg") + font.size = 48 + let mask = newMask(200, 100) + mask.fillText(font, "Ubuntu ") + writeFile("tests/fonts/svg_ubuntu.png", mask.encodePng()) block: var font = readFont("tests/fonts/Roboto-Regular_1.ttf") @@ -180,6 +186,21 @@ block: doDiff(image, "basic9") +block: + var font = readFont("tests/fonts/Roboto-Regular_1.ttf") + font.size = 24 + + let image = newImage(200, 100) + image.fill(rgba(255, 255, 255, 255)) + image.fillText( + font, + "a b c d e f g h i j k l m n o p", + bounds = vec2(200, 0), + hAlign = haRight + ) + + doDiff(image, "basic10") + const paragraph = "ShehadcometotheconclusionthatyoucouldtellalotaboutapersonbytheirearsThewaytheystuckoutandthesizeoftheearlobescouldgiveyou" paragraph_2 = "She had come to the conclusion that you could tell a lot about a person by their ears The way they stuck out and the size of the earlobes could give you wonderful insights into the person Of course she couldnt scientifically prove any of this but that didnt matter to her Before anything else she would size up the ears of the person she was talking to Shes asked the question so many times that she barely listened to the answers anymore The answers were always the same Well not exactly the same but the same in a general sense A more accurate description was the answers never surprised her" @@ -363,9 +384,9 @@ block: block: var font = readFont("tests/fonts/Roboto-Regular_1.ttf") - font.size = 200 + font.size = 100 - let image = newImage(2800, 400) + let image = newImage(1400, 200) image.fill(rgba(255, 255, 255, 255)) image.fillText( font, @@ -377,10 +398,10 @@ block: block: var font = readFont("tests/fonts/Roboto-Regular_1.ttf") - font.size = 200 + font.size = 100 font.noKerningAdjustments = true - let image = newImage(2800, 400) + let image = newImage(1400, 200) image.fill(rgba(255, 255, 255, 255)) image.fillText( font, @@ -392,9 +413,9 @@ block: block: var font = readFont("tests/fonts/Ubuntu-Regular_1.ttf") - font.size = 200 + font.size = 100 - let image = newImage(2800, 400) + let image = newImage(1400, 200) image.fill(rgba(255, 255, 255, 255)) image.fillText( font, @@ -406,10 +427,10 @@ block: block: var font = readFont("tests/fonts/Ubuntu-Regular_1.ttf") - font.size = 200 + font.size = 100 font.noKerningAdjustments = true - let image = newImage(2800, 400) + let image = newImage(1400, 200) image.fill(rgba(255, 255, 255, 255)) image.fillText( font, @@ -421,9 +442,9 @@ block: block: var font = readFont("tests/fonts/Roboto-Regular_1.ttf") - font.size = 200 + font.size = 100 - let image = newImage(2800, 400) + let image = newImage(1400, 200) image.fill(rgba(255, 255, 255, 255)) image.fillText( font, @@ -435,10 +456,10 @@ block: block: var font = readFont("tests/fonts/Roboto-Regular_1.ttf") - font.size = 200 + font.size = 100 font.noKerningAdjustments = true - let image = newImage(2800, 400) + let image = newImage(1400, 200) image.fill(rgba(255, 255, 255, 255)) image.fillText( font, @@ -450,9 +471,9 @@ block: block: var font = readFont("tests/fonts/Roboto-Regular_1.ttf") - font.size = 100 + font.size = 50 - let image = newImage(2800, 200) + let image = newImage(1400, 100) image.fill(rgba(255, 255, 255, 255)) image.fillText( font, @@ -464,9 +485,9 @@ block: block: var font = readFont("tests/fonts/Ubuntu-Regular_1.ttf") - font.size = 100 + font.size = 50 - let image = newImage(2800, 200) + let image = newImage(1400, 100) image.fill(rgba(255, 255, 255, 255)) image.fillText( font, @@ -478,9 +499,9 @@ block: block: var font = readFont("tests/fonts/IBMPlexSans-Regular_2.ttf") - font.size = 100 + font.size = 50 - let image = newImage(2800, 200) + let image = newImage(1400, 100) image.fill(rgba(255, 255, 255, 255)) image.fillText( font, @@ -621,14 +642,15 @@ block: ], gradientStops: @[ ColorStop(color: rgba(255, 0, 0, 255), position: 0), - ColorStop(color: rgba(255, 0, 0, 40), position: 1.0), + ColorStop(color: rgba(255, 0, 0, 127), position: 1.0), ] ) let image = newImage(100, 100) + image.fill(rgba(255, 255, 255, 255)) image.fillText(font, "Text") - image.writeFile("tests/fonts/image_paint_fill.png") + doDiff(image, "image_paint_fill") block: var font1 = readFont("tests/fonts/Roboto-Regular_1.ttf") @@ -656,7 +678,7 @@ block: doDiff(image, "spans1") let ctx = newContext(image) - ctx.fillStyle = rgba(128, 128, 128, 128) + ctx.fillStyle = rgba(127, 127, 127, 127) for i, rect in arrangement.selectionRects: ctx.fillRect(rect) @@ -688,7 +710,7 @@ block: doDiff(image, "spans2") let ctx = newContext(image) - ctx.fillStyle = rgba(128, 128, 128, 128) + ctx.fillStyle = rgba(127, 127, 127, 127) for i, rect in arrangement.selectionRects: ctx.fillRect(rect) @@ -702,13 +724,13 @@ block: image.fill(rgba(255, 255, 255, 255)) let arrangement = typeset( - font, "Wrapping text to new line", bounds = image.wh + font, "Wrapping text to the next line", bounds = image.wh ) image.fillText(arrangement) let ctx = newContext(image) - ctx.fillStyle = rgba(128, 128, 128, 128) + ctx.fillStyle = rgba(127, 127, 127, 127) for i, rect in arrangement.selectionRects: ctx.fillRect(rect) diff --git a/tests/test_svg.nim b/tests/test_svg.nim index ac620aa..d82449a 100644 --- a/tests/test_svg.nim +++ b/tests/test_svg.nim @@ -16,12 +16,13 @@ const files = [ "dashes" ] -for file in files: +proc doDiff(rendered: Image, name: string) = + rendered.writeFile(&"tests/images/svg/rendered/{name}.png") let - original = readFile(&"tests/images/svg/{file}.svg") - image = decodeSvg(original) - gold = readImage(&"tests/images/svg/{file}.png") + master = readImage(&"tests/images/svg/masters/{name}.png") + (diffScore, diffImage) = diff(master, rendered) + echo &"{name} score: {diffScore}" + diffImage.writeFile(&"tests/images/svg/diffs/{name}.png") - let (score, _) = diff(image, gold) - doAssert score < 1 - image.writeFile(&"tests/images/svg/{file}.png") +for file in files: + doDiff(decodeSvg(readFile(&"tests/images/svg/{file}.svg")), file)