First version
[3rdparty/ote_partner/tlk.git] / include / lib / gfx.h
1 /*
2  * Copyright (c) 2010 Travis Geiselbrecht
3  *
4  * Permission is hereby granted, free of charge, to any person obtaining
5  * a copy of this software and associated documentation files
6  * (the "Software"), to deal in the Software without restriction,
7  * including without limitation the rights to use, copy, modify, merge,
8  * publish, distribute, sublicense, and/or sell copies of the Software,
9  * and to permit persons to whom the Software is furnished to do so,
10  * subject to the following conditions:
11  *
12  * The above copyright notice and this permission notice shall be
13  * included in all copies or substantial portions of the Software.
14  *
15  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
16  * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
17  * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
18  * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
19  * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
20  * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
21  * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
22  */
23 #ifndef __LIB_GFX_H
24 #define __LIB_GFX_H
25
26 #include <sys/types.h>
27
28 // gfx library
29
30 // different graphics formats
31 typedef enum {
32         GFX_FORMAT_RGB_565,
33         GFX_FORMAT_ARGB_8888,
34         GFX_FORMAT_RGB_x888,
35
36         GFX_FORMAT_MAX
37 } gfx_format;
38
39 #define MAX_ALPHA 255
40
41 /**
42  * @brief  Describe a graphics drawing surface
43  *
44  * The gfx_surface object represents a framebuffer that can be rendered
45  * to.  Elements include a pointer to the actual pixel memory, its size, its
46  * layout, and pointers to basic drawing functions.
47  *
48  * @ingroup graphics
49  */
50 typedef struct gfx_surface {
51         void *ptr;
52         bool free_on_destroy;
53         gfx_format format;
54         uint width;
55         uint height;
56         uint stride;
57         uint pixelsize;
58         size_t len;
59         uint alpha;
60
61         // function pointers
62         void (*copyrect)(struct gfx_surface *, uint x, uint y, uint width, uint height, uint x2, uint y2);
63         void (*fillrect)(struct gfx_surface *, uint x, uint y, uint width, uint height, uint color);
64         void (*putpixel)(struct gfx_surface *, uint x, uint y, uint color);
65         void (*flush)(uint starty, uint endy);
66 } gfx_surface;
67
68 // copy a rect from x,y with width x height to x2, y2
69 void gfx_copyrect(gfx_surface *surface, uint x, uint y, uint width, uint height, uint x2, uint y2);
70
71 // fill a rect within the surface with a color
72 void gfx_fillrect(gfx_surface *surface, uint x, uint y, uint width, uint height, uint color);
73
74 // draw a pixel at x, y in the surface
75 void gfx_putpixel(gfx_surface *surface, uint x, uint y, uint color);
76
77 // clear the entire surface with a color
78 static inline void gfx_clear(gfx_surface *surface, uint color)
79 {
80         surface->fillrect(surface, 0, 0, surface->width, surface->height, color);
81
82         if (surface->flush)
83                 surface->flush(0, surface->height-1);
84 }
85
86 // blend between two surfaces
87 void gfx_surface_blend(struct gfx_surface *target, struct gfx_surface *source, uint destx, uint desty);
88
89 void gfx_flush(struct gfx_surface *surface);
90
91 void gfx_flush_rows(struct gfx_surface *surface, uint start, uint end);
92
93 // surface setup
94 gfx_surface *gfx_create_surface(void *ptr, uint width, uint height, uint stride, gfx_format format);
95
96 // utility routine to make a surface out of a display info
97 struct display_info;
98 gfx_surface *gfx_create_surface_from_display(struct display_info *);
99
100 // free the surface
101 // optionally frees the buffer if the free bit is set
102 void gfx_surface_destroy(struct gfx_surface *surface);
103
104 // utility routine to fill the display with a little moire pattern
105 void gfx_draw_pattern(void);
106
107 #endif
108