diff options
Diffstat (limited to 'quantum/painter/qp.c')
| -rw-r--r-- | quantum/painter/qp.c | 123 | 
1 files changed, 100 insertions, 23 deletions
| diff --git a/quantum/painter/qp.c b/quantum/painter/qp.c index f27bb7892a..3759866509 100644 --- a/quantum/painter/qp.c +++ b/quantum/painter/qp.c @@ -12,11 +12,11 @@  // Internal driver validation  static bool validate_driver_vtable(painter_driver_t *driver) { -    return (driver->driver_vtable && driver->driver_vtable->init && driver->driver_vtable->power && driver->driver_vtable->clear && driver->driver_vtable->viewport && driver->driver_vtable->pixdata && driver->driver_vtable->palette_convert && driver->driver_vtable->append_pixels && driver->driver_vtable->append_pixdata) ? true : false; +    return (driver && driver->driver_vtable && driver->driver_vtable->init && driver->driver_vtable->power && driver->driver_vtable->clear && driver->driver_vtable->viewport && driver->driver_vtable->pixdata && driver->driver_vtable->palette_convert && driver->driver_vtable->append_pixels && driver->driver_vtable->append_pixdata) ? true : false;  }  static bool validate_comms_vtable(painter_driver_t *driver) { -    return (driver->comms_vtable && driver->comms_vtable->comms_init && driver->comms_vtable->comms_start && driver->comms_vtable->comms_stop && driver->comms_vtable->comms_send) ? true : false; +    return (driver && driver->comms_vtable && driver->comms_vtable->comms_init && driver->comms_vtable->comms_start && driver->comms_vtable->comms_stop && driver->comms_vtable->comms_send) ? true : false;  }  static bool validate_driver_integrity(painter_driver_t *driver) { @@ -131,49 +131,126 @@ 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; +            break; +        case QP_ROTATION_90: +        case QP_ROTATION_270: +            width = driver->panel_height; +            break;      } +    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; -            } +            height = driver->panel_height;              break;          case QP_ROTATION_90:          case QP_ROTATION_270: -            if (width) { -                *width = driver->panel_height; -            } -            if (height) { -                *height = driver->panel_width; -            } +            height = driver->panel_width;              break;      } +    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"); | 
