X-Git-Url: https://git.mdrn.pl/librarian.git/blobdiff_plain/8495b2ce8e9aebe778db74217b60fb68c0b5f9f2..e2acc67a478455184e5e714e63a61e78ad37d787:/src/librarian/covers/marquise.py diff --git a/src/librarian/covers/marquise.py b/src/librarian/covers/marquise.py index 283a2be..6f33b32 100644 --- a/src/librarian/covers/marquise.py +++ b/src/librarian/covers/marquise.py @@ -1,3 +1,6 @@ +# This file is part of Librarian, licensed under GNU Affero GPLv3 or later. +# Copyright © Fundacja Wolne Lektury. See NOTICE for more information. +# import PIL.Image from librarian.cover import Cover, Metric from .utils.color import algo_contrast_or_hue, luminance, is_very_bright @@ -17,6 +20,8 @@ class MarquiseCover(Cover): height = 2970 margin = 100 logo_h = 177 + author_width = 1300 + title_box_top = 262 color_schemes = [ @@ -56,7 +61,7 @@ class MarquiseCover(Cover): self.scale_after = final_width / self.width if final_height is not None: - self.height = round(final_height / self.m._scale) + self.height = round(final_height / self.scale_after / self.m._scale) self.square_variant = self.height / self.width < 250 / 210 @@ -79,69 +84,81 @@ class MarquiseCover(Cover): def image(self): img = PIL.Image.new('RGB', (self.m.width, self.m.height), self.background_color) - bg = Background(self) - - if self.square_variant: - layout_options = [ - (self.m.marquise_small, 1), - (self.m.marquise_big, 2), - (self.m.marquise_big, 3), - (self.m.marquise_big, None), - ] + if self.predesigned: + bg = Background(self, crop_to_square=False) + bg.apply( + img, + 0, 0, + self.m.width, self.m.height + ) else: - layout_options = [ - (self.m.marquise_small, 2), - (self.m.marquise_small, 1), - (self.m.marquise_big, 3), - (self.m.marquise_xl, 4), - (self.m.marquise_xl, None), - ] - - for marquise_h, lines in layout_options: - title_box_height = marquise_h - self.m.title_box_top - self.m.margin - try: - title_box = TitleBox( - self, - self.m.width - 2 * self.m.margin, - title_box_height, - lines, - force=lines is None - ) - except DoesNotFit: - continue + bg = Background(self) + if self.square_variant: + layout_options = [ + (self.m.marquise_small, 1), + (self.m.marquise_big, 2), + (self.m.marquise_big, 3), + (self.m.marquise_big, None), + ] else: - break - - self.marquise_height = marquise_h - marquise = Marquise(self, marquise_h) - - bg.apply( - img, - 0, marquise.edge_top, - self.m.width, self.m.height - marquise.edge_top - ) - self.set_color_scheme_from( - img.crop(( + layout_options = [ + (self.m.marquise_small, 2), + (self.m.marquise_small, 1), + (self.m.marquise_big, 3), + (self.m.marquise_xl, 4), + (self.m.marquise_xl, None), + ] + + # Trying all the layout options with decreasing scale. + title_box = None + title_scale = 1 + while title_box is None: + for marquise_h, lines in layout_options: + title_box_height = marquise_h - self.m.title_box_top - self.m.margin + try: + title_box = TitleBox( + self, + self.m.width - 2 * self.m.margin, + title_box_height, + lines, + scale=title_scale + ) + except DoesNotFit: + continue + else: + break + title_scale *= .99 + + self.marquise_height = marquise_h + marquise = Marquise(self, self.marquise_height) + + bg.apply( + img, 0, marquise.edge_top, - self.m.width, marquise.edge_top + ( - self.m.height - marquise.edge_top - ) / 4 - )) - ) - - marquise.apply( - img, 0, 0, self.m.width - ) - title_box.apply( - img, - marquise.title_box_position[0], - marquise.title_box_position[1], - ) - - AuthorBox(self, self.m.width - self.m.margin).apply( - img, 0, self.m.margin - ) - WLLogo(self).apply(img, self.m.margin, self.m.margin, None, self.m.logo_h) + self.m.width, self.m.height - marquise.edge_top + ) + self.set_color_scheme_from( + img.crop(( + 0, marquise.edge_top, + self.m.width, marquise.edge_top + ( + self.m.height - marquise.edge_top + ) / 4 + )) + ) + + marquise.apply( + img, 0, 0, self.m.width + ) + title_box.apply( + img, + marquise.title_box_position[0], + marquise.title_box_position[1], + ) + + AuthorBox(self, self.m.author_width).apply( + img, self.m.width - self.m.margin - self.m.author_width, self.m.margin + ) + WLLogo(self).apply(img, self.m.margin, self.m.margin, None, self.m.logo_h) for logo in self.additional_logos: @@ -160,13 +177,13 @@ class LabelMarquiseCover(MarquiseCover): def image(self): img = super().image() - - Label(self).apply( - img, - self.m.label_left, - self.marquise_height - self.m.label_top, - self.m.label_w, - self.m.label_h - ) + if not self.predesigned: + Label(self).apply( + img, + self.m.label_left, + self.marquise_height - self.label_top, + self.m.label_w, + self.m.label_h + ) return img