Commit 37bb778b authored by Caleb Michael Moore's avatar Caleb Michael Moore

image fixes

parent 40e7c1f4
2004-07-18 Caleb Moore <c.moore@student.unsw.edu.au>
* rsvg-filter.c: made feImage work better, now it transforms it better.
* rsvg-shapes.c: fixed filters on images and bounding boxes on images
2004-07-17 Dom Lachowicz <cinamod@hotmail.com>
* rsvg.[ch]: Bug #147662
......
......@@ -28,6 +28,7 @@
#include "rsvg-shapes.h"
#include "rsvg-css.h"
#include <libart_lgpl/art_rgba.h>
#include <libart_lgpl/art_affine.h>
#include <string.h>
#include <math.h>
......@@ -4024,7 +4025,20 @@ rsvg_filter_primitive_image_render_ext (RsvgFilterPrimitive * self,
{
FPBox boundarys;
RsvgFilterPrimitiveImage *oself;
GdkPixbuf * img;
double tmp_affine[6];
double tmp_tmp_affine[6];
double inv_tmp_affine[6];
GdkPixbuf * intermediate;
int intstride;
int basestride;
int basex, basey;
guchar * intpix;
guchar * basepix;
int i, j, k, basebpp;
gboolean has_alpha;
oself = (RsvgFilterPrimitiveImage *) self;
if(!oself->href)
......@@ -4032,11 +4046,63 @@ rsvg_filter_primitive_image_render_ext (RsvgFilterPrimitive * self,
boundarys = rsvg_filter_primitive_get_bounds (self, ctx);
return rsvg_pixbuf_new_from_href(oself->href->str,
rsvg_handle_get_base_uri (oself->ctx),
boundarys.x2 - boundarys.x1,
boundarys.y2 - boundarys.y1,
FALSE, NULL);
img = rsvg_pixbuf_new_from_href(oself->href->str,
rsvg_handle_get_base_uri (oself->ctx), NULL);
has_alpha = gdk_pixbuf_get_has_alpha (img);
for (i = 0; i < 6; i++)
tmp_affine[i] = ctx->paffine[i];
art_affine_invert(inv_tmp_affine, tmp_affine);
/*scale to w and h*/
tmp_tmp_affine[0] = (double)gdk_pixbuf_get_width (img) / (double)(boundarys.x2 - boundarys.x1);
tmp_tmp_affine[3] = (double)gdk_pixbuf_get_height (img) / (double)(boundarys.y2 - boundarys.y1);
tmp_tmp_affine[1] = tmp_tmp_affine[2] = tmp_tmp_affine[4] = tmp_tmp_affine[5] = 0;
art_affine_multiply(inv_tmp_affine, inv_tmp_affine, tmp_tmp_affine);
intermediate = gdk_pixbuf_new (GDK_COLORSPACE_RGB, 1, 8,
boundarys.x2 - boundarys.x1,
boundarys.y2 - boundarys.y1);
if (!intermediate)
{
g_object_unref (G_OBJECT (img));
return NULL;
}
basestride = gdk_pixbuf_get_rowstride (img);
intstride = gdk_pixbuf_get_rowstride (intermediate);
basepix = gdk_pixbuf_get_pixels (img);
intpix = gdk_pixbuf_get_pixels (intermediate);
basebpp = has_alpha ? 4 : 3;
/*apply the transformation*/
for (i = 0; i < gdk_pixbuf_get_width (intermediate); i++)
for (j = 0; j < gdk_pixbuf_get_height (intermediate); j++)
{
basex = inv_tmp_affine[0] * i + inv_tmp_affine[2] * j + inv_tmp_affine[4];
basey = inv_tmp_affine[1] * i + inv_tmp_affine[3] * j + inv_tmp_affine[5];
if (basex < 0 || basey < 0
|| basex >= gdk_pixbuf_get_width (img)
|| basey >= gdk_pixbuf_get_height (img))
{
for (k = 0; k < 4; k++)
intpix[i * 4 + j * intstride + k] = 0;
}
else
{
for (k = 0; k < basebpp; k++)
intpix[i * 4 + j * intstride + k] = basepix[basebpp * basex + basey * basestride + k];
if (!has_alpha)
intpix[i * 4 + j * intstride + 3] = 255;
}
}
g_object_unref (G_OBJECT (img));
return intermediate;
}
static void
......
......@@ -1289,9 +1289,6 @@ static gboolean utf8_base64_decode(char ** binptr, size_t * binlen, const char *
static GdkPixbuf *
rsvg_pixbuf_new_from_data_at_size (const char *data,
int width,
int height,
gboolean keep_aspect_ratio,
GError **error)
{
GdkPixbufLoader *loader;
......@@ -1301,7 +1298,6 @@ rsvg_pixbuf_new_from_data_at_size (const char *data,
size_t buffer_len, buffer_max_len, data_len;
g_return_val_if_fail (data != NULL, NULL);
g_return_val_if_fail (width > 0 && height > 0, NULL);
while (*data) if (*data++ == ',') break;
......@@ -1377,9 +1373,6 @@ rsvg_get_file_path (const gchar * filename, const gchar *basedir)
static GdkPixbuf *
rsvg_pixbuf_new_from_file_at_size (const char *filename,
const char *base_uri,
int width,
int height,
gboolean keep_aspect_ratio,
GError **error)
{
GdkPixbufLoader *loader;
......@@ -1451,9 +1444,6 @@ rsvg_pixbuf_new_from_file_at_size (const char *filename,
static GdkPixbuf *
rsvg_pixbuf_new_from_vfs_at_size (const char *filename,
const char *base_uri,
int width,
int height,
gboolean keep_aspect_ratio,
GError **error)
{
GdkPixbufLoader *loader;
......@@ -1465,7 +1455,6 @@ rsvg_pixbuf_new_from_vfs_at_size (const char *filename,
GnomeVFSResult res;
g_return_val_if_fail (filename != NULL, NULL);
g_return_val_if_fail (width > 0 && height > 0, NULL);
if (!gnome_vfs_initialized())
gnome_vfs_init();
......@@ -1540,22 +1529,19 @@ rsvg_pixbuf_new_from_vfs_at_size (const char *filename,
GdkPixbuf *
rsvg_pixbuf_new_from_href (const char *href,
const char *base_uri,
int w,
int h,
gboolean keep_aspect_ratio,
GError **err)
{
GdkPixbuf * img = NULL;
if(!strncmp(href, "data:", 5))
img = rsvg_pixbuf_new_from_data_at_size (href, w, h, keep_aspect_ratio, err);
img = rsvg_pixbuf_new_from_data_at_size (href, err);
if(!img)
img = rsvg_pixbuf_new_from_file_at_size (href, base_uri, w, h, keep_aspect_ratio, err);
img = rsvg_pixbuf_new_from_file_at_size (href, base_uri, err);
#ifdef HAVE_GNOME_VFS
if(!img)
img = rsvg_pixbuf_new_from_vfs_at_size (href, base_uri, w, h, keep_aspect_ratio, err);
img = rsvg_pixbuf_new_from_vfs_at_size (href, base_uri, err);
#endif
return img;
......@@ -1627,7 +1613,7 @@ rsvg_start_image (RsvgHandle *ctx, RsvgPropertyBag *atts)
/* figure out if image is visible or not */
if (!state->visible || !state->cond_true)
return;
img = rsvg_pixbuf_new_from_href (href, rsvg_handle_get_base_uri (ctx), w, h, (aspect_ratio != RSVG_ASPECT_RATIO_NONE), &err);
img = rsvg_pixbuf_new_from_href (href, rsvg_handle_get_base_uri (ctx), &err);
if (!img)
{
......@@ -1726,16 +1712,28 @@ rsvg_start_image (RsvgHandle *ctx, RsvgPropertyBag *atts)
gdk_pixbuf_get_height (intermediate),
ctx->pixbuf,
0, 0);
rsvg_pop_discrete_layer(ctx);
/*fix me, this is not the propper rectangle*/
temprect.x0 = 0;;
temprect.y0 = 0;;
temprect.x1 = gdk_pixbuf_get_width (intermediate);
temprect.y1 = gdk_pixbuf_get_height (intermediate);
temprect.x0 = gdk_pixbuf_get_width (intermediate);
temprect.y0 = gdk_pixbuf_get_height (intermediate);
temprect.x1 = 0;
temprect.y1 = 0;
for (i = 0; i < 2; i++)
for (j = 0; j < 2; j++)
{
basex = tmp_affine[0] * w * i + tmp_affine[2] * h * j + tmp_affine[4];
basey = tmp_affine[1] * w * i + tmp_affine[3] * h * j + tmp_affine[5];
temprect.x0 = MIN(basex, temprect.x0);
temprect.y0 = MIN(basey, temprect.y0);
temprect.x1 = MAX(basex, temprect.x1);
temprect.y1 = MAX(basey, temprect.y1);
}
art_irect_union(&ctx->bbox, &ctx->bbox, &temprect);
rsvg_pop_discrete_layer(ctx);
g_object_unref (G_OBJECT (intermediate));
}
void
......
......@@ -98,9 +98,6 @@ rsvg_marker_parse (const RsvgDefs * defs, const char *str);
GdkPixbuf *
rsvg_pixbuf_new_from_href (const char *href,
const char *base_uri,
int w,
int h,
gboolean keep_aspect_ratio,
GError **err);
void rsvg_defs_drawable_draw (RsvgDefsDrawable * self, RsvgHandle *ctx,
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment