From 49120f48474fc8fdc2448c75d961bc238213cfac Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=B6rg=20Frings-F=C3=BCrst?= Date: Tue, 1 May 2018 14:34:32 +0200 Subject: New upstream version 0.28.2 --- src/Photo.vala | 51 +++++++++++++++++++++++++++++++++++---------------- 1 file changed, 35 insertions(+), 16 deletions(-) (limited to 'src/Photo.vala') diff --git a/src/Photo.vala b/src/Photo.vala index c768017..f089d79 100644 --- a/src/Photo.vala +++ b/src/Photo.vala @@ -628,12 +628,14 @@ public abstract class Photo : PhotoSource, Dateable { // Reads info on a backing photo and adds it. // Note: this function was created for importing new photos. It will not // notify of changes to the developments. - public void add_backing_photo_for_development(RawDeveloper d, BackingPhotoRow bpr) throws Error { + public void add_backing_photo_for_development(RawDeveloper d, BackingPhotoRow bpr, bool notify = true) throws Error { import_developed_backing_photo(row, d, bpr); lock (developments) { developments.set(d, bpr); } - notify_altered(new Alteration("image", "developer")); + + if (notify) + notify_altered(new Alteration("image", "developer")); } public static void import_developed_backing_photo(PhotoRow row, RawDeveloper d, @@ -667,7 +669,7 @@ public abstract class Photo : PhotoSource, Dateable { // "Develops" a raw photo // Not thread-safe. - private void develop_photo(RawDeveloper d) { + private void develop_photo(RawDeveloper d, bool notify) { bool wrote_img_to_disk = false; BackingPhotoRow bps = null; @@ -714,7 +716,7 @@ public abstract class Photo : PhotoSource, Dateable { if (wrote_img_to_disk) { try { // Read in backing photo info, add to DB. - add_backing_photo_for_development(d, bps); + add_backing_photo_for_development(d, bps, notify); notify_raw_development_modified(); } catch (Error e) { @@ -743,17 +745,33 @@ public abstract class Photo : PhotoSource, Dateable { return; } - Gdk.Pixbuf? pix = prev.get_pixbuf(); + var pix = prev.flatten(); if (pix == null) { debug("Could not get preview pixbuf"); return; } - + // Write out file. bps = d.create_backing_row_for_development(row.master.filepath); - PhotoFileWriter writer = PhotoFileFormat.JFIF.create_writer(bps.filepath); - writer.write(pix, Jpeg.Quality.HIGH); - + + // Peek at data. If we really have a JPEG image, just use it, + // otherwise do GdkPixbuf roundtrip + if (Jpeg.is_jpeg_bytes(pix)) { + var outfile = File.new_for_path(bps.filepath); + outfile.replace_contents(pix.get_data(), null, + false, FileCreateFlags.NONE, null); + } else { + var pixbuf = prev.get_pixbuf(); + if (pixbuf == null) { + debug("Could not get preview pixbuf"); + return; + } + + var writer = PhotoFileFormat.JFIF.create_writer(bps.filepath); + writer.write(pixbuf, Jpeg.Quality.HIGH); + } + + // Remember that we wrote it (see above // case for why this is necessary). wrote_img_to_disk = true; @@ -768,7 +786,7 @@ public abstract class Photo : PhotoSource, Dateable { if (wrote_img_to_disk) { try { // Read in backing photo info, add to DB. - add_backing_photo_for_development(d, bps); + add_backing_photo_for_development(d, bps, notify); notify_raw_development_modified(); } catch (Error e) { @@ -792,7 +810,7 @@ public abstract class Photo : PhotoSource, Dateable { } // Sets the developer and develops the photo. - public void set_raw_developer(RawDeveloper d) { + public void set_raw_developer(RawDeveloper d, bool notify = true) { if (get_master_file_format() != PhotoFileFormat.RAW) return; @@ -804,7 +822,7 @@ public abstract class Photo : PhotoSource, Dateable { // If the embedded preview is too small to be used in the PhotoPage, don't // allow EMBEDDED to be chosen. - if (!is_raw_developer_available(RawDeveloper.EMBEDDED)) + if (!is_raw_developer_available(RawDeveloper.EMBEDDED) && d != RawDeveloper.CAMERA) d = RawDeveloper.SHOTWELL; lock (developments) { @@ -812,7 +830,7 @@ public abstract class Photo : PhotoSource, Dateable { // Perform development, bail out if it doesn't work. if (!is_raw_developer_complete(d)) { - develop_photo(d); + develop_photo(d, notify); } if (!developments.has_key(d)) return; // we tried! @@ -855,14 +873,15 @@ public abstract class Photo : PhotoSource, Dateable { // and is to be preserved. } - notify_altered(new Alteration("image", "developer")); + if (notify) + notify_altered(new Alteration("image", "developer")); discard_prefetched(); } - + public RawDeveloper get_raw_developer() { return row.developer; } - + // Removes a development from the database, filesystem, etc. // Returns true if a development was removed, otherwise false. private bool delete_raw_development(RawDeveloper d) { -- cgit v1.2.3