diff options
| author | mbkma <[email protected]> | 2026-03-14 15:32:03 +0100 |
|---|---|---|
| committer | Victor Kareh <[email protected]> | 2026-03-17 09:46:48 -0400 |
| commit | d0749fc30eeb33cf3910a7b49252cf046a8532a8 (patch) | |
| tree | 34f6bf212ffcff24c15129528dd5e1f2bb93e935 /src/eom-image.c | |
| parent | 9b75ba3c2b56d94777e50fff913bb22a2873e582 (diff) | |
| download | eom-crop.tar.bz2 eom-crop.tar.xz | |
add crop featurecrop
Diffstat (limited to 'src/eom-image.c')
| -rw-r--r-- | src/eom-image.c | 58 |
1 files changed, 58 insertions, 0 deletions
diff --git a/src/eom-image.c b/src/eom-image.c index e9741ef..6e6487f 100644 --- a/src/eom-image.c +++ b/src/eom-image.c @@ -1428,6 +1428,64 @@ eom_image_undo (EomImage *img) priv->modified = (priv->undo_stack != NULL); } +void +eom_image_crop (EomImage *img, gint x, gint y, gint width, gint height) +{ + EomImagePrivate *priv; + GdkPixbuf *subpixbuf; + GdkPixbuf *cropped; + gint orig_width; + gint orig_height; + + g_return_if_fail (EOM_IS_IMAGE (img)); + + priv = img->priv; + + g_return_if_fail (priv->image != NULL); + g_return_if_fail (x >= 0 && y >= 0 && width > 0 && height > 0); + g_return_if_fail (x + width <= priv->width && y + height <= priv->height); + + orig_width = priv->width; + orig_height = priv->height; + + subpixbuf = gdk_pixbuf_new_subpixbuf (priv->image, x, y, width, height); + cropped = gdk_pixbuf_copy (subpixbuf); + g_object_unref (subpixbuf); + + g_object_unref (priv->image); + priv->image = cropped; + priv->width = width; + priv->height = height; + priv->modified = TRUE; + + if (priv->thumbnail != NULL) { + gint thumb_w = gdk_pixbuf_get_width (priv->thumbnail); + gint thumb_h = gdk_pixbuf_get_height (priv->thumbnail); + gint tx = x * thumb_w / orig_width; + gint ty = y * thumb_h / orig_height; + gint tw = width * thumb_w / orig_width; + gint th = height * thumb_h / orig_height; + + tw = CLAMP (tw, 1, thumb_w - tx); + th = CLAMP (th, 1, thumb_h - ty); + + subpixbuf = gdk_pixbuf_new_subpixbuf (priv->thumbnail, tx, ty, tw, th); + cropped = gdk_pixbuf_copy (subpixbuf); + g_object_unref (subpixbuf); + g_object_unref (priv->thumbnail); + priv->thumbnail = cropped; + } + + /* Crop cannot be undone via the transform mechanism, so clear the stack */ + g_slist_free_full (priv->undo_stack, g_object_unref); + priv->undo_stack = NULL; + + if (priv->trans != NULL) { + g_object_unref (priv->trans); + priv->trans = NULL; + } +} + static GFile * tmp_file_get (void) { |
