# Copyright (c) 2012 The Chromium OS Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.

description    "Displays an animation while the system is booting"
author         "chromium-os-dev@chromium.org"

# boot-splash depends on udev-trigger-early because frecon does need
# graphics device to be ready to display splash screen and tty (ptmx)
# device to create terminals, it also uses input devices (though they
# can also be hotplugged).

start on stopped udev-trigger-early

script
  . /usr/share/cros/factory_utils.sh

  if ! is_factory_installer_mode; then
    # Set the backlight to 40% of its maximum level.
    BACKLIGHT_DIR=/sys/class/backlight
    if [ -d $BACKLIGHT_DIR ] &&
       [ -n "$(find $BACKLIGHT_DIR -maxdepth 0 ! -empty)" ]; then
      backlight_tool --set_brightness_percent=40.0 || true
    fi

    ASSETS=/usr/share/chromeos-assets
    ASSETS_200=$ASSETS/images_200_percent
    ASSETS_100=$ASSETS/images_100_percent

    # Use differently-sized images depending on the framebuffer width.
    if [ -x /sbin/frecon ]; then
      if [ -e "$ASSETS_200/boot_splash_frame01.png" ]; then
        BOOT_IMAGES=""
        for image in "$ASSETS_200"/boot_splash_frame*.png; do
          BOOT_IMAGES="${BOOT_IMAGES} --image-hires ${image}"
        done
        for image in "$ASSETS_100"/boot_splash_frame*.png; do
          BOOT_IMAGES="${BOOT_IMAGES} --image ${image}"
        done
      else
        BOOT_IMAGES="$ASSETS_100"/boot_splash_frame*.png
      fi
    else
      WIDTH=$(ply-image --print-resolution | cut -d ' ' -f 1)
      if [ $WIDTH -gt 1920 -a -e "$ASSETS_200/boot_splash_frame01.png" ]; then
        BOOT_IMAGES="$ASSETS_200"/boot_splash_frame*.png
      else
        BOOT_IMAGES="$ASSETS_100"/boot_splash_frame*.png
      fi
    fi

    if is_factory_test_mode; then
      BOOT_IMAGES="${BOOT_IMAGES} /usr/local/factory/misc/boot_splash.png"
    fi

    DEV_END_USER=
    if is_developer_end_user; then
      DEV_END_USER=--dev-mode
    fi

    if [ -x /sbin/frecon ]; then
      frecon --daemon \
        --gamma /usr/share/color/bin/internal_display.bin \
        --clear 0xfffefefe $DEV_END_USER --frame-interval 25 \
        $BOOT_IMAGES
    else
      # Disable blinking cursor. Without this, a splash screen will show a
      # distinct cursor shape even when the cursor is set to none.
      echo 0 > /sys/devices/virtual/graphics/fbcon/cursor_blink

      ply-image --set-monitors \
        --gamma /usr/share/color/bin/internal_display.bin \
        --clear 0xfefefe --frame-interval 25 $BOOT_IMAGES
     fi
  fi
end script
