72 lines
2.5 KiB
C
72 lines
2.5 KiB
C
|
#pragma once
|
||
|
|
||
|
#include "../../main.h"
|
||
|
#include "../graphics.h"
|
||
|
#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
|
||
|
|
||
|
// 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
|
||
|
uint32_t subtype; // Type specific subtype, Copyright, License or Other
|
||
|
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
|
||
|
HelosGraphics_Color pixels[1]; // Packed ARGB little-endian format pixels, with A at the highest byte (BGRA in byte order)
|
||
|
} PACKED xcursor_ChunkHeader_Image;
|
||
|
|
||
|
|
||
|
#ifdef __cplusplus
|
||
|
}
|
||
|
#endif
|