~ruther/qmk_firmware

a360900fbb87cec0aa721d527b251a3dcc72c671 — Pablo Martínez 1 year, 7 months ago 4e7e824
[Enhancement] QP Getters (#21171)

3 files changed, 174 insertions(+), 25 deletions(-)

M docs/quantum_painter.md
M quantum/painter/qp.c
M quantum/painter/qp.h
M docs/quantum_painter.md => docs/quantum_painter.md +41 -2
@@ 857,13 857,52 @@ void keyboard_post_init_kb(void) {

<!-- tabs:start -->

#### ** Get Geometry **
#### ** Gettters **

These functions allow external code to retrieve the current width, height, rotation, and drawing offsets.

<!-- tabs:start -->

#### ** Width **

```c
uint16_t qp_get_width(painter_device_t device);
```

#### ** Height **

```c
uint16_t qp_get_height(painter_device_t device);
```

#### ** Rotation **

```c
painter_rotation_t qp_get_rotation(painter_device_t device);
```

#### ** Offset X **

```c
uint16_t qp_get_offset_x(painter_device_t device);
```

#### ** Offset Y **

```c
uint16_t qp_get_offset_y(painter_device_t device);
```

##### ** Everything **

Convenience function to call all the previous ones at once.
Note: You can pass `NULL` for the values you are not interested in.

```c
void qp_get_geometry(painter_device_t device, uint16_t *width, uint16_t *height, painter_rotation_t *rotation, uint16_t *offset_x, uint16_t *offset_y);
```

The `qp_get_geometry` function allows external code to retrieve the current width, height, rotation, and drawing offsets.
<!-- tabs:end -->

#### ** Set Viewport Offsets **


M quantum/painter/qp.c => quantum/painter/qp.c +98 -23
@@ 131,49 131,124 @@ bool qp_flush(painter_device_t device) {
}

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// Quantum Painter External API: qp_get_geometry
// Quantum Painter External API: qp_get_*

void qp_get_geometry(painter_device_t device, uint16_t *width, uint16_t *height, painter_rotation_t *rotation, uint16_t *offset_x, uint16_t *offset_y) {
    qp_dprintf("qp_get_geometry: entry\n");
uint16_t qp_get_width(painter_device_t device) {
    qp_dprintf("qp_get_width: entry\n");
    painter_driver_t *driver = (painter_driver_t *)device;

    if (!driver) {
        qp_dprintf("qp_get_geometry: fail (pointer to NULL)\n");
        return;
    if (!driver || !driver->validate_ok) {
        qp_dprintf("qp_get_width: fail (invalid driver)\n");
        return 0;
    }

    uint16_t width;
    switch (driver->rotation) {
        default:
        case QP_ROTATION_0:
        case QP_ROTATION_180:
            width = driver->panel_width;

        case QP_ROTATION_90:
        case QP_ROTATION_270:
            width = driver->panel_height;
    }

    qp_dprintf("qp_get_width: ok\n");
    return width;
}

uint16_t qp_get_height(painter_device_t device) {
    qp_dprintf("qp_get_height: entry\n");
    painter_driver_t *driver = (painter_driver_t *)device;

    if (!driver || !driver->validate_ok) {
        qp_dprintf("qp_get_height: fail (invalid driver)\n");
        return 0;
    }

    uint16_t height;
    switch (driver->rotation) {
        default:
        case QP_ROTATION_0:
        case QP_ROTATION_180:
            if (width) {
                *width = driver->panel_width;
            }
            if (height) {
                *height = driver->panel_height;
            }
            break;
            height = driver->panel_height;

        case QP_ROTATION_90:
        case QP_ROTATION_270:
            if (width) {
                *width = driver->panel_height;
            }
            if (height) {
                *height = driver->panel_width;
            }
            break;
            height = driver->panel_width;
    }

    qp_dprintf("qp_get_height: ok\n");
    return height;
}

painter_rotation_t qp_get_rotation(painter_device_t device) {
    qp_dprintf("qp_get_rotation: entry\n");
    painter_driver_t *driver = (painter_driver_t *)device;

    if (!driver || !driver->validate_ok) {
        qp_dprintf("qp_get_rotation: fail (invalid driver)\n");
        return QP_ROTATION_0;
    }

    qp_dprintf("qp_get_rotation: ok\n");
    return driver->rotation;
}

uint16_t qp_get_offset_x(painter_device_t device) {
    qp_dprintf("qp_get_offset_x: entry\n");
    painter_driver_t *driver = (painter_driver_t *)device;

    if (!driver || !driver->validate_ok) {
        qp_dprintf("qp_get_offset_x: fail (invalid driver)\n");
        return 0;
    }

    qp_dprintf("qp_get_offset_x: ok\n");
    return driver->offset_x;
}

uint16_t qp_get_offset_y(painter_device_t device) {
    qp_dprintf("qp_get_offset_y: entry\n");
    painter_driver_t *driver = (painter_driver_t *)device;

    if (!driver || !driver->validate_ok) {
        qp_dprintf("qp_get_offset_y: fail (invalid driver)\n");
        return 0;
    }

    qp_dprintf("qp_get_offset_y: ok\n");
    return driver->offset_y;
}

void qp_get_geometry(painter_device_t device, uint16_t *width, uint16_t *height, painter_rotation_t *rotation, uint16_t *offset_x, uint16_t *offset_y) {
    qp_dprintf("qp_geometry: entry\n");
    painter_driver_t *driver = (painter_driver_t *)device;

    if (!driver || !driver->validate_ok) {
        qp_dprintf("qp_geometry: fail (invalid driver)\n");
        return;
    }

    if (width) {
        *width = qp_get_width(device);
    }

    if (height) {
        *height = qp_get_height(device);
    }

    if (rotation) {
        *rotation = driver->rotation;
        *rotation = qp_get_rotation(device);
    }

    if (offset_x) {
        *offset_x = driver->offset_x;
        *offset_x = qp_get_offset_x(device);
    }

    if (offset_y) {
        *offset_y = driver->offset_y;
        *offset_y = qp_get_offset_y(device);
    }

    qp_dprintf("qp_get_geometry: ok\n");

M quantum/painter/qp.h => quantum/painter/qp.h +35 -0
@@ 176,6 176,41 @@ bool qp_clear(painter_device_t device);
bool qp_flush(painter_device_t device);

/**
 * Retrieves the width of the display.
 *
 * @param device[in] the handle of the device to control
 */
uint16_t qp_get_width(painter_device_t device);

/**
 * Retrieves the height of the display.
 *
 * @param device[in] the handle of the device to control
 */
uint16_t qp_get_height(painter_device_t device);

/**
 * Retrieves the rotation of the display.
 *
 * @param device[in] the handle of the device to control
 */
painter_rotation_t qp_get_rotation(painter_device_t device);

/**
 * Retrieves the x-offset of the display.
 *
 * @param device[in] the handle of the device to control
 */
uint16_t qp_get_offset_x(painter_device_t device);

/**
 * Retrieves the y-offset of the display.
 *
 * @param device[in] the handle of the device to control
 */
uint16_t qp_get_offset_y(painter_device_t device);

/**
 * Retrieves the size, rotation, and offsets for the display.
 *
 * @note Any arguments of NULL will be ignored.

Do not follow this link