105 lines
3.2 KiB
C
105 lines
3.2 KiB
C
/*
|
|
* Copyright (C) 2017 Kovid Goyal <kovid at kovidgoyal.net>
|
|
*
|
|
* Distributed under terms of the GPL3 license.
|
|
*/
|
|
|
|
#pragma once
|
|
#include "data-types.h"
|
|
#include "monotonic.h"
|
|
|
|
typedef struct {
|
|
unsigned char action, transmission_type, compressed, delete_action;
|
|
uint32_t format, more, id, data_sz, data_offset, placement_id;
|
|
uint32_t width, height, x_offset, y_offset, data_height, data_width, num_cells, num_lines, cell_x_offset, cell_y_offset;
|
|
int32_t z_index;
|
|
size_t payload_sz;
|
|
} GraphicsCommand;
|
|
|
|
typedef struct {
|
|
uint8_t *buf;
|
|
size_t buf_capacity, buf_used;
|
|
|
|
uint8_t *mapped_file;
|
|
size_t mapped_file_sz;
|
|
|
|
size_t data_sz;
|
|
uint8_t *data;
|
|
bool is_4byte_aligned;
|
|
bool is_opaque;
|
|
} LoadData;
|
|
|
|
typedef struct {
|
|
float left, top, right, bottom;
|
|
} ImageRect;
|
|
|
|
typedef struct {
|
|
uint32_t src_width, src_height, src_x, src_y;
|
|
uint32_t cell_x_offset, cell_y_offset, num_cols, num_rows, effective_num_rows, effective_num_cols;
|
|
int32_t z_index;
|
|
int32_t start_row, start_column;
|
|
uint32_t client_id;
|
|
ImageRect src_rect;
|
|
} ImageRef;
|
|
|
|
|
|
typedef struct {
|
|
uint32_t texture_id, client_id, width, height;
|
|
id_type internal_id;
|
|
|
|
bool data_loaded;
|
|
LoadData load_data;
|
|
|
|
ImageRef *refs;
|
|
size_t refcnt, refcap;
|
|
monotonic_t atime;
|
|
size_t used_storage;
|
|
} Image;
|
|
|
|
typedef struct {
|
|
uint32_t texture_id;
|
|
unsigned int height, width;
|
|
uint8_t* bitmap;
|
|
uint32_t refcnt;
|
|
} BackgroundImage;
|
|
|
|
typedef struct {
|
|
float vertices[16];
|
|
uint32_t texture_id, group_count;
|
|
int z_index;
|
|
id_type image_id;
|
|
} ImageRenderData;
|
|
|
|
typedef struct {
|
|
PyObject_HEAD
|
|
|
|
size_t image_count, images_capacity;
|
|
id_type loading_image;
|
|
GraphicsCommand last_init_graphics_command;
|
|
Image *images;
|
|
size_t count, capacity;
|
|
ImageRenderData *render_data;
|
|
bool layers_dirty;
|
|
// The number of images below MIN_ZINDEX / 2, then the number of refs between MIN_ZINDEX / 2 and -1 inclusive, then the number of refs above 0 inclusive.
|
|
size_t num_of_below_refs, num_of_negative_refs, num_of_positive_refs;
|
|
unsigned int last_scrolled_by;
|
|
size_t used_storage;
|
|
} GraphicsManager;
|
|
|
|
|
|
typedef struct {
|
|
int32_t amt, limit;
|
|
index_type margin_top, margin_bottom;
|
|
bool has_margins;
|
|
} ScrollData;
|
|
|
|
GraphicsManager* grman_alloc(void);
|
|
void grman_clear(GraphicsManager*, bool, CellPixelSize fg);
|
|
const char* grman_handle_command(GraphicsManager *self, const GraphicsCommand *g, const uint8_t *payload, Cursor *c, bool *is_dirty, CellPixelSize fg);
|
|
bool grman_update_layers(GraphicsManager *self, unsigned int scrolled_by, float screen_left, float screen_top, float dx, float dy, unsigned int num_cols, unsigned int num_rows, CellPixelSize);
|
|
void grman_scroll_images(GraphicsManager *self, const ScrollData*, CellPixelSize fg);
|
|
void grman_resize(GraphicsManager*, index_type, index_type, index_type, index_type);
|
|
void grman_rescale(GraphicsManager *self, CellPixelSize fg);
|
|
void gpu_data_for_centered_image(ImageRenderData *ans, unsigned int screen_width_px, unsigned int screen_height_px, unsigned int width, unsigned int height);
|
|
bool png_path_to_bitmap(const char *path, uint8_t** data, unsigned int* width, unsigned int* height, size_t* sz);
|