commit 71766960912418de1d1873ce0a4af17c77c6df59 Author: Sebastian Date: Wed Sep 2 21:48:52 2026 +0200 copy of trixie theme to modify for falbella diff --git a/README.md b/README.md new file mode 100644 index 0000000..572a785 --- /dev/null +++ b/README.md @@ -0,0 +1,3 @@ +# hfg_os falbella theme based on trixie + + diff --git a/banners/website_banner.svg b/banners/website_banner.svg new file mode 100644 index 0000000..70fb53f --- /dev/null +++ b/banners/website_banner.svg @@ -0,0 +1,420 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/banners/wiki_banner.svg b/banners/wiki_banner.svg new file mode 100644 index 0000000..13e5251 --- /dev/null +++ b/banners/wiki_banner.svg @@ -0,0 +1,251 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/bootscreen/README.md b/bootscreen/README.md new file mode 100644 index 0000000..8331b72 --- /dev/null +++ b/bootscreen/README.md @@ -0,0 +1,41 @@ +## Key files + +* GRUB 2: bootscreen/grub/grub.png +* Isolinux: bootscreen/isolinux_syslinux/isolinux*.rle +* Syslinux: bootscreen/isolinux_syslinux/syslinux_16bit.png +* Plymouth: bootscreen/plymouth.svg +* Plymouth with script: bootscreen/plymouth/ceratopsian/* + +The plymouth theme has five elements: a background, a frill, a glow, password swatches, and the debian logo. Everything except the glow is intended to be static. The glow should have varying opacity. + +The "ceratopsian" folder uses the existing Emerald plymouth script and folder structure, patched for the ceratopsian plymouth layout. I made minor changes to the Emerald script for alignment and sizing of the assets. The existing Emerald script and the final versions were added in separate commits if you want to see the diff. + +Similarly, there are multiple alternatives for the isolinux rle file, given the limited palette. Two are based on the same design as syslinux (assuming 4bit indexed color is possible, either indexed full-color or indexed greyscale). One is built from the start for 4bit (assuming indexed color is not allowed). Which option should we use? Whatever works technically. The indexed color option is preferable but it might not be technically feasible. + +## svg files used for development + +grub.svg: no additional elements relative to grub.png, but saved for editing purposes. Similar for isolinux.svg, syslinux.svg, and plymouth.svg. + +## export process to ensure that plymouth elements align + +Getting the frill and glow to line up can be difficult. The following steps will get the elements to align, but still allow for resizing in the plymouth script. + +1. In inkscape, hide all layers except for the frill layer. +2. Export the entire canvas as a png, using the least compression. This will include a lot of white space. We'll fix that later, +3. Repeat steps 1 and 2 for the glow layer. +4. Open both the frill layer and the glow layer in gimp. They should be two separate layers for the same file. +5. Crop the canvas (not the individual layers) to include both elements, with minimal white space. Crop it to a square format (or close) so that the scale calculations in ceratopsian.script work correctly. The exact size doesn't matter as much as being close to square. +6. Export each layer separately back to png files with maximum compression. + +Other elements can be exported directly as png files from inkscape. + + +## working notes + +Converting bmp to rle using netpbm: + +First gimp -> indexed color with 15 colors + +```bmptoppm isolinux.bmp > boot.ppm``` + +```pnmtorle boot.ppm -outfile=boot.rle``` diff --git a/bootscreen/grub/grub.png b/bootscreen/grub/grub.png new file mode 100644 index 0000000..3e1bfc5 Binary files /dev/null and b/bootscreen/grub/grub.png differ diff --git a/bootscreen/grub/grub.svg b/bootscreen/grub/grub.svg new file mode 100644 index 0000000..6d82e9c --- /dev/null +++ b/bootscreen/grub/grub.svg @@ -0,0 +1,519 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/bootscreen/isolinux_syslinux/isolinux_15bw.rle b/bootscreen/isolinux_syslinux/isolinux_15bw.rle new file mode 100644 index 0000000..70c4913 Binary files /dev/null and b/bootscreen/isolinux_syslinux/isolinux_15bw.rle differ diff --git a/bootscreen/isolinux_syslinux/isolinux_15color.rle b/bootscreen/isolinux_syslinux/isolinux_15color.rle new file mode 100644 index 0000000..ced8b83 Binary files /dev/null and b/bootscreen/isolinux_syslinux/isolinux_15color.rle differ diff --git a/bootscreen/isolinux_syslinux/isolinux_alt/isolinux.rle b/bootscreen/isolinux_syslinux/isolinux_alt/isolinux.rle new file mode 100644 index 0000000..0554501 Binary files /dev/null and b/bootscreen/isolinux_syslinux/isolinux_alt/isolinux.rle differ diff --git a/bootscreen/isolinux_syslinux/isolinux_alt/isolinux.svg b/bootscreen/isolinux_syslinux/isolinux_alt/isolinux.svg new file mode 100644 index 0000000..e8d905f --- /dev/null +++ b/bootscreen/isolinux_syslinux/isolinux_alt/isolinux.svg @@ -0,0 +1,588 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/bootscreen/isolinux_syslinux/syslinux.svg b/bootscreen/isolinux_syslinux/syslinux.svg new file mode 100644 index 0000000..f557764 --- /dev/null +++ b/bootscreen/isolinux_syslinux/syslinux.svg @@ -0,0 +1,478 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/bootscreen/isolinux_syslinux/syslinux_16bit.png b/bootscreen/isolinux_syslinux/syslinux_16bit.png new file mode 100644 index 0000000..19fe6ee Binary files /dev/null and b/bootscreen/isolinux_syslinux/syslinux_16bit.png differ diff --git a/bootscreen/plymouth/ceratopsian/ceratopsian.plymouth b/bootscreen/plymouth/ceratopsian/ceratopsian.plymouth new file mode 100644 index 0000000..e24428a --- /dev/null +++ b/bootscreen/plymouth/ceratopsian/ceratopsian.plymouth @@ -0,0 +1,8 @@ +[Plymouth Theme] +Name=Ceratopsian theme for Debian 13.0 Trixie +Description=Ceratopsian theme by Elise Couper +ModuleName=script + +[script] +ImageDir=/usr/share/plymouth/themes/ceratopsian +ScriptFile=/usr/share/plymouth/themes/ceratopsian/ceratopsian.script diff --git a/bootscreen/plymouth/ceratopsian/ceratopsian.script b/bootscreen/plymouth/ceratopsian/ceratopsian.script new file mode 100644 index 0000000..deea07d --- /dev/null +++ b/bootscreen/plymouth/ceratopsian/ceratopsian.script @@ -0,0 +1,1069 @@ +# ceratopsian.script - boot splash using script plugin +# +# Copyright (C) 2009 Canonical Ltd. +# Copyright © 2010-2021 Aurélien Couderc +# Copyright © 2014-2022 Juliette Taka +# +# This program 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, or (at your option) +# any later version. +# +# This program 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 this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA +# 02111-1307, USA. +# +# Written by: Alberto Milone +# +# Based on the example provided with the "script plugin" written by: +# Charlie Brej +# + + +#------------------------------- Constants ----------------------------------------- +NB_ANIM_STEPS = 360; +NB_REFRESHS_BETWEEN_ANIMS = 1; + + + +#------------------------------- Globals ------------------------------------------- +# are we currently prompting for a password? +prompt_active = 0; + +# Globals to share progress time / percent with intersted functions +progress_time = 0; +progress_pct = 0; + +# Variables for glow rotation animation +anim_start_time = NULL; +anim_status = "stopped"; +refresh_iter = 0; +anim_iter = 0; + +#-----------------------------Text-image functions---------------------------- + +# Set the text colour in (rgb / 256) +text_colour.red = 1.0; +text_colour.green = 1.0; +text_colour.blue = 1.0; + +# Tinted text #988592 +tinted_text_colour.red = 1.0; +tinted_text_colour.green = 1.0; +tinted_text_colour.blue = 1.0; + +# Action Text - #ffffff - RGB 255 255 255 +action_text_colour.red = 1.0; +action_text_colour.green = 1.0; +action_text_colour.blue = 1.0; + +# Orange - #ff4012 - RGB 255 64 18 +debugsprite = Sprite(); +debugsprite_bottom = Sprite(); +debugsprite_bottom.SetPosition(0, (Window.GetHeight (0) - 20), 1); +debugsprite_medium = Sprite(); +debugsprite_medium.SetPosition(0, (Window.GetHeight (0) - 100), 1); + +# General purpose function to create text +fun WriteText (text, colour) { + image = Image.Text (text, colour.red, colour.green, colour.blue); + return image; +} + +fun ImageFromText (text) { + image = WriteText (text, text_colour); + return image; +} + +fun ImageFromTintedText (text) { + image = WriteText (text, tinted_text_colour); + return image; +} + +fun ImageFromActionText (text) { + image = WriteText (text, action_text_colour); + return image; +} + +fun Debug(text) { + debugsprite.SetImage(ImageFromText (text)); +} + +fun DebugBottom(text) { + debugsprite_bottom.SetImage(ImageFromText (text)); +} + +fun DebugMedium(text) { + debugsprite_medium.SetImage(ImageFromText (text)); +} + +#Debug("Window.GetHeight(0) = " + Window.GetHeight(0)); +fun TextYOffset() { + local.y; + local.text_height; + local.min_height; + + # Put the 1st line below the logo + some spacing + # TODO position from lower edge + #y = logo_sprite.GetY() + logo.GetHeight(); + # Put the first line at the midpoint + y = 0.5*Window.GetHeight(); + #Debug("y = " + y); + + text_height = first_line_height * 7.5; + # subtract Window.GetY() to show info also at smallest of dual srceens + min_height = window_max.height - 2 * first_line_height - Window.GetY(); + #Debug("text_height=" + text_height + "; min_height=" + min_height); + + if (y + text_height > min_height) + y = min_height - text_height; + + return y; +} + + +#----------------------------- Screen/window setup --------------------------- +# Compute screen/image ratio and scale the background accordingly +window_max.width = Window.GetWidth(); +window_max.height = Window.GetHeight(); +screen_ratio = window_max.width / window_max.height; +small_dimension = Math.Min(window_max.width, window_max.height); +#Debug("Window.GetX():" + Window.GetX() + ", Window.GetY():" + Window.GetY()); +#Debug("Window is [" + window_max.width + ";" + window_max.height + "], ratio=" + screen_ratio); + + + +#---------------------------- Frills --------------------------------- + +fun calcfmt(frill,logo_base) { + x0 = Window.GetWidth(); + y0 = Window.GetHeight(); + xlogo = logo_base.GetWidth(); + ylogo = logo_base.GetHeight(); + xfrill = frill.GetWidth(); + yfrill = frill.GetHeight(); + + coef = 0.6; + + logoscale = 0.1; + if (xlogo=y0) { + dim.frill.ysize = coef*y0; + dim.frill.xsize = coef*y0*(xfrill/yfrill); + dim.frill.x = x0-coef*y0*(xfrill/yfrill); + dim.frill.y = y0-coef*y0; + } + else { + dim.frill.xsize = coef*x0; + dim.frill.ysize = coef*x0*(yfrill/xfrill); + dim.frill.x = x0 - coef*x0; + dim.frill.y = y0 - coef*x0*(yfrill/xfrill); + } + return dim; +} + + +logo = Image("logo.png"); +frill = Image("frill.png"); +glow = Image("glow.png"); + +frilldim = calcfmt(frill,logo); + +frill = frill.Scale(frilldim.frill.xsize, frilldim.frill.ysize); +frill_sprite = Sprite(frill); +frill_sprite.SetPosition(frilldim.frill.x,frilldim.frill.y,-2); + +glow = glow.Scale(frilldim.frill.xsize, frilldim.frill.ysize); +glow_sprite = Sprite(glow); +glow_sprite.SetPosition(frilldim.frill.x,frilldim.frill.y,-1); + +logo = logo.Scale(frilldim.logo.xsize,frilldim.logo.ysize); +logo_sprite = Sprite(logo); +logo_sprite.SetPosition(frilldim.logo.x,frilldim.logo.y,-4); + + +#------------------------------String functions------------------------------- + +# This is the equivalent for strstr() +fun StringString(string, substring) { + start = 0; + while (String(string).CharAt (start)) { + walk = 0; + while (String(substring).CharAt (walk) == String(string).CharAt (start + walk) ) { + walk++; + if (!String(substring).CharAt (walk)) return start; + } + start++; + } + + return NULL; +} + +fun StringLength (string) { + index = 0; + while (String(string).CharAt(index)) index++; + return index; +} + +fun StringCopy (source, beginning, end) { + local.destination = ""; + for (index = beginning; ( ( (end == NULL) || (index <= end) ) && (String(source).CharAt(index)) ); index++) { + local.destination += String(source).CharAt(index); + } + + return local.destination; +} + +fun StringReplace (source, pattern, replacement) { + local.found = StringString(source, pattern); + if (local.found == NULL) + return source; + + local.new_string = StringCopy (source, 0, local.found - 1) + + replacement + + StringCopy (source, local.found + StringLength(pattern), NULL); + + return local.new_string; +} + +# it makes sense to use it only for +# numbers up to 100 +fun StringToInteger (str) { + int = -1; + for (i=0; i<=100; i++) { + if (i+"" == str) { + int = i; + break; + } + } + return int; +} + +#----------------------------------------------------------------------------- +# Top background colour -> RGB/256 +# #263a47 --> 0.1484, 0.2266, 0.2773 +# Bottom background colour +# #263a47 --> 0.1484, 0.2266, 0.2773 +# +Window.SetBackgroundTopColor (0.1484, 0.2266, 0.2773); # Nice colour on top of the screen fading to +Window.SetBackgroundBottomColor (0.1484, 0.2266, 0.2773); # an equally nice colour on the bottom + +bits_per_pixel = Window.GetBitsPerPixel (); +# TODO need to handle 16 colors ? +#if (bits_per_pixel == 4) { +# logo_filename = "debian_logo16.png"; +# progress_dot_off_filename = "progress_dot_off16.png"; +# progress_dot_on_filename = "progress_dot_on16.png"; +# password_dot_filename = "password_dot.png"; +# password_field_filename = "password_field16.png"; +#} else { +# logo_filename = "debian_logo.png"; +# progress_dot_off_filename = "progress_dot_off.png"; +# progress_dot_on_filename = "progress_dot_on.png"; + password_dot_filename = "password_dot.png"; + password_field_filename = "password_field.png"; +#} + +message_notification[0].image = ImageFromTintedText (""); +message_notification[1].image = ImageFromTintedText (""); +fsck_notification.image = ImageFromActionText (""); + +status = "normal"; + +# use a fixed string with ascending and descending stems to calibrate the +# bounding box for the first message, so the messages below don't move up +# and down according to *their* height. +first_line_height = ImageFromTintedText ("AfpqtM").GetHeight(); + +# if the user has a 640x480 or 800x600 display, we can't quite fit everything +# (including passphrase prompts) with the target spacing, so scoot the text up +# a bit if needed. +top_of_the_text = TextYOffset(); + + +#-------------------------------Progress Indicator----------------------------- +# Implement in boot progress callback +fun animate_progress_indicator (time, progress) { + progress_time = time; + progress_pct = progress; + + #Debug ("mode = " + Plymouth.GetMode() + ", progress_time = " + progress_time + ", progress_pct = " + progress_pct); + +} + + +#-----------------------------------------Label utility functions--------------------- + +# label should be either a string or NULL +# Images for n lines will be created and returned as items of the +# message_label array +# +fun get_message_label (label, is_fake, is_action_line) { + #Debug("Get Label position"); + local.message_label; + + if (is_fake) + # Create a fake label so as to get the y coordinate of + # a standard-length label. + local.message_image = ImageFromTintedText ("This is a fake message"); + else + local.message_image = (is_action_line) && ImageFromActionText (label) || ImageFromTintedText (label); + + message_label.width = message_image.GetWidth (); + message_label.height = message_image.GetHeight (); + + # Center the line horizontally + message_label.x = Window.GetX () + Window.GetWidth () / 2 - message_label.width / 2; + + message_label.y = top_of_the_text; + + # Put the 2nd line below the fsck line + if (is_action_line) { + local.fsck_label.y = message_label.y + (first_line_height + first_line_height / 2); + message_label.y = local.fsck_label.y + (first_line_height * 1.5); + } + + #Debug("action label x = " + message_label.x + " y = " + message_label.y ); + +# message_debug = "msg_x = " + message_label.x + " msg_y = " + message_label.y + +# "msg_width = " + message_label.width + " msg_height = " + +# message_label.height + " message = " + label; +# Debug(message_debug); + + return message_label; + +} + +# Create an fsck label and/or get its position +fun get_fsck_label (label, is_fake) { + # Debug("Get Label position"); + local.fsck_label = global.progress_label; + + if (is_fake) + fsck_label.image = ImageFromTintedText ("This is a fake message"); + else + fsck_label.image = ImageFromTintedText (label); + + fsck_label.width = fsck_label.image.GetWidth (); + fsck_label.height = fsck_label.image.GetHeight (); + + # Centre the label horizontally + fsck_label.x = Window.GetX () + Window.GetWidth () / 2 - fsck_label.width / 2; + + local.first_label = get_message_label (label, 1, 0); + + # Place the label below the 1st message line + fsck_label.y = local.first_label.y + local.first_label.height + (local.first_label.height / 2); + +# message_debug = "msg_x = " + fsck_label.x + " msg_y = " + fsck_label.y + +# "msg_width = " + fsck_label.width + " msg_height = " + +# fsck_label.height + " message = " + label; +# Debug(message_debug); + + return fsck_label; +} + +#-----------------------------------------Message stuff -------------------------------- +# + +# Set up a message label +# +# NOTE: this is called when doing something like 'plymouth message "hello world"' +# +fun setup_message (message_text, x, y, z, index) { + #DebugMedium("Message setup: " + message_text); + global.message_notification[index].image = (index) && ImageFromActionText (message_text) || ImageFromTintedText (message_text); + + # Set up the text message, if any + message_notification[index].x = x; + message_notification[index].y = y; + message_notification[index].z = z; + + message_notification[index].sprite = Sprite (); + message_notification[index].sprite.SetImage (message_notification[index].image); + message_notification[index].sprite.SetX (message_notification[index].x); + message_notification[index].sprite.SetY (message_notification[index].y); + message_notification[index].sprite.SetZ (message_notification[index].z); + +} + +fun show_message (index) { + if (global.message_notification[index].sprite) global.message_notification[index].sprite.SetOpacity(1); +} + +fun hide_message (index) { + if (global.message_notification[index].sprite) global.message_notification[index].sprite.SetOpacity(0); +} + + + + +# the callback function is called when new message should be displayed. +# First arg is message to display. +fun message_callback (message) +{ + # Debug("Message callback"); + is_fake = 0; + if (!message || (message == "")) is_fake = 1; + + local.substring = "keys:"; + + # Look for the "keys:" prefix + local.keys = StringString(message, local.substring); + + local.is_action_line = (keys != NULL); + #Debug("keys " + local.keys + " substring length = " + StringLength(local.substring)); + + # Get the message without the "keys:" prefix + if (keys != NULL) + message = StringCopy (message, keys + StringLength(local.substring), NULL); + + # Get the message without the "fsckd-cancel-msg" prefix as we don't support i18n + substring = "fsckd-cancel-msg:"; + keys = StringString(message, substring); + if (keys != NULL) + message = StringCopy(message, keys + StringLength(substring), NULL); + + local.label.is_fake = is_fake; + label = get_message_label(message, is_fake, is_action_line); + label.z = 10000; + + setup_message (message, label.x, label.y, label.z, is_action_line); + if (prompt_active && local.is_action_line) + hide_message (is_action_line); + else + show_message (is_action_line); + +} + + +#-----------------------------------------Display Password stuff ----------------------- +# + +fun password_dialogue_setup (message_label) { + #Debug("Password dialog setup"); + + local.entry; + local.bullet_image; + + bullet_image = Image (password_dot_filename); + entry.image = Image (password_field_filename); + + # Hide the normal labels + prompt_active = 1; + if (message_notification[1].sprite) hide_message (1); + + # Set the prompt label + label = get_message_label(message_label, 0, 1); + label.z = 10000; + + setup_message (message_label, label.x, label.y, label.z, 2); + show_message (2); + + # Set up the text entry which contains the bullets + entry.sprite = Sprite (); + entry.sprite.SetImage (entry.image); + + # Centre the box horizontally + entry.x = Window.GetX () + Window.GetWidth () / 2 - entry.image.GetWidth () / 2; + + # Put the entry below the second label. + entry.y = message_notification[2].y + label.height * 1.5; + + #DebugMedium("entry x = " + entry.x + ", y = " + entry.y); + entry.z = 10000; + entry.sprite.SetX (entry.x); + entry.sprite.SetY (entry.y); + entry.sprite.SetZ (entry.z); + + global.password_dialogue = local; +} + +fun password_dialogue_opacity (opacity) { + #Debug("Setting password dialog opacity to " + opacity); + global.password_dialogue.opacity = opacity; + local = global.password_dialogue; + + # You can make the box translucent with a float + # entry.sprite.SetOpacity (0.3); + entry.sprite.SetOpacity (opacity); + label.sprite.SetOpacity (opacity); + + if (bullets) { + for (index = 0; bullets[index]; index++) { + bullets[index].sprite.SetOpacity (opacity); + } + } +} + + +# The callback function is called when the display should display a password dialogue. +# First arg is prompt string, the second is the number of bullets. +fun display_password_callback (prompt, bullets) { + #Debug("Password dialog setup"); + + global.status = "password"; + if (!global.password_dialogue) password_dialogue_setup(prompt); + password_dialogue_opacity (1); + bullet_width = password_dialogue.bullet_image.GetWidth(); + bullet_y = password_dialogue.entry.y + + password_dialogue.entry.image.GetHeight () / 2 - + password_dialogue.bullet_image.GetHeight () / 2; + margin = bullet_width; + spaces = Math.Int( (password_dialogue.entry.image.GetWidth () - (margin * 2)) / (bullet_width / 2 ) ); + #DebugMedium ("spaces = " + spaces + ", bullets = " + bullets); + bullets_area.width = margin + spaces * (bullet_width / 2); + bullets_area.x = Window.GetX () + Window.GetWidth () / 2 - bullets_area.width / 2; + #DebugBottom ("pwd_entry (x,y) = " + password_dialogue.entry.x + "," + password_dialogue.entry.y + # + "), bullets_area.x = " + bullets_area.x + ", bullets_area.width = " + bullets_area.width); + if (bullets > spaces) + bullets = spaces; + for (index = 0; password_dialogue.bullets[index] || index < bullets; index++){ + if (!password_dialogue.bullets[index]) { + password_dialogue.bullets[index].sprite = Sprite (); + password_dialogue.bullets[index].sprite.SetImage (password_dialogue.bullet_image); + password_dialogue.bullets[index].x = bullets_area.x + # password_dialogue.entry.x + margin + + index * bullet_width / 2; + password_dialogue.bullets[index].sprite.SetX (password_dialogue.bullets[index].x); + password_dialogue.bullets[index].y = bullet_y; + password_dialogue.bullets[index].sprite.SetY (password_dialogue.bullets[index].y); + password_dialogue.bullets[index].z = password_dialogue.entry.z + 1; + password_dialogue.bullets[index].sprite.SetZ (password_dialogue.bullets[index].z); + } + + password_dialogue.bullets[index].sprite.SetOpacity (0); + + if (index < bullets) { + password_dialogue.bullets[index].sprite.SetOpacity (1); + } + } +} + +Plymouth.SetDisplayPasswordFunction (display_password_callback); + +Plymouth.SetMessageFunction (message_callback); + +Plymouth.SetBootProgressFunction (animate_progress_indicator); + +# Plymouth.SetBootProgressFunction: the callback function is called with two numbers, the progress (between 0 and 1) and the time spent booting so far +# Plymouth.SetRootMountedFunction: the callback function is called when a new root is mounted +# Plymouth.SetKeyboardInputFunction: the callback function is called with a string containing a new character entered on the keyboard + +#----------------------------------------- FSCK Counter -------------------------------- + +# Initialise the counter +fun init_fsck_count () { + # The number of fsck checks in this cycle + global.counter.total = 0; + # The number of fsck checks already performed + the current one + global.counter.current = 1; + # The previous fsck + global.counter.last = 0; +} + +# Increase the total counter +fun increase_fsck_count () { + global.counter.total++; +} + +fun increase_current_fsck_count () { + global.counter.last = global.counter.current++; +} + +# Clear the counter +fun clear_fsck_count () { + global.counter = NULL; + init_fsck_count (); +} + +#----------------------------------------- Progress Label ------------------------------ + + +# Change the opacity level of a progress label +# +# opacity = 1 -> show +# opacity = 0 -> hide +# opacity = 0.3 (or any other float) -> translucent +# +fun set_progress_label_opacity (opacity) { + # the label + progress_label.sprite.SetOpacity (opacity); + + # Make the slot available again when hiding the bar + # So that another bar can take its place + if (opacity == 0) { + progress_label.is_available = 1; + progress_label.device = ""; + } +} + +# Set up a new Progress Bar +# +# TODO: Make it possible to reuse (rather than recreate) a bar +# if .is_available = 1. Ideally this would just reset the +# label, the associated +# device and the image size of the sprite. + +fun init_progress_label (device, status_string) { + # Make the slot unavailable + global.progress_label.is_available = 0; + progress_label.progress = 0; + progress_label.device = device; + progress_label.status_string = status_string; +} + +# See if the progress label is keeping track of the fsck +# of "device" +# +fun device_has_progress_label (device) { + #DebugBottom ("label device = " + progress_label.device + " checking device " + device); + return (progress_label.device == device); +} + +# Update the Progress bar which corresponds to index +# +fun update_progress_label (progress) { + # If progress is NULL then we just refresh the label. + # This happens when only counter.total has changed. + if (progress != NULL) { + progress_label.progress = progress; + + #Debug("device " + progress_label.device + " progress " + progress); + + # If progress >= 100% hide the label and make it available again + if (progress >= 100) { + set_progress_label_opacity (0); + + # See if we any other fsck check is complete + # and, if so, hide the progress bars and the labels + on_fsck_completed (); + + return 0; + } + } + # Update progress label here + # + # FIXME: the queue logic from this theme should really be moved into mountall + # instead of using string replacement to deal with localised strings. + label = StringReplace (progress_label.status_string[0], "%1$d", global.counter.current); + label = StringReplace (label, "%2$d", global.counter.total); + label = StringReplace (label, "%3$d", progress_label.progress); + label = StringReplace (label, "%%", "%"); + + progress_label = get_fsck_label (label, 0); + #progress_label.progress = progress; + + progress_label.sprite = Sprite (progress_label.image); + + # Set up the bar + progress_label.sprite.SetPosition(progress_label.x, progress_label.y, 1); + + set_progress_label_opacity (1); + +} + +# Refresh the label so as to update counters +fun refresh_progress_label () { + update_progress_label (NULL); +} + +#----------------------------------------- FSCK Queue ---------------------------------- + +# Initialise the fsck queue +fun init_queue () { + global.fsck_queue[0].device; + global.fsck_queue[0].progress; + global.fsck_queue.counter = 0; + global.fsck_queue.biggest_item = 0; +} + +fun clear_queue () { + global.fsck_queue = NULL; + init_queue (); +} + +# Return either the device index in the queue or -1 +fun queue_look_up_by_device (device) { + for (i=0; i <= fsck_queue.biggest_item; i++) { + if ((fsck_queue[i]) && (fsck_queue[i].device == device)) + return i; + } + return -1; +} + +# Keep track of an fsck process in the queue +fun add_fsck_to_queue (device, progress) { + # Look for an empty slot in the queue + for (i=0; global.fsck_queue[i].device; i++) { + continue; + } + local.index = i; + + # Set device and progress + global.fsck_queue[local.index].device = device; + global.fsck_queue[local.index].progress = progress; + + # Increase the queue counter + global.fsck_queue.counter++; + + # Update the max index of the array for iterations + if (local.index > global.fsck_queue.biggest_item) + global.fsck_queue.biggest_item = local.index; + + #DebugMedium ("Adding " + device + " at " + local.index); +} + +fun is_queue_empty () { + return (fsck_queue.counter == 0); +} + +fun is_progress_label_available () { + return (progress_label.is_available == 1); +} + + +# This should cover the case in which the fsck checks in +# the queue are completed before the ones showed in the +# progress label +fun on_queued_fsck_completed () { + if (!is_queue_empty ()) + return; + + # Hide the extra label, if any + #if (progress_bar.extra_label.sprite) + # progress_bar.extra_label.sprite.SetOpacity(0); +} + +fun remove_fsck_from_queue (index) { + # Free memory which was previously allocated for + # device and progress + global.fsck_queue[index].device = NULL; + global.fsck_queue[index].progress = NULL; + + # Decrease the queue counter + global.fsck_queue.counter--; + + # See if there are other processes in the queue + # if not, clear the extra_label + on_queued_fsck_completed (); +} + +fun on_fsck_completed () { + # We have moved on to tracking the next fsck + increase_current_fsck_count (); + + if (!is_progress_label_available ()) + return; + + if (!is_queue_empty ()) + return; + + # Hide the progress label + if (progress_label.sprite) + progress_label.sprite.SetOpacity (0); + + # Clear the queue + clear_queue (); + + # Clear the fsck counter + clear_fsck_count (); +} + +# Update an fsck process that we keep track of in the queue +fun update_progress_in_queue (index, device, progress) { + # If the fsck is complete, remove it from the queue + if (progress >= 100) { + remove_fsck_from_queue (index); + on_queued_fsck_completed (); + return; + } + + global.fsck_queue[index].device = device; + global.fsck_queue[index].progress = progress; + +} + +# TODO: Move it to some function +# Create an empty queue +#init_queue (); + + +#----------------------------------------- FSCK Functions ------------------------------ + + +# Either add a new bar for fsck checks or update an existing bar +# +# NOTE: no more than "progress_bar.max_number" bars are allowed +# +fun fsck_check (device, progress, status_string) { + + # The 1st time this will take place + if (!global.progress_label) { + # Increase the fsck counter + increase_fsck_count (); + + # Set up a new label for the check + init_progress_label (device, status_string); + update_progress_label (progress); + + return; + } + + + if (device_has_progress_label (device)) { + # Update the progress of the existing label + update_progress_label (progress); + } + else { + # See if there's already a slot in the queue for the device + local.queue_device_index = queue_look_up_by_device(device); + + # See if the progress_label is available + if (progress_label.is_available) { + +# local.my_string = "available index " + local.available_index + " progress_bar counter is " + progress_bar.counter; +# Debug(local.my_string); + + + # If the fsck check for the device was in the queue, then + # remove it from the queue + if (local.queue_device_index >= 0) { + remove_fsck_from_queue (index); + } + else { + # Increase the fsck counter + increase_fsck_count (); + } + +# local.my_string += local.message; + #Debug("setting new label for device " + device + " progress " + progress); + + # Set up a new label for the check + init_progress_label (device, status_string); + update_progress_label (progress); + + } + # If the progress_label is not available + else { + + # If the fsck check for the device is already in the queue + # just update its progress in the queue + if (local.queue_device_index >= 0) { + #DebugMedium("Updating queue at " + local.queue_device_index + " for device " + device); + update_progress_in_queue (local.queue_device_index, device, progress); + } + # Otherwise add the check to the queue + else { + #DebugMedium("Adding device " + device + " to queue at " + local.queue_device_index); + add_fsck_to_queue (device, progress); + + # Increase the fsck counter + increase_fsck_count (); + + refresh_progress_label (); + } + + } + } + +# if (!is_queue_empty ()) { +# DebugBottom("Extra label for "+ device); + #} +# else { +# DebugBottom("No extra label for " + device + ". 1st Device in the queue "+ fsck_queue[0].device + " counter = " + global.fsck_queue.counter); +# } +} + + +#-----------------------------------------Update Status stuff -------------------------- +# +# The update_status_callback is what we can use to pass plymouth whatever we want so +# as to make use of features which are available only in this program (as opposed to +# being available for any theme for the script plugin). +# +# Example: +# +# Thanks to the current implementation, some scripts can call "plymouth --update=fsck:sda1:40" +# and this program will know that 1) we're performing and fsck check, 2) we're checking sda1, +# 3) the program should set the label progress to 40% +# +# Other features can be easily added by parsing the string that we pass plymouth with "--update" +# +fun update_status_callback (status) { +# Debug(status); + if (!status) return; + + string_it = 0; + update_strings[string_it] = ""; + + for (i=0; (String(status).CharAt(i) != ""); i++) { + local.temp_char = String(status).CharAt(i); + if (temp_char != ":") + update_strings[string_it] += temp_char; + else + update_strings[++string_it] = ""; + } + +# my_string = update_strings[0] + " " + update_strings[1] + " " + update_strings[2]; +# Debug(my_string); + # Let's assume that we're dealing with these strings fsck:sda1:40 + if ((string_it >= 2) && (update_strings[0] == "fsck")) { + + device = update_strings[1]; + progress = update_strings[2]; + status_string[0] = update_strings[3]; # "Checking disk %1$d of %2$d (%3$d %% complete)" + if (!status_string[0]) + status_string[0] = "Checking disk %1$d of %2$d (%3$d %% complete)"; + + if ((device != "") && (progress != "")) { + progress = StringToInteger (progress); + + # Make sure that the fsck_queue is initialised + if (!global.fsck_queue) + init_queue (); + + # Make sure that the fsck counter is initialised + if (!global.counter) + init_fsck_count (); + +# if (!global.progress_bar.extra_label.sprite) +# create_extra_fsck_label (); + + # Keep track of the fsck check + fsck_check (device, progress, status_string); + } + + } + + # systemd-fsckd pass fsckd::: + if (update_strings[0] == "fsckd") { + number_devices = StringToInteger(update_strings[1]); + + if (number_devices > 0) { + label = update_strings[3]; + + progress_label = get_fsck_label (label, 0); + progress_label.sprite = Sprite (progress_label.image); + progress_label.sprite.SetPosition(progress_label.x, progress_label.y, 1); + progress_label.sprite.SetOpacity (1); + } else { + if (progress_label.sprite) + progress_label.sprite.SetOpacity (0); + } + } + +} +Plymouth.SetUpdateStatusFunction (update_status_callback); + +#-----------------------------------------Display Question stuff ----------------------- +# +# TODO: Implement this if needed +# +# The callback function is called when the display should display a question dialogue. +# First arg is prompt string, the second is the entry contents. +#fun display_question_callback (prompt_string, entry_contents) +#{ +# time++; +#} +# +#Plymouth.SetDisplayQuestionFunction (display_question_callback); + +#fun rotate_img(source_img, current_step, nb_steps) { +# angle = Math.Sin(current_step / nb_steps * Math.Pi / 2) * 2 * Math.Pi; +# #debug_sin = Math.Sin(current_step / nb_steps * Math.Pi / 2); +# #DebugMedium("Sin = " + debug_sin); +# rotated_img = source_img.Rotate(angle); +# return rotated_img; +#} + +fun update_glow_anim () { + if (global.anim_iter > NB_ANIM_STEPS) { + global.anim_iter = 0; + } + #DebugMedium("iter = " + global.anim_iter); + glow_opacity = 0.6 + 0.3 * Math.Cos(global.anim_iter / NB_ANIM_STEPS * 2 * Math.Pi); + #Debug("glow_opacity = " + glow_opacity); + if (global.anim_start_time != global.progress_time && global.anim_status != "running") { + global.anim_start_time = global.progress_time; + global.anim_iter = 0; + global.anim_status = "running"; + } + + if (global.anim_status == "running") { + global.glow_sprite.SetOpacity(glow_opacity); + global.anim_iter++; + + if (global.anim_iter >= NB_ANIM_STEPS) { + global.anim_status = "stopped"; + } + } +} + + +#-----------------------------------------Refresh stuff -------------------------------- +# +# Calling Plymouth.SetRefreshFunction with a function will set that function to be +# called up to 50 times every second, e.g. +# +# NOTE: if a refresh function is not set, Plymouth doesn't seem to be able to update +# the screen correctly +# +fun refresh_callback () +{ + global.refresh_iter++; + if (global.refresh_iter == NB_REFRESHS_BETWEEN_ANIMS) { + global.refresh_iter = 0; + update_glow_anim(); + + } + #DebugBottom ("refresh_iter=" + refresh_iter + "; anim_status=" + anim_status + "; anim_start_time=" + anim_start_time + "; anim_iter=" + anim_iter); +} +Plymouth.SetRefreshFunction (refresh_callback); + + +#-----------------------------------------Display Normal stuff ----------------------- +# +# The callback function is called when the display should return to normal +fun display_normal_callback () +{ + global.status = "normal"; + if (global.password_dialogue) { + password_dialogue_opacity (0); + global.password_dialogue = NULL; + if (message_notification[2].sprite) hide_message(2); + prompt_active = 0; + } + + if (message_notification[1].sprite) { + show_message (1); + } + +} + +Plymouth.SetDisplayNormalFunction (display_normal_callback); + + +#----------------------------------------- Quit -------------------------------- + +fun quit_callback () +{ +} + +Plymouth.SetQuitFunction(quit_callback); diff --git a/bootscreen/plymouth/ceratopsian/debian.png b/bootscreen/plymouth/ceratopsian/debian.png new file mode 100644 index 0000000..94846bb Binary files /dev/null and b/bootscreen/plymouth/ceratopsian/debian.png differ diff --git a/bootscreen/plymouth/ceratopsian/frill.png b/bootscreen/plymouth/ceratopsian/frill.png new file mode 100644 index 0000000..defc30e Binary files /dev/null and b/bootscreen/plymouth/ceratopsian/frill.png differ diff --git a/bootscreen/plymouth/ceratopsian/glow.png b/bootscreen/plymouth/ceratopsian/glow.png new file mode 100644 index 0000000..0800d39 Binary files /dev/null and b/bootscreen/plymouth/ceratopsian/glow.png differ diff --git a/bootscreen/plymouth/ceratopsian/logo.png b/bootscreen/plymouth/ceratopsian/logo.png new file mode 100644 index 0000000..890d1b3 Binary files /dev/null and b/bootscreen/plymouth/ceratopsian/logo.png differ diff --git a/bootscreen/plymouth/ceratopsian/password_dot.png b/bootscreen/plymouth/ceratopsian/password_dot.png new file mode 100644 index 0000000..5df3ffd Binary files /dev/null and b/bootscreen/plymouth/ceratopsian/password_dot.png differ diff --git a/bootscreen/plymouth/ceratopsian/password_dot16.png b/bootscreen/plymouth/ceratopsian/password_dot16.png new file mode 100644 index 0000000..e88b43d Binary files /dev/null and b/bootscreen/plymouth/ceratopsian/password_dot16.png differ diff --git a/bootscreen/plymouth/ceratopsian/password_field.png b/bootscreen/plymouth/ceratopsian/password_field.png new file mode 100644 index 0000000..4de2e07 Binary files /dev/null and b/bootscreen/plymouth/ceratopsian/password_field.png differ diff --git a/bootscreen/plymouth/ceratopsian/password_field16.png b/bootscreen/plymouth/ceratopsian/password_field16.png new file mode 100644 index 0000000..02280f7 Binary files /dev/null and b/bootscreen/plymouth/ceratopsian/password_field16.png differ diff --git a/bootscreen/plymouth/plymouth.svg b/bootscreen/plymouth/plymouth.svg new file mode 100644 index 0000000..c107594 --- /dev/null +++ b/bootscreen/plymouth/plymouth.svg @@ -0,0 +1,1945 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/components/blues_shades.svg b/components/blues_shades.svg new file mode 100644 index 0000000..1022d3b --- /dev/null +++ b/components/blues_shades.svg @@ -0,0 +1,361 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/components/blues_tints.svg b/components/blues_tints.svg new file mode 100644 index 0000000..03ca286 --- /dev/null +++ b/components/blues_tints.svg @@ -0,0 +1,104 @@ + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/components/test.svg b/components/test.svg new file mode 100644 index 0000000..144cae8 --- /dev/null +++ b/components/test.svg @@ -0,0 +1,1414 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Linear gradient +Works across platforms +Visible banding if set to screen width + + + + + + Radial gradient +Works across platforms +Grey-on-grey example is just grainy +Others have visible banding if set to screen width + + + + + + Mesh gradient +Doesn't work outside of Inkscape + + + + + + + + + + + + + + + + + + + + + + + + Blur 20% +Works in GTK (all?) and Qt6.7+ +Does not work in earlier versions of Qt +I.e. Gnome, xfce, KDE but not LXQt + + + Turbulence (inkscape roughen) +Freq=100, complex=2, var=50, intensity=10 +Largely eliminates banding at screen width +Available in Gnome and xfce but not KDE or LXQt + + + + + + Mask +Same availability as blur + + + + + + + diff --git a/components/viewfinders.svg b/components/viewfinders.svg new file mode 100644 index 0000000..322b9e3 --- /dev/null +++ b/components/viewfinders.svg @@ -0,0 +1,93 @@ + + + + + + + + + + + + + + + + diff --git a/debianstd/grub.svg b/debianstd/grub.svg new file mode 100644 index 0000000..8621551 --- /dev/null +++ b/debianstd/grub.svg @@ -0,0 +1,16 @@ + + + + + + + diff --git a/debianstd/installer.svg b/debianstd/installer.svg new file mode 100644 index 0000000..c8be6ed --- /dev/null +++ b/debianstd/installer.svg @@ -0,0 +1,16 @@ + + + + + + + diff --git a/debianstd/syslinux.svg b/debianstd/syslinux.svg new file mode 100644 index 0000000..3eb00e1 --- /dev/null +++ b/debianstd/syslinux.svg @@ -0,0 +1,16 @@ + + + + + + + diff --git a/debianstd/wallpaper_1920x1080.svg b/debianstd/wallpaper_1920x1080.svg new file mode 100644 index 0000000..ea2fcd0 --- /dev/null +++ b/debianstd/wallpaper_1920x1080.svg @@ -0,0 +1,39 @@ + + + + + + + + diff --git a/debianstd/wallpaper_1920x1200.svg b/debianstd/wallpaper_1920x1200.svg new file mode 100644 index 0000000..2b3849f --- /dev/null +++ b/debianstd/wallpaper_1920x1200.svg @@ -0,0 +1,39 @@ + + + + + + + + diff --git a/debianstd/website_banner.svg b/debianstd/website_banner.svg new file mode 100644 index 0000000..8780b75 --- /dev/null +++ b/debianstd/website_banner.svg @@ -0,0 +1,16 @@ + + + + + + + diff --git a/debianstd/wiki_banner.svg b/debianstd/wiki_banner.svg new file mode 100644 index 0000000..e51cad4 --- /dev/null +++ b/debianstd/wiki_banner.svg @@ -0,0 +1,16 @@ + + + + + + + diff --git a/installer/installer.svg b/installer/installer.svg new file mode 100644 index 0000000..01afc9b --- /dev/null +++ b/installer/installer.svg @@ -0,0 +1,420 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/installer/installer_rgb16.png b/installer/installer_rgb16.png new file mode 100644 index 0000000..3e92d74 Binary files /dev/null and b/installer/installer_rgb16.png differ diff --git a/login/README.md b/login/README.md new file mode 100644 index 0000000..a60a06a --- /dev/null +++ b/login/README.md @@ -0,0 +1,15 @@ +## Key files + +**Log-in screen**: login/login_1920x1200.svg and login/login_21x9 are log-in screens. +* Plain svg file, no unused elements +* These use some of the same core elements as the wallpaper, but with harder edges and higher contrast. It is intended to transition to the more muted wallpaper. +* The 1920x1200 composition is designed to work when *cropped* to any dimensions specified in the requirements. There are visible tangents (solvable if necessary) on the 1280x1024 if it is *scaled and then cropped*. +* The 21x9 composition has not been tested for cropping + +**Note:** This does not have the logo turned on. This is so that the element does not interfere with any elements from the individual DE's lock/login screen (e.g. in KDE, the clock on lock screen and the swirl and password field in the login screen). The logo element can be turned back on through the _detailed files below. + +## Used in development only + +login/login_detailed_1920x1200.svg: Same visible image as login_1920x1200.svg. This is an Inkscape svg file and includes (1) viewfinders for testing the cropped composition, (2) full palettes for the image, (3) other composition checks, and (4) the logo. These are useful for making the design but are not necessary for the final image. + +login/login_detailed_21x9.svg is similar. diff --git a/login/login_1920x1200.svg b/login/login_1920x1200.svg new file mode 100644 index 0000000..b4c9858 --- /dev/null +++ b/login/login_1920x1200.svg @@ -0,0 +1,198 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/login/login_21x9.svg b/login/login_21x9.svg new file mode 100644 index 0000000..7aa0682 --- /dev/null +++ b/login/login_21x9.svg @@ -0,0 +1,357 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/login/login_detailed_1920x1200.svg b/login/login_detailed_1920x1200.svg new file mode 100644 index 0000000..075381d --- /dev/null +++ b/login/login_detailed_1920x1200.svg @@ -0,0 +1,1023 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/login/login_detailed_21x9.svg b/login/login_detailed_21x9.svg new file mode 100644 index 0000000..127eaad --- /dev/null +++ b/login/login_detailed_21x9.svg @@ -0,0 +1,1373 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/wallpaper/README.md b/wallpaper/README.md new file mode 100644 index 0000000..056d01d --- /dev/null +++ b/wallpaper/README.md @@ -0,0 +1,14 @@ +## Key files + +**Wallpaper**: wallpaper/wallpaper_1920x1200.svg, wallpaper/wallpaper_small_logo_1920x1200.svg, and wallpaper_21x9.svg +* Plain svg file, no unused elements +* The 1920x1200 composition is designed to work when *cropped* to any dimensions specified in the requirements. There are visible tangents (solvable if necessary) on the 1280x1024 if it is *scaled and then cropped*. +* The 21x9 composition has not been tested for cropping + +## Used in development only + +wallpaper/wallpaper_detailed_1920x1200.svg: + +Same visible image as wallpaper_1920x1200.svg. This is an Inkscape svg file and includes (1) viewfinders for testing the cropped composition, (2) full palettes for the image, and (3) other composition checks. These are useful for making the design but are not necessary for the final image. + +wallpaper/wallpaper_detailed_21x9.svg is similar. diff --git a/wallpaper/thumbnail.png b/wallpaper/thumbnail.png new file mode 100644 index 0000000..7881651 Binary files /dev/null and b/wallpaper/thumbnail.png differ diff --git a/wallpaper/wallpaper_1920x1200.svg b/wallpaper/wallpaper_1920x1200.svg new file mode 100644 index 0000000..aaa8a22 --- /dev/null +++ b/wallpaper/wallpaper_1920x1200.svg @@ -0,0 +1,1152 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/wallpaper/wallpaper_1920x1200_small_logo.svg b/wallpaper/wallpaper_1920x1200_small_logo.svg new file mode 100644 index 0000000..10904c6 --- /dev/null +++ b/wallpaper/wallpaper_1920x1200_small_logo.svg @@ -0,0 +1,1152 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/wallpaper/wallpaper_21x9.svg b/wallpaper/wallpaper_21x9.svg new file mode 100644 index 0000000..4ed9ce8 --- /dev/null +++ b/wallpaper/wallpaper_21x9.svg @@ -0,0 +1,1247 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/wallpaper/wallpaper_detailed_1920x1200.svg b/wallpaper/wallpaper_detailed_1920x1200.svg new file mode 100644 index 0000000..8a04eab --- /dev/null +++ b/wallpaper/wallpaper_detailed_1920x1200.svg @@ -0,0 +1,1960 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/wallpaper/wallpaper_detailed_21x9.svg b/wallpaper/wallpaper_detailed_21x9.svg new file mode 100644 index 0000000..5227e8e --- /dev/null +++ b/wallpaper/wallpaper_detailed_21x9.svg @@ -0,0 +1,2355 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +