unofficial mirror of emacs-devel@gnu.org 
 help / color / mirror / code / Atom feed
* create-image and find-image consistency
@ 2020-04-15  8:48 David Ponce
  2020-04-19 23:24 ` Juri Linkov
  2020-04-30  5:08 ` Lars Ingebrigtsen
  0 siblings, 2 replies; 5+ messages in thread
From: David Ponce @ 2020-04-15  8:48 UTC (permalink / raw)
  To: emacs-devel

Hello dear Emacs developers,

I am using Emacs latest master, and noticed some inconsistency between the
results of function `create-image' and `find-image'.

Here is an example:

(create-image "[EMACS-DIR]/etc/images/icons/hicolor/scalable/apps/emacs.svg")
==> (image :type svg :file "[EMACS-DIR]/etc/images/icons/hicolor/scalable/apps/emacs.svg" :scale 1.2)

(find-image '((:type svg :file "[EMACS-DIR]/etc/images/icons/hicolor/scalable/apps/emacs.svg")))
==> (image :type svg :file "[EMACS-DIR]/etc/images/icons/hicolor/scalable/apps/emacs.svg")

Contrary to images returned by `create-image', which are automatically scaled
when no :scale property is provided, those returned by `find-image' are not.

I propose the below patch to have `find-image' use `create-image' in order to get
consistent results from both functions. Another advantage of using `create-image' is
that it is no longer necessary to provide the :type property to `find-image'.
The correct type is determined by `create-image' with the proper default scaling.

Here is the result of previous example with patched `find-image':

(find-image '((:file "[EMACS-DIR]/etc/images/icons/hicolor/scalable/apps/emacs.svg")))
==> (image :type svg :file "[EMACS-DIR]/etc/images/icons/hicolor/scalable/apps/emacs.svg" :scale 1.2)

Please eventually consider this enhancement to Emacs, if it makes sense.

Thanks & regards,
David Ponce

diff --git a/installs/emacs/lisp/image.el b/emacs.d/image.el
index 4ea8594..046af95 100644
--- a/installs/emacs/lisp/image.el
+++ b/emacs.d/image.el
@@ -687,13 +687,15 @@ SPECS is a list of image specifications.
  
  Each image specification in SPECS is a property list.  The contents of
  a specification are image type dependent.  All specifications must at
-least contain the properties `:type TYPE' and either `:file FILE' or
-`:data DATA', where TYPE is a symbol specifying the image type,
-e.g. `xbm', FILE is the file to load the image from, and DATA is a
-string containing the actual image data.  The specification whose TYPE
-is supported, and FILE exists, is used to construct the image
-specification to be returned.  Return nil if no specification is
-satisfied.
+least contain the either the property `:file FILE' or `:data DATA',
+where FILE is the file to load the image from, and DATA is a string
+containing the actual image data.  If the property `:type TYPE' is
+omitted or nil, try to determine the image type from its first few
+bytes of image data.  If that doesn’t work, and the property `:file
+FILE' provide a file name, use its file extension as image type. If
+the property `:type TYPE' is provided, it must match the actual type
+determined for FILE or DATA by `create-image'.  Return nil if no
+specification is satisfied.
  
  The image is looked for in `image-load-path'.
  
@@ -703,16 +705,39 @@ Image files should not be larger than specified by `max-image-size'."
        (let* ((spec (car specs))
  	     (type (plist-get spec :type))
  	     (data (plist-get spec :data))
-	     (file (plist-get spec :file))
-	     found)
-	(when (image-type-available-p type)
-	  (cond ((stringp file)
-		 (if (setq found (image-search-load-path file))
-		     (setq image
-			   (cons 'image (plist-put (copy-sequence spec)
-						   :file found)))))
-		((not (null data))
-		 (setq image (cons 'image spec)))))
+	     (file (plist-get spec :file)))
+	(cond
+         ((stringp file)
+	  (when (setq file (image-search-load-path file))
+            ;; At this point, remove the :type and :file properties.
+            ;; `create-image' will set them depending on image file.
+            (setq image (cons 'image (copy-sequence spec)))
+            (setf (image-property image :type) nil)
+            (setf (image-property image :file) nil)
+            (and (setq image (ignore-errors
+                               (apply #'create-image file nil nil
+                                      (cdr image))))
+                 ;; Ensure, if a type has been provided, it is
+                 ;; consistent with the type returned by
+                 ;; `create-image'. If not, return nil.
+                 (not (null type))
+                 (not (eq type (image-property image :type)))
+                 (setq image nil))))
+	  ((not (null data))
+            ;; At this point, remove the :type and :data properties.
+            ;; `create-image' will set them depending on image data.
+           (setq image (cons 'image (copy-sequence spec)))
+           (setf (image-property image :type) nil)
+           (setf (image-property image :data) nil)
+	   (and (setq image (ignore-errors
+                              (apply #'create-image data nil t
+                                     (cdr image))))
+                ;; Ensure, if a type has been provided, it is
+                ;; consistent with the type returned by
+                ;; `create-image'. If not, return nil.
+                (not (null type))
+                (not (eq type (image-property image :type)))
+                (setq image nil))))
  	(setq specs (cdr specs))))
      image))
  



