2021-10-10 14:39:17 +08:00
|
|
|
#pragma once
|
|
|
|
|
|
|
|
#include "../../main.h"
|
2021-10-10 23:16:23 +08:00
|
|
|
#include "../color.h"
|
2021-10-10 14:39:17 +08:00
|
|
|
#include <stdint.h>
|
|
|
|
|
|
|
|
#ifdef __cplusplus
|
|
|
|
extern "C" {
|
|
|
|
#endif
|
|
|
|
|
|
|
|
// XCursor file format - see man page xcursor(3)
|
|
|
|
// https://www.x.org/releases/X11R7.7/doc/man/man3/Xcursor.3.xhtml
|
|
|
|
|
2021-10-10 23:16:23 +08:00
|
|
|
#define XCURSOR_MAGIC "Xcur"
|
|
|
|
#define XCURSOR_MAGIC_SIZE 4
|
|
|
|
|
2021-10-10 14:39:17 +08:00
|
|
|
// Header
|
|
|
|
typedef struct {
|
|
|
|
char magic[4]; // Magic string "Xcur"
|
|
|
|
uint32_t headerSize; // Size of the header (16)
|
|
|
|
uint32_t version; // File version number
|
|
|
|
uint32_t numTOC; // Number of entries in the Table of Contents
|
|
|
|
} PACKED xcursor_Header;
|
|
|
|
|
|
|
|
// Table of Content Entry
|
|
|
|
typedef struct {
|
|
|
|
uint32_t type; // Entry chunk type (0xfffe0001 = Comment, 0xfffd0002 = Image)
|
|
|
|
uint32_t subtype; // Type specific Subtype, size(width=height) for images
|
|
|
|
uint32_t offset; // Absolute byte position in the file
|
|
|
|
} PACKED xcursor_TOCEntry;
|
|
|
|
|
|
|
|
|
|
|
|
#define XCURSOR_CHUNKTYPE_COMMENT 0xfffe0001u
|
|
|
|
#define XCURSOR_CHUNKTYPE_IMAGE 0xfffd0002u
|
|
|
|
|
|
|
|
// Common parts in different types of Chunk Headers
|
|
|
|
typedef struct {
|
|
|
|
uint32_t headerSize; // Size of the header
|
|
|
|
uint32_t type; // Type of the Chunk, matches the Entry Type in the TOC
|
|
|
|
uint32_t subtype; // Type specific subtype
|
|
|
|
uint32_t version; // Version number of the chunk type
|
|
|
|
} PACKED xcursor_ChunkHeader;
|
|
|
|
|
|
|
|
#define XCURSOR_COMMENT_SUBTYPE_COPYRIGHT 0x00000001u
|
|
|
|
#define XCURSOR_COMMENT_SUBTYPE_LICENSE 0x00000002u
|
|
|
|
#define XCURSOR_COMMENT_SUBTYPE_OTHER 0x00000003u
|
|
|
|
|
|
|
|
// Chunk Header for type Comment
|
|
|
|
typedef struct {
|
|
|
|
uint32_t headerSize; // Size of the header
|
|
|
|
uint32_t type; // Type of the Chunk, matches the Entry Type in the TOC
|
|
|
|
uint32_t subtype; // Type specific subtype, Copyright, License or Other
|
|
|
|
uint32_t version; // Version number of the chunk type, =1
|
|
|
|
|
|
|
|
uint32_t length; // Length in bytes of the UTF-8 string
|
|
|
|
char string[1]; // The UTF-8 string, spanning the rest of the chunk
|
|
|
|
} PACKED xcursor_ChunkHeader_Comment;
|
|
|
|
|
|
|
|
typedef struct {
|
|
|
|
uint32_t headerSize; // Size of the header
|
|
|
|
uint32_t type; // Type of the Chunk, matches the Entry Type in the TOC
|
2021-10-10 23:16:23 +08:00
|
|
|
uint32_t subtype; // Type specific subtype, Image size
|
2021-10-10 14:39:17 +08:00
|
|
|
uint32_t version; // Version number of the chunk type, =1
|
|
|
|
|
|
|
|
uint32_t width, height; // Width/Height, <=0x7fff
|
|
|
|
uint32_t xhot, yhot; // X/Y hotpoint, <=Width/Height
|
|
|
|
uint32_t delay; // Delay between animation frames in milliseconds
|
2021-10-21 23:39:49 +08:00
|
|
|
HelosGraphics_Color pixels[1]; // Packed ARGB little-endian format pixels, with A at the highest byte (BGRA in byte order), with premultiplied alpha
|
2021-10-10 14:39:17 +08:00
|
|
|
} PACKED xcursor_ChunkHeader_Image;
|
|
|
|
|
|
|
|
|
2021-10-10 23:16:23 +08:00
|
|
|
typedef struct {
|
|
|
|
xcursor_Header * header;
|
|
|
|
uintptr_t size; // size of the file in bytes
|
|
|
|
uintptr_t n; // number of Chunks/TOC Entries
|
|
|
|
xcursor_TOCEntry *toc; // array of TOC Entries
|
|
|
|
} xcursor_Xcursor;
|
|
|
|
|
|
|
|
// cursor->header is 0 if the open failed.
|
|
|
|
void xcursor_LoadMemory(xcursor_Xcursor *cursor, void *file, uintptr_t fileSize);
|
|
|
|
|
|
|
|
|
2021-10-10 14:39:17 +08:00
|
|
|
#ifdef __cplusplus
|
|
|
|
}
|
|
|
|
#endif
|