From a3c2444339d23d8a408b59cf0c7a34af509373b4 Mon Sep 17 00:00:00 2001 From: Ryan Oldenburg Date: Thu, 20 Jan 2022 20:09:24 -0600 Subject: [PATCH] morepretty --- src/pixie/fileformats/ppm.nim | 3 +- src/pixie/fontformats/opentype.nim | 4 ++- src/pixie/images.nim | 55 +++++++++++++++++++++--------- 3 files changed, 42 insertions(+), 20 deletions(-) diff --git a/src/pixie/fileformats/ppm.nim b/src/pixie/fileformats/ppm.nim index 87099fd..23c849f 100644 --- a/src/pixie/fileformats/ppm.nim +++ b/src/pixie/fileformats/ppm.nim @@ -129,12 +129,11 @@ proc decodePpm*(data: string): Image {.raises: [PixieError].} = failInvalid() result = newImage(header.width, header.height) - result.data = ( + result.data = if header.version == "P3": decodeP3Data(data[header.dataOffset .. ^1], header.maxVal) else: decodeP6Data(data[header.dataOffset .. ^1], header.maxVal) - ) proc encodePpm*(image: Image): string {.raises: [].} = ## Encodes an image into the PPM file format (version P6). diff --git a/src/pixie/fontformats/opentype.nim b/src/pixie/fontformats/opentype.nim index cb9f025..ea169b0 100644 --- a/src/pixie/fontformats/opentype.nim +++ b/src/pixie/fontformats/opentype.nim @@ -2126,7 +2126,9 @@ proc getGlyphId(opentype: OpenType, rune: Rune): uint16 = proc hasGlyph*(opentype: OpenType, rune: Rune): bool = rune in opentype.cmap.runeToGlyphId -proc parseGlyfGlyph(opentype: OpenType, glyphId: uint16): Path {.raises: [PixieError], gcsafe.} +proc parseGlyfGlyph( + opentype: OpenType, glyphId: uint16 +): Path {.raises: [PixieError], gcsafe.} proc parseGlyphPath( buf: string, offset, numberOfContours: int diff --git a/src/pixie/images.nim b/src/pixie/images.nim index c8e7d72..b2183ed 100644 --- a/src/pixie/images.nim +++ b/src/pixie/images.nim @@ -837,27 +837,37 @@ proc drawUber( when type(a) is Image: when type(b) is Image: for q in [0, 4, 8, 12]: - let sourceVec = mm_loadu_si128(b.data[b.dataIndex(sx + q, sy)].addr) - if mm_movemask_epi8(mm_cmpeq_epi8(sourceVec, mm_setzero_si128())) != 0xffff: - if (mm_movemask_epi8(mm_cmpeq_epi8(sourceVec, vec255)) and 0x8888) == 0x8888: + let + sourceVec = mm_loadu_si128(b.data[b.dataIndex(sx + q, sy)].addr) + eqZer0 = mm_cmpeq_epi8(sourceVec, mm_setzero_si128()) + if mm_movemask_epi8(eqZer0) != 0xffff: + let eq255 = mm_cmpeq_epi8(sourceVec, vec255) + if (mm_movemask_epi8(eq255) and 0x8888) == 0x8888: mm_storeu_si128(a.data[a.dataIndex(x + q, y)].addr, sourceVec) else: - let backdropVec = mm_loadu_si128(a.data[a.dataIndex(x + q, y)].addr) + let + backdropIdx = a.dataIndex(x + q, y) + backdropVec = mm_loadu_si128(a.data[backdropIdx].addr) mm_storeu_si128( - a.data[a.dataIndex(x + q, y)].addr, + a.data[backdropIdx].addr, blendNormalInlineSimd(backdropVec, sourceVec) ) else: # b is a Mask var values = mm_loadu_si128(b.data[b.dataIndex(sx, sy)].addr) for q in [0, 4, 8, 12]: - let sourceVec = unpackAlphaValues(values) - if mm_movemask_epi8(mm_cmpeq_epi8(sourceVec, mm_setzero_si128())) != 0xffff: - if (mm_movemask_epi8(mm_cmpeq_epi8(sourceVec, vec255)) and 0x8888) == 0x8888: + let + sourceVec = unpackAlphaValues(values) + eqZer0 = mm_cmpeq_epi8(sourceVec, mm_setzero_si128()) + if mm_movemask_epi8(eqZer0) != 0xffff: + let eq255 = mm_cmpeq_epi8(sourceVec, vec255) + if (mm_movemask_epi8(eq255) and 0x8888) == 0x8888: discard else: - let backdropVec = mm_loadu_si128(a.data[a.dataIndex(x + q, y)].addr) + let + backdropIdx = a.dataIndex(x + q, y) + backdropVec = mm_loadu_si128(a.data[backdropIdx].addr) mm_storeu_si128( - a.data[a.dataIndex(x + q, y)].addr, + a.data[backdropIdx].addr, blendNormalInlineSimd(backdropVec, sourceVec) ) # Shuffle 32 bits off for the next iteration @@ -885,9 +895,14 @@ proc drawUber( when type(a) is Image: when type(b) is Image: for q in [0, 4, 8, 12]: - let sourceVec = mm_loadu_si128(b.data[b.dataIndex(sx + q, sy)].addr) - if mm_movemask_epi8(mm_cmpeq_epi8(sourceVec, mm_setzero_si128())) == 0xffff: - mm_storeu_si128(a.data[a.dataIndex(x + q, y)].addr, mm_setzero_si128()) + let + sourceVec = mm_loadu_si128(b.data[b.dataIndex(sx + q, sy)].addr) + eqZer0 = mm_cmpeq_epi8(sourceVec, mm_setzero_si128()) + if mm_movemask_epi8(eqZer0) == 0xffff: + mm_storeu_si128( + a.data[a.dataIndex(x + q, y)].addr, + mm_setzero_si128() + ) elif mm_movemask_epi8(mm_cmpeq_epi8(sourceVec, vec255)) != 0xffff: let backdropVec = mm_loadu_si128(a.data[a.dataIndex(x + q, y)].addr) mm_storeu_si128( @@ -897,10 +912,16 @@ proc drawUber( else: # b is a Mask var values = mm_loadu_si128(b.data[b.dataIndex(sx, sy)].addr) for q in [0, 4, 8, 12]: - let sourceVec = unpackAlphaValues(values) - if mm_movemask_epi8(mm_cmpeq_epi8(sourceVec, mm_setzero_si128())) == 0xffff: - mm_storeu_si128(a.data[a.dataIndex(x + q, y)].addr, mm_setzero_si128()) - elif (mm_movemask_epi8(mm_cmpeq_epi8(sourceVec, vec255)) and 0x8888) != 0x8888: + let + sourceVec = unpackAlphaValues(values) + eqZer0 = mm_cmpeq_epi8(sourceVec, mm_setzero_si128()) + eq255 = mm_cmpeq_epi8(sourceVec, vec255) + if mm_movemask_epi8(eqZer0) == 0xffff: + mm_storeu_si128( + a.data[a.dataIndex(x + q, y)].addr, + mm_setzero_si128() + ) + elif (mm_movemask_epi8(eq255) and 0x8888) != 0x8888: let backdropVec = mm_loadu_si128(a.data[a.dataIndex(x + q, y)].addr) mm_storeu_si128( a.data[a.dataIndex(x + q, y)].addr,