diff --git a/Makefile b/Makefile index 11773fc..7c9ba78 100644 --- a/Makefile +++ b/Makefile @@ -89,6 +89,6 @@ install: $(INSTALL) grub/grub_background.sh $(DESTDIR)/usr/share/desktop-base/ # plymouth - install -d $(DESTDIR)/usr/share/plymouth/spacefun - $(INSTALL) $(wildcard plymouth/spacefun/*) $(DESTDIR)/usr/share/plymouth/spacefun + install -d $(DESTDIR)/usr/share/plymouth/themes/spacefun + $(INSTALL) $(wildcard plymouth/spacefun/*) $(DESTDIR)/usr/share/plymouth/themes/spacefun diff --git a/plymouth/spacefun/background.png b/plymouth/spacefun/background.png new file mode 100644 index 0000000..7d94b28 Binary files /dev/null and b/plymouth/spacefun/background.png differ diff --git a/plymouth/spacefun/box.png b/plymouth/spacefun/box.png new file mode 100644 index 0000000..9d83eae Binary files /dev/null and b/plymouth/spacefun/box.png differ diff --git a/plymouth/spacefun/bullet.png b/plymouth/spacefun/bullet.png new file mode 100644 index 0000000..dd52736 Binary files /dev/null and b/plymouth/spacefun/bullet.png differ diff --git a/plymouth/spacefun/earth0.png b/plymouth/spacefun/earth0.png new file mode 100644 index 0000000..e9d995b Binary files /dev/null and b/plymouth/spacefun/earth0.png differ diff --git a/plymouth/spacefun/earth1.png b/plymouth/spacefun/earth1.png new file mode 100644 index 0000000..f81e9c2 Binary files /dev/null and b/plymouth/spacefun/earth1.png differ diff --git a/plymouth/spacefun/earth2.png b/plymouth/spacefun/earth2.png new file mode 100644 index 0000000..448950d Binary files /dev/null and b/plymouth/spacefun/earth2.png differ diff --git a/plymouth/spacefun/earth3.png b/plymouth/spacefun/earth3.png new file mode 100644 index 0000000..c22abdb Binary files /dev/null and b/plymouth/spacefun/earth3.png differ diff --git a/plymouth/spacefun/earth4.png b/plymouth/spacefun/earth4.png new file mode 100644 index 0000000..cfb3cf1 Binary files /dev/null and b/plymouth/spacefun/earth4.png differ diff --git a/plymouth/spacefun/entry.png b/plymouth/spacefun/entry.png new file mode 100644 index 0000000..a9f4157 Binary files /dev/null and b/plymouth/spacefun/entry.png differ diff --git a/plymouth/spacefun/lock.png b/plymouth/spacefun/lock.png new file mode 100644 index 0000000..5b0de6a Binary files /dev/null and b/plymouth/spacefun/lock.png differ diff --git a/plymouth/spacefun/logo.png b/plymouth/spacefun/logo.png new file mode 100644 index 0000000..4f867c7 Binary files /dev/null and b/plymouth/spacefun/logo.png differ diff --git a/plymouth/spacefun/planet.png b/plymouth/spacefun/planet.png new file mode 100644 index 0000000..74ee1a5 Binary files /dev/null and b/plymouth/spacefun/planet.png differ diff --git a/plymouth/spacefun/rocket0.png b/plymouth/spacefun/rocket0.png new file mode 100644 index 0000000..21fb394 Binary files /dev/null and b/plymouth/spacefun/rocket0.png differ diff --git a/plymouth/spacefun/rocket1.png b/plymouth/spacefun/rocket1.png new file mode 100644 index 0000000..11ffc84 Binary files /dev/null and b/plymouth/spacefun/rocket1.png differ diff --git a/plymouth/spacefun/rocket2.png b/plymouth/spacefun/rocket2.png new file mode 100644 index 0000000..5a8b58f Binary files /dev/null and b/plymouth/spacefun/rocket2.png differ diff --git a/plymouth/spacefun/rocket3.png b/plymouth/spacefun/rocket3.png new file mode 100644 index 0000000..2f10633 Binary files /dev/null and b/plymouth/spacefun/rocket3.png differ diff --git a/plymouth/spacefun/spacefun.plymouth b/plymouth/spacefun/spacefun.plymouth new file mode 100644 index 0000000..888f4d9 --- /dev/null +++ b/plymouth/spacefun/spacefun.plymouth @@ -0,0 +1,8 @@ +[Plymouth Theme] +Name=Debian Space Fun theme +Description=This is the default desktop theme for Debian 6.0 (Squeeze) +ModuleName=script + +[script] +ImageDir=/usr/share/plymouth/themes/spacefun +ScriptFile=/usr/share/plymouth/themes/spacefun/spacefun.script diff --git a/plymouth/spacefun/spacefun.script b/plymouth/spacefun/spacefun.script new file mode 100644 index 0000000..d407537 --- /dev/null +++ b/plymouth/spacefun/spacefun.script @@ -0,0 +1,465 @@ +# Spacefun Plymouth theme script +# Copyright 2010 Aurélien COUDERC +# +# Inspired by the great blog series on Plymouth by Charlie Brej. +# +# The script uses the material made by Valessio Brito for his SpaceFun +# theme for Debian 6.0 Squeeze. + +# 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 3 of the License, 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, see . + +#------------------------------- Constants ----------------------------------------- +NUM_STARS = 40; +MAX_STAR_SIZE = Math.Min(Window.GetWidth(), Window.GetHeight()) * 0.045; +MAX_MSG_DISPLAYED = 5; + +#------------------------------- Background ---------------------------------------- +bg_image = Image("background.png"); + +# Compute screen/image ratio and scale the background accordingly +screen_ratio = Window.GetWidth() / Window.GetHeight(); +bg_image_ratio = bg_image.GetWidth() / bg_image.GetHeight(); +if (screen_ratio > bg_image_ratio) + bg_scale_factor = Window.GetWidth() / bg_image.GetWidth(); +else + bg_scale_factor = Window.GetHeight() / bg_image.GetHeight(); +scaled_bg_image = bg_image.Scale(bg_image.GetWidth() * bg_scale_factor, + bg_image.GetHeight() * bg_scale_factor); + +# Display background +bg_sprite = Sprite(scaled_bg_image); +bg_sprite.SetPosition(Window.GetWidth() / 2 - scaled_bg_image.GetWidth() / 2, + Window.GetHeight() / 2 - scaled_bg_image.GetHeight() / 2, + -10000); + +#------------------------------- Earth --------------------------------------------- +earth_height = Math.Min(Window.GetWidth(), Window.GetHeight()) * 0.12; +for (i = 0; i < 5; i++) + { + earth_image = Image("earth" + i + ".png"); + earth_scale_factor = earth_height / earth_image.GetHeight(); + earth_images[i] = earth_image.Scale(earth_image.GetWidth() * earth_scale_factor, + earth_image.GetHeight() * earth_scale_factor); + } + +earth_glow_index = 0; +earth_sprite = Sprite(earth_images[earth_glow_index]); +earth_to_edge = Math.Min(Window.GetWidth(), Window.GetHeight()) * 0.07; +earth_x = earth_to_edge; +earth_y = Window.GetHeight() - earth_to_edge - earth_images[0].GetHeight(); +earth_sprite.SetPosition(earth_x, earth_y, -10); + +#------------------------------- Planet -------------------------------------------- +planet_image = Image("planet.png"); +planet_height = Math.Min(Window.GetWidth(), Window.GetHeight()) * 0.07; +planet_scale_factor = planet_height / planet_image.GetHeight(); +planet_image = planet_image.Scale(planet_image.GetWidth() * planet_scale_factor, + planet_image.GetHeight() * planet_scale_factor); +planet_sprite = Sprite(planet_image); +planet_to_edge_y = Window.GetHeight() * 0.14; +planet_to_edge_x = Window.GetWidth() * 0.08; +planet_x = Window.GetWidth() - planet_to_edge_x - planet_image.GetWidth(); +planet_y = planet_to_edge_y; +planet_sprite.SetPosition(planet_x, planet_y, -10); + +#------------------------------- Logo ---------------------------------------------- +logo_image = Image("logo.png"); +logo_height = Math.Min(Window.GetWidth(), Window.GetHeight()) * 0.095; +logo_scale_factor = logo_height / logo_image.GetHeight(); +logo_image = logo_image.Scale(logo_image.GetWidth() * logo_scale_factor, + logo_image.GetHeight() * logo_scale_factor); +logo_sprite = Sprite(logo_image); +logo_to_edge = Window.GetHeight() * 0.1; +logo_sprite.SetPosition(Window.GetWidth() - logo_to_edge - logo_image.GetWidth(), + Window.GetHeight() - logo_to_edge - logo_image.GetHeight(), + -10); + +#------------------------------- Swirl galaxies ------------------------------------ +swirlaxy_image = Image("swirlaxy.png"); +if (!(Plymouth.GetMode() == "boot" || Plymouth.GetMode == "resume")) + { + swirls[0].x = 0.1; # Percentage of screen from left when positive, or right otherwise + swirls[0].y = 0.1; # Percentage of screen from top when positive, or bottom otherwise + swirls[0].height_p = 0.21; # Percent of screen height + swirls[0].angle = Math.Pi; + swirls[1].x = 0.54; + swirls[1].y = 0.14; + swirls[1].height_p = 0.11; + swirls[1].angle = Math.Pi; + swirls[2].x = -0.16; + swirls[2].y = -0.16; + swirls[2].height_p = 0.31; + swirls[2].angle = 0; + } +else + { + swirls[0].x = 0.1; + swirls[0].y = 0.12; + swirls[0].height_p = 0.38; + swirls[0].angle = 0; + swirls[1].x = 0.3; + swirls[1].y = -0.24; + swirls[1].height_p = 0.065; + swirls[1].angle = Math.Pi; + swirls[2].x = -0.05; + swirls[2].y = -0.3; + swirls[2].height_p = 0.21; + swirls[2].angle = Math.Pi; + } +for (i = 0; i < 3; i++) + { + swirl_height = Math.Min(Window.GetWidth(), Window.GetHeight()) * swirls[i].height_p; + swirl_width = swirl_height * swirlaxy_image.GetWidth() / swirlaxy_image.GetHeight(); + swirl_image = swirlaxy_image.Scale(swirl_width, swirl_height); + swirl_image = swirl_image.Rotate(swirls[i].angle); + swirl_sprites[i] = Sprite(); + if (swirls[i].x >= 0) + swirl_sprites[i].SetX(Window.GetWidth() * swirls[i].x); + else + swirl_sprites[i].SetX(Window.GetWidth() * (1 + swirls[i].x) - swirl_image.GetWidth()); + if (swirls[i].y >= 0) + swirl_sprites[i].SetY(Window.GetHeight() * swirls[i].y); + else + swirl_sprites[i].SetY(Window.GetHeight() * (1 + swirls[i].y) - swirl_image.GetHeight()); + swirl_sprites[i].SetImage(swirl_image); + } + +#------------------------------- Stars --------------------------------------------- +# Load 3 star images +star_white_image = Image("star-white.png"); +star_fuzzy_image = Image("star-fuzzy.png"); +star_red_image = Image("star-red.png"); +star_white_small_image = Image("star-white-small.png"); +star_fuzzy_small_image = Image("star-fuzzy-small.png"); +star_red_small_image = Image("star-red-small.png"); + +# Initialize the random seed depending on the resolution +pixels = Window.GetWidth() * Window.GetHeight(); +while (pixels % 10 == 0) + { + pixels = pixels / 10; + Math.Random(); + } +for (i = 0; i < pixels % 10; i++) + Math.Random(); + +# Create all star sprites +for (i = 0; i < NUM_STARS; i++) + { + # Randomly choose star image; white/fuzzy/red have 2/1/1 weights + star_type = Math.Random() * 4; + if (star_type < 2) + { + selected_image.big = star_white_image; + selected_image.small = star_white_small_image; + } + else if (star_type < 3) + { + selected_image.big = star_fuzzy_image; + selected_image.small = star_fuzzy_small_image; + } + else + { + selected_image.big = star_red_image; + selected_image.small = star_red_small_image; + } + + # Choose random size + star_scaled_size = MAX_STAR_SIZE * Math.Random(); + # Adapt the source image depending on the scale, smaller scales on big images + # don't render so nicely. + if (star_scaled_size > selected_image.small.GetHeight() + || star_scaled_size > selected_image.small.GetWidth()) + star_image = selected_image.big; + else + star_image = selected_image.small; + transformed_image = star_image.Scale(star_scaled_size, star_scaled_size); + + # Random rotation of a 5 branch stars, we only need to rotate 2 * Pi / 5 at maximum. + transformed_image = transformed_image.Rotate(2 * Math.Pi / 5 * Math.Random()); + stars[i] = Sprite(transformed_image); + + # Randomize position, we accept that stars may be half out of the viewport + # in each direction + star_x = Math.Random() * (Window.GetWidth() + transformed_image.GetWidth()) + - transformed_image.GetWidth() / 2; + star_y = Math.Random() * (Window.GetHeight() + transformed_image.GetHeight()) + - transformed_image.GetHeight() / 2; + stars[i].SetPosition(star_x, star_y, -20); # Stars go behind other elements. + } + +#------------------------------- Rocket -------------------------------------------- +# Load all rocket images for animation +rocket_height = Math.Min(Window.GetWidth(), Window.GetHeight()) * 0.145; +for (i = 0; i < 4; i++) + { + rocket_image = Image("rocket" + i + ".png"); + rocket_scale_factor = rocket_height / rocket_image.GetHeight(); + rocket_images[i] = rocket_image.Scale(rocket_image.GetWidth() * rocket_scale_factor, + rocket_image.GetHeight() * rocket_scale_factor); + } +rocket_flame_index = 0; +rocket_sprite = Sprite(); + +# Rocket trajectory +# Take a point somwhere in the middle to compute the parabola +middle_x = Window.GetWidth() * 0.42; +middle_y = Window.GetHeight() * 0.42; +# Parabole coeffs so that y = a.x^2 + b.x + c for the earth, planet and middle points +# Use the earth and planet centers instead of top left corner +earth_cx = earth_x + earth_images[0].GetWidth()/2; +earth_cy = earth_y + earth_images[0].GetHeight()/2; +planet_cx = planet_x + planet_image.GetWidth()/2; +planet_cy = planet_y + planet_image.GetHeight()/2; +a = ((earth_cy-middle_y)/(earth_cx-middle_x)-(earth_cy-planet_cy)/(earth_cx-planet_cx))/(middle_x-planet_cx); +b = (middle_y-planet_cy)/(middle_x-planet_cx)-a*(middle_x+planet_cx); +c = earth_cy-a*earth_cx*earth_cx-b*earth_cx; +rocket_x_start = earth_cx + Window.GetWidth() * 0.1; # Don't start right on the earth +rocket_x_end = planet_cx - Window.GetWidth() * 0.1; # Don't reach the planet + +# Set initial position +rocket_x = rocket_x_start; +rocket_y = a*rocket_x*rocket_x+b*rocket_x+c; +alpha = 2*a*rocket_x + b; + +# Set flame status and rocket direction. +has_rocket = 0; +rocket_comes_back = 0; +if (Plymouth.GetMode() == "boot") + { + has_rocket = 1; + rocket_comes_back = 0; + } +if (Plymouth.GetMode() == "shutdown" || Plymouth.GetMode() == "suspend") + { + has_rocket = 1; + rocket_comes_back = 1; + } +if (Plymouth.GetMode() == "resume") + { + has_rocket = 1; + rocket_comes_back = 0; + } + +#------------------------------- Animation ----------------------------------------- +progress = 0; +fun refresh_callback () + { + progress++; + + # Rocket, update 50/3 times per second + if (progress % 3 == 0) + { + # 6 states for the rocket flame: 1, 2, 3, 4, 3, 2 + rocket_flame_index = (rocket_flame_index + 1) % 6; + rocket_image = rocket_images[3 - Math.Abs(rocket_flame_index - 3)]; + rotated_rocket = rocket_image.Rotate(alpha); + + rocket_sprite.SetImage(rotated_rocket); + rocket_sprite.SetPosition(rocket_x - rotated_rocket.GetWidth()/2, + rocket_y - rotated_rocket.GetHeight()/2, + -10); + } + + # Earth glow, update 10 times per second + if (earth_glow_index != 0 && progress % 5 == 0) + { + earth_glow_anim = Math.Int(3 * Math.Random()) - 1; + earth_glow_index = Math.Clamp(earth_glow_index + earth_glow_anim, 1, 4); + earth_sprite.SetImage(earth_images[earth_glow_index]); + } + + # Stars dim, update 5 times per second + if (progress % 10 == 0) + { + for (i = 0; i < NUM_STARS; i++) + { + # Reset star to visible by 0.05 steps + star_opacity = stars[i].GetOpacity(); + if (star_opacity < 1) + stars[i].SetOpacity(star_opacity + 0.05); + + # 10% chance to dim the star + if (Math.Random() < 0.1) + stars[i].SetOpacity(0.8); + } + } + } + +Plymouth.SetRefreshFunction (refresh_callback); + +#------------------------------- Dialogue ------------------------------------------ + +status = "normal"; + +fun dialog_setup() + { + local.box; + local.lock; + local.entry; + + box.image = Image("box.png"); + lock.image = Image("lock.png"); + entry.image = Image("entry.png"); + + box.sprite = Sprite(box.image); + box.x = Window.GetWidth() / 2 - box.image.GetWidth ()/2; + box.y = Window.GetHeight() / 2 - box.image.GetHeight()/2; + box.z = 10000; + box.sprite.SetPosition(box.x, box.y, box.z); + + lock.sprite = Sprite(lock.image); + lock.x = box.x + box.image.GetWidth()/2 - (lock.image.GetWidth() + entry.image.GetWidth()) / 2; + lock.y = box.y + box.image.GetHeight()/2 - lock.image.GetHeight()/2; + lock.z = box.z + 1; + lock.sprite.SetPosition(lock.x, lock.y, lock.z); + + entry.sprite = Sprite(entry.image); + entry.x = lock.x + lock.image.GetWidth(); + entry.y = box.y + box.image.GetHeight()/2 - entry.image.GetHeight()/2; + entry.z = box.z + 1; + entry.sprite.SetPosition(entry.x, entry.y, entry.z); + + global.dialog.box = box; + global.dialog.lock = lock; + global.dialog.entry = entry; + global.dialog.bullet_image = Image("bullet.png"); + dialog_opacity (1); + } + +fun dialog_opacity(opacity) + { + dialog.box.sprite.SetOpacity (opacity); + dialog.lock.sprite.SetOpacity (opacity); + dialog.entry.sprite.SetOpacity (opacity); + for (index = 0; dialog.bullet[index]; index++) + { + dialog.bullet[index].sprite.SetOpacity(opacity); + } + } + +fun display_normal_callback () + { + global.status = "normal"; + if (global.dialog) + dialog_opacity (0); + } + +fun display_password_callback (prompt, bullets) + { + global.status = "password"; + if (!global.dialog) + dialog_setup(); + else + dialog_opacity(1); + for (index = 0; dialog.bullet[index] || index < bullets; index++) + { + if (!dialog.bullet[index]) + { + dialog.bullet[index].sprite = Sprite(dialog.bullet_image); + dialog.bullet[index].x = dialog.entry.x + index * dialog.bullet_image.GetWidth(); + dialog.bullet[index].y = dialog.entry.y + dialog.entry.image.GetHeight() / 2 - dialog.bullet_image.GetHeight() / 2; + dialog.bullet[index].z = dialog.entry.z + 1; + dialog.bullet[index].sprite.SetPosition(dialog.bullet[index].x, dialog.bullet[index].y, dialog.bullet[index].z); + } + if (index < bullets) + dialog.bullet[index].sprite.SetOpacity(1); + else + dialog.bullet[index].sprite.SetOpacity(0); + } + } + +Plymouth.SetDisplayNormalFunction(display_normal_callback); +Plymouth.SetDisplayPasswordFunction(display_password_callback); + +#------------------------------- Progress Bar ------------------------------------------ +# No "progress bar" per se, we use the rocket position + +fun progress_callback (duration, progress) + { + if (rocket_comes_back) + { + # Rocket position + rocket_x = rocket_x_end - progress * (rocket_x_end - rocket_x_start); + rocket_y = a*rocket_x*rocket_x + b*rocket_x + c; + # Rocket orientation + alpha = Math.ATan2(2*a*rocket_x + b, 1) + Math.Pi; + } + else + { + # Rocket position + rocket_x = rocket_x_start + progress * (rocket_x_end - rocket_x_start); + rocket_y = a*rocket_x*rocket_x + b*rocket_x + c; + # Rocket orientation + alpha = Math.ATan2(2*a*rocket_x + b, 1); + } + } + +Plymouth.SetBootProgressFunction(progress_callback); + +#------------------------------- Root filesystem mount --------------------------------- + +fun root_mounted_callback () + { + # On boot show earth glow starting when root filesystem is mounted + earth_glow_index = 1; + } + +Plymouth.SetRootMountedFunction(root_mounted_callback); + +#------------------------------- Quit -------------------------------------------------- + +fun quit_callback () + { + } + +Plymouth.SetQuitFunction(quit_callback); + +#------------------------------- Message ----------------------------------------------- + +msg_sprites; # Declare global variable +num_displayed_msg = 0; # Current number of message being displayed +next_msg_idx = 0; # Index of the message to be displayed next in the msg_sprites table +next_msg_y; # Y of next message to display +fun message_callback (text) + { + if (num_displayed_msg < MAX_MSG_DISPLAYED) + { + # We've not reached max number of messages + # Compute next y + next_msg_y = 10; + for (i = 0; i < num_displayed_msg; i++) + next_msg_y += msg_sprites[i].GetImage().GetHeight() + 1; # 1px between lines + num_displayed_msg++; + } + else + { + # We've reached max number of messages + # Move all existing messages one line up + move_y_by = -1 - msg_sprites[(next_msg_idx + 1) % MAX_MSG_DISPLAYED].GetImage().GetHeight(); + for (i = 0; i < MAX_MSG_DISPLAYED; i++) + { + msg = msg_sprites[(next_msg_idx + 1 + i) % MAX_MSG_DISPLAYED]; + msg.SetY(msg.GetY() + move_y_by); + } + } + next_msg_image = Image.Text(text, 1, 1, 1, 1); + msg_sprites[next_msg_idx] = Sprite(); + msg_sprites[next_msg_idx].SetPosition(10, next_msg_y, 10000); + msg_sprites[next_msg_idx].SetImage(next_msg_image); + + next_msg_idx = (next_msg_idx + 1) % MAX_MSG_DISPLAYED; + } + +Plymouth.SetMessageFunction(message_callback); diff --git a/plymouth/spacefun/star-fuzzy-small.png b/plymouth/spacefun/star-fuzzy-small.png new file mode 100644 index 0000000..b8c0109 Binary files /dev/null and b/plymouth/spacefun/star-fuzzy-small.png differ diff --git a/plymouth/spacefun/star-fuzzy.png b/plymouth/spacefun/star-fuzzy.png new file mode 100644 index 0000000..044976f Binary files /dev/null and b/plymouth/spacefun/star-fuzzy.png differ diff --git a/plymouth/spacefun/star-red-small.png b/plymouth/spacefun/star-red-small.png new file mode 100644 index 0000000..cef89fd Binary files /dev/null and b/plymouth/spacefun/star-red-small.png differ diff --git a/plymouth/spacefun/star-red.png b/plymouth/spacefun/star-red.png new file mode 100644 index 0000000..3b6626b Binary files /dev/null and b/plymouth/spacefun/star-red.png differ diff --git a/plymouth/spacefun/star-white-small.png b/plymouth/spacefun/star-white-small.png new file mode 100644 index 0000000..7df48c0 Binary files /dev/null and b/plymouth/spacefun/star-white-small.png differ diff --git a/plymouth/spacefun/star-white.png b/plymouth/spacefun/star-white.png new file mode 100644 index 0000000..f597dd3 Binary files /dev/null and b/plymouth/spacefun/star-white.png differ diff --git a/plymouth/spacefun/swirlaxy.png b/plymouth/spacefun/swirlaxy.png new file mode 100644 index 0000000..a947fe6 Binary files /dev/null and b/plymouth/spacefun/swirlaxy.png differ