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