mirror of
https://gitlab.freedesktop.org/wayland/wayland.git
synced 2026-04-04 07:15:53 -04:00
Optimize blur further, resize gears with window.
This commit is contained in:
parent
29590034f4
commit
e9d550bdd4
2 changed files with 32 additions and 46 deletions
|
|
@ -110,7 +110,7 @@ blur_surface(cairo_surface_t *surface, int margin)
|
||||||
uint8_t *src, *dst;
|
uint8_t *src, *dst;
|
||||||
uint32_t *s, *d, a, p;
|
uint32_t *s, *d, a, p;
|
||||||
int i, j, k, size, half;
|
int i, j, k, size, half;
|
||||||
uint8_t kernel[10];
|
uint8_t kernel[17];
|
||||||
double f;
|
double f;
|
||||||
|
|
||||||
size = ARRAY_LENGTH(kernel);
|
size = ARRAY_LENGTH(kernel);
|
||||||
|
|
|
||||||
76
window.c
76
window.c
|
|
@ -68,29 +68,31 @@ draw_window(void *data)
|
||||||
struct window *window = data;
|
struct window *window = data;
|
||||||
cairo_surface_t *surface;
|
cairo_surface_t *surface;
|
||||||
cairo_t *cr;
|
cairo_t *cr;
|
||||||
int border = 2, radius = 5;
|
int border = 2, radius = 5, shadow = 16;
|
||||||
cairo_text_extents_t extents;
|
cairo_text_extents_t extents;
|
||||||
cairo_pattern_t *gradient, *outline, *bright, *dim;
|
cairo_pattern_t *gradient, *outline, *bright, *dim;
|
||||||
struct buffer *buffer;
|
struct buffer *buffer;
|
||||||
const static char title[] = "Wayland First Post";
|
const static char title[] = "Wayland First Post";
|
||||||
|
int width, height;
|
||||||
|
|
||||||
surface = cairo_image_surface_create(CAIRO_FORMAT_RGB24,
|
surface = cairo_image_surface_create(CAIRO_FORMAT_RGB24,
|
||||||
window->width + 32, window->height + 32);
|
window->width + 32, window->height + 32);
|
||||||
|
|
||||||
outline = cairo_pattern_create_rgb(0.1, 0.1, 0.1);
|
outline = cairo_pattern_create_rgb(0.1, 0.1, 0.1);
|
||||||
bright = cairo_pattern_create_rgb(0.6, 0.6, 0.6);
|
bright = cairo_pattern_create_rgb(0.8, 0.8, 0.8);
|
||||||
dim = cairo_pattern_create_rgb(0.4, 0.4, 0.4);
|
dim = cairo_pattern_create_rgb(0.4, 0.4, 0.4);
|
||||||
|
|
||||||
cr = cairo_create(surface);
|
cr = cairo_create(surface);
|
||||||
|
|
||||||
cairo_translate(cr, 16 + 7, 16 + 5);
|
cairo_translate(cr, shadow + 7, shadow + 5);
|
||||||
cairo_set_line_width (cr, border);
|
cairo_set_line_width (cr, border);
|
||||||
cairo_set_source_rgba(cr, 0, 0, 0, 0.5);
|
cairo_set_source_rgba(cr, 0, 0, 0, 0.7);
|
||||||
rounded_rect(cr, 0, 0, window->width, window->height, radius);
|
rounded_rect(cr, 0, 0, window->width, window->height, radius);
|
||||||
cairo_fill(cr);
|
cairo_fill(cr);
|
||||||
blur_surface(surface, 24 + radius);
|
blur_surface(surface, 24 + radius);
|
||||||
|
|
||||||
cairo_translate(cr, -5, -3);
|
#if 1
|
||||||
|
cairo_translate(cr, -7, -5);
|
||||||
cairo_set_line_width (cr, border);
|
cairo_set_line_width (cr, border);
|
||||||
rounded_rect(cr, 1, 1, window->width - 1, window->height - 1, radius);
|
rounded_rect(cr, 1, 1, window->width - 1, window->height - 1, radius);
|
||||||
cairo_set_source(cr, outline);
|
cairo_set_source(cr, outline);
|
||||||
|
|
@ -104,8 +106,8 @@ draw_window(void *data)
|
||||||
|
|
||||||
rounded_rect(cr, 2, 2, window->width - 2, window->height - 2, radius - 1);
|
rounded_rect(cr, 2, 2, window->width - 2, window->height - 2, radius - 1);
|
||||||
gradient = cairo_pattern_create_linear (0, 0, 0, 100);
|
gradient = cairo_pattern_create_linear (0, 0, 0, 100);
|
||||||
cairo_pattern_add_color_stop_rgb(gradient, 0, 0.4, 0.4, 0.4);
|
cairo_pattern_add_color_stop_rgb(gradient, 0, 0.6, 0.6, 0.4);
|
||||||
cairo_pattern_add_color_stop_rgb(gradient, 1, 0.7, 0.7, 0.7);
|
cairo_pattern_add_color_stop_rgb(gradient, 1, 0.8, 0.8, 0.7);
|
||||||
cairo_set_source(cr, gradient);
|
cairo_set_source(cr, gradient);
|
||||||
cairo_fill(cr);
|
cairo_fill(cr);
|
||||||
cairo_pattern_destroy(gradient);
|
cairo_pattern_destroy(gradient);
|
||||||
|
|
@ -127,14 +129,6 @@ draw_window(void *data)
|
||||||
cairo_set_source(cr, bright);
|
cairo_set_source(cr, bright);
|
||||||
cairo_stroke(cr);
|
cairo_stroke(cr);
|
||||||
|
|
||||||
cairo_move_to(cr, 10, 50);
|
|
||||||
cairo_line_to(cr, window->width - 10, 50);
|
|
||||||
cairo_line_to(cr, window->width - 10, window->height - 10);
|
|
||||||
cairo_line_to(cr, 10, window->height - 10);
|
|
||||||
cairo_close_path(cr);
|
|
||||||
cairo_set_source_rgba(cr, 0, 0, 0, 0.9);
|
|
||||||
cairo_fill(cr);
|
|
||||||
|
|
||||||
cairo_set_operator(cr, CAIRO_OPERATOR_OVER);
|
cairo_set_operator(cr, CAIRO_OPERATOR_OVER);
|
||||||
cairo_set_font_size(cr, 14);
|
cairo_set_font_size(cr, 14);
|
||||||
cairo_text_extents(cr, title, &extents);
|
cairo_text_extents(cr, title, &extents);
|
||||||
|
|
@ -147,6 +141,7 @@ draw_window(void *data)
|
||||||
cairo_stroke_preserve(cr);
|
cairo_stroke_preserve(cr);
|
||||||
cairo_set_source_rgb(cr, 1, 1, 1);
|
cairo_set_source_rgb(cr, 1, 1, 1);
|
||||||
cairo_fill(cr);
|
cairo_fill(cr);
|
||||||
|
#endif
|
||||||
cairo_destroy(cr);
|
cairo_destroy(cr);
|
||||||
if (window->buffer != NULL)
|
if (window->buffer != NULL)
|
||||||
buffer_destroy(window->buffer, window->fd);
|
buffer_destroy(window->buffer, window->fd);
|
||||||
|
|
@ -164,11 +159,25 @@ draw_window(void *data)
|
||||||
|
|
||||||
/* FIXME: Free window->buffer when we receive the ack event. */
|
/* FIXME: Free window->buffer when we receive the ack event. */
|
||||||
|
|
||||||
buffer = window->egl_buffer;
|
width = window->width - 20;
|
||||||
|
height = window->height - 60;
|
||||||
|
buffer = buffer_create(window->fd, width, height, (width * 4 + 15) & ~15);
|
||||||
|
window->egl_buffer = buffer;
|
||||||
|
window->egl_surface = eglCreateSurfaceForName(window->display,
|
||||||
|
window->config, buffer->name,
|
||||||
|
buffer->width, buffer->height,
|
||||||
|
buffer->stride, NULL);
|
||||||
|
if (!eglMakeCurrent(window->display,
|
||||||
|
window->egl_surface, window->egl_surface, window->context))
|
||||||
|
die("failed to make context current\n");
|
||||||
|
|
||||||
|
glViewport(0, 0, width, height);
|
||||||
|
|
||||||
|
if (window->gears == NULL)
|
||||||
|
window->gears = gears_create(0, 0, 0, 0.92);
|
||||||
|
|
||||||
gears_draw(window->gears, window->gears_angle);
|
gears_draw(window->gears, window->gears_angle);
|
||||||
wl_surface_copy(window->surface,
|
wl_surface_copy(window->surface, 10 + shadow, 50 + shadow,
|
||||||
(window->width - 300) / 2,
|
|
||||||
50 + (window->height - 50 - 300) / 2,
|
|
||||||
buffer->name, buffer->stride,
|
buffer->name, buffer->stride,
|
||||||
0, 0, buffer->width, buffer->height);
|
0, 0, buffer->width, buffer->height);
|
||||||
|
|
||||||
|
|
@ -269,8 +278,7 @@ window_create(struct wl_display *display, int fd)
|
||||||
EGLint major, minor, count;
|
EGLint major, minor, count;
|
||||||
EGLConfig configs[64];
|
EGLConfig configs[64];
|
||||||
struct window *window;
|
struct window *window;
|
||||||
struct buffer *buffer;
|
const GLfloat red = 0, green = 0, blue = 0, alpha = 0.92;
|
||||||
const GLfloat red = 0, green = 0, blue = 0, alpha = 0.9;
|
|
||||||
|
|
||||||
window = malloc(sizeof *window);
|
window = malloc(sizeof *window);
|
||||||
if (window == NULL)
|
if (window == NULL)
|
||||||
|
|
@ -301,27 +309,6 @@ window_create(struct wl_display *display, int fd)
|
||||||
if (window->context == NULL)
|
if (window->context == NULL)
|
||||||
die("failed to create context\n");
|
die("failed to create context\n");
|
||||||
|
|
||||||
/* FIXME: We need to get the stride right here in a chipset
|
|
||||||
* independent way. Maybe do it in name_cairo_surface(). */
|
|
||||||
buffer = buffer_create(window->fd, 300, 300, (300 * 4 + 15) & ~15);
|
|
||||||
window->egl_buffer = buffer;
|
|
||||||
window->egl_surface = eglCreateSurfaceForName(window->display,
|
|
||||||
window->config, buffer->name,
|
|
||||||
buffer->width, buffer->height,
|
|
||||||
buffer->stride, NULL);
|
|
||||||
|
|
||||||
if (window->egl_surface == NULL)
|
|
||||||
die("failed to create egl surface\n");
|
|
||||||
|
|
||||||
if (!eglMakeCurrent(window->display,
|
|
||||||
window->egl_surface, window->egl_surface, window->context))
|
|
||||||
die("failed to make context current\n");
|
|
||||||
|
|
||||||
glViewport(0, 0, 300, 300);
|
|
||||||
|
|
||||||
window->gears = gears_create(red, green, blue, alpha);
|
|
||||||
window->gears_angle = 0.0;
|
|
||||||
|
|
||||||
draw_window(window);
|
draw_window(window);
|
||||||
|
|
||||||
return window;
|
return window;
|
||||||
|
|
@ -332,15 +319,14 @@ draw(gpointer data)
|
||||||
{
|
{
|
||||||
struct window *window = data;
|
struct window *window = data;
|
||||||
struct buffer *buffer;
|
struct buffer *buffer;
|
||||||
|
int shadow = 16;
|
||||||
|
|
||||||
if (!window->redraw_scheduled) {
|
if (!window->redraw_scheduled) {
|
||||||
gears_draw(window->gears, window->gears_angle);
|
gears_draw(window->gears, window->gears_angle);
|
||||||
|
|
||||||
buffer = window->egl_buffer;
|
buffer = window->egl_buffer;
|
||||||
wl_surface_copy(window->surface,
|
wl_surface_copy(window->surface,
|
||||||
(window->width - 300) / 2,
|
10 + shadow, 50 + shadow,
|
||||||
50 + (window->height - 50 - 300) / 2,
|
|
||||||
buffer->name, buffer->stride,
|
buffer->name, buffer->stride,
|
||||||
0, 0, buffer->width, buffer->height);
|
0, 0, buffer->width, buffer->height);
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue