[gnome-music/wip/mschraal/async-queue: 1/2] artcache: Move DefaultIcon out of artcache.py
- From: Marinus Schraal <mschraal src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gnome-music/wip/mschraal/async-queue: 1/2] artcache: Move DefaultIcon out of artcache.py
- Date: Wed, 11 Aug 2021 14:38:51 +0000 (UTC)
commit 1641a6fb722f8c4765e46d07e13925dddb6f48d6
Author: Marinus Schraal <mschraal gnome org>
Date: Wed Aug 11 15:52:33 2021 +0200
artcache: Move DefaultIcon out of artcache.py
DefaultIcon and the helper function make_icon_frame are moved to
defaulticon.py .
gnomemusic/artcache.py | 125 ++--------------------------------------
gnomemusic/defaulticon.py | 144 ++++++++++++++++++++++++++++++++++++++++++++++
2 files changed, 148 insertions(+), 121 deletions(-)
---
diff --git a/gnomemusic/artcache.py b/gnomemusic/artcache.py
index ca0ada8a4..8e9823545 100644
--- a/gnomemusic/artcache.py
+++ b/gnomemusic/artcache.py
@@ -22,132 +22,16 @@
# code, but you are not obligated to do so. If you do not wish to do so,
# delete this exception statement from your version.
-from enum import Enum
-from math import pi
-from typing import Dict, Tuple, Union
-
-import cairo
-from gi.repository import Gdk, GdkPixbuf, Gio, Gtk, GLib, GObject
+from gi.repository import Gdk, GdkPixbuf, Gio, GLib, GObject
from gnomemusic.corealbum import CoreAlbum
from gnomemusic.coreartist import CoreArtist
from gnomemusic.coresong import CoreSong
+from gnomemusic.defaulticon import DefaultIcon, make_icon_frame
from gnomemusic.musiclogger import MusicLogger
from gnomemusic.utils import ArtSize
-def _make_icon_frame(
- icon_surface, art_size=None, scale=1, default_icon=False,
- round_shape=False):
- """Create an Art frame, square or round.
-
- :param cairo.Surface icon_surface: The surface to use
- :param art_size: The size of the art
- :param int scale: The scale of the art
- :param bool default_icon: Indicates of this is a default icon
- :param bool round_shape: Square or round indicator
-
- :return: The framed surface
- :rtype: cairo.Surface
- """
- degrees = pi / 180
- if art_size == ArtSize.SMALL:
- radius = 2
- else:
- radius = 8
- icon_w = icon_surface.get_width()
- icon_h = icon_surface.get_height()
- ratio = icon_h / icon_w
-
- # Scale down the image according to the biggest axis
- if ratio > 1:
- w = int(art_size.width / ratio)
- h = art_size.height
- else:
- w = art_size.width
- h = int(art_size.height * ratio)
-
- surface = cairo.ImageSurface(cairo.FORMAT_ARGB32, w * scale, h * scale)
- surface.set_device_scale(scale, scale)
- ctx = cairo.Context(surface)
-
- if round_shape:
- ctx.arc(w / 2, h / 2, w / 2, 0, 2 * pi)
- else:
- ctx.arc(w - radius, radius, radius - 0.5, -90 * degrees, 0 * degrees)
- ctx.arc(
- w - radius, h - radius, radius - 0.5, 0 * degrees, 90 * degrees)
- ctx.arc(radius, h - radius, radius - 0.5, 90 * degrees, 180 * degrees)
- ctx.arc(radius, radius, radius - 0.5, 180 * degrees, 270 * degrees)
-
- if default_icon:
- ctx.set_source_rgb(1, 1, 1)
- ctx.fill()
- ctx.set_source_rgba(0, 0, 0, 0.3)
- ctx.mask_surface(icon_surface, w / 3, h / 3)
- ctx.fill()
- else:
- matrix = cairo.Matrix()
- matrix.scale(icon_w / (w * scale), icon_h / (h * scale))
- ctx.set_source_surface(icon_surface, 0, 0)
- pattern = ctx.get_source()
- pattern.set_matrix(matrix)
- ctx.fill()
-
- return surface
-
-
-class DefaultIcon(GObject.GObject):
- """Provides the symbolic fallback icons."""
-
- class Type(Enum):
- ALBUM = "folder-music-symbolic"
- ARTIST = "avatar-default-symbolic"
-
- _cache: Dict[
- Tuple["DefaultIcon.Type", ArtSize, int, bool], cairo.Surface] = {}
-
- _default_theme = Gtk.IconTheme.get_default()
-
- def __init__(self):
- super().__init__()
-
- def _make_default_icon(self, icon_type, art_size, scale, round_shape):
- icon_info = self._default_theme.lookup_icon_for_scale(
- icon_type.value, art_size.width / 3, scale, 0)
- icon = icon_info.load_surface()
-
- icon_surface = _make_icon_frame(
- icon, art_size, scale, True, round_shape=round_shape)
-
- return icon_surface
-
- def get(self, icon_type, art_size, scale=1):
- """Returns the requested symbolic icon
-
- Returns a cairo surface of the requested symbolic icon in the
- given size and shape.
-
- :param enum icon_type: The DefaultIcon.Type of the icon
- :param enum art_size: The ArtSize requested
- :param int scale: The scale
-
- :return: The symbolic icon
- :rtype: cairo.Surface
- """
- if icon_type == DefaultIcon.Type.ALBUM:
- round_shape = False
- else:
- round_shape = True
-
- if (icon_type, art_size, scale) not in self._cache.keys():
- new_icon = self._make_default_icon(
- icon_type, art_size, scale, round_shape)
- self._cache[(icon_type, art_size, scale, round_shape)] = new_icon
-
- return self._cache[(icon_type, art_size, scale, round_shape)]
-
-
class ArtCache(GObject.GObject):
"""Handles retrieval of MediaArt cache art
@@ -230,11 +114,11 @@ class ArtCache(GObject.GObject):
surface = Gdk.cairo_surface_create_from_pixbuf(
pixbuf, self._scale, None)
if isinstance(self._coreobject, CoreArtist):
- surface = _make_icon_frame(
+ surface = make_icon_frame(
surface, self._size, self._scale, round_shape=True)
elif (isinstance(self._coreobject, CoreAlbum)
or isinstance(self._coreobject, CoreSong)):
- surface = _make_icon_frame(surface, self._size, self._scale)
+ surface = make_icon_frame(surface, self._size, self._scale)
self.emit("result", surface)
@@ -244,4 +128,3 @@ class ArtCache(GObject.GObject):
except GLib.Error as error:
self._log.warning(
"Error: {}, {}".format(error.domain, error.message))
-
diff --git a/gnomemusic/defaulticon.py b/gnomemusic/defaulticon.py
new file mode 100644
index 000000000..5af8769b7
--- /dev/null
+++ b/gnomemusic/defaulticon.py
@@ -0,0 +1,144 @@
+# Copyright 2021 The GNOME Music developers
+#
+# GNOME Music is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GNOME Music is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License along
+# with GNOME Music; if not, write to the Free Software Foundation, Inc.,
+# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+#
+# The GNOME Music authors hereby grant permission for non-GPL compatible
+# GStreamer plugins to be used and distributed together with GStreamer
+# and GNOME Music. This permission is above and beyond the permissions
+# granted by the GPL license by which GNOME Music is covered. If you
+# modify this code, you may extend this exception to your version of the
+# code, but you are not obligated to do so. If you do not wish to do so,
+# delete this exception statement from your version.
+
+from enum import Enum
+from math import pi
+from typing import Dict, Tuple
+
+import cairo
+from gi.repository import Gtk, GObject
+
+from gnomemusic.utils import ArtSize
+
+
+def make_icon_frame(
+ icon_surface, art_size=None, scale=1, default_icon=False,
+ round_shape=False):
+ """Create an Art frame, square or round.
+
+ :param cairo.Surface icon_surface: The surface to use
+ :param art_size: The size of the art
+ :param int scale: The scale of the art
+ :param bool default_icon: Indicates of this is a default icon
+ :param bool round_shape: Square or round indicator
+
+ :return: The framed surface
+ :rtype: cairo.Surface
+ """
+ degrees = pi / 180
+ if art_size == ArtSize.SMALL:
+ radius = 2
+ else:
+ radius = 8
+ icon_w = icon_surface.get_width()
+ icon_h = icon_surface.get_height()
+ ratio = icon_h / icon_w
+
+ # Scale down the image according to the biggest axis
+ if ratio > 1:
+ w = int(art_size.width / ratio)
+ h = art_size.height
+ else:
+ w = art_size.width
+ h = int(art_size.height * ratio)
+
+ surface = cairo.ImageSurface(cairo.FORMAT_ARGB32, w * scale, h * scale)
+ surface.set_device_scale(scale, scale)
+ ctx = cairo.Context(surface)
+
+ if round_shape:
+ ctx.arc(w / 2, h / 2, w / 2, 0, 2 * pi)
+ else:
+ ctx.arc(w - radius, radius, radius - 0.5, -90 * degrees, 0 * degrees)
+ ctx.arc(
+ w - radius, h - radius, radius - 0.5, 0 * degrees, 90 * degrees)
+ ctx.arc(radius, h - radius, radius - 0.5, 90 * degrees, 180 * degrees)
+ ctx.arc(radius, radius, radius - 0.5, 180 * degrees, 270 * degrees)
+
+ if default_icon:
+ ctx.set_source_rgb(1, 1, 1)
+ ctx.fill()
+ ctx.set_source_rgba(0, 0, 0, 0.3)
+ ctx.mask_surface(icon_surface, w / 3, h / 3)
+ ctx.fill()
+ else:
+ matrix = cairo.Matrix()
+ matrix.scale(icon_w / (w * scale), icon_h / (h * scale))
+ ctx.set_source_surface(icon_surface, 0, 0)
+ pattern = ctx.get_source()
+ pattern.set_matrix(matrix)
+ ctx.fill()
+
+ return surface
+
+
+class DefaultIcon(GObject.GObject):
+ """Provides the symbolic fallback icons."""
+
+ class Type(Enum):
+ ALBUM = "folder-music-symbolic"
+ ARTIST = "avatar-default-symbolic"
+
+ _cache: Dict[
+ Tuple["DefaultIcon.Type", ArtSize, int, bool], cairo.Surface] = {}
+
+ _default_theme = Gtk.IconTheme.get_default()
+
+ def __init__(self):
+ super().__init__()
+
+ def _make_default_icon(self, icon_type, art_size, scale, round_shape):
+ icon_info = self._default_theme.lookup_icon_for_scale(
+ icon_type.value, art_size.width / 3, scale, 0)
+ icon = icon_info.load_surface()
+
+ icon_surface = make_icon_frame(
+ icon, art_size, scale, True, round_shape=round_shape)
+
+ return icon_surface
+
+ def get(self, icon_type, art_size, scale=1):
+ """Returns the requested symbolic icon
+
+ Returns a cairo surface of the requested symbolic icon in the
+ given size and shape.
+
+ :param enum icon_type: The DefaultIcon.Type of the icon
+ :param enum art_size: The ArtSize requested
+ :param int scale: The scale
+
+ :return: The symbolic icon
+ :rtype: cairo.Surface
+ """
+ if icon_type == DefaultIcon.Type.ALBUM:
+ round_shape = False
+ else:
+ round_shape = True
+
+ if (icon_type, art_size, scale) not in self._cache.keys():
+ new_icon = self._make_default_icon(
+ icon_type, art_size, scale, round_shape)
+ self._cache[(icon_type, art_size, scale, round_shape)] = new_icon
+
+ return self._cache[(icon_type, art_size, scale, round_shape)]
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]