/* Copyright (C) 2007-2008 The Android Open Source Project
**
** This software is licensed under the terms of the GNU General Public
** License version 2, as published by the Free Software Foundation, and
** may be copied, distributed, and modified under those terms.
**
** This program is distributed in the hope that it will be useful,
** but WITHOUT ANY WARRANTY; without even the implied warranty of
** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
** GNU General Public License for more details.
*/
#ifndef _QEMU_FRAMEBUFFER_H_
#define _QEMU_FRAMEBUFFER_H_
/* a simple interface to a framebuffer display. this is to be used by the hardware framebuffer
* driver (e.g. hw/goldfish_fb.c) to send VRAM updates to the emulator.
*
* note the 'rotation' field: it can take values 0, 1, 2 or 3 and corresponds to a rotation
* that must be performed to the pixels stored in the framebuffer *before* displaying them
* a value of 1 corresponds to a rotation of 90 clockwise-degrees, when the framebuffer is
* rotated 90 or 270 degrees, its width/height are swapped automatically
*
* phys_width_mm and phys_height_mm are physical dimensions expressed in millimeters
*
* each QFrameBuffer can have one "client" that reacts to VRAM updates or the framebuffer
* rotations requested by the system.
*/
typedef struct QFrameBuffer QFrameBuffer;
typedef enum {
QFRAME_BUFFER_NONE = 0,
QFRAME_BUFFER_RGB565 = 1,
QFRAME_BUFFER_MAX /* do not remove */
} QFrameBufferFormat;
struct QFrameBuffer {
int width; /* width in pixels */
int height; /* height in pixels */
int pitch; /* bytes per line */
int rotation; /* rotation to be applied when displaying */
QFrameBufferFormat format;
void* pixels; /* pixel buffer */
int phys_width_mm;
int phys_height_mm;
/* extra data that is handled by the framebuffer implementation */
void* extra;
};
/* the default dpi resolution of a typical framebuffer. this is an average between
* various prototypes being used during the development of the Android system...
*/
#define DEFAULT_FRAMEBUFFER_DPI 165
/* initialize a framebuffer object and allocate its pixel buffer */
/* this computes phys_width_mm and phys_height_mm assuming a 165 dpi screen */
/* returns -1 in case of error, 0 otherwise */
extern int
qframebuffer_init( QFrameBuffer* qfbuff,
int width,
int height,
int rotation,
QFrameBufferFormat format );
/* recompute phys_width_mm and phys_height_mm according to the emulated screen DPI settings */
extern void
qframebuffer_set_dpi( QFrameBuffer* qfbuff,
int x_dpi,
int y_dpi );
/* alternative to qframebuffer_set_dpi where one can set the physical dimensions directly */
/* in millimeters. for the record 1 inch = 25.4 mm */
extern void
qframebuffer_set_mm( QFrameBuffer* qfbuff,
int width_mm,
int height_mm );
/* add one client to a given framebuffer */
/* client functions */
typedef void (*QFrameBufferUpdateFunc)( void* opaque, int x, int y, int w, int h );
typedef void (*QFrameBufferRotateFunc)( void* opaque, int rotation );
typedef void (*QFrameBufferDoneFunc) ( void* opaque );
extern void
qframebuffer_add_client( QFrameBuffer* qfbuff,
void* fb_opaque,
QFrameBufferUpdateFunc fb_update,
QFrameBufferRotateFunc fb_rotate,
QFrameBufferDoneFunc fb_done );
/* add one producer to a given framebuffer */
/* producer functions */
typedef void (*QFrameBufferCheckUpdateFunc)( void* opaque );
typedef void (*QFrameBufferInvalidateFunc) ( void* opaque );
typedef void (*QFrameBufferDetachFunc) ( void* opaque );
extern void
qframebuffer_add_producer( QFrameBuffer* qfbuff,
void* opaque,
QFrameBufferCheckUpdateFunc fb_check,
QFrameBufferInvalidateFunc fb_invalidate,
QFrameBufferDetachFunc fb_detach );
/* tell a client that a rectangle region has been updated in the framebuffer pixel buffer */
extern void
qframebuffer_update( QFrameBuffer* qfbuff, int x, int y, int w, int h );
/* rotate the framebuffer (may swap width/height), and tell a client that we did */
extern void
qframebuffer_rotate( QFrameBuffer* qfbuff, int rotation );
/* finalize a framebuffer, release its pixel buffer */
extern void
qframebuffer_done( QFrameBuffer* qfbuff );
/*
* QFrameBuffer objects are created by the emulated system, its characteristics typically
* depend on the current device skin being used.
*
* there are also used by emulated framebuffer devices, who don't know much about all this
*
* use a simple fifo to bridge these together
*/
/* add a new constructed frame buffer object to our global list */
extern void
qframebuffer_fifo_add( QFrameBuffer* qfbuff );
extern QFrameBuffer*
qframebuffer_fifo_get( void );
/*
* check all registered framebuffers for updates. tgus wukk cakk tge ckuebt's update
* functions in the end...
*/
extern void
qframebuffer_check_updates( void );
extern void
qframebuffer_invalidate_all( void );
#endif /* _QEMU_FRAMEBUFFER_H_ */
syntax highlighted by Code2HTML, v. 0.9.1