Remove drop-shadow code.

This commit is contained in:
Cody Russell
2010-05-19 15:31:48 -05:00
parent 74352ac616
commit f48314129a

View File

@@ -26,7 +26,6 @@
#include "config.h"
#include <math.h>
#include <pixman.h>
#include <stdlib.h>
#include <string.h>
#include <gobject/gvaluecollector.h>
@@ -3492,244 +3491,6 @@ option_menu_get_props (GtkWidget *widget,
*indicator_spacing = default_option_indicator_spacing;
}
/* gaussian blur kernel */
static pixman_fixed_t *
create_blur_kernel (gint radius,
gint *length)
{
const gdouble radiusf = fabs (radius) + 1.0f;
const gdouble sigma = sqrt (-(radiusf * radiusf) / (2.0f * log (1.0f / 255.0f)));
const gdouble scale2 = 2.0f * sigma * sigma;
const gdouble scale1 = 1.0f / (G_PI * scale2);
const gint size = 2 * radius + 1;
const gint n_params = size * size;
pixman_fixed_t *params;
gdouble *tmp;
gdouble sum;
gint x;
gint y;
gint i;
tmp = g_newa (double, n_params);
for (i = 0, sum = 0, x = -radius; x <= radius; ++x)
{
for (y = -radius; y <= radius; ++y, ++i)
{
const gdouble u = x * x;
const gdouble v = y * y;
tmp[i] = scale1 * exp (-(u + v) / scale2);
sum += tmp[i];
}
}
params = g_new (pixman_fixed_t, n_params + 2);
params[0] = pixman_int_to_fixed (size);
params[1] = pixman_int_to_fixed (size);
for (i = 0; i < n_params; ++i)
params[2 + i] = pixman_double_to_fixed (tmp[i] / sum);
if (length)
*length = n_params + 2;
return params;
}
static void
blur_image_surface (cairo_surface_t *surface,
gint radius)
{
cairo_format_t format;
pixman_fixed_t *params = NULL;
gint n_params;
pixman_image_t *src;
gint w;
gint h;
gint s;
gpointer p;
if (radius == 0 ||
cairo_surface_status (surface) != CAIRO_STATUS_SUCCESS ||
cairo_surface_get_type (surface) != CAIRO_SURFACE_TYPE_IMAGE)
{
return;
}
format = cairo_image_surface_get_format (surface);
if (format != CAIRO_FORMAT_A8 &&
format != CAIRO_FORMAT_RGB24 &&
format != CAIRO_FORMAT_ARGB32)
{
return;
}
cairo_surface_flush (surface);
w = cairo_image_surface_get_width (surface);
h = cairo_image_surface_get_height (surface);
s = cairo_image_surface_get_stride (surface);
p = cairo_image_surface_get_data (surface);
src = pixman_image_create_bits (PIXMAN_a8r8g8b8, w, h, p, s);
params = create_blur_kernel (radius, &n_params);
pixman_image_set_filter (src,
PIXMAN_FILTER_CONVOLUTION,
params,
n_params);
g_free (params);
pixman_image_composite (PIXMAN_OP_SRC,
src,
NULL,
src,
0, 0,
0, 0,
0, 0,
w, h);
pixman_image_unref (src);
cairo_surface_mark_dirty (surface);
}
typedef struct _TileData
{
guchar *data;
cairo_format_t format;
gint width;
gint height;
gint stride;
} TileData;
/* XXX - leak */
static TileData *tile = NULL;
static void
paint_window_shadow (cairo_t *cr,
gint width,
gint height,
gint shadow_radius,
gint corner_radius)
{
cairo_surface_t *tmp_surface = NULL;
cairo_surface_t *new_surface = NULL;
cairo_pattern_t *pattern = NULL;
cairo_t *cr_surf = NULL;
cairo_matrix_t matrix;
if (!tile)
{
guchar *data;
tmp_surface = cairo_image_surface_create (CAIRO_FORMAT_ARGB32,
4 * shadow_radius,
4 * shadow_radius);
if (cairo_surface_status (tmp_surface) != CAIRO_STATUS_SUCCESS)
return;
cr_surf = cairo_create (tmp_surface);
if (cairo_status (cr_surf) != CAIRO_STATUS_SUCCESS)
{
cairo_surface_destroy (tmp_surface);
return;
}
cairo_scale (cr_surf, 1.0f, 1.0f);
cairo_set_operator (cr_surf, CAIRO_OPERATOR_CLEAR);
cairo_paint (cr_surf);
cairo_set_operator (cr_surf, CAIRO_OPERATOR_OVER);
cairo_set_source_rgba (cr_surf, 0.0f, 0.0f, 0.0f, 0.75f);
cairo_arc (cr_surf,
2 * shadow_radius,
2 * shadow_radius,
2.0f * corner_radius,
0.0f,
360.0f * (G_PI / 180.f));
cairo_fill (cr_surf);
cairo_destroy (cr_surf);
blur_image_surface (tmp_surface, shadow_radius);
tile = g_new0 (TileData, 1);
tile->format = cairo_image_surface_get_format (tmp_surface);
tile->width = cairo_image_surface_get_width (tmp_surface) / 2;
tile->height = cairo_image_surface_get_height (tmp_surface) / 2;
tile->stride = cairo_image_surface_get_stride (tmp_surface);
data = cairo_image_surface_get_data (tmp_surface);
tile->data = g_malloc (tile->height * tile->stride);
memcpy (tile->data, data, tile->height * tile->stride);
}
new_surface = cairo_image_surface_create_for_data (tile->data,
tile->format,
tile->width,
tile->height,
tile->stride);
pattern = cairo_pattern_create_for_surface (new_surface);
if (cairo_pattern_status (pattern) != CAIRO_STATUS_SUCCESS)
{
cairo_surface_destroy (tmp_surface);
cairo_surface_destroy (new_surface);
return;
}
/* top left */
cairo_pattern_set_extend (pattern, CAIRO_EXTEND_PAD);
cairo_set_source (cr, pattern);
cairo_rectangle (cr,
0.0f,
0.0f,
width - 2 * shadow_radius,
2 * shadow_radius);
cairo_fill (cr);
/* bottom left */
cairo_matrix_init_scale (&matrix, 1.0f, -1.0f);
cairo_matrix_translate (&matrix, 0.0f, -height);
cairo_pattern_set_matrix (pattern, &matrix);
cairo_rectangle (cr,
0.0f,
2 * shadow_radius,
2 * shadow_radius,
height - 2 * shadow_radius);
cairo_fill (cr);
/* top right */
cairo_matrix_init_scale (&matrix, -1.0f, 1.0f);
cairo_matrix_translate (&matrix, -width, 0.0f);
cairo_pattern_set_matrix (pattern, &matrix);
cairo_rectangle (cr,
width - 2 * shadow_radius,
0.0f,
2 * shadow_radius,
height - 2 * shadow_radius);
cairo_fill (cr);
/* bottom right */
cairo_matrix_init_scale (&matrix, -1.0f, -1.0f);
cairo_matrix_translate (&matrix, -width, -height);
cairo_pattern_set_matrix (pattern, &matrix);
cairo_rectangle (cr,
2 * shadow_radius,
height - 2 * shadow_radius,
width - 2 * shadow_radius,
2 * shadow_radius);
cairo_fill (cr);
cairo_pattern_destroy (pattern);
cairo_surface_destroy (tmp_surface);
cairo_surface_destroy (new_surface);
}
static void
paint_decorated_window (GtkStyle *style,
GdkWindow *window,
@@ -3777,21 +3538,6 @@ paint_decorated_window (GtkStyle *style,
}
else
{
gboolean paint_shadows;
gtk_widget_style_get (widget,
"client-side-drop-shadows", &paint_shadows,
NULL);
if (paint_shadows)
{
paint_window_shadow (cr,
width,
height,
x / 2 + 2.5,
radius);
}
cairo_move_to (cr, hmargin, vmargin + radius);
cairo_arc (cr, hmargin + radius, vmargin + radius,