logo

qmk_firmware

custom branch of QMK firmware git clone https://anongit.hacktivis.me/git/qmk_firmware.git

qp_draw.h (5562B)


  1. // Copyright 2021 Nick Brassel (@tzarc)
  2. // SPDX-License-Identifier: GPL-2.0-or-later
  3. #pragma once
  4. #include "qp_internal.h"
  5. #include "qp_stream.h"
  6. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  7. // Quantum Painter utility functions
  8. // Global variable used for native pixel data streaming.
  9. extern uint8_t qp_internal_global_pixdata_buffer[QUANTUM_PAINTER_PIXDATA_BUFFER_SIZE];
  10. // Check if the supplied bpp is capable of being rendered
  11. bool qp_internal_bpp_capable(uint8_t bits_per_pixel);
  12. // Returns the number of pixels that can fit in the pixdata buffer
  13. uint32_t qp_internal_num_pixels_in_buffer(painter_device_t device);
  14. // Fills the supplied buffer with equivalent native pixels matching the supplied HSV
  15. void qp_internal_fill_pixdata(painter_device_t device, uint32_t num_pixels, uint8_t hue, uint8_t sat, uint8_t val);
  16. // qp_setpixel internal implementation, but uses the global pixdata buffer with pre-converted native pixel. Only the first pixel is used.
  17. bool qp_internal_setpixel_impl(painter_device_t device, uint16_t x, uint16_t y);
  18. // qp_rect internal implementation, but uses the global pixdata buffer with pre-converted native pixels.
  19. bool qp_internal_fillrect_helper_impl(painter_device_t device, uint16_t l, uint16_t t, uint16_t r, uint16_t b);
  20. // Convert from input pixel data + palette to equivalent pixels
  21. typedef int16_t (*qp_internal_byte_input_callback)(void* cb_arg);
  22. typedef bool (*qp_internal_pixel_output_callback)(qp_pixel_t* palette, uint8_t index, void* cb_arg);
  23. typedef bool (*qp_internal_byte_output_callback)(uint8_t byte, void* cb_arg);
  24. bool qp_internal_decode_palette(painter_device_t device, uint32_t pixel_count, uint8_t bits_per_pixel, qp_internal_byte_input_callback input_callback, void* input_arg, qp_pixel_t* palette, qp_internal_pixel_output_callback output_callback, void* output_arg);
  25. bool qp_internal_decode_grayscale(painter_device_t device, uint32_t pixel_count, uint8_t bits_per_pixel, qp_internal_byte_input_callback input_callback, void* input_arg, qp_internal_pixel_output_callback output_callback, void* output_arg);
  26. bool qp_internal_decode_recolor(painter_device_t device, uint32_t pixel_count, uint8_t bits_per_pixel, qp_internal_byte_input_callback input_callback, void* input_arg, qp_pixel_t fg_hsv888, qp_pixel_t bg_hsv888, qp_internal_pixel_output_callback output_callback, void* output_arg);
  27. bool qp_internal_send_bytes(painter_device_t device, uint32_t byte_count, qp_internal_byte_input_callback input_callback, void* input_arg, qp_internal_byte_output_callback output_callback, void* output_arg);
  28. // Global variable used for interpolated pixel lookup table.
  29. #if QUANTUM_PAINTER_SUPPORTS_256_PALETTE
  30. extern qp_pixel_t qp_internal_global_pixel_lookup_table[256];
  31. #else
  32. extern qp_pixel_t qp_internal_global_pixel_lookup_table[16];
  33. #endif
  34. // Generates a color-interpolated lookup table based off the number of items, from foreground to background, for use with monochrome image rendering.
  35. // Returns true if a palette was created, false if the palette is reused.
  36. // As this uses a global, this may present a problem if using the same parameters but a different screen converts pixels -- use qp_internal_invalidate_palette() below to reset.
  37. bool qp_internal_interpolate_palette(qp_pixel_t fg_hsv888, qp_pixel_t bg_hsv888, int16_t steps);
  38. // Resets the global palette so that it can be regenerated. Only needed if the colors are identical, but a different display is used with a different internal pixel format.
  39. void qp_internal_invalidate_palette(void);
  40. // Helper shared between image and font rendering -- sets up the global palette to match the palette block specified in the asset. Expects the stream to be positioned at the start of the block header.
  41. bool qp_internal_load_qgf_palette(qp_stream_t* stream, uint8_t bpp);
  42. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  43. // Quantum Painter codec functions
  44. enum qp_internal_rle_mode_t {
  45. MARKER_BYTE,
  46. REPEATING_RUN,
  47. NON_REPEATING_RUN,
  48. };
  49. typedef struct qp_internal_byte_input_state_t {
  50. painter_device_t device;
  51. qp_stream_t* src_stream;
  52. int16_t curr;
  53. union {
  54. // RLE-specific
  55. struct {
  56. enum qp_internal_rle_mode_t mode;
  57. uint8_t remain; // number of bytes remaining in the current mode
  58. } rle;
  59. };
  60. } qp_internal_byte_input_state_t;
  61. typedef struct qp_internal_pixel_output_state_t {
  62. painter_device_t device;
  63. uint32_t pixel_write_pos;
  64. uint32_t max_pixels;
  65. } qp_internal_pixel_output_state_t;
  66. bool qp_internal_pixel_appender(qp_pixel_t* palette, uint8_t index, void* cb_arg);
  67. typedef struct qp_internal_byte_output_state_t {
  68. painter_device_t device;
  69. uint32_t byte_write_pos;
  70. uint32_t max_bytes;
  71. } qp_internal_byte_output_state_t;
  72. bool qp_internal_byte_appender(uint8_t byteval, void* cb_arg);
  73. // Helper shared between image and font rendering, sends pixels to the display using:
  74. // - qp_internal_decode_palette + qp_internal_pixel_appender (bpp <= 8)
  75. // - qp_internal_send_bytes (bpp > 8)
  76. bool qp_internal_appender(painter_device_t device, uint8_t bpp, uint32_t pixel_count, qp_internal_byte_input_callback input_callback, void* input_state);
  77. qp_internal_byte_input_callback qp_internal_prepare_input_state(qp_internal_byte_input_state_t* input_state, painter_compression_t compression);