convertToImage alternative to newImage for straight alpha image formats
This commit is contained in:
parent
97ba8c745f
commit
033c4b5455
4 changed files with 37 additions and 9 deletions
|
@ -40,7 +40,7 @@ proc decodeImageDimensions*(
|
||||||
proc decodeImage*(data: string): Image {.raises: [PixieError].} =
|
proc decodeImage*(data: string): Image {.raises: [PixieError].} =
|
||||||
## Loads an image from memory.
|
## Loads an image from memory.
|
||||||
if data.len > 8 and data.readUint64(0) == cast[uint64](pngSignature):
|
if data.len > 8 and data.readUint64(0) == cast[uint64](pngSignature):
|
||||||
newImage(decodePng(data))
|
decodePng(data).convertToImage()
|
||||||
elif data.len > 2 and data.readUint16(0) == cast[uint16](jpegStartOfImage):
|
elif data.len > 2 and data.readUint16(0) == cast[uint16](jpegStartOfImage):
|
||||||
decodeJpeg(data)
|
decodeJpeg(data)
|
||||||
elif data.len > 2 and data.readStr(0, 2) == bmpSignature:
|
elif data.len > 2 and data.readStr(0, 2) == bmpSignature:
|
||||||
|
@ -51,7 +51,7 @@ proc decodeImage*(data: string): Image {.raises: [PixieError].} =
|
||||||
elif data.len > 6 and data.readStr(0, 6) in gifSignatures:
|
elif data.len > 6 and data.readStr(0, 6) in gifSignatures:
|
||||||
decodeGif(data)
|
decodeGif(data)
|
||||||
elif data.len > (14+8) and data.readStr(0, 4) == qoiSignature:
|
elif data.len > (14+8) and data.readStr(0, 4) == qoiSignature:
|
||||||
newImage(decodeQoi(data))
|
decodeQoi(data).convertToImage()
|
||||||
elif data.len > 9 and data.readStr(0, 2) in ppmSignatures:
|
elif data.len > 9 and data.readStr(0, 2) in ppmSignatures:
|
||||||
decodePpm(data)
|
decodePpm(data)
|
||||||
else:
|
else:
|
||||||
|
@ -60,7 +60,7 @@ proc decodeImage*(data: string): Image {.raises: [PixieError].} =
|
||||||
proc decodeMask*(data: string): Mask {.raises: [PixieError].} =
|
proc decodeMask*(data: string): Mask {.raises: [PixieError].} =
|
||||||
## Loads a mask from memory.
|
## Loads a mask from memory.
|
||||||
if data.len > 8 and data.readUint64(0) == cast[uint64](pngSignature):
|
if data.len > 8 and data.readUint64(0) == cast[uint64](pngSignature):
|
||||||
newMask(newImage(decodePng(data)))
|
newMask(decodePng(data).convertToImage())
|
||||||
else:
|
else:
|
||||||
raise newException(PixieError, "Unsupported mask file format")
|
raise newException(PixieError, "Unsupported mask file format")
|
||||||
|
|
||||||
|
|
|
@ -338,10 +338,24 @@ proc decodeImageData(
|
||||||
discard # Not possible, parseHeader validates
|
discard # Not possible, parseHeader validates
|
||||||
|
|
||||||
proc newImage*(png: Png): Image {.raises: [PixieError].} =
|
proc newImage*(png: Png): Image {.raises: [PixieError].} =
|
||||||
|
## Creates a new Image from the PNG.
|
||||||
result = newImage(png.width, png.height)
|
result = newImage(png.width, png.height)
|
||||||
copyMem(result.data[0].addr, png.data[0].addr, png.data.len * 4)
|
copyMem(result.data[0].addr, png.data[0].addr, png.data.len * 4)
|
||||||
result.data.toPremultipliedAlpha()
|
result.data.toPremultipliedAlpha()
|
||||||
|
|
||||||
|
proc convertToImage*(png: Png): Image {.raises: [].} =
|
||||||
|
## Converts a PNG into an Image by moving the data. This is faster but can
|
||||||
|
## only be done once.
|
||||||
|
type Movable = ref object
|
||||||
|
width, height, channels: int
|
||||||
|
data: seq[ColorRGBX]
|
||||||
|
|
||||||
|
result = Image()
|
||||||
|
result.width = png.width
|
||||||
|
result.height = png.height
|
||||||
|
result.data = move cast[Movable](png).data
|
||||||
|
result.data.toPremultipliedAlpha()
|
||||||
|
|
||||||
proc decodePngDimensions*(
|
proc decodePngDimensions*(
|
||||||
data: pointer, len: int
|
data: pointer, len: int
|
||||||
): ImageDimensions {.raises: [PixieError].} =
|
): ImageDimensions {.raises: [PixieError].} =
|
||||||
|
|
|
@ -30,11 +30,25 @@ proc hash(p: ColorRGBA): int =
|
||||||
(p.r.int * 3 + p.g.int * 5 + p.b.int * 7 + p.a.int * 11) mod indexLen
|
(p.r.int * 3 + p.g.int * 5 + p.b.int * 7 + p.a.int * 11) mod indexLen
|
||||||
|
|
||||||
proc newImage*(qoi: Qoi): Image =
|
proc newImage*(qoi: Qoi): Image =
|
||||||
## Converts raw QOI data to `Image`.
|
## Creates a new Image from the QOI.
|
||||||
result = newImage(qoi.width, qoi.height)
|
result = newImage(qoi.width, qoi.height)
|
||||||
copyMem(result.data[0].addr, qoi.data[0].addr, qoi.data.len * 4)
|
copyMem(result.data[0].addr, qoi.data[0].addr, qoi.data.len * 4)
|
||||||
result.data.toPremultipliedAlpha()
|
result.data.toPremultipliedAlpha()
|
||||||
|
|
||||||
|
proc convertToImage*(qoi: Qoi): Image {.raises: [].} =
|
||||||
|
## Converts a QOI into an Image by moving the data. This is faster but can
|
||||||
|
## only be done once.
|
||||||
|
type Movable = ref object
|
||||||
|
width, height, channels: int
|
||||||
|
colorspace: Colorspace
|
||||||
|
data: seq[ColorRGBX]
|
||||||
|
|
||||||
|
result = Image()
|
||||||
|
result.width = qoi.width
|
||||||
|
result.height = qoi.height
|
||||||
|
result.data = move cast[Movable](qoi).data
|
||||||
|
result.data.toPremultipliedAlpha()
|
||||||
|
|
||||||
proc decodeQoi*(data: string): Qoi {.raises: [PixieError].} =
|
proc decodeQoi*(data: string): Qoi {.raises: [PixieError].} =
|
||||||
## Decompress QOI file format data.
|
## Decompress QOI file format data.
|
||||||
if data.len <= 14 or data[0 .. 3] != qoiSignature:
|
if data.len <= 14 or data[0 .. 3] != qoiSignature:
|
||||||
|
|
|
@ -13,12 +13,12 @@ block:
|
||||||
timeIt "pixie decode":
|
timeIt "pixie decode":
|
||||||
discard decodePng(data)
|
discard decodePng(data)
|
||||||
|
|
||||||
|
timeIt "pixie decode + alpha":
|
||||||
|
discard decodePng(data).convertToImage()
|
||||||
|
|
||||||
timeIt "pixie encode":
|
timeIt "pixie encode":
|
||||||
discard encodePng(decodedPng)
|
discard encodePng(decodedPng)
|
||||||
|
|
||||||
timeIt "pixie decode + alpha":
|
|
||||||
discard newImage(decodePng(data))
|
|
||||||
|
|
||||||
timeIt "pixie encode + alpha":
|
timeIt "pixie encode + alpha":
|
||||||
discard encodePng(decodedImage)
|
discard encodePng(decodedImage)
|
||||||
|
|
||||||
|
@ -55,9 +55,9 @@ block:
|
||||||
|
|
||||||
block:
|
block:
|
||||||
timeIt "cairo decode":
|
timeIt "cairo decode":
|
||||||
discard imageSurfaceCreateFromPng(filePath)
|
discard imageSurfaceCreateFromPng(filePath.cstring)
|
||||||
|
|
||||||
let decoded = imageSurfaceCreateFromPng(filePath)
|
let decoded = imageSurfaceCreateFromPng(filePath.cstring)
|
||||||
timeIt "cairo encode":
|
timeIt "cairo encode":
|
||||||
var write: WriteFunc =
|
var write: WriteFunc =
|
||||||
proc(closure: pointer, data: cstring, len: int32): Status {.cdecl.} =
|
proc(closure: pointer, data: cstring, len: int32): Status {.cdecl.} =
|
||||||
|
|
Loading…
Reference in a new issue