annotate semicongine/images.nim @ 1430:db3af8a0b86b

add: lerp
author sam <sam@basx.dev>
date Sun, 19 Jan 2025 21:31:38 +0700
parents ab01c577d91c
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
1429
ab01c577d91c fix: some more import-stuff
sam <sam@basx.dev>
parents:
diff changeset
1 import std/os
ab01c577d91c fix: some more import-stuff
sam <sam@basx.dev>
parents:
diff changeset
2 import std/typetraits
ab01c577d91c fix: some more import-stuff
sam <sam@basx.dev>
parents:
diff changeset
3 import std/strformat
ab01c577d91c fix: some more import-stuff
sam <sam@basx.dev>
parents:
diff changeset
4 import std/strutils
ab01c577d91c fix: some more import-stuff
sam <sam@basx.dev>
parents:
diff changeset
5 import std/streams
ab01c577d91c fix: some more import-stuff
sam <sam@basx.dev>
parents:
diff changeset
6
ab01c577d91c fix: some more import-stuff
sam <sam@basx.dev>
parents:
diff changeset
7 import ./core
ab01c577d91c fix: some more import-stuff
sam <sam@basx.dev>
parents:
diff changeset
8 import ./resources
ab01c577d91c fix: some more import-stuff
sam <sam@basx.dev>
parents:
diff changeset
9
ab01c577d91c fix: some more import-stuff
sam <sam@basx.dev>
parents:
diff changeset
10 {.emit: "#define STB_IMAGE_STATIC".}
ab01c577d91c fix: some more import-stuff
sam <sam@basx.dev>
parents:
diff changeset
11 {.emit: "#define STB_IMAGE_IMPLEMENTATION".}
ab01c577d91c fix: some more import-stuff
sam <sam@basx.dev>
parents:
diff changeset
12 {.
ab01c577d91c fix: some more import-stuff
sam <sam@basx.dev>
parents:
diff changeset
13 emit: "#include \"" & currentSourcePath.parentDir() & "/thirdparty/stb/stb_image.h\""
ab01c577d91c fix: some more import-stuff
sam <sam@basx.dev>
parents:
diff changeset
14 .}
ab01c577d91c fix: some more import-stuff
sam <sam@basx.dev>
parents:
diff changeset
15
ab01c577d91c fix: some more import-stuff
sam <sam@basx.dev>
parents:
diff changeset
16 proc stbi_load_from_memory(
ab01c577d91c fix: some more import-stuff
sam <sam@basx.dev>
parents:
diff changeset
17 buffer: ptr uint8,
ab01c577d91c fix: some more import-stuff
sam <sam@basx.dev>
parents:
diff changeset
18 len: cint,
ab01c577d91c fix: some more import-stuff
sam <sam@basx.dev>
parents:
diff changeset
19 x, y: ptr cint,
ab01c577d91c fix: some more import-stuff
sam <sam@basx.dev>
parents:
diff changeset
20 channels_in_file: ptr cint,
ab01c577d91c fix: some more import-stuff
sam <sam@basx.dev>
parents:
diff changeset
21 desired_channels: cint,
ab01c577d91c fix: some more import-stuff
sam <sam@basx.dev>
parents:
diff changeset
22 ): ptr uint8 {.importc, nodecl.}
ab01c577d91c fix: some more import-stuff
sam <sam@basx.dev>
parents:
diff changeset
23
ab01c577d91c fix: some more import-stuff
sam <sam@basx.dev>
parents:
diff changeset
24 func `$`*[S, IsArray](img: ImageObject[S, IsArray]): string =
ab01c577d91c fix: some more import-stuff
sam <sam@basx.dev>
parents:
diff changeset
25 let pixelTypeName = S.name
ab01c577d91c fix: some more import-stuff
sam <sam@basx.dev>
parents:
diff changeset
26 if IsArray == false:
ab01c577d91c fix: some more import-stuff
sam <sam@basx.dev>
parents:
diff changeset
27 $img.width & "x" & $img.height & " " & pixelTypeName
ab01c577d91c fix: some more import-stuff
sam <sam@basx.dev>
parents:
diff changeset
28 else:
ab01c577d91c fix: some more import-stuff
sam <sam@basx.dev>
parents:
diff changeset
29 $img.width & "x" & $img.height & "[" & $img.nLayers & "] " & pixelTypeName
ab01c577d91c fix: some more import-stuff
sam <sam@basx.dev>
parents:
diff changeset
30
ab01c577d91c fix: some more import-stuff
sam <sam@basx.dev>
parents:
diff changeset
31 func copy*[S, T](img: ImageObject[S, T]): ImageObject[S, T] =
ab01c577d91c fix: some more import-stuff
sam <sam@basx.dev>
parents:
diff changeset
32 for bf, rf in fields(img, result):
ab01c577d91c fix: some more import-stuff
sam <sam@basx.dev>
parents:
diff changeset
33 rf = bf
ab01c577d91c fix: some more import-stuff
sam <sam@basx.dev>
parents:
diff changeset
34
ab01c577d91c fix: some more import-stuff
sam <sam@basx.dev>
parents:
diff changeset
35 # loads single layer image
ab01c577d91c fix: some more import-stuff
sam <sam@basx.dev>
parents:
diff changeset
36 proc loadImageData*[T: PixelType](
ab01c577d91c fix: some more import-stuff
sam <sam@basx.dev>
parents:
diff changeset
37 pngData: string | seq[uint8]
ab01c577d91c fix: some more import-stuff
sam <sam@basx.dev>
parents:
diff changeset
38 ): tuple[width: uint32, height: uint32, data: seq[T]] =
ab01c577d91c fix: some more import-stuff
sam <sam@basx.dev>
parents:
diff changeset
39 when T is Gray:
ab01c577d91c fix: some more import-stuff
sam <sam@basx.dev>
parents:
diff changeset
40 let nChannels = 1.cint
ab01c577d91c fix: some more import-stuff
sam <sam@basx.dev>
parents:
diff changeset
41 elif T is BGRA:
ab01c577d91c fix: some more import-stuff
sam <sam@basx.dev>
parents:
diff changeset
42 let nChannels = 4.cint
ab01c577d91c fix: some more import-stuff
sam <sam@basx.dev>
parents:
diff changeset
43
ab01c577d91c fix: some more import-stuff
sam <sam@basx.dev>
parents:
diff changeset
44 var w, h, c: cint
ab01c577d91c fix: some more import-stuff
sam <sam@basx.dev>
parents:
diff changeset
45
ab01c577d91c fix: some more import-stuff
sam <sam@basx.dev>
parents:
diff changeset
46 let data = stbi_load_from_memory(
ab01c577d91c fix: some more import-stuff
sam <sam@basx.dev>
parents:
diff changeset
47 buffer = cast[ptr uint8](pngData.ToCPointer),
ab01c577d91c fix: some more import-stuff
sam <sam@basx.dev>
parents:
diff changeset
48 len = pngData.len.cint,
ab01c577d91c fix: some more import-stuff
sam <sam@basx.dev>
parents:
diff changeset
49 x = addr(w),
ab01c577d91c fix: some more import-stuff
sam <sam@basx.dev>
parents:
diff changeset
50 y = addr(h),
ab01c577d91c fix: some more import-stuff
sam <sam@basx.dev>
parents:
diff changeset
51 channels_in_file = addr(c),
ab01c577d91c fix: some more import-stuff
sam <sam@basx.dev>
parents:
diff changeset
52 desired_channels = nChannels,
ab01c577d91c fix: some more import-stuff
sam <sam@basx.dev>
parents:
diff changeset
53 )
ab01c577d91c fix: some more import-stuff
sam <sam@basx.dev>
parents:
diff changeset
54 if data == nil:
ab01c577d91c fix: some more import-stuff
sam <sam@basx.dev>
parents:
diff changeset
55 raise newException(Exception, "An error occured while loading PNG file")
ab01c577d91c fix: some more import-stuff
sam <sam@basx.dev>
parents:
diff changeset
56
ab01c577d91c fix: some more import-stuff
sam <sam@basx.dev>
parents:
diff changeset
57 let imagesize = w * h * nChannels
ab01c577d91c fix: some more import-stuff
sam <sam@basx.dev>
parents:
diff changeset
58 result = (width: w.uint32, height: h.uint32, data: newSeq[T](w * h))
ab01c577d91c fix: some more import-stuff
sam <sam@basx.dev>
parents:
diff changeset
59 copyMem(result.data.ToCPointer, data, imagesize)
ab01c577d91c fix: some more import-stuff
sam <sam@basx.dev>
parents:
diff changeset
60 nativeFree(data)
ab01c577d91c fix: some more import-stuff
sam <sam@basx.dev>
parents:
diff changeset
61
ab01c577d91c fix: some more import-stuff
sam <sam@basx.dev>
parents:
diff changeset
62 when T is BGRA: # convert to BGRA
ab01c577d91c fix: some more import-stuff
sam <sam@basx.dev>
parents:
diff changeset
63 for i in 0 ..< result.data.len:
ab01c577d91c fix: some more import-stuff
sam <sam@basx.dev>
parents:
diff changeset
64 swap(result.data[i][0], result.data[i][2])
ab01c577d91c fix: some more import-stuff
sam <sam@basx.dev>
parents:
diff changeset
65
ab01c577d91c fix: some more import-stuff
sam <sam@basx.dev>
parents:
diff changeset
66 # TODO: static versions to check for existing of files during compilation
ab01c577d91c fix: some more import-stuff
sam <sam@basx.dev>
parents:
diff changeset
67 proc addImage*[T: PixelType](imageArray: var ImageArray[T], image: sink Image[T]) =
ab01c577d91c fix: some more import-stuff
sam <sam@basx.dev>
parents:
diff changeset
68 assert image.width == imageArray.width,
ab01c577d91c fix: some more import-stuff
sam <sam@basx.dev>
parents:
diff changeset
69 &"Image needs to have same dimension as ImageArray to be added (array has {imageArray.width}x{imageArray.height} but image has {image.width}x{image.height})"
ab01c577d91c fix: some more import-stuff
sam <sam@basx.dev>
parents:
diff changeset
70 assert image.height == imageArray.height,
ab01c577d91c fix: some more import-stuff
sam <sam@basx.dev>
parents:
diff changeset
71 &"Image needs to have same dimension as ImageArray to be added (array has {imageArray.width}x{imageArray.height} but image has {image.width}x{image.height})"
ab01c577d91c fix: some more import-stuff
sam <sam@basx.dev>
parents:
diff changeset
72
ab01c577d91c fix: some more import-stuff
sam <sam@basx.dev>
parents:
diff changeset
73 inc imageArray.nLayers
ab01c577d91c fix: some more import-stuff
sam <sam@basx.dev>
parents:
diff changeset
74 imageArray.data.add image.data
ab01c577d91c fix: some more import-stuff
sam <sam@basx.dev>
parents:
diff changeset
75
ab01c577d91c fix: some more import-stuff
sam <sam@basx.dev>
parents:
diff changeset
76 proc `[]`*(image: Image, x, y: uint32): auto =
ab01c577d91c fix: some more import-stuff
sam <sam@basx.dev>
parents:
diff changeset
77 assert x < image.width, &"{x} < {image.width} is not true"
ab01c577d91c fix: some more import-stuff
sam <sam@basx.dev>
parents:
diff changeset
78 assert y < image.height, &"{y} < {image.height} is not true"
ab01c577d91c fix: some more import-stuff
sam <sam@basx.dev>
parents:
diff changeset
79
ab01c577d91c fix: some more import-stuff
sam <sam@basx.dev>
parents:
diff changeset
80 image.data[y * image.width + x]
ab01c577d91c fix: some more import-stuff
sam <sam@basx.dev>
parents:
diff changeset
81
ab01c577d91c fix: some more import-stuff
sam <sam@basx.dev>
parents:
diff changeset
82 proc `[]=`*[T](image: var Image[T], x, y: uint32, value: T) =
ab01c577d91c fix: some more import-stuff
sam <sam@basx.dev>
parents:
diff changeset
83 assert x < image.width
ab01c577d91c fix: some more import-stuff
sam <sam@basx.dev>
parents:
diff changeset
84 assert y < image.height
ab01c577d91c fix: some more import-stuff
sam <sam@basx.dev>
parents:
diff changeset
85
ab01c577d91c fix: some more import-stuff
sam <sam@basx.dev>
parents:
diff changeset
86 image.data[y * image.width + x] = value
ab01c577d91c fix: some more import-stuff
sam <sam@basx.dev>
parents:
diff changeset
87
ab01c577d91c fix: some more import-stuff
sam <sam@basx.dev>
parents:
diff changeset
88 proc `[]`*(image: ImageArray, layer, x, y: uint32): auto =
ab01c577d91c fix: some more import-stuff
sam <sam@basx.dev>
parents:
diff changeset
89 assert layer < image.nLayers,
ab01c577d91c fix: some more import-stuff
sam <sam@basx.dev>
parents:
diff changeset
90 &"Tried to access image layer {layer}, but image has only {image.nLayers} layers"
ab01c577d91c fix: some more import-stuff
sam <sam@basx.dev>
parents:
diff changeset
91 assert x < image.width,
ab01c577d91c fix: some more import-stuff
sam <sam@basx.dev>
parents:
diff changeset
92 &"Tried to access pixel coordinate {(x, y)} but image has size {(image.width, image.height)}"
ab01c577d91c fix: some more import-stuff
sam <sam@basx.dev>
parents:
diff changeset
93 assert y < image.height,
ab01c577d91c fix: some more import-stuff
sam <sam@basx.dev>
parents:
diff changeset
94 &"Tried to access pixel coordinate {(x, y)} but image has size {(image.width, image.height)}"
ab01c577d91c fix: some more import-stuff
sam <sam@basx.dev>
parents:
diff changeset
95
ab01c577d91c fix: some more import-stuff
sam <sam@basx.dev>
parents:
diff changeset
96 image.data[layer * (image.width * image.height) + y * image.width + x]
ab01c577d91c fix: some more import-stuff
sam <sam@basx.dev>
parents:
diff changeset
97
ab01c577d91c fix: some more import-stuff
sam <sam@basx.dev>
parents:
diff changeset
98 proc `[]=`*[T](image: var ImageArray[T], layer, x, y: uint32, value: T) =
ab01c577d91c fix: some more import-stuff
sam <sam@basx.dev>
parents:
diff changeset
99 assert layer < image.nLayers,
ab01c577d91c fix: some more import-stuff
sam <sam@basx.dev>
parents:
diff changeset
100 &"Tried to access image layer {layer}, but image has only {image.nLayers} layers"
ab01c577d91c fix: some more import-stuff
sam <sam@basx.dev>
parents:
diff changeset
101 assert x < image.width,
ab01c577d91c fix: some more import-stuff
sam <sam@basx.dev>
parents:
diff changeset
102 &"Tried to access pixel coordinate {(x, y)} but image has size {(image.width, image.height)}"
ab01c577d91c fix: some more import-stuff
sam <sam@basx.dev>
parents:
diff changeset
103 assert y < image.height,
ab01c577d91c fix: some more import-stuff
sam <sam@basx.dev>
parents:
diff changeset
104 &"Tried to access pixel coordinate {(x, y)} but image has size {(image.width, image.height)}"
ab01c577d91c fix: some more import-stuff
sam <sam@basx.dev>
parents:
diff changeset
105
ab01c577d91c fix: some more import-stuff
sam <sam@basx.dev>
parents:
diff changeset
106 image.data[layer * (image.width * image.height) + y * image.width + x] = value
ab01c577d91c fix: some more import-stuff
sam <sam@basx.dev>
parents:
diff changeset
107
ab01c577d91c fix: some more import-stuff
sam <sam@basx.dev>
parents:
diff changeset
108 # stb_image.h has no encoding support, maybe check stb_image_write or similar
ab01c577d91c fix: some more import-stuff
sam <sam@basx.dev>
parents:
diff changeset
109 #
ab01c577d91c fix: some more import-stuff
sam <sam@basx.dev>
parents:
diff changeset
110 # proc lodepng_encode_memory(out_data: ptr cstring, outsize: ptr csize_t, image: cstring, w: cuint, h: cuint, colorType: cint, bitdepth: cuint): cuint {.importc.}
ab01c577d91c fix: some more import-stuff
sam <sam@basx.dev>
parents:
diff changeset
111 #
ab01c577d91c fix: some more import-stuff
sam <sam@basx.dev>
parents:
diff changeset
112 #[
ab01c577d91c fix: some more import-stuff
sam <sam@basx.dev>
parents:
diff changeset
113 proc toPNG[T: PixelType](image: Image[T]): seq[uint8] =
ab01c577d91c fix: some more import-stuff
sam <sam@basx.dev>
parents:
diff changeset
114 when T is Gray:
ab01c577d91c fix: some more import-stuff
sam <sam@basx.dev>
parents:
diff changeset
115 let pngType = 0 # hardcoded in lodepng.h
ab01c577d91c fix: some more import-stuff
sam <sam@basx.dev>
parents:
diff changeset
116 else:
ab01c577d91c fix: some more import-stuff
sam <sam@basx.dev>
parents:
diff changeset
117 let pngType = 6 # hardcoded in lodepng.h
ab01c577d91c fix: some more import-stuff
sam <sam@basx.dev>
parents:
diff changeset
118 var
ab01c577d91c fix: some more import-stuff
sam <sam@basx.dev>
parents:
diff changeset
119 pngData: cstring
ab01c577d91c fix: some more import-stuff
sam <sam@basx.dev>
parents:
diff changeset
120 pngSize: csize_t
ab01c577d91c fix: some more import-stuff
sam <sam@basx.dev>
parents:
diff changeset
121 for y in 0 ..< image.height:
ab01c577d91c fix: some more import-stuff
sam <sam@basx.dev>
parents:
diff changeset
122 for x in 0 ..< image.width:
ab01c577d91c fix: some more import-stuff
sam <sam@basx.dev>
parents:
diff changeset
123 discard
ab01c577d91c fix: some more import-stuff
sam <sam@basx.dev>
parents:
diff changeset
124 let ret = lodepng_encode_memory(
ab01c577d91c fix: some more import-stuff
sam <sam@basx.dev>
parents:
diff changeset
125 addr pngData,
ab01c577d91c fix: some more import-stuff
sam <sam@basx.dev>
parents:
diff changeset
126 addr pngSize,
ab01c577d91c fix: some more import-stuff
sam <sam@basx.dev>
parents:
diff changeset
127 cast[cstring](image.imagedata.ToCPointer),
ab01c577d91c fix: some more import-stuff
sam <sam@basx.dev>
parents:
diff changeset
128 cuint(image.width),
ab01c577d91c fix: some more import-stuff
sam <sam@basx.dev>
parents:
diff changeset
129 cuint(image.height),
ab01c577d91c fix: some more import-stuff
sam <sam@basx.dev>
parents:
diff changeset
130 cint(pngType),
ab01c577d91c fix: some more import-stuff
sam <sam@basx.dev>
parents:
diff changeset
131 8,
ab01c577d91c fix: some more import-stuff
sam <sam@basx.dev>
parents:
diff changeset
132 )
ab01c577d91c fix: some more import-stuff
sam <sam@basx.dev>
parents:
diff changeset
133 assert ret == 0, &"There was an error with generating the PNG data for image {image}, result was: {ret}"
ab01c577d91c fix: some more import-stuff
sam <sam@basx.dev>
parents:
diff changeset
134 result = newSeq[uint8](pngSize)
ab01c577d91c fix: some more import-stuff
sam <sam@basx.dev>
parents:
diff changeset
135 for i in 0 ..< pngSize:
ab01c577d91c fix: some more import-stuff
sam <sam@basx.dev>
parents:
diff changeset
136 result[i] = uint8(pngData[i])
ab01c577d91c fix: some more import-stuff
sam <sam@basx.dev>
parents:
diff changeset
137 nativeFree(pngData)
ab01c577d91c fix: some more import-stuff
sam <sam@basx.dev>
parents:
diff changeset
138
ab01c577d91c fix: some more import-stuff
sam <sam@basx.dev>
parents:
diff changeset
139 proc WritePNG*(image: Image, filename: string) =
ab01c577d91c fix: some more import-stuff
sam <sam@basx.dev>
parents:
diff changeset
140 let f = filename.open(mode = fmWrite)
ab01c577d91c fix: some more import-stuff
sam <sam@basx.dev>
parents:
diff changeset
141 let data = image.toPNG()
ab01c577d91c fix: some more import-stuff
sam <sam@basx.dev>
parents:
diff changeset
142 let written = f.writeBytes(data, 0, data.len)
ab01c577d91c fix: some more import-stuff
sam <sam@basx.dev>
parents:
diff changeset
143 assert written == data.len, &"There was an error while saving '{filename}': only {written} of {data.len} bytes were written"
ab01c577d91c fix: some more import-stuff
sam <sam@basx.dev>
parents:
diff changeset
144 f.close()
ab01c577d91c fix: some more import-stuff
sam <sam@basx.dev>
parents:
diff changeset
145 ]#
ab01c577d91c fix: some more import-stuff
sam <sam@basx.dev>
parents:
diff changeset
146
ab01c577d91c fix: some more import-stuff
sam <sam@basx.dev>
parents:
diff changeset
147 proc loadImage*[T: PixelType](
ab01c577d91c fix: some more import-stuff
sam <sam@basx.dev>
parents:
diff changeset
148 path: string, package = DEFAULT_PACKAGE
ab01c577d91c fix: some more import-stuff
sam <sam@basx.dev>
parents:
diff changeset
149 ): Image[T] {.gcsafe.} =
ab01c577d91c fix: some more import-stuff
sam <sam@basx.dev>
parents:
diff changeset
150 assert path.splitFile().ext.toLowerAscii == ".png",
ab01c577d91c fix: some more import-stuff
sam <sam@basx.dev>
parents:
diff changeset
151 "Unsupported image type: " & path.splitFile().ext.toLowerAscii
ab01c577d91c fix: some more import-stuff
sam <sam@basx.dev>
parents:
diff changeset
152
ab01c577d91c fix: some more import-stuff
sam <sam@basx.dev>
parents:
diff changeset
153 let (width, height, data) =
ab01c577d91c fix: some more import-stuff
sam <sam@basx.dev>
parents:
diff changeset
154 loadImageData[T](loadResource_intern(path, package = package).readAll())
ab01c577d91c fix: some more import-stuff
sam <sam@basx.dev>
parents:
diff changeset
155 result = Image[T](width: width, height: height, data: data)
ab01c577d91c fix: some more import-stuff
sam <sam@basx.dev>
parents:
diff changeset
156
ab01c577d91c fix: some more import-stuff
sam <sam@basx.dev>
parents:
diff changeset
157 proc loadImageArray*[T: PixelType](
ab01c577d91c fix: some more import-stuff
sam <sam@basx.dev>
parents:
diff changeset
158 paths: openArray[string], package = DEFAULT_PACKAGE
ab01c577d91c fix: some more import-stuff
sam <sam@basx.dev>
parents:
diff changeset
159 ): ImageArray[T] {.gcsafe.} =
ab01c577d91c fix: some more import-stuff
sam <sam@basx.dev>
parents:
diff changeset
160 assert paths.len > 0, "Image array cannot contain 0 images"
ab01c577d91c fix: some more import-stuff
sam <sam@basx.dev>
parents:
diff changeset
161 for path in paths:
ab01c577d91c fix: some more import-stuff
sam <sam@basx.dev>
parents:
diff changeset
162 assert path.splitFile().ext.toLowerAscii == ".png",
ab01c577d91c fix: some more import-stuff
sam <sam@basx.dev>
parents:
diff changeset
163 "Unsupported image type: " & path.splitFile().ext.toLowerAscii
ab01c577d91c fix: some more import-stuff
sam <sam@basx.dev>
parents:
diff changeset
164
ab01c577d91c fix: some more import-stuff
sam <sam@basx.dev>
parents:
diff changeset
165 let (width, height, data) =
ab01c577d91c fix: some more import-stuff
sam <sam@basx.dev>
parents:
diff changeset
166 loadImageData[T](loadResource_intern(paths[0], package = package).readAll())
ab01c577d91c fix: some more import-stuff
sam <sam@basx.dev>
parents:
diff changeset
167 result =
ab01c577d91c fix: some more import-stuff
sam <sam@basx.dev>
parents:
diff changeset
168 ImageArray[T](width: width, height: height, data: data, nLayers: paths.len.uint32)
ab01c577d91c fix: some more import-stuff
sam <sam@basx.dev>
parents:
diff changeset
169 for path in paths[1 .. ^1]:
ab01c577d91c fix: some more import-stuff
sam <sam@basx.dev>
parents:
diff changeset
170 let (w, h, data) =
ab01c577d91c fix: some more import-stuff
sam <sam@basx.dev>
parents:
diff changeset
171 loadImageData[T](loadResource_intern(path, package = package).readAll())
ab01c577d91c fix: some more import-stuff
sam <sam@basx.dev>
parents:
diff changeset
172 assert w == result.width,
ab01c577d91c fix: some more import-stuff
sam <sam@basx.dev>
parents:
diff changeset
173 "New image layer has dimension {(w, y)} but image has dimension {(result.width, result.height)}"
ab01c577d91c fix: some more import-stuff
sam <sam@basx.dev>
parents:
diff changeset
174 assert h == result.height,
ab01c577d91c fix: some more import-stuff
sam <sam@basx.dev>
parents:
diff changeset
175 "New image layer has dimension {(w, y)} but image has dimension {(result.width, result.height)}"
ab01c577d91c fix: some more import-stuff
sam <sam@basx.dev>
parents:
diff changeset
176 result.data.add data
ab01c577d91c fix: some more import-stuff
sam <sam@basx.dev>
parents:
diff changeset
177
ab01c577d91c fix: some more import-stuff
sam <sam@basx.dev>
parents:
diff changeset
178 proc loadImageArray*[T: PixelType](
ab01c577d91c fix: some more import-stuff
sam <sam@basx.dev>
parents:
diff changeset
179 path: string, tilesize: uint32, package = DEFAULT_PACKAGE
ab01c577d91c fix: some more import-stuff
sam <sam@basx.dev>
parents:
diff changeset
180 ): ImageArray[T] {.gcsafe.} =
ab01c577d91c fix: some more import-stuff
sam <sam@basx.dev>
parents:
diff changeset
181 assert path.splitFile().ext.toLowerAscii == ".png",
ab01c577d91c fix: some more import-stuff
sam <sam@basx.dev>
parents:
diff changeset
182 "Unsupported image type: " & path.splitFile().ext.toLowerAscii
ab01c577d91c fix: some more import-stuff
sam <sam@basx.dev>
parents:
diff changeset
183
ab01c577d91c fix: some more import-stuff
sam <sam@basx.dev>
parents:
diff changeset
184 let (width, height, data) =
ab01c577d91c fix: some more import-stuff
sam <sam@basx.dev>
parents:
diff changeset
185 loadImageData[T](loadResource_intern(path, package = package).readAll())
ab01c577d91c fix: some more import-stuff
sam <sam@basx.dev>
parents:
diff changeset
186 let tilesY = height div tilesize
ab01c577d91c fix: some more import-stuff
sam <sam@basx.dev>
parents:
diff changeset
187
ab01c577d91c fix: some more import-stuff
sam <sam@basx.dev>
parents:
diff changeset
188 result = ImageArray[T](width: tilesize, height: tilesize)
ab01c577d91c fix: some more import-stuff
sam <sam@basx.dev>
parents:
diff changeset
189 var tile = newSeq[T](tilesize * tilesize)
ab01c577d91c fix: some more import-stuff
sam <sam@basx.dev>
parents:
diff changeset
190
ab01c577d91c fix: some more import-stuff
sam <sam@basx.dev>
parents:
diff changeset
191 for ty in 0 ..< tilesY:
ab01c577d91c fix: some more import-stuff
sam <sam@basx.dev>
parents:
diff changeset
192 for tx in 0 ..< tilesY:
ab01c577d91c fix: some more import-stuff
sam <sam@basx.dev>
parents:
diff changeset
193 var hasNonTransparent = when T is BGRA: false else: true
ab01c577d91c fix: some more import-stuff
sam <sam@basx.dev>
parents:
diff changeset
194 let baseI = ty * tilesize * width + tx * tilesize
ab01c577d91c fix: some more import-stuff
sam <sam@basx.dev>
parents:
diff changeset
195 for y in 0 ..< tilesize:
ab01c577d91c fix: some more import-stuff
sam <sam@basx.dev>
parents:
diff changeset
196 for x in 0 ..< tilesize:
ab01c577d91c fix: some more import-stuff
sam <sam@basx.dev>
parents:
diff changeset
197 tile[y * tilesize + x] = data[baseI + y * width + x]
ab01c577d91c fix: some more import-stuff
sam <sam@basx.dev>
parents:
diff changeset
198 when T is BGRA:
ab01c577d91c fix: some more import-stuff
sam <sam@basx.dev>
parents:
diff changeset
199 hasNonTransparent = hasNonTransparent or tile[y * tilesize + x].a > 0
ab01c577d91c fix: some more import-stuff
sam <sam@basx.dev>
parents:
diff changeset
200 if hasNonTransparent:
ab01c577d91c fix: some more import-stuff
sam <sam@basx.dev>
parents:
diff changeset
201 result.data.add tile
ab01c577d91c fix: some more import-stuff
sam <sam@basx.dev>
parents:
diff changeset
202 result.nLayers.inc