18b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/* Copyright (C) 2007-2008 The Android Open Source Project
28b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project**
38b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project** This software is licensed under the terms of the GNU General Public
48b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project** License version 2, as published by the Free Software Foundation, and
58b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project** may be copied, distributed, and modified under those terms.
68b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project**
78b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project** This program is distributed in the hope that it will be useful,
88b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project** but WITHOUT ANY WARRANTY; without even the implied warranty of
98b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
108b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project** GNU General Public License for more details.
118b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project*/
12e3fdd075ed97085b4201cb0c79609633b19bddccDavid 'Digit' Turner#include "android/framebuffer.h"
138b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#include <memory.h>
148b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#include <stdlib.h>
158b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
168b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projecttypedef struct {
178b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    /* client fields, these correspond to code that waits for updates before displaying them */
188b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    /* at the moment, only one client is supported */
198b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    void*                        fb_opaque;
208b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    QFrameBufferUpdateFunc       fb_update;
218b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    QFrameBufferRotateFunc       fb_rotate;
22055ae42d36d9d78a7920f66ee2df485d81d24264David 'Digit' Turner    QFrameBufferPollFunc         fb_poll;
238b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    QFrameBufferDoneFunc         fb_done;
248b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
258b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    void*                        pr_opaque;
268b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    QFrameBufferCheckUpdateFunc  pr_check;
278b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    QFrameBufferInvalidateFunc   pr_invalidate;
288b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    QFrameBufferDetachFunc       pr_detach;
298b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
308b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} QFrameBufferExtra;
318b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
328b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
338b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectstatic int
348b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project_get_pitch( int  width, QFrameBufferFormat  format )
358b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{
368b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
378b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    switch (format) {
388b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        case QFRAME_BUFFER_RGB565:
398b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            return width*2;
4097d795c955f8d261a0a5294d49ea06d5a473ed03David 'Digit' Turner        case QFRAME_BUFFER_RGBX_8888:
4197d795c955f8d261a0a5294d49ea06d5a473ed03David 'Digit' Turner            return width*4;
428b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        default:
438b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            return -1;
448b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    }
458b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project}
468b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
47e95660aadc669784406d5f5a867988b8ecc2ed0dVladimir Chtchetkinestatic int
48e95660aadc669784406d5f5a867988b8ecc2ed0dVladimir Chtchetkine_get_bits_per_pixel(QFrameBufferFormat  format)
49e95660aadc669784406d5f5a867988b8ecc2ed0dVladimir Chtchetkine{
50e95660aadc669784406d5f5a867988b8ecc2ed0dVladimir Chtchetkine
51e95660aadc669784406d5f5a867988b8ecc2ed0dVladimir Chtchetkine    switch (format) {
52e95660aadc669784406d5f5a867988b8ecc2ed0dVladimir Chtchetkine        case QFRAME_BUFFER_RGB565:
53e95660aadc669784406d5f5a867988b8ecc2ed0dVladimir Chtchetkine            return 16;
5497d795c955f8d261a0a5294d49ea06d5a473ed03David 'Digit' Turner        case QFRAME_BUFFER_RGBX_8888:
5597d795c955f8d261a0a5294d49ea06d5a473ed03David 'Digit' Turner            return 32;
56e95660aadc669784406d5f5a867988b8ecc2ed0dVladimir Chtchetkine        default:
57e95660aadc669784406d5f5a867988b8ecc2ed0dVladimir Chtchetkine            return -1;
58e95660aadc669784406d5f5a867988b8ecc2ed0dVladimir Chtchetkine    }
59e95660aadc669784406d5f5a867988b8ecc2ed0dVladimir Chtchetkine}
60e95660aadc669784406d5f5a867988b8ecc2ed0dVladimir Chtchetkine
61e95660aadc669784406d5f5a867988b8ecc2ed0dVladimir Chtchetkinestatic int
62e95660aadc669784406d5f5a867988b8ecc2ed0dVladimir Chtchetkine_get_bytes_per_pixel(QFrameBufferFormat  format)
63e95660aadc669784406d5f5a867988b8ecc2ed0dVladimir Chtchetkine{
64e95660aadc669784406d5f5a867988b8ecc2ed0dVladimir Chtchetkine
65e95660aadc669784406d5f5a867988b8ecc2ed0dVladimir Chtchetkine    switch (format) {
66e95660aadc669784406d5f5a867988b8ecc2ed0dVladimir Chtchetkine        case QFRAME_BUFFER_RGB565:
67e95660aadc669784406d5f5a867988b8ecc2ed0dVladimir Chtchetkine            return 2;
6897d795c955f8d261a0a5294d49ea06d5a473ed03David 'Digit' Turner        case QFRAME_BUFFER_RGBX_8888:
6997d795c955f8d261a0a5294d49ea06d5a473ed03David 'Digit' Turner            return 4;
70e95660aadc669784406d5f5a867988b8ecc2ed0dVladimir Chtchetkine        default:
71e95660aadc669784406d5f5a867988b8ecc2ed0dVladimir Chtchetkine            return -1;
72e95660aadc669784406d5f5a867988b8ecc2ed0dVladimir Chtchetkine    }
73e95660aadc669784406d5f5a867988b8ecc2ed0dVladimir Chtchetkine}
748b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
758b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectint
768b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectqframebuffer_init( QFrameBuffer*       qfbuff,
778b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                   int                 width,
788b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                   int                 height,
798b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                   int                 rotation,
808b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                   QFrameBufferFormat  format )
818b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{
82e95660aadc669784406d5f5a867988b8ecc2ed0dVladimir Chtchetkine    int   pitch, bytes_per_pixel, bits_per_pixel;
838b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
848b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    rotation &= 3;
858b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
868b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    if (!qfbuff || width < 0 || height < 0)
878b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        return -1;
888b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
898b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    pitch = _get_pitch( width, format );
908b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    if (pitch < 0)
918b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        return -1;
928b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
9397d795c955f8d261a0a5294d49ea06d5a473ed03David 'Digit' Turner    bits_per_pixel = _get_bits_per_pixel(format);
9497d795c955f8d261a0a5294d49ea06d5a473ed03David 'Digit' Turner    if (bits_per_pixel < 0)
9597d795c955f8d261a0a5294d49ea06d5a473ed03David 'Digit' Turner        return -1;
96e95660aadc669784406d5f5a867988b8ecc2ed0dVladimir Chtchetkine
9797d795c955f8d261a0a5294d49ea06d5a473ed03David 'Digit' Turner    bytes_per_pixel = _get_bytes_per_pixel(format);
98e95660aadc669784406d5f5a867988b8ecc2ed0dVladimir Chtchetkine    if (bytes_per_pixel < 0)
99e95660aadc669784406d5f5a867988b8ecc2ed0dVladimir Chtchetkine        return -1;
100e95660aadc669784406d5f5a867988b8ecc2ed0dVladimir Chtchetkine
1018b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    memset( qfbuff, 0, sizeof(*qfbuff) );
1028b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
1038b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    qfbuff->extra = calloc( 1, sizeof(QFrameBufferExtra) );
1048b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    if (qfbuff->extra == NULL)
1058b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        return -1;
1068b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
1078b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    qfbuff->pixels = calloc( pitch, height );
1088b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    if (qfbuff->pixels == NULL && (height > 0 && pitch > 0)) {
1098b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        free( qfbuff->extra );
1108b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        return -1;
1118b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    }
1128b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
1138b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    qfbuff->width  = width;
1148b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    qfbuff->height = height;
1158b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    qfbuff->pitch  = pitch;
1168b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    qfbuff->format = format;
117e95660aadc669784406d5f5a867988b8ecc2ed0dVladimir Chtchetkine    qfbuff->bits_per_pixel = bits_per_pixel;
118e95660aadc669784406d5f5a867988b8ecc2ed0dVladimir Chtchetkine    qfbuff->bytes_per_pixel = bytes_per_pixel;
1198b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
1208b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    qframebuffer_set_dpi( qfbuff, DEFAULT_FRAMEBUFFER_DPI, DEFAULT_FRAMEBUFFER_DPI );
1218b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    return 0;
1228b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project}
1238b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
1248b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
1258b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectvoid
1268b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectqframebuffer_set_dpi( QFrameBuffer*   qfbuff,
1278b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                      int             x_dpi,
1288b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                      int             y_dpi )
1298b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{
1308b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    /* dpi = dots / inch
1318b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    ** inch = dots / dpi
1328b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    ** mm / 25.4 = dots / dpi
1338b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    ** mm = (dots * 25.4)/dpi
1348b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    */
1358b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    qfbuff->phys_width_mm  = (int)(0.5 + 25.4 * qfbuff->width  / x_dpi);
1368b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    qfbuff->phys_height_mm = (int)(0.5 + 25.4 * qfbuff->height / y_dpi);
1378b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project}
1388b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
1398b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/* alternative to qframebuffer_set_dpi where one can set the physical dimensions directly */
1408b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/* in millimeters. for the record 1 inch = 25.4 mm */
1418b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectvoid
1428b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectqframebuffer_set_mm( QFrameBuffer*   qfbuff,
1438b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                     int             width_mm,
1448b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                     int             height_mm )
1458b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{
1468b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    qfbuff->phys_width_mm  = width_mm;
1478b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    qfbuff->phys_height_mm = height_mm;
1488b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project}
1498b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
1508b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectvoid
1518b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectqframebuffer_update( QFrameBuffer*  qfbuff, int  x, int  y, int  w, int  h )
1528b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{
1538b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    QFrameBufferExtra*  extra = qfbuff->extra;
1548b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
1558b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    if (extra->fb_update)
1568b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        extra->fb_update( extra->fb_opaque, x, y, w, h );
1578b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project}
1588b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
1598b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
1608b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectvoid
1618b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectqframebuffer_add_client( QFrameBuffer*           qfbuff,
1628b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                         void*                   fb_opaque,
1638b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                         QFrameBufferUpdateFunc  fb_update,
1648b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                         QFrameBufferRotateFunc  fb_rotate,
165055ae42d36d9d78a7920f66ee2df485d81d24264David 'Digit' Turner                         QFrameBufferPollFunc    fb_poll,
1668b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                         QFrameBufferDoneFunc    fb_done )
1678b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{
1688b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    QFrameBufferExtra*  extra = qfbuff->extra;
1698b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
1708b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    extra->fb_opaque = fb_opaque;
1718b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    extra->fb_update = fb_update;
1728b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    extra->fb_rotate = fb_rotate;
173055ae42d36d9d78a7920f66ee2df485d81d24264David 'Digit' Turner    extra->fb_poll   = fb_poll;
1748b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    extra->fb_done   = fb_done;
1758b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project}
1768b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
1778b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectvoid
1788b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectqframebuffer_set_producer( QFrameBuffer*                qfbuff,
1798b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                           void*                        opaque,
1808b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                           QFrameBufferCheckUpdateFunc  pr_check,
1818b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                           QFrameBufferInvalidateFunc   pr_invalidate,
1828b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                           QFrameBufferDetachFunc       pr_detach )
1838b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{
1848b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    QFrameBufferExtra*  extra = qfbuff->extra;
1858b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
1868b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    extra->pr_opaque     = opaque;
1878b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    extra->pr_check      = pr_check;
1888b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    extra->pr_invalidate = pr_invalidate;
1898b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    extra->pr_detach     = pr_detach;
1908b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project}
1918b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
1928b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
1938b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectvoid
1948b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectqframebuffer_rotate( QFrameBuffer*  qfbuff, int  rotation )
1958b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{
1968b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    QFrameBufferExtra*  extra = qfbuff->extra;
1978b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
1988b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    if ((rotation ^ qfbuff->rotation) & 1) {
1998b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        /* swap width and height if new rotation requires it */
2008b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        int  temp = qfbuff->width;
2018b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        qfbuff->width  = qfbuff->height;
2028b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        qfbuff->height = temp;
2038b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        qfbuff->pitch  = _get_pitch( qfbuff->width, qfbuff->format );
2048b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
2058b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        temp = qfbuff->phys_width_mm;
2068b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        qfbuff->phys_width_mm  = qfbuff->phys_height_mm;
2078b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        qfbuff->phys_height_mm = temp;
2088b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    }
2098b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    qfbuff->rotation = rotation;
2108b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
2118b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    if (extra->fb_rotate)
2128b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        extra->fb_rotate( extra->fb_opaque, rotation );
2138b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project}
2148b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
215055ae42d36d9d78a7920f66ee2df485d81d24264David 'Digit' Turnervoid
216055ae42d36d9d78a7920f66ee2df485d81d24264David 'Digit' Turnerqframebuffer_poll( QFrameBuffer* qfbuff )
217055ae42d36d9d78a7920f66ee2df485d81d24264David 'Digit' Turner{
218055ae42d36d9d78a7920f66ee2df485d81d24264David 'Digit' Turner    QFrameBufferExtra*  extra = qfbuff->extra;
219055ae42d36d9d78a7920f66ee2df485d81d24264David 'Digit' Turner
22073f31662e687ea96d579ce9dca45c640b930985fDavid 'Digit' Turner    if (extra && extra->fb_poll)
221055ae42d36d9d78a7920f66ee2df485d81d24264David 'Digit' Turner        extra->fb_poll( extra->fb_opaque );
222055ae42d36d9d78a7920f66ee2df485d81d24264David 'Digit' Turner}
223055ae42d36d9d78a7920f66ee2df485d81d24264David 'Digit' Turner
2248b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
2258b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectextern void
2268b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectqframebuffer_done( QFrameBuffer*   qfbuff )
2278b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{
2288b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    QFrameBufferExtra*  extra = qfbuff->extra;
2298b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
2308b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    if (extra) {
2318b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        if (extra->pr_detach)
2328b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            extra->pr_detach( extra->pr_opaque );
2338b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
2348b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        if (extra->fb_done)
2358b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            extra->fb_done( extra->fb_opaque );
2368b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    }
2378b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
2388b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    free( qfbuff->pixels );
2398b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    free( qfbuff->extra );
2408b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    memset( qfbuff, 0, sizeof(*qfbuff) );
2418b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project}
2428b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
2438b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
2448b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define  MAX_FRAME_BUFFERS  8
2458b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
2468b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectstatic QFrameBuffer* framebuffer_fifo[ MAX_FRAME_BUFFERS ];
2478b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectstatic int           framebuffer_fifo_rpos;
2488b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectstatic int           framebuffer_fifo_count;
2498b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
2508b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectvoid
2518b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectqframebuffer_fifo_add( QFrameBuffer*  qfbuff )
2528b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{
2538b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    if (framebuffer_fifo_count >= MAX_FRAME_BUFFERS)
2548b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        return;
2558b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
2568b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    framebuffer_fifo[ framebuffer_fifo_count++ ] = qfbuff;
2578b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project}
2588b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
2598b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
2608b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source ProjectQFrameBuffer*
2618b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectqframebuffer_fifo_get( void )
2628b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{
2638b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    if (framebuffer_fifo_rpos >= framebuffer_fifo_count)
2648b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        return NULL;
2658b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
2668b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    return framebuffer_fifo[ framebuffer_fifo_rpos++ ];
2678b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project}
2688b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
2698b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
2708b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectvoid
2718b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectqframebuffer_check_updates( void )
2728b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{
2738b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    int  nn;
2748b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    for (nn = 0; nn < framebuffer_fifo_count; nn++) {
2758b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        QFrameBuffer*       q     = framebuffer_fifo[nn];
2768b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        QFrameBufferExtra*  extra = q->extra;
2778b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
2788b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        if (extra->pr_check)
2798b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            extra->pr_check( extra->pr_opaque );
2808b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    }
2818b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project}
2828b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
2838b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectvoid
28407db34976ba1dd045a51c4ab2c7f52479cddcc57David 'Digit' Turnerqframebuffer_pulse( void )
28507db34976ba1dd045a51c4ab2c7f52479cddcc57David 'Digit' Turner{
28607db34976ba1dd045a51c4ab2c7f52479cddcc57David 'Digit' Turner    int  nn;
28707db34976ba1dd045a51c4ab2c7f52479cddcc57David 'Digit' Turner    for (nn = 0; nn < framebuffer_fifo_count; nn++) {
28807db34976ba1dd045a51c4ab2c7f52479cddcc57David 'Digit' Turner        qframebuffer_poll(framebuffer_fifo[nn]);
28907db34976ba1dd045a51c4ab2c7f52479cddcc57David 'Digit' Turner    }
29007db34976ba1dd045a51c4ab2c7f52479cddcc57David 'Digit' Turner}
29107db34976ba1dd045a51c4ab2c7f52479cddcc57David 'Digit' Turner
29207db34976ba1dd045a51c4ab2c7f52479cddcc57David 'Digit' Turnervoid
2938b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectqframebuffer_invalidate_all( void )
2948b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{
2958b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    int  nn;
2968b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    for (nn = 0; nn < framebuffer_fifo_count; nn++) {
2978b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        QFrameBuffer*       q     = framebuffer_fifo[nn];
2988b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        QFrameBufferExtra*  extra = q->extra;
2998b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
3008b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        if (extra->pr_invalidate)
3018b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            extra->pr_invalidate( extra->pr_opaque );
3028b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    }
3038b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project}
304