Optimize the case where a component is entirely transparent by skipping
Sun Jan 27 23:58:13 2002 Owen Taylor <otaylor@redhat.com> * pixbuf-render.c (compute_hint): Optimize the case where a component is entirely transparent by skipping drawing it. * pixbuf-rc-style.c (theme_parse_image): Catch case where background or overlay border/stretch are specified without a background image. * pixbuf-render.c (theme_pixbuf_destroy): Actually free the structure and filename.
This commit is contained in:
parent
624b01a92e
commit
6090d199a5
@ -1,3 +1,16 @@
|
|||||||
|
Sun Jan 27 23:58:13 2002 Owen Taylor <otaylor@redhat.com>
|
||||||
|
|
||||||
|
* pixbuf-render.c (compute_hint): Optimize the case
|
||||||
|
where a component is entirely transparent by skipping
|
||||||
|
drawing it.
|
||||||
|
|
||||||
|
* pixbuf-rc-style.c (theme_parse_image): Catch case
|
||||||
|
where background or overlay border/stretch are specified
|
||||||
|
without a background image.
|
||||||
|
|
||||||
|
* pixbuf-render.c (theme_pixbuf_destroy): Actually free
|
||||||
|
the structure and filename.
|
||||||
|
|
||||||
=================== Move back into gtk-engines ====================
|
=================== Move back into gtk-engines ====================
|
||||||
|
|
||||||
Sat Jan 19 02:45:17 2002 Owen Taylor <otaylor@redhat.com>
|
Sat Jan 19 02:45:17 2002 Owen Taylor <otaylor@redhat.com>
|
||||||
|
@ -14,3 +14,7 @@ libpixmap_la_SOURCES = \
|
|||||||
pixbuf.h
|
pixbuf.h
|
||||||
|
|
||||||
libpixmap_la_LDFLAGS = -avoid-version -module
|
libpixmap_la_LDFLAGS = -avoid-version -module
|
||||||
|
|
||||||
|
dist-hook:
|
||||||
|
cp -pr examples $(distdir); \
|
||||||
|
find $(distdir)/examples -name 'CVS' -print | xargs rm -rf
|
||||||
|
@ -659,9 +659,10 @@ draw_box (GtkStyle *style,
|
|||||||
match_data.state = state;
|
match_data.state = state;
|
||||||
|
|
||||||
if (!draw_simple_image (style, window, area, widget, &match_data, TRUE, TRUE,
|
if (!draw_simple_image (style, window, area, widget, &match_data, TRUE, TRUE,
|
||||||
x, y, width, height))
|
x, y, width, height)) {
|
||||||
parent_class->draw_box (style, window, state, shadow, area, widget, detail,
|
parent_class->draw_box (style, window, state, shadow, area, widget, detail,
|
||||||
x, y, width, height);
|
x, y, width, height);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
|
@ -664,6 +664,20 @@ theme_parse_image(GtkSettings *settings,
|
|||||||
|
|
||||||
token = g_scanner_get_next_token(scanner);
|
token = g_scanner_get_next_token(scanner);
|
||||||
|
|
||||||
|
if (data->background && !data->background->filename)
|
||||||
|
{
|
||||||
|
g_scanner_warn (scanner, "Background image options specified without filename");
|
||||||
|
theme_pixbuf_destroy (data->background);
|
||||||
|
data->background = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (data->overlay && !data->overlay->filename)
|
||||||
|
{
|
||||||
|
g_scanner_warn (scanner, "Overlay image options specified without filename");
|
||||||
|
theme_pixbuf_destroy (data->overlay);
|
||||||
|
data->overlay = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
if (token != G_TOKEN_RIGHT_CURLY)
|
if (token != G_TOKEN_RIGHT_CURLY)
|
||||||
{
|
{
|
||||||
/* error - cleanup for exit */
|
/* error - cleanup for exit */
|
||||||
|
@ -180,6 +180,9 @@ pixbuf_render (GdkPixbuf *src,
|
|||||||
rect.width = dest_width;
|
rect.width = dest_width;
|
||||||
rect.height = dest_height;
|
rect.height = dest_height;
|
||||||
|
|
||||||
|
if (hints & THEME_MISSING)
|
||||||
|
return;
|
||||||
|
|
||||||
/* FIXME: Because we use the mask to shape windows, we don't use
|
/* FIXME: Because we use the mask to shape windows, we don't use
|
||||||
* clip_rect to clip what we draw to the mask, only to clip
|
* clip_rect to clip what we draw to the mask, only to clip
|
||||||
* what we actually draw. But this leads to the horrible ineffiency
|
* what we actually draw. But this leads to the horrible ineffiency
|
||||||
@ -290,8 +293,8 @@ theme_pixbuf_new (void)
|
|||||||
void
|
void
|
||||||
theme_pixbuf_destroy (ThemePixbuf *theme_pb)
|
theme_pixbuf_destroy (ThemePixbuf *theme_pb)
|
||||||
{
|
{
|
||||||
if (theme_pb->pixbuf)
|
theme_pixbuf_set_filename (theme_pb, NULL);
|
||||||
g_cache_remove (pixbuf_cache, theme_pb->pixbuf);
|
g_free (theme_pb);
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
@ -307,7 +310,10 @@ theme_pixbuf_set_filename (ThemePixbuf *theme_pb,
|
|||||||
if (theme_pb->filename)
|
if (theme_pb->filename)
|
||||||
g_free (theme_pb->filename);
|
g_free (theme_pb->filename);
|
||||||
|
|
||||||
theme_pb->filename = g_strdup (filename);
|
if (filename)
|
||||||
|
theme_pb->filename = g_strdup (filename);
|
||||||
|
else
|
||||||
|
theme_pb->filename = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
static guint
|
static guint
|
||||||
@ -318,7 +324,7 @@ compute_hint (GdkPixbuf *pixbuf,
|
|||||||
gint y1)
|
gint y1)
|
||||||
{
|
{
|
||||||
int i, j;
|
int i, j;
|
||||||
int hints = THEME_CONSTANT_ROWS | THEME_CONSTANT_COLS;
|
int hints = THEME_CONSTANT_ROWS | THEME_CONSTANT_COLS | THEME_MISSING;
|
||||||
int n_channels = gdk_pixbuf_get_n_channels (pixbuf);
|
int n_channels = gdk_pixbuf_get_n_channels (pixbuf);
|
||||||
|
|
||||||
guchar *data = gdk_pixbuf_get_pixels (pixbuf);
|
guchar *data = gdk_pixbuf_get_pixels (pixbuf);
|
||||||
@ -340,13 +346,21 @@ compute_hint (GdkPixbuf *pixbuf,
|
|||||||
|
|
||||||
for (j = x0 + 1; j < x1 ; j++)
|
for (j = x0 + 1; j < x1 ; j++)
|
||||||
{
|
{
|
||||||
|
if (n_channels != 4 || p[4] != 0)
|
||||||
|
{
|
||||||
|
hints &= ~THEME_MISSING;
|
||||||
|
if (!(hints & THEME_CONSTANT_ROWS))
|
||||||
|
goto cols;
|
||||||
|
}
|
||||||
|
|
||||||
if (r != *(p++) ||
|
if (r != *(p++) ||
|
||||||
g != *(p++) ||
|
g != *(p++) ||
|
||||||
b != *(p++) ||
|
b != *(p++) ||
|
||||||
(n_channels == 4 && a != *(p++)))
|
(n_channels != 4 && a != *(p++)))
|
||||||
{
|
{
|
||||||
hints &= ~THEME_CONSTANT_ROWS;
|
hints &= ~THEME_CONSTANT_ROWS;
|
||||||
goto cols;
|
if (!(hints & THEME_MISSING))
|
||||||
|
goto cols;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -121,7 +121,8 @@ typedef enum {
|
|||||||
|
|
||||||
typedef enum {
|
typedef enum {
|
||||||
THEME_CONSTANT_ROWS = 1 << 0,
|
THEME_CONSTANT_ROWS = 1 << 0,
|
||||||
THEME_CONSTANT_COLS = 1 << 1
|
THEME_CONSTANT_COLS = 1 << 1,
|
||||||
|
THEME_MISSING = 1 << 2
|
||||||
} ThemeRenderHints;
|
} ThemeRenderHints;
|
||||||
|
|
||||||
struct _ThemePixbuf
|
struct _ThemePixbuf
|
||||||
|
Loading…
Reference in New Issue
Block a user