fix image in symbols rotation/flip for svg exports

This commit is contained in:
stefan schippers 2025-02-17 17:53:49 +01:00
parent 4623b1c869
commit 9eb012e6a3
2 changed files with 30 additions and 5 deletions

View File

@ -4534,7 +4534,7 @@ static cairo_surface_t *get_surface_from_file(const char *filename, const char *
#endif
}
if(!surface || cairo_surface_status(surface) != CAIRO_STATUS_SUCCESS) {
if(jpg != 1) dbg(0, "draw_image(): failure creating image surface from %s\n", filename);
if(jpg != 1) dbg(0, "get_surface_from_file(): failure creating image surface from %s\n", filename);
if(surface) cairo_surface_destroy(surface);
my_free(_ALLOC_ID_, &closure.buffer);
*buffer = NULL;
@ -4736,7 +4736,7 @@ int draw_image(int dr, xRect *r, double *x1, double *y1, double *x2, double *y2,
cairo_translate(xctx->cairo_ctx, x, y);
cairo_rotate(xctx->cairo_ctx, rot * XSCH_PI * 0.5);
if(flip && (rot == 0 || rot == 2)) cairo_scale(xctx->cairo_ctx, -scalex, scaley);
else if(flip && (rot == 1 || rot == 3)) cairo_scale(xctx->cairo_ctx, scalex, -scaley);
else if(flip && (rot == 1 || rot == 3)) cairo_scale(xctx->cairo_ctx, -scalex, scaley);
else cairo_scale(xctx->cairo_ctx, scalex, scaley);
cairo_set_source_surface(xctx->cairo_ctx, emb_ptr->image, 0. , 0.);
cairo_rectangle(xctx->cairo_ctx, 0, 0, w , h );

View File

@ -513,6 +513,7 @@ static int svg_embedded_image(xRect *r, double rx1, double ry1, double rx2, doub
double alpha = 1.0;
unsigned char *buffer = NULL;
size_t buffer_size;
double xorig, yorig; /* image anchor point, upper left corner in SVG */
x1=X_TO_SCREEN(rx1);
y1=Y_TO_SCREEN(ry1);
@ -523,7 +524,6 @@ static int svg_embedded_image(xRect *r, double rx1, double ry1, double rx2, doub
if(RECT_OUTSIDE(x1, y1, x2, y2,
xctx->areax1,xctx->areay1,xctx->areax2,xctx->areay2)) return 0;
if(rot == 1 || rot == 3) {
w = fabs(y2 - y1);
h = fabs(x2 - x1);
@ -533,7 +533,8 @@ static int svg_embedded_image(xRect *r, double rx1, double ry1, double rx2, doub
}
if(flip && (rot == 0 || rot == 2)) scalex = -1.0;
else if(flip && (rot == 1 || rot == 3)) scaley = -1.0;
else if(flip && (rot == 1 || rot == 3)) scalex = -1.0;
alpha_str = get_tok_value(r->prop_ptr, "alpha", 0);
if(alpha_str[0]) alpha = atof(alpha_str);
attr_len = my_strdup2(_ALLOC_ID_, &attr, get_tok_value(r->prop_ptr, "image_data", 0));
@ -558,8 +559,32 @@ static int svg_embedded_image(xRect *r, double rx1, double ry1, double rx2, doub
my_free(_ALLOC_ID_, &attr);
return 0;
}
xorig = x1;
yorig = y1;
if(rot == 0) {
if(flip) xorig += w;
} else if(rot == 1) {
if(flip) {
xorig += h;
yorig += w;
} else xorig += h;
} else if(rot == 2) {
if(flip) {
yorig += h;
} else {
xorig += w;
yorig += h;
}
} else if(rot == 3) {
if(flip) {
} else {
yorig += w;
}
}
my_snprintf(transform, S(transform),
"transform=\"translate(%g,%g) scale(%g,%g) rotate(%d)\"", x1, y1, scalex, scaley, rot * 90);
"transform=\"translate(%g,%g) rotate(%d) scale(%g,%g)\"", xorig, yorig, rot * 90, scalex, scaley);
if(alpha == 1.0) strcpy(opacity, "");
else my_snprintf(opacity, S(opacity), "style=\"opacity:%g;\"", alpha);
/* png jpg */