^ permalink raw reply related	[flat|nested] 5+ messages in thread

* Re: create-image and find-image consistency
  2020-04-15  8:48 create-image and find-image consistency David Ponce
@ 2020-04-19 23:24 ` Juri Linkov
  2020-04-30  5:08 ` Lars Ingebrigtsen
  1 sibling, 0 replies; 5+ messages in thread
From: Juri Linkov @ 2020-04-19 23:24 UTC (permalink / raw)
  To: David Ponce; +Cc: emacs-devel

> I propose the below patch to have `find-image' use `create-image' in order to get
> consistent results from both functions. Another advantage of using `create-image' is
> that it is no longer necessary to provide the :type property to `find-image'.
> The correct type is determined by `create-image' with the proper default scaling.
>
> Here is the result of previous example with patched `find-image':
>
> (find-image '((:file "[EMACS-DIR]/etc/images/icons/hicolor/scalable/apps/emacs.svg")))
> ==> (image :type svg :file "[EMACS-DIR]/etc/images/icons/hicolor/scalable/apps/emacs.svg" :scale 1.2)
>
> Please eventually consider this enhancement to Emacs, if it makes sense.

I haven't tested it yet, but it makes sense indeed.



^ permalink raw reply	[flat|nested] 5+ messages in thread

* Re: create-image and find-image consistency
  2020-04-15  8:48 create-image and find-image consistency David Ponce
  2020-04-19 23:24 ` Juri Linkov
@ 2020-04-30  5:08 ` Lars Ingebrigtsen
  2020-04-30  9:24   ` bug#40978: " David Ponce
  1 sibling, 1 reply; 5+ messages in thread
From: Lars Ingebrigtsen @ 2020-04-30  5:08 UTC (permalink / raw)
  To: David Ponce; +Cc: emacs-devel

David Ponce <da_vid@orange.fr> writes:

> I am using Emacs latest master, and noticed some inconsistency between the
> results of function `create-image' and `find-image'.
>
> Here is an example:
>
> (create-image "[EMACS-DIR]/etc/images/icons/hicolor/scalable/apps/emacs.svg")
> ==> (image :type svg :file "[EMACS-DIR]/etc/images/icons/hicolor/scalable/apps/emacs.svg" :scale 1.2)
>
> (find-image '((:type svg :file "[EMACS-DIR]/etc/images/icons/hicolor/scalable/apps/emacs.svg")))
> ==> (image :type svg :file "[EMACS-DIR]/etc/images/icons/hicolor/scalable/apps/emacs.svg")
>
> Contrary to images returned by `create-image', which are automatically scaled
> when no :scale property is provided, those returned by `find-image' are not.
>
> I propose the below patch to have `find-image' use `create-image' in
> order to get consistent results from both functions.

I think it conceptually makes sense to have find-image use create-image,
but looking at the code, and where find-image is used, it looks like the
use case it for creating toolbars and the like, where you want to pick
out one of the (built-in) image formats that Emacs supports...

Looking at your patch, you remove the (image-type-available-p type), and
instead rely on create-image not bugging out instead?  That feels like a
less obvious way to do the test (and more breakable; there may be other
reasons create-image fails).

And I'm not 100% sure that we want to auto-scale toolbars and the like.
I'm pretty sure we do, but perhaps somebody else has an opinion here?

Anyway, I think you should file this as a bug report so that the patch
doesn't get lost, because I think you're basically correct that the
find-image behaviour should be changed.

-- 
(domestic pets only, the antidote for overdose, milk.)
   bloggy blog: http://lars.ingebrigtsen.no



^ permalink raw reply	[flat|nested] 5+ messages in thread

* bug#40978: create-image and find-image consistency
  2020-04-30  5:08 ` Lars Ingebrigtsen
@ 2020-04-30  9:24   ` David Ponce
  2020-04-30 13:39     ` Clément Pit-Claudel
  0 siblings, 1 reply; 5+ messages in thread
From: David Ponce @ 2020-04-30  9:24 UTC (permalink / raw)
  To: Lars Ingebrigtsen; +Cc: emacs-devel, 40978

On 30/04/2020 07:08, Lars Ingebrigtsen wrote:
> 
> I think it conceptually makes sense to have find-image use create-image,
> but looking at the code, and where find-image is used, it looks like the
> use case it for creating toolbars and the like, where you want to pick
> out one of the (built-in) image formats that Emacs supports...
> 
> Looking at your patch, you remove the (image-type-available-p type), and
> instead rely on create-image not bugging out instead?  That feels like a
> less obvious way to do the test (and more breakable; there may be other
> reasons create-image fails).
> 
> And I'm not 100% sure that we want to auto-scale toolbars and the like.
> I'm pretty sure we do, but perhaps somebody else has an opinion here?
> 
> Anyway, I think you should file this as a bug report so that the patch
> doesn't get lost, because I think you're basically correct that the
> find-image behaviour should be changed.
> 

Hi Lars,

I created bug report #40978 as suggested.

My idea was to better separate the role of find-image from
create-image:

- create-image to actually make a new image based on given specs, and
   maybe some common options and device capabilities (for example, auto
   scaling based on screen resolution).
   
- find-image to lookup for an image in the file system or in raw data,
   but delegating to create-image the actual creation of the image.

Currently find-image & create-image can return a different image from
the same spec, which is not consistent. My patch proposes to fix such
potential inconsistencies.
When you don't need auto-scaling for example, you can pass :scale 1.0
to find-image, like you would have done with create-image :-)
IMHO, auto-scaling is particularly useful with graphics elements like
tool bars, tab bars, and widgets ;-)

Thanks for taking into account this proposal!





^ permalink raw reply	[flat|nested] 5+ messages in thread

* Re: create-image and find-image consistency
  2020-04-30  9:24   ` bug#40978: " David Ponce
@ 2020-04-30 13:39     ` Clément Pit-Claudel
  0 siblings, 0 replies; 5+ messages in thread
From: Clément Pit-Claudel @ 2020-04-30 13:39 UTC (permalink / raw)
  To: emacs-devel

On 30/04/2020 05.24, David Ponce wrote:
> On 30/04/2020 07:08, Lars Ingebrigtsen wrote:
>>
>> I think it conceptually makes sense to have find-image use create-image,
>> but looking at the code, and where find-image is used, it looks like the
>> use case it for creating toolbars and the like, where you want to pick
>> out one of the (built-in) image formats that Emacs supports...
>>
>> Looking at your patch, you remove the (image-type-available-p type), and
>> instead rely on create-image not bugging out instead?  That feels like a
>> less obvious way to do the test (and more breakable; there may be other
>> reasons create-image fails).
>>
>> And I'm not 100% sure that we want to auto-scale toolbars and the like.
>> I'm pretty sure we do, but perhaps somebody else has an opinion here?
>>
>> Anyway, I think you should file this as a bug report so that the patch
>> doesn't get lost, because I think you're basically correct that the
>> find-image behaviour should be changed.
>>
> 
> Hi Lars,
> 
> I created bug report #40978 as suggested.
> 
> My idea was to better separate the role of find-image from
> create-image:
> 
> - create-image to actually make a new image based on given specs, and
>   maybe some common options and device capabilities (for example, auto
>   scaling based on screen resolution).
>   - find-image to lookup for an image in the file system or in raw data,
>   but delegating to create-image the actual creation of the image.
> 
> Currently find-image & create-image can return a different image from
> the same spec, which is not consistent. My patch proposes to fix such
> potential inconsistencies.
> When you don't need auto-scaling for example, you can pass :scale 1.0
> to find-image, like you would have done with create-image :-)
> IMHO, auto-scaling is particularly useful with graphics elements like
> tool bars, tab bars, and widgets ;-)

One problem is that SVG scaling is broken at the moment, so auto-scaling SVGs yields blurry results, so it's not clear that scaling is in fact desirable for tool bars.
Additionally, the scaling that create-image does is based on font size, right?  Do we expect font size changes to change the size of tab bar icons?



^ permalink raw reply	[flat|nested] 5+ messages in thread

end of thread, other threads:[~2020-04-30 13:39 UTC | newest]

Thread overview: 5+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2020-04-15  8:48 create-image and find-image consistency David Ponce
2020-04-19 23:24 ` Juri Linkov
2020-04-30  5:08 ` Lars Ingebrigtsen
2020-04-30  9:24   ` bug#40978: " David Ponce
2020-04-30 13:39     ` Clément Pit-Claudel

Code repositories for project(s) associated with this public inbox

	https://git.savannah.gnu.org/cgit/emacs.git

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).