GameLib is a collection of libraries for creating applications in Cakelisp.
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

61 lines
2.3 KiB

;; Image
;; Interface for loading images of various formats
;; Currently, stb_image.h does all the heavy lifting
(export-and-evaluate
(comptime-cond
('STBImageDefinedInRaylib
(add-c-search-directory-module "Dependencies"))
(true
(add-c-search-directory-module "Dependencies/stb"))))
(import "STB.cake") ;; Download STB if necessary
;; If another dependency includes stb_image (it's quite popular), then we don't need to add the
;; implementations here (and cause multiple definitions)
(comptime-cond
('STBImageDefinedInRaylib)
(true
(c-preprocessor-define STB_IMAGE_IMPLEMENTATION)))
(c-preprocessor-define STBI_FAILURE_USERMSG)
;; This is an annoying hack: Raylib uses a different version of stb, so if we import Raylib.cake
;; and Image.cake (must be in that order!), we need to use Raylib's version, because I don't want
;; to modify raylib.
(comptime-cond
('STBImageDefinedInRaylib
;; I don't want to expose raylib/src/external because it breaks other modules in GameLib
(c-import &with-decls "raylib/src/external/stb_image.h"
&with-defs "raylib/src/external/stb_image.h"))
(true
(c-import &with-decls "stb_image.h"
&with-defs "stb_image.h")))
(comptime-cond
('auto-test
(defun-nodecl test--stb-image (&return int)
(var image-to-load (* (const char)) "assets/town.jpg")
(var width int 0)
(var height int 0)
(var num-pixel-components int 0)
(var num-desired-channels int 3)
(var pixel-data (* (unsigned char))
(stbi_load image-to-load (addr width) (addr height) (addr num-pixel-components)
num-desired-channels))
(unless pixel-data
(fprintf stderr "error: failed to load %s with message: %s\n" image-to-load
(stbi_failure_reason))
(return 1))
(fprintf stderr "size of %s: %dx%d\n" image-to-load width height)
(fprintf stderr "num components in %s: %d\n" image-to-load num-pixel-components)
(fprintf stderr "first three pixels:\n")
(each-in-range 3 i
(var rgb-components ([] 3 (unsigned char)) (array 0))
(memcpy rgb-components (addr (at (* i 3) pixel-data))
(sizeof rgb-components))
(fprintf stderr "[%d] %d %d %d\n"
i
(at 0 rgb-components)
(at 1 rgb-components)
(at 2 rgb-components)))
(stbi_image_free pixel-data)
(return 0))))