Merge pull request #423 from guzba/master

remove stb, commit to new jpeg
This commit is contained in:
treeform 2022-05-16 21:01:05 -07:00 committed by GitHub
commit a4d659ae38
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
6 changed files with 16 additions and 7977 deletions

View file

@ -1,5 +1,5 @@
import bumpy, chroma, flatty/binny, os, pixie/common, pixie/contexts, import bumpy, chroma, flatty/binny, os, pixie/common, pixie/contexts,
pixie/fileformats/bmp, pixie/fileformats/gif, pixie/fileformats/jpg, pixie/fileformats/bmp, pixie/fileformats/gif, pixie/fileformats/jpeg,
pixie/fileformats/png, pixie/fileformats/ppm, pixie/fileformats/qoi, pixie/fileformats/png, pixie/fileformats/ppm, pixie/fileformats/qoi,
pixie/fileformats/svg, pixie/fonts, pixie/images, pixie/masks, pixie/paints, pixie/fileformats/svg, pixie/fonts, pixie/images, pixie/masks, pixie/paints,
pixie/paths, strutils, vmath pixie/paths, strutils, vmath
@ -8,7 +8,7 @@ export bumpy, chroma, common, contexts, fonts, images, masks, paints, paths, vma
type type
FileFormat* = enum FileFormat* = enum
PngFormat, BmpFormat, JpgFormat, GifFormat, QoiFormat, PpmFormat PngFormat, BmpFormat, JpegFormat, GifFormat, QoiFormat, PpmFormat
converter autoStraightAlpha*(c: ColorRGBX): ColorRGBA {.inline, raises: [].} = converter autoStraightAlpha*(c: ColorRGBX): ColorRGBA {.inline, raises: [].} =
## Convert a premultiplied alpha RGBA to a straight alpha RGBA. ## Convert a premultiplied alpha RGBA to a straight alpha RGBA.
@ -22,8 +22,8 @@ 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):
decodePng(data) decodePng(data)
elif data.len > 2 and data.readUint16(0) == cast[uint16](jpgStartOfImage): elif data.len > 2 and data.readUint16(0) == cast[uint16](jpegStartOfImage):
decodeJpg(data) decodeJpeg(data)
elif data.len > 2 and data.readStr(0, 2) == bmpSignature: elif data.len > 2 and data.readStr(0, 2) == bmpSignature:
decodeBmp(data) decodeBmp(data)
elif data.len > 5 and elif data.len > 5 and
@ -64,7 +64,7 @@ proc encodeImage*(image: Image, fileFormat: FileFormat): string {.raises: [Pixie
case fileFormat: case fileFormat:
of PngFormat: of PngFormat:
image.encodePng() image.encodePng()
of JpgFormat: of JpegFormat:
raise newException(PixieError, "Unsupported file format") raise newException(PixieError, "Unsupported file format")
of BmpFormat: of BmpFormat:
image.encodeBmp() image.encodeBmp()
@ -88,7 +88,7 @@ proc writeFile*(image: Image, filePath: string) {.raises: [PixieError].} =
let fileFormat = case splitFile(filePath).ext.toLowerAscii(): let fileFormat = case splitFile(filePath).ext.toLowerAscii():
of ".png": PngFormat of ".png": PngFormat
of ".bmp": BmpFormat of ".bmp": BmpFormat
of ".jpg", ".jpeg": JpgFormat of ".jpg", ".jpeg": JpegFormat
of ".qoi": QoiFormat of ".qoi": QoiFormat
of ".ppm": PpmFormat of ".ppm": PpmFormat
else: else:
@ -104,7 +104,7 @@ proc writeFile*(mask: Mask, filePath: string) {.raises: [PixieError].} =
let fileFormat = case splitFile(filePath).ext.toLowerAscii(): let fileFormat = case splitFile(filePath).ext.toLowerAscii():
of ".png": PngFormat of ".png": PngFormat
of ".bmp": BmpFormat of ".bmp": BmpFormat
of ".jpg", ".jpeg": JpgFormat of ".jpg", ".jpeg": JpegFormat
of ".qoi": QoiFormat of ".qoi": QoiFormat
of ".ppm": PpmFormat of ".ppm": PpmFormat
else: else:

View file

@ -21,7 +21,7 @@ import pixie/common, pixie/images, pixie/masks, sequtils, strutils, chroma, std/
const const
fastBits = 9 fastBits = 9
jpgStartOfImage* = [0xFF.uint8, 0xD8] jpegStartOfImage* = [0xFF.uint8, 0xD8]
deZigZag = [ deZigZag = [
uint8 00, 01, 08, 16, 09, 02, 03, 10, uint8 00, 01, 08, 16, 09, 02, 03, 10,
uint8 17, 24, 32, 25, 18, 11, 04, 05, uint8 17, 24, 32, 25, 18, 11, 04, 05,
@ -895,17 +895,21 @@ proc buildImage(state: var DecoderState): Image =
cb = state.components[1].channel cb = state.components[1].channel
cr = state.components[2].channel cr = state.components[2].channel
for y in 0 ..< state.imageHeight: for y in 0 ..< state.imageHeight:
var channelIndex = cy.dataIndex(0, y)
for x in 0 ..< state.imageWidth: for x in 0 ..< state.imageWidth:
result.unsafe[x, y] = yCbCrToRgbx( result.unsafe[x, y] = yCbCrToRgbx(
cy.unsafe[x, y], cy.data[channelIndex],
cb.unsafe[x, y], cb.data[channelIndex],
cr.unsafe[x, y], cr.data[channelIndex],
) )
inc channelIndex
elif state.components.len == 1: elif state.components.len == 1:
let cy = state.components[0].channel let cy = state.components[0].channel
for y in 0 ..< state.imageHeight: for y in 0 ..< state.imageHeight:
var channelIndex = cy.dataIndex(0, y)
for x in 0 ..< state.imageWidth: for x in 0 ..< state.imageWidth:
result.unsafe[x, y] = grayScaleToRgbx(cy.unsafe[x, y]) result.unsafe[x, y] = grayScaleToRgbx(cy.data[channelIndex])
inc channelIndex
else: else:
failInvalid() failInvalid()

View file

@ -1,22 +0,0 @@
import pixie/common, pixie/images
const
jpgStartOfImage* = [0xFF.uint8, 0xD8]
when defined(pixieUseStb):
import pixie/fileformats/stb_image/stb_image
else:
import pixie/fileformats/jpeg
proc decodeJpg*(data: string): Image {.inline, raises: [PixieError].} =
## Decodes the JPEG into an Image.
when not defined(pixieUseStb):
decodeJpeg(data)
else:
var
width: int
height: int
let pixels = loadFromMemory(data, width, height)
result = newImage(width, height)
copyMem(result.data[0].addr, pixels[0].unsafeAddr, pixels.len)

View file

@ -1,6 +0,0 @@
#define STBI_NO_STDIO
#define STBI_NO_LINEAR
#define STBI_NO_HDR
#define STBI_ONLY_JPEG
#define STB_IMAGE_IMPLEMENTATION
#include "stb_image.h"

File diff suppressed because it is too large Load diff

View file

@ -1,40 +0,0 @@
import pixie/common
when defined(windows) and defined(vcc):
{.pragma: stbcall, stdcall.}
else:
{.pragma: stbcall, cdecl.}
{.compile: "stb_image.c".}
proc stbi_image_free(retval_from_stbi_load: pointer)
{.importc: "stbi_image_free", stbcall.}
proc stbi_load_from_memory(
buffer: pointer,
len: cint,
x, y, channels_in_file: var cint,
desired_channels: cint
): pointer
{.importc: "stbi_load_from_memory", stbcall.}
proc loadFromMemory*(buffer: string, width, height: var int): string =
var outWidth, outHeight, outComponents: cint
let data = stbi_load_from_memory(
buffer[0].unsafeAddr,
buffer.len.cint,
outWidth,
outHeight,
outComponents,
4
)
if data == nil:
raise newException(PixieError, "Decoding JPG failed")
width = outWidth.int
height = outHeight.int
result.setLen(width * height * 4)
copyMem(result[0].addr, data, result.len)
stbi_image_free(data)