From 917901e8e33438c425aef50a0a7417f32d77b760 Mon Sep 17 00:00:00 2001
From: s_alexander <s_alexander@b956fd51-792f-4845-bead-9b4dfca2ff2c>
Date: Mon, 9 Nov 2009 00:27:55 +0000
Subject: merged unicode branch (r1931) into trunk

git-svn-id: svn://svn.code.sf.net/p/ultrastardx/svn/trunk@1939 b956fd51-792f-4845-bead-9b4dfca2ff2c
---
 src/menu/UDisplay.pas               |  66 +++---
 src/menu/UMenu.pas                  | 241 ++++++++++-----------
 src/menu/UMenuBackground.pas        | 166 +++++++--------
 src/menu/UMenuBackgroundColor.pas   | 144 ++++++-------
 src/menu/UMenuBackgroundFade.pas    | 352 +++++++++++++++----------------
 src/menu/UMenuBackgroundNone.pas    | 138 ++++++------
 src/menu/UMenuBackgroundTexture.pas | 251 +++++++++++-----------
 src/menu/UMenuBackgroundVideo.pas   | 407 ++++++++++++++++++------------------
 src/menu/UMenuSelectSlide.pas       |   2 +-
 src/menu/UMenuText.pas              |  49 ++---
 10 files changed, 897 insertions(+), 919 deletions(-)

(limited to 'src/menu')

diff --git a/src/menu/UDisplay.pas b/src/menu/UDisplay.pas
index f2eb2ced..6f29d2e1 100644
--- a/src/menu/UDisplay.pas
+++ b/src/menu/UDisplay.pas
@@ -36,10 +36,11 @@ interface
 uses
   UCommon,
   SDL,
-  UMenu,
   gl,
   glu,
-  SysUtils;
+  SysUtils,
+  UMenu,
+  UPath;
 
 type
   TDisplay = class
@@ -123,7 +124,8 @@ uses
   UMain,
   UTexture,
   UTime,
-  UPath;
+  ULanguage,
+  UPathUtils;
 
 constructor TDisplay.Create;
 var
@@ -219,6 +221,8 @@ begin
       //popup mod
       if (ScreenPopupError <> nil) and ScreenPopupError.Visible then
         ScreenPopupError.Draw
+      else if (ScreenPopupInfo <> nil) and ScreenPopupInfo.Visible then
+        ScreenPopupInfo.Draw
       else if (ScreenPopupCheck <> nil) and ScreenPopupCheck.Visible then
         ScreenPopupCheck.Draw;
 
@@ -268,7 +272,7 @@ begin
 
           // blackscreen-hack
           if not BlackScreen then
-            NextScreen.onShow;
+            NextScreen.OnShow;
 
           // update fade state
           LastFadeTime := SDL_GetTicks();
@@ -328,7 +332,7 @@ begin
         NextScreen := nil;
         if not BlackScreen then
         begin
-          CurrentScreen.onShowFinish;
+          CurrentScreen.OnShowFinish;
           CurrentScreen.ShowFinish := true;
         end
         else
@@ -504,49 +508,49 @@ end;
 procedure TDisplay.SaveScreenShot;
 var
   Num:        integer;
-  FileName:   string;
+  FileName:   IPath;
+  Prefix:     UTF8String;
   ScreenData: PChar;
   Surface:    PSDL_Surface;
   Success:    boolean;
   Align:      integer;
   RowSize:    integer;
 begin
-// Exit if Screenshot-path does not exist or read-only
-  if (ScreenshotsPath = '') then
+  // Exit if Screenshot-path does not exist or read-only
+  if (ScreenshotsPath.IsUnset) then
     Exit;
 
   for Num := 1 to 9999 do
   begin
-    FileName := IntToStr(Num);
-    while Length(FileName) < 4 do
-      FileName := '0' + FileName;
-    FileName := ScreenshotsPath + 'screenshot' + FileName + '.png';
-    if not FileExists(FileName) then
-      break
+    // fill prefix to 4 digits with leading '0', e.g. '0001'
+    Prefix := Format('screenshot%.4d', [Num]);
+    FileName := ScreenshotsPath.Append(Prefix + '.png');
+    if not FileName.Exists() then
+      break;
   end;
 
-// we must take the row-alignment (4byte by default) into account
+  // we must take the row-alignment (4byte by default) into account
   glGetIntegerv(GL_PACK_ALIGNMENT, @Align);
-// calc aligned row-size
+  // calc aligned row-size
   RowSize := ((ScreenW*3 + (Align-1)) div Align) * Align;
 
   GetMem(ScreenData, RowSize * ScreenH);
   glReadPixels(0, 0, ScreenW, ScreenH, GL_RGB, GL_UNSIGNED_BYTE, ScreenData);
-// on big endian machines (powerpc) this may need to be changed to
-// Needs to be tests. KaMiSchi Sept 2008
-// in this case one may have to add " glext, " to the list of used units
-//  glReadPixels(0, 0, ScreenW, ScreenH, GL_BGR, GL_UNSIGNED_BYTE, ScreenData);
+  // on big endian machines (powerpc) this may need to be changed to
+  // Needs to be tests. KaMiSchi Sept 2008
+  // in this case one may have to add " glext, " to the list of used units
+  //  glReadPixels(0, 0, ScreenW, ScreenH, GL_BGR, GL_UNSIGNED_BYTE, ScreenData);
   Surface := SDL_CreateRGBSurfaceFrom(
       ScreenData, ScreenW, ScreenH, 24, RowSize,
       $0000FF, $00FF00, $FF0000, 0);
 
-//  Success := WriteJPGImage(FileName, Surface, 95);
-//  Success := WriteBMPImage(FileName, Surface);
+  //  Success := WriteJPGImage(FileName, Surface, 95);
+  //  Success := WriteBMPImage(FileName, Surface);
   Success := WritePNGImage(FileName, Surface);
   if Success then
-    ScreenPopupError.ShowPopup('Screenshot saved: ' + ExtractFileName(FileName))
+    ScreenPopupInfo.ShowPopup(Format(Language.Translate('SCREENSHOT_SAVED'), [FileName.GetName.ToUTF8()]))
   else
-    ScreenPopupError.ShowPopup('Screenshot failed');
+    ScreenPopupError.ShowPopup(Language.Translate('SCREENSHOT_FAILED'));
 
   SDL_FreeSurface(Surface);
   FreeMem(ScreenData);
@@ -559,7 +563,7 @@ procedure TDisplay.DrawDebugInformation;
 var
   Ticks: cardinal;
 begin
-// Some White Background for information
+  // Some White Background for information
   glEnable(GL_BLEND);
   glDisable(GL_TEXTURE_2D);
   glColor4f(1, 1, 1, 0.5);
@@ -571,13 +575,13 @@ begin
   glEnd;
   glDisable(GL_BLEND);
 
-// set font specs
+  // set font specs
   SetFontStyle(0);
   SetFontSize(21);
   SetFontItalic(false);
   glColor4f(0, 0, 0, 1);
 
-// calculate fps
+  // calculate fps
   Ticks := SDL_GetTicks();
   if (Ticks >= NextFPSSwap) then
   begin
@@ -588,17 +592,17 @@ begin
 
   Inc(FPSCounter);
 
-// draw text
+  // draw text
 
-// fps
+  // fps
   SetFontPos(695, 0);
   glPrint ('FPS: ' + InttoStr(LastFPS));
 
-// rspeed
+  // rspeed
   SetFontPos(695, 13);
   glPrint ('RSpeed: ' + InttoStr(Round(1000 * TimeMid)));
 
-// lasterror
+  // lasterror
   SetFontPos(695, 26);
   glColor4f(1, 0, 0, 1);
   glPrint (OSD_LastError);
diff --git a/src/menu/UMenu.pas b/src/menu/UMenu.pas
index a3f47b3d..7979e28e 100644
--- a/src/menu/UMenu.pas
+++ b/src/menu/UMenu.pas
@@ -38,6 +38,7 @@ uses
   Math,
   gl,
   SDL,
+  UPath,
   UMenuBackground,
   UMenuButton,
   UMenuButtonCollection,
@@ -81,8 +82,6 @@ type
       //constructor Create(Back: string; W, H: integer); overload; virtual; // W and H are the number of overlaps
 
       // interaction
-      function WideCharUpperCase(wchar: WideChar) : WideString;
-      function WideStringUpperCase(wstring: WideString) : WideString;
       procedure AddInteraction(Typ, Num: integer);
       procedure SetInteraction(Num: integer); virtual;
       property Interaction: integer read SelInteraction write SetInteraction;
@@ -98,62 +97,62 @@ type
 
       // static
       function AddStatic(ThemeStatic: TThemeStatic): integer; overload;
-      function AddStatic(X, Y, W, H: real; const Name: string): integer; overload;
-      function AddStatic(X, Y, W, H: real; const Name: string; Typ: TTextureType): integer; overload;
-      function AddStatic(X, Y, W, H: real; ColR, ColG, ColB: real; const Name: string; Typ: TTextureType): integer; overload;
-      function AddStatic(X, Y, W, H, Z: real; ColR, ColG, ColB: real; const Name: string; Typ: TTextureType): integer; overload;
-      function AddStatic(X, Y, W, H: real; ColR, ColG, ColB: real; const Name: string; Typ: TTextureType; Color: integer): integer; overload;
-      function AddStatic(X, Y, W, H, Z: real; ColR, ColG, ColB: real; const Name: string; Typ: TTextureType; Color: integer): integer; overload;
-      function AddStatic(X, Y, W, H, Z: real; ColR, ColG, ColB: real; TexX1, TexY1, TexX2, TexY2: real; const Name: string; Typ: TTextureType; Color: integer; Reflection: boolean; ReflectionSpacing: real): integer; overload;
+      function AddStatic(X, Y, W, H: real; const TexName: IPath): integer; overload;
+      function AddStatic(X, Y, W, H: real; const TexName: IPath; Typ: TTextureType): integer; overload;
+      function AddStatic(X, Y, W, H: real; ColR, ColG, ColB: real; const TexName: IPath; Typ: TTextureType): integer; overload;
+      function AddStatic(X, Y, W, H, Z: real; ColR, ColG, ColB: real; const TexName: IPath; Typ: TTextureType): integer; overload;
+      function AddStatic(X, Y, W, H: real; ColR, ColG, ColB: real; const TexName: IPath; Typ: TTextureType; Color: integer): integer; overload;
+      function AddStatic(X, Y, W, H, Z: real; ColR, ColG, ColB: real; const TexName: IPath; Typ: TTextureType; Color: integer): integer; overload;
+      function AddStatic(X, Y, W, H, Z: real; ColR, ColG, ColB: real; TexX1, TexY1, TexX2, TexY2: real; const TexName: IPath; Typ: TTextureType; Color: integer; Reflection: boolean; ReflectionSpacing: real): integer; overload;
 
       // text
       function AddText(ThemeText: TThemeText): integer; overload;
-      function AddText(X, Y: real; const Text_: string): integer; overload;
-      function AddText(X, Y: real; Style: integer; Size, ColR, ColG, ColB: real; const Text: string): integer; overload;
-      function AddText(X, Y, W: real; Style: integer; Size, ColR, ColG, ColB: real; Align: integer; const Text_: string; Reflection_: boolean; ReflectionSpacing_: real; Z : real): integer; overload;
+      function AddText(X, Y: real; const Text_: UTF8String): integer; overload;
+      function AddText(X, Y: real; Style: integer; Size, ColR, ColG, ColB: real; const Text: UTF8String): integer; overload;
+      function AddText(X, Y, W: real; Style: integer; Size, ColR, ColG, ColB: real; Align: integer; const Text_: UTF8String; Reflection_: boolean; ReflectionSpacing_: real; Z : real): integer; overload;
 
       // button
       procedure SetButtonLength(Length: cardinal); //Function that Set Length of Button Array in one Step instead of register new Memory for every Button
       function AddButton(ThemeButton: TThemeButton): integer; overload;
-      function AddButton(X, Y, W, H: real; const Name: string): integer; overload;
-      function AddButton(X, Y, W, H: real; const Name: string; Typ: TTextureType; Reflection: boolean): integer; overload;
-      function AddButton(X, Y, W, H, ColR, ColG, ColB, Int, DColR, DColG, DColB, DInt: real; const Name: string; Typ: TTextureType; Reflection: boolean; ReflectionSpacing, DeSelectReflectionSpacing: real): integer; overload;
+      function AddButton(X, Y, W, H: real; const TexName: IPath): integer; overload;
+      function AddButton(X, Y, W, H: real; const TexName: IPath; Typ: TTextureType; Reflection: boolean): integer; overload;
+      function AddButton(X, Y, W, H, ColR, ColG, ColB, Int, DColR, DColG, DColB, DInt: real; const TexName: IPath; Typ: TTextureType; Reflection: boolean; ReflectionSpacing, DeSelectReflectionSpacing: real): integer; overload;
       procedure ClearButtons;
-      procedure AddButtonText(AddX, AddY: real; const AddText: string); overload;
-      procedure AddButtonText(AddX, AddY: real; ColR, ColG, ColB: real; const AddText: string); overload;
-      procedure AddButtonText(AddX, AddY: real; ColR, ColG, ColB: real; Font: integer; Size: integer; Align: integer; const AddText: string); overload;
-      procedure AddButtonText(CustomButton: TButton; AddX, AddY: real; ColR, ColG, ColB: real; Font: integer; Size: integer; Align: integer; const AddText: string); overload;
+      procedure AddButtonText(AddX, AddY: real; const AddText: UTF8String); overload;
+      procedure AddButtonText(AddX, AddY: real; ColR, ColG, ColB: real; const AddText: UTF8String); overload;
+      procedure AddButtonText(AddX, AddY: real; ColR, ColG, ColB: real; Font: integer; Size: integer; Align: integer; const AddText: UTF8String); overload;
+      procedure AddButtonText(CustomButton: TButton; AddX, AddY: real; ColR, ColG, ColB: real; Font: integer; Size: integer; Align: integer; const AddText: UTF8String); overload;
 
       // select slide
-      function AddSelectSlide(ThemeSelectS: TThemeSelectSlide; var Data: integer; Values: array of string): integer; overload;
+      function AddSelectSlide(ThemeSelectS: TThemeSelectSlide; var Data: integer; const Values: array of UTF8String): integer; overload;
       function AddSelectSlide(X, Y, W, H, SkipX, SBGW, ColR, ColG, ColB, Int, DColR, DColG, DColB, DInt,
         TColR, TColG, TColB, TInt, TDColR, TDColG, TDColB, TDInt,
         SBGColR, SBGColG, SBGColB, SBGInt, SBGDColR, SBGDColG, SBGDColB, SBGDInt,
         STColR, STColG, STColB, STInt, STDColR, STDColG, STDColB, STDInt: real;
-        const Name: string; Typ: TTextureType; const SBGName: string; SBGTyp: TTextureType;
-        const Caption: string; var Data: integer): integer; overload;
-      procedure AddSelectSlideOption(const AddText: string); overload;
-      procedure AddSelectSlideOption(SelectNo: cardinal; const AddText: string); overload;
-      procedure UpdateSelectSlideOptions(ThemeSelectSlide: TThemeSelectSlide; SelectNum: integer; Values: array of string; var Data: integer);
+        const TexName: IPath; Typ: TTextureType; const SBGName: IPath; SBGTyp: TTextureType;
+        const Caption: UTF8String; var Data: integer): integer; overload;
+      procedure AddSelectSlideOption(const AddText: UTF8String); overload;
+      procedure AddSelectSlideOption(SelectNo: cardinal; const AddText: UTF8String); overload;
+      procedure UpdateSelectSlideOptions(ThemeSelectSlide: TThemeSelectSlide; SelectNum: integer; const Values: array of UTF8String; var Data: integer);
 
 //      function AddWidget(X, Y : UInt16; WidgetSrc : PSDL_Surface): Int16;
 //      procedure ClearWidgets(MinNumber : Int16);
       procedure FadeTo(Screen: PMenu); overload;
       procedure FadeTo(Screen: PMenu; aSound: TAudioPlaybackStream); overload;
       //popup hack
-      procedure CheckFadeTo(Screen: PMenu; msg: string);
+      procedure CheckFadeTo(Screen: PMenu; Msg: UTF8String);
 
       function DrawBG: boolean; virtual;
       function DrawFG: boolean; virtual;
       function Draw: boolean; virtual;
-      function ParseInput(PressedKey: cardinal; CharCode: WideChar; PressedDown : boolean): boolean; virtual;
+      function ParseInput(PressedKey: cardinal; CharCode: UCS4Char; PressedDown : boolean): boolean; virtual;
       function ParseMouse(MouseButton: integer; BtnDown: boolean; X, Y: integer): boolean; virtual;
       function InRegion(X1, Y1, W, H, X, Y: real): boolean;
       function InteractAt(X, Y: real): integer;
       function CollectionAt(X, Y: real): integer;
-      procedure onShow; virtual;
-      procedure onShowFinish; virtual;
-      procedure onHide; virtual;
+      procedure OnShow; virtual;
+      procedure OnShowFinish; virtual;
+      procedure OnHide; virtual;
 
       procedure SetAnimationProgress(Progress: real); virtual;
 
@@ -391,7 +390,7 @@ begin
       begin
 
         //At first some intelligent try to decide which BG to load
-        FileExt := lowercase(ExtractFileExt(Skin.GetTextureFileName(ThemedSettings.Tex)));
+        FileExt := LowerCase(Skin.GetTextureFileName(ThemedSettings.Tex).GetExtension.ToUTF8);
 
         if IsInArray(FileExt, SUPPORTED_EXTS_BACKGROUNDTEXTURE) then
           TryBGCreate(TMenuBackgroundTexture)
@@ -599,29 +598,29 @@ begin
     ThemeStatic.Typ, $FFFFFF, ThemeStatic.Reflection, ThemeStatic.Reflectionspacing);
 end;
 
-function TMenu.AddStatic(X, Y, W, H: real; const Name: string): integer;
+function TMenu.AddStatic(X, Y, W, H: real; const TexName: IPath): integer;
 begin
-  Result := AddStatic(X, Y, W, H, Name, TEXTURE_TYPE_PLAIN);
+  Result := AddStatic(X, Y, W, H, TexName, TEXTURE_TYPE_PLAIN);
 end;
 
 function TMenu.AddStatic(X, Y, W, H: real;
-                         ColR, ColG, ColB: real;
-			 const Name: string;
+       ColR, ColG, ColB: real;
+			 const TexName: IPath;
 			 Typ: TTextureType): integer;
 begin
-  Result := AddStatic(X, Y, W, H, ColR, ColG, ColB, Name, Typ, $FFFFFF);
+  Result := AddStatic(X, Y, W, H, ColR, ColG, ColB, TexName, Typ, $FFFFFF);
 end;
 
 function TMenu.AddStatic(X, Y, W, H, Z: real;
-                         ColR, ColG, ColB: real;
-			 const Name: string;
+       ColR, ColG, ColB: real;
+			 const TexName: IPath;
 			 Typ: TTextureType): integer;
 begin
-  Result := AddStatic(X, Y, W, H, Z, ColR, ColG, ColB, Name, Typ, $FFFFFF);
+  Result := AddStatic(X, Y, W, H, Z, ColR, ColG, ColB, TexName, Typ, $FFFFFF);
 end;
 
 function TMenu.AddStatic(X, Y, W, H: real;
-                         const Name: string;
+       const TexName: IPath;
 			 Typ: TTextureType): integer;
 var
   StatNum: integer;
@@ -629,7 +628,7 @@ begin
   // adds static
   StatNum := Length(Static);
   SetLength(Static, StatNum + 1);
-  Static[StatNum] := TStatic.Create(Texture.GetTexture(Name, Typ, $FF00FF)); // new skin
+  Static[StatNum] := TStatic.Create(Texture.GetTexture(TexName, Typ, $FF00FF)); // new skin
 
   // configures static
   Static[StatNum].Texture.X := X;
@@ -642,26 +641,26 @@ end;
 
 function TMenu.AddStatic(X, Y, W, H: real;
                          ColR, ColG, ColB: real;
-			 const Name: string;
+			 const TexName: IPath;
 			 Typ: TTextureType;
 			 Color: integer): integer;
 begin
-  Result := AddStatic(X, Y, W, H, 0, ColR, ColG, ColB, Name, Typ, Color);
+  Result := AddStatic(X, Y, W, H, 0, ColR, ColG, ColB, TexName, Typ, Color);
 end;
 
 function TMenu.AddStatic(X, Y, W, H, Z: real;
                          ColR, ColG, ColB: real;
-			 const Name: string;
+			 const TexName: IPath;
 			 Typ: TTextureType;
 			 Color: integer): integer;
 begin
-  Result := AddStatic(X, Y, W, H, Z, ColR, ColG, ColB, 0, 0, 1, 1, Name, Typ, Color, false, 0);
+  Result := AddStatic(X, Y, W, H, Z, ColR, ColG, ColB, 0, 0, 1, 1, TexName, Typ, Color, false, 0);
 end;
 
 function TMenu.AddStatic(X, Y, W, H, Z: real;
                          ColR, ColG, ColB: real;
 			 TexX1, TexY1, TexX2, TexY2: real;
-			 const Name: string;
+			 const TexName: IPath;
 			 Typ: TTextureType;
 			 Color: integer;
 			 Reflection: boolean;
@@ -677,11 +676,11 @@ begin
   if (Typ = TEXTURE_TYPE_COLORIZED) then
   begin
     // give encoded color to GetTexture()
-    Static[StatNum] := TStatic.Create(Texture.GetTexture(Name, Typ, RGBFloatToInt(ColR, ColG, ColB)));
+    Static[StatNum] := TStatic.Create(Texture.GetTexture(TexName, Typ, RGBFloatToInt(ColR, ColG, ColB)));
   end
   else
   begin
-    Static[StatNum] := TStatic.Create(Texture.GetTexture(Name, Typ, Color)); // new skin
+    Static[StatNum] := TStatic.Create(Texture.GetTexture(TexName, Typ, Color)); // new skin
   end;
                      
   // configures static
@@ -726,7 +725,7 @@ begin
     ThemeText.ColR, ThemeText.ColG, ThemeText.ColB, ThemeText.Align, ThemeText.Text, ThemeText.Reflection, ThemeText.ReflectionSpacing, ThemeText.Z);
 end;
 
-function TMenu.AddText(X, Y: real; const Text_: string): integer;
+function TMenu.AddText(X, Y: real; const Text_: UTF8String): integer;
 var
   TextNum: integer;
 begin
@@ -739,20 +738,20 @@ end;
 
 function TMenu.AddText(X, Y: real;
                       Style: integer;
-		      Size, ColR, ColG, ColB: real
-		      ; const Text: string): integer;
+                      Size, ColR, ColG, ColB: real;
+                      const Text: UTF8String): integer;
 begin
   Result := AddText(X, Y, 0, Style, Size, ColR, ColG, ColB, 0, Text, false, 0, 0);
 end;
 
 function TMenu.AddText(X, Y, W: real;
                        Style: integer;
-		       Size, ColR, ColG, ColB: real;
-		       Align: integer;
-		       const Text_: string;
-		       Reflection_: boolean;
-		       ReflectionSpacing_: real;
-		       Z : real): integer;
+                       Size, ColR, ColG, ColB: real;
+                       Align: integer;
+                       const Text_: UTF8String;
+                       Reflection_: boolean;
+                       ReflectionSpacing_: real;
+                       Z : real): integer;
 var
   TextNum: integer;
 begin
@@ -843,18 +842,18 @@ begin
   Log.LogBenchmark('====> Screen Options32', 6);
 end;
 
-function TMenu.AddButton(X, Y, W, H: real; const Name: string): integer;
+function TMenu.AddButton(X, Y, W, H: real; const TexName: IPath): integer;
 begin
-  Result := AddButton(X, Y, W, H, Name, TEXTURE_TYPE_PLAIN, false);
+  Result := AddButton(X, Y, W, H, TexName, TEXTURE_TYPE_PLAIN, false);
 end;
 
-function TMenu.AddButton(X, Y, W, H: real; const Name: string; Typ: TTextureType; Reflection: boolean): integer;
+function TMenu.AddButton(X, Y, W, H: real; const TexName: IPath; Typ: TTextureType; Reflection: boolean): integer;
 begin
-  Result := AddButton(X, Y, W, H, 1, 1, 1, 1, 1, 1, 1, 0.5, Name, TEXTURE_TYPE_PLAIN, Reflection, 15, 15);
+  Result := AddButton(X, Y, W, H, 1, 1, 1, 1, 1, 1, 1, 0.5, TexName, TEXTURE_TYPE_PLAIN, Reflection, 15, 15);
 end;
 
 function TMenu.AddButton(X, Y, W, H, ColR, ColG, ColB, Int, DColR, DColG, DColB, DInt: real;
-                         const Name: string;
+                         const TexName: IPath;
 			 Typ: TTextureType;
                          Reflection: boolean;
 			 ReflectionSpacing, DeSelectReflectionSpacing: real): integer;
@@ -876,12 +875,12 @@ begin
   if (Typ = TEXTURE_TYPE_COLORIZED) then
   begin
     // give encoded color to GetTexture()
-    Button[Result] := TButton.Create(Texture.GetTexture(Name, Typ, RGBFloatToInt(ColR, ColG, ColB)),
-                                     Texture.GetTexture(Name, Typ, RGBFloatToInt(DColR, DColG, DColB)));
+    Button[Result] := TButton.Create(Texture.GetTexture(TexName, Typ, RGBFloatToInt(ColR, ColG, ColB)),
+                                     Texture.GetTexture(TexName, Typ, RGBFloatToInt(DColR, DColG, DColB)));
   end
   else
   begin
-    Button[Result] := TButton.Create(Texture.GetTexture(Name, Typ));
+    Button[Result] := TButton.Create(Texture.GetTexture(TexName, Typ));
   end;
 
   // configures button
@@ -935,11 +934,11 @@ var
   J: integer;
 begin
   // We don't forget about newly implemented static for nice skin ...
-  for J := 0 to Length(Static) - 1 do
+  for J := 0 to High(Static) do
     Static[J].Draw;
 
   // ... and slightly implemented menutext unit
-  for J := 0 to Length(Text) - 1 do
+  for J := 0 to High(Text) do
     Text[J].Draw;
 
   //  Draw all ButtonCollections
@@ -947,10 +946,10 @@ begin
     ButtonCollection[J].Draw;
 
   // Second, we draw all of our buttons
-  for J := 0 to Length(Button) - 1 do
+  for J := 0 to High(Button) do
     Button[J].Draw;
 
-  for J := 0 to Length(SelectsS) - 1 do
+  for J := 0 to High(SelectsS) do
     SelectsS[J].Draw;
 
   // Third, we draw all our widgets
@@ -1178,21 +1177,41 @@ begin
   AudioPlayback.PlaySound( aSound );
 end;
 
+procedure OnSaveEncodingError(Value: boolean; Data: Pointer);
+begin
+  Display.CheckOK := Value;
+  if (Value) then
+  begin
+    //Hack to Finish Singscreen correct on Exit with Q Shortcut
+    if (Display.NextScreenWithCheck = nil) then
+    begin
+      if (Display.CurrentScreen = @ScreenSing) then
+        ScreenSing.Finish
+      else if (Display.CurrentScreen = @ScreenSingModi) then
+        ScreenSingModi.Finish;
+    end;
+  end
+  else
+  begin
+    Display.NextScreenWithCheck := nil;
+  end;
+end;
+
 //popup hack
-procedure TMenu.CheckFadeTo(Screen: PMenu; msg: string);
+procedure TMenu.CheckFadeTo(Screen: PMenu; Msg: UTF8String);
 begin
   Display.Fade := 0;
   Display.NextScreenWithCheck := Screen;
   Display.CheckOK := false;
-  ScreenPopupCheck.ShowPopup(msg);
+  ScreenPopupCheck.ShowPopup(msg, OnSaveEncodingError, nil, false);
 end;
 
-procedure TMenu.AddButtonText(AddX, AddY: real; const AddText: string);
+procedure TMenu.AddButtonText(AddX, AddY: real; const AddText: UTF8String);
 begin
   AddButtonText(AddX, AddY, 1, 1, 1, AddText);
 end;
 
-procedure TMenu.AddButtonText(AddX, AddY: real; ColR, ColG, ColB: real; const AddText: string);
+procedure TMenu.AddButtonText(AddX, AddY: real; ColR, ColG, ColB: real; const AddText: UTF8String);
 var
   Il: integer;
 begin
@@ -1208,7 +1227,7 @@ begin
   end;
 end;
 
-procedure TMenu.AddButtonText(AddX, AddY: real; ColR, ColG, ColB: real; Font: integer; Size: integer; Align: integer; const AddText: string);
+procedure TMenu.AddButtonText(AddX, AddY: real; ColR, ColG, ColB: real; Font: integer; Size: integer; Align: integer; const AddText: UTF8String);
 var
   Il: integer;
 begin
@@ -1227,7 +1246,7 @@ begin
   end;
 end;
 
-procedure TMenu.AddButtonText(CustomButton: TButton; AddX, AddY: real; ColR, ColG, ColB: real; Font: integer; Size: integer; Align: integer; const AddText: string);
+procedure TMenu.AddButtonText(CustomButton: TButton; AddX, AddY: real; ColR, ColG, ColB: real; Font: integer; Size: integer; Align: integer; const AddText: UTF8String);
 var
   Il: integer;
 begin
@@ -1246,7 +1265,7 @@ begin
   end;
 end;
 
-function TMenu.AddSelectSlide(ThemeSelectS: TThemeSelectSlide; var Data: integer; Values: array of string): integer;
+function TMenu.AddSelectSlide(ThemeSelectS: TThemeSelectSlide; var Data: integer; const Values: array of UTF8String): integer;
 var
   SO: integer;
 begin
@@ -1283,8 +1302,8 @@ function TMenu.AddSelectSlide(X, Y, W, H, SkipX, SBGW, ColR, ColG, ColB, Int, DC
   TColR, TColG, TColB, TInt, TDColR, TDColG, TDColB, TDInt,
   SBGColR, SBGColG, SBGColB, SBGInt, SBGDColR, SBGDColG, SBGDColB, SBGDInt,
   STColR, STColG, STColB, STInt, STDColR, STDColG, STDColB, STDInt: real;
-  const Name: string; Typ: TTextureType; const SBGName: string; SBGTyp: TTextureType;
-  const Caption: string; var Data: integer): integer;
+  const TexName: IPath; Typ: TTextureType; const SBGName: IPath; SBGTyp: TTextureType;
+  const Caption: UTF8String; var Data: integer): integer;
 var
   S: integer;
   I: integer;
@@ -1294,9 +1313,9 @@ begin
   SelectsS[S] := TSelectSlide.Create;
 
   if (Typ = TEXTURE_TYPE_COLORIZED) then
-    SelectsS[S].Texture := Texture.GetTexture(Name, Typ, RGBFloatToInt(ColR, ColG, ColB))
+    SelectsS[S].Texture := Texture.GetTexture(TexName, Typ, RGBFloatToInt(ColR, ColG, ColB))
   else
-    SelectsS[S].Texture := Texture.GetTexture(Name, Typ);
+    SelectsS[S].Texture := Texture.GetTexture(TexName, Typ);
   SelectsS[S].X := X;
   SelectsS[S].Y := Y;
   SelectsS[S].W := W;
@@ -1414,12 +1433,12 @@ begin
   Result := S;
 end;
 
-procedure TMenu.AddSelectSlideOption(const AddText: string);
+procedure TMenu.AddSelectSlideOption(const AddText: UTF8String);
 begin
   AddSelectSlideOption(High(SelectsS), AddText);
 end;
 
-procedure TMenu.AddSelectSlideOption(SelectNo: cardinal; const AddText: string);
+procedure TMenu.AddSelectSlideOption(SelectNo: cardinal; const AddText: UTF8String);
 var
   SO: integer;
 begin
@@ -1435,7 +1454,8 @@ begin
 }
 end;
 
-procedure TMenu.UpdateSelectSlideOptions(ThemeSelectSlide: TThemeSelectSlide; SelectNum: integer; Values: array of string; var Data: integer);
+procedure TMenu.UpdateSelectSlideOptions(ThemeSelectSlide: TThemeSelectSlide;
+  SelectNum: integer; const Values: array of UTF8String; var Data: integer);
 var
   SO: integer;
 begin
@@ -1560,7 +1580,7 @@ begin
   AddStatic(X+2, Y+2, W-4, H-4, 1, 1, 1, Skin.GetTextureFileName('MainBar'), TEXTURE_TYPE_COLORIZED);
 end;
 
-procedure TMenu.onShow;
+procedure TMenu.OnShow;
 begin
   // FIXME: this needs some work. First, there should be a variable like
   // VideoBackground so we can check whether a video-background is enabled or not.
@@ -1589,57 +1609,18 @@ begin
   Background.OnShow;
 end;
 
-procedure TMenu.onShowFinish;
+procedure TMenu.OnShowFinish;
 begin
   // nothing
 end;
 
-(*
- * Wrapper for WideUpperCase. Needed because some plattforms have problems with
- * unicode support.
- *)
-function TMenu.WideCharUpperCase(wchar: WideChar) : WideString;
-begin
-  // On Linux and MacOSX the cwstring unit is necessary for Unicode function-calls.
-  // Otherwise you will get an EIntOverflow exception (thrown by unimplementedwidestring()).
-  // The Unicode manager cwstring does not work with MacOSX at the moment because
-  // of missing references to iconv. So we have to use Ansi... for the moment.
-
-  // cwstring crashes in FPC 2.2.2 so do not use the cwstring stuff
-  {.$IFNDEF DARWIN}
-  {$IFDEF NOIGNORE}
-    // The FPC implementation of WideUpperCase returns nil if wchar is #0 (e.g. if an arrow key is pressed)
-    if (wchar <> #0) then
-      Result := WideUpperCase(wchar)
-    else
-      Result := #0;
-  {$ELSE}
-    Result := AnsiUpperCase(wchar)
-  {$ENDIF}
-end;
-
-(*
- * Wrapper for WideUpperCase. Needed because some plattforms have problems with
- * unicode support.
- *)
-function TMenu.WideStringUpperCase(wstring: WideString) : WideString;
-begin
-  // cwstring crashes in FPC 2.2.2 so do not use the cwstring stuff
-  {.$IFNDEF DARWIN}
-  {$IFDEF NOIGNORE}
-    Result := WideUpperCase(wstring)
-  {$ELSE}
-    Result := AnsiUpperCase(wstring);
-  {$ENDIF}
-end;
-
-procedure TMenu.onHide;
+procedure TMenu.OnHide;
 begin
   // nothing
   Background.OnFinish;
 end;
 
-function TMenu.ParseInput(PressedKey: cardinal; CharCode: WideChar; PressedDown: boolean): boolean;
+function TMenu.ParseInput(PressedKey: Cardinal; CharCode: UCS4Char; PressedDown: boolean): boolean;
 begin
   // nothing
   Result := true;
@@ -1657,7 +1638,7 @@ begin
   if RightMbESC and (MouseButton = SDL_BUTTON_RIGHT) and BtnDown then
   begin
     //if RightMbESC is set, send ESC keypress
-    Result:=ParseInput(SDLK_ESCAPE, #0, true);
+    Result:=ParseInput(SDLK_ESCAPE, 0, true);
   end;
 
   nBut := InteractAt(X, Y);
@@ -1669,18 +1650,18 @@ begin
     if (MouseButton = SDL_BUTTON_LEFT) and BtnDown then
     begin
       //click button
-      Result:=ParseInput(SDLK_RETURN, #0, true);
+      Result:=ParseInput(SDLK_RETURN, 0, true);
     end;
     if (Interactions[nBut].Typ = iSelectS) then
     begin
       //forward/backward in select slide with mousewheel
       if (MouseButton = SDL_BUTTON_WHEELDOWN) and BtnDown then
       begin
-        ParseInput(SDLK_RIGHT, #0, true);
+        ParseInput(SDLK_RIGHT, 0, true);
       end;
       if (MouseButton = SDL_BUTTON_WHEELUP) and BtnDown then
       begin
-        ParseInput(SDLK_LEFT, #0, true);
+        ParseInput(SDLK_LEFT, 0, true);
       end;
     end;
   end
diff --git a/src/menu/UMenuBackground.pas b/src/menu/UMenuBackground.pas
index c85f0806..0e2e63a6 100644
--- a/src/menu/UMenuBackground.pas
+++ b/src/menu/UMenuBackground.pas
@@ -1,83 +1,83 @@
-{* UltraStar Deluxe - Karaoke Game
- *
- * UltraStar Deluxe is the legal property of its developers, whose names
- * are too numerous to list here. Please refer to the COPYRIGHT
- * file distributed with this source distribution.
- *
- * 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
- * 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; see the file COPYING. If not, write to
- * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
- * Boston, MA 02110-1301, USA.
- *
- * $URL$
- * $Id$
- *}
-
-unit UMenuBackground;
-
-interface
-
-{$IFDEF FPC}
-  {$MODE Delphi}
-{$ENDIF}
-
-{$I switches.inc}
-
-uses
-  SysUtils,
-  UThemes;
-
-//TMenuBackground - abstraction class for MenuBackgrounds
-//this is a class, not an interface because of the constructors
-//and destructors
-//--------
-
-type
-  EMenuBackgroundError = class(Exception);
-  TMenuBackground = class
-    constructor Create(const ThemedSettings: TThemeBackground); virtual;
-    procedure   OnShow; virtual;
-    procedure   Draw; virtual;
-    procedure   OnFinish; virtual;
-    destructor  Destroy; override;
-  end;
-  cMenuBackground = class of TMenuBackground;
-
-implementation
-
-constructor TMenuBackground.Create(const ThemedSettings: TThemeBackground);
-begin
-  inherited Create;
-end;
-
-destructor  TMenuBackground.Destroy;
-begin
-  inherited;
-end;
-
-procedure   TMenuBackground.OnShow;
-begin
-
-end;
-
-procedure   TMenuBackground.OnFinish;
-begin
-
-end;
-
-procedure   TMenuBackground.Draw;
-begin
-
-end;
-
-end.
+{* UltraStar Deluxe - Karaoke Game
+ *
+ * UltraStar Deluxe is the legal property of its developers, whose names
+ * are too numerous to list here. Please refer to the COPYRIGHT
+ * file distributed with this source distribution.
+ *
+ * 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
+ * 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; see the file COPYING. If not, write to
+ * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ *
+ * $URL$
+ * $Id$
+ *}
+
+unit UMenuBackground;
+
+interface
+
+{$IFDEF FPC}
+  {$MODE Delphi}
+{$ENDIF}
+
+{$I switches.inc}
+
+uses
+  SysUtils,
+  UThemes;
+
+//TMenuBackground - abstraction class for MenuBackgrounds
+//this is a class, not an interface because of the constructors
+//and destructors
+//--------
+
+type
+  EMenuBackgroundError = class(Exception);
+  TMenuBackground = class
+    constructor Create(const ThemedSettings: TThemeBackground); virtual;
+    procedure   OnShow; virtual;
+    procedure   Draw; virtual;
+    procedure   OnFinish; virtual;
+    destructor  Destroy; override;
+  end;
+  cMenuBackground = class of TMenuBackground;
+
+implementation
+
+constructor TMenuBackground.Create(const ThemedSettings: TThemeBackground);
+begin
+  inherited Create;
+end;
+
+destructor  TMenuBackground.Destroy;
+begin
+  inherited;
+end;
+
+procedure   TMenuBackground.OnShow;
+begin
+
+end;
+
+procedure   TMenuBackground.OnFinish;
+begin
+
+end;
+
+procedure   TMenuBackground.Draw;
+begin
+
+end;
+
+end.
diff --git a/src/menu/UMenuBackgroundColor.pas b/src/menu/UMenuBackgroundColor.pas
index a5c2a70a..45b58c1e 100644
--- a/src/menu/UMenuBackgroundColor.pas
+++ b/src/menu/UMenuBackgroundColor.pas
@@ -1,73 +1,73 @@
-{* UltraStar Deluxe - Karaoke Game
- *
- * UltraStar Deluxe is the legal property of its developers, whose names
- * are too numerous to list here. Please refer to the COPYRIGHT
- * file distributed with this source distribution.
- *
- * 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
- * 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; see the file COPYING. If not, write to
- * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
- * Boston, MA 02110-1301, USA.
- *
- * $URL$
- * $Id$
- *}
-
-unit UMenuBackgroundColor;
-
-interface
-
-{$IFDEF FPC}
-  {$MODE Delphi}
-{$ENDIF}
-
-{$I switches.inc}
-
-uses
-  UThemes,
-  UMenuBackground;
-
-//TMenuBackgroundColor - Background Color
-//--------
-
-type
-  TMenuBackgroundColor = class (TMenuBackground)
-    private
-      Color: TRGB;
-    public
-      constructor Create(const ThemedSettings: TThemeBackground); override;
-      procedure   Draw; override;
-  end;
-
-implementation
-uses
-  gl,
-  glext,
-  UGraphic;
-
-constructor TMenuBackgroundColor.Create(const ThemedSettings: TThemeBackground);
-begin
-  inherited;
-  Color := ThemedSettings.Color;
-end;
-
-procedure   TMenuBackgroundColor.Draw;
-begin
-  if (ScreenAct = 1) then
-  begin //just clear once, even when using two screens
-   glClearColor(Color.R, Color.G, Color.B, 0);
-   glClear(GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT);
-  end;
-end;
-
+{* UltraStar Deluxe - Karaoke Game
+ *
+ * UltraStar Deluxe is the legal property of its developers, whose names
+ * are too numerous to list here. Please refer to the COPYRIGHT
+ * file distributed with this source distribution.
+ *
+ * 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
+ * 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; see the file COPYING. If not, write to
+ * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ *
+ * $URL$
+ * $Id$
+ *}
+
+unit UMenuBackgroundColor;
+
+interface
+
+{$IFDEF FPC}
+  {$MODE Delphi}
+{$ENDIF}
+
+{$I switches.inc}
+
+uses
+  UThemes,
+  UMenuBackground;
+
+//TMenuBackgroundColor - Background Color
+//--------
+
+type
+  TMenuBackgroundColor = class (TMenuBackground)
+    private
+      Color: TRGB;
+    public
+      constructor Create(const ThemedSettings: TThemeBackground); override;
+      procedure   Draw; override;
+  end;
+
+implementation
+uses
+  gl,
+  glext,
+  UGraphic;
+
+constructor TMenuBackgroundColor.Create(const ThemedSettings: TThemeBackground);
+begin
+  inherited;
+  Color := ThemedSettings.Color;
+end;
+
+procedure   TMenuBackgroundColor.Draw;
+begin
+  if (ScreenAct = 1) then
+  begin //just clear once, even when using two screens
+   glClearColor(Color.R, Color.G, Color.B, 0);
+   glClear(GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT);
+  end;
+end;
+
 end.
\ No newline at end of file
diff --git a/src/menu/UMenuBackgroundFade.pas b/src/menu/UMenuBackgroundFade.pas
index b61a4542..6d877baa 100644
--- a/src/menu/UMenuBackgroundFade.pas
+++ b/src/menu/UMenuBackgroundFade.pas
@@ -1,176 +1,176 @@
-{* UltraStar Deluxe - Karaoke Game
- *
- * UltraStar Deluxe is the legal property of its developers, whose names
- * are too numerous to list here. Please refer to the COPYRIGHT
- * file distributed with this source distribution.
- *
- * 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
- * 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; see the file COPYING. If not, write to
- * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
- * Boston, MA 02110-1301, USA.
- *
- * $URL$
- * $Id$
- *}
-
-unit UMenuBackgroundFade;
-
-interface
-
-{$IFDEF FPC}
-  {$MODE Delphi}
-{$ENDIF}
-
-{$I switches.inc}
-
-uses
-  UThemes,
-  UTexture,
-  UMenuBackground;
-
-//TMenuBackgroundFade - Background Fade In for Overlay screens
-//--------
-
-type
-  TMenuBackgroundFade = class (TMenuBackground)
-    private
-      Tex:        TTexture;
-      Color:      TRGB;
-      Alpha:      real;
-      
-      useTexture: boolean;
-
-      FadeTime:   cardinal;
-    public
-      constructor Create(const ThemedSettings: TThemeBackground); override;
-      procedure   OnShow; override;
-      procedure   Draw; override;
-      destructor  Destroy; override;
-  end;
-
-const
-  FADEINTIME = 1500; //Time the bg fades in
-
-implementation
-uses
-  sdl,
-  gl,
-  glext,
-  USkins,
-  UCommon,
-  UGraphic;
-
-constructor TMenuBackgroundFade.Create(const ThemedSettings: TThemeBackground);
-var
-  texFilename: string;
-begin
-  inherited;
-  FadeTime := 0;
-
-  Color := ThemedSettings.Color;
-  Alpha := ThemedSettings.Alpha;
-  if (Length(ThemedSettings.Tex) > 0) then
-  begin
-    texFilename := Skin.GetTextureFileName(ThemedSettings.Tex);
-    texFilename := AdaptFilePaths(texFilename);
-    Tex         := Texture.GetTexture(texFilename, TEXTURE_TYPE_PLAIN);
-
-    UseTexture  := (Tex.TexNum <> 0);
-  end
-  else
-    UseTexture := false;
-
-  if (not UseTexture) then
-    FreeandNil(Tex);
-end;
-
-destructor  TMenuBackgroundFade.Destroy;
-begin
-  //Why isn't there any Tex.free method?
-  {if UseTexture then
-    FreeandNil(Tex); }
-  inherited;
-end;
-
-procedure   TMenuBackgroundFade.OnShow;
-begin
-  FadeTime := SDL_GetTicks;
-end;
-
-procedure   TMenuBackgroundFade.Draw;
-var
-  Progress: real;
-begin
-  if FadeTime = 0 then
-    Progress := Alpha
-  else
-    Progress := Alpha * (SDL_GetTicks - FadeTime) / FADEINTIME;
-
-  if Progress > Alpha then
-  begin
-    FadeTime := 0;
-    Progress := Alpha;
-  end;
-
-  if (UseTexture) then
-  begin //Draw Texture to Screen
-    if (ScreenAct = 1) then //Clear just once when in dual screen mode
-      glClear(GL_DEPTH_BUFFER_BIT);
-
-    glEnable(GL_TEXTURE_2D);
-    glEnable(GL_BLEND);
-    glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
-
-    glColorRGB(Color, Progress);
-    glBindTexture(GL_TEXTURE_2D, Tex.TexNum);
-
-    glBegin(GL_QUADS);
-      glTexCoord2f(Tex.TexX1*Tex.TexW, Tex.TexY1*Tex.TexH);
-      glVertex2f(0, 0);
-
-      glTexCoord2f(Tex.TexX1*Tex.TexW, Tex.TexY2*Tex.TexH);
-      glVertex2f(0, 600);
-
-      glTexCoord2f(Tex.TexX2*Tex.TexW, Tex.TexY2*Tex.TexH);
-      glVertex2f(800, 600);
-
-      glTexCoord2f(Tex.TexX2*Tex.TexW, Tex.TexY1*Tex.TexH);
-      glVertex2f(800, 0);
-    glEnd;
-
-    glDisable(GL_BLEND);
-    glDisable(GL_TEXTURE_2D);
-  end
-  else
-  begin //Clear Screen w/ progress Alpha + Color
-    if (ScreenAct = 1) then //Clear just once when in dual screen mode
-      glClear(GL_DEPTH_BUFFER_BIT);
-      
-    glDisable(GL_TEXTURE_2D);
-    glEnable(GL_BLEND);
-    glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
-
-    glColorRGB(Color, Progress);
-
-    glBegin(GL_QUADS);
-      glVertex2f(0, 0);
-      glVertex2f(0, 600);
-      glVertex2f(800, 600);
-      glVertex2f(800, 0);
-    glEnd;
-
-    glDisable(GL_BLEND);
-  end;  
-end;
-
-end.
+{* UltraStar Deluxe - Karaoke Game
+ *
+ * UltraStar Deluxe is the legal property of its developers, whose names
+ * are too numerous to list here. Please refer to the COPYRIGHT
+ * file distributed with this source distribution.
+ *
+ * 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
+ * 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; see the file COPYING. If not, write to
+ * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ *
+ * $URL$
+ * $Id$
+ *}
+
+unit UMenuBackgroundFade;
+
+interface
+
+{$IFDEF FPC}
+  {$MODE Delphi}
+{$ENDIF}
+
+{$I switches.inc}
+
+uses
+  UThemes,
+  UTexture,
+  UMenuBackground,
+  UPath;
+
+//TMenuBackgroundFade - Background Fade In for Overlay screens
+//--------
+
+type
+  TMenuBackgroundFade = class (TMenuBackground)
+    private
+      Tex:        TTexture;
+      Color:      TRGB;
+      Alpha:      real;
+      
+      useTexture: boolean;
+
+      FadeTime:   cardinal;
+    public
+      constructor Create(const ThemedSettings: TThemeBackground); override;
+      procedure   OnShow; override;
+      procedure   Draw; override;
+      destructor  Destroy; override;
+  end;
+
+const
+  FADEINTIME = 1500; //Time the bg fades in
+
+implementation
+uses
+  sdl,
+  gl,
+  glext,
+  USkins,
+  UCommon,
+  UGraphic;
+
+constructor TMenuBackgroundFade.Create(const ThemedSettings: TThemeBackground);
+var
+  texFilename: IPath;
+begin
+  inherited;
+  FadeTime := 0;
+
+  Color := ThemedSettings.Color;
+  Alpha := ThemedSettings.Alpha;
+  if (Length(ThemedSettings.Tex) > 0) then
+  begin
+    texFilename := Skin.GetTextureFileName(ThemedSettings.Tex);
+    Tex         := Texture.GetTexture(texFilename, TEXTURE_TYPE_PLAIN);
+
+    UseTexture  := (Tex.TexNum <> 0);
+  end
+  else
+    UseTexture := false;
+
+  if (not UseTexture) then
+    FreeandNil(Tex);
+end;
+
+destructor  TMenuBackgroundFade.Destroy;
+begin
+  //Why isn't there any Tex.free method?
+  {if UseTexture then
+    FreeandNil(Tex); }
+  inherited;
+end;
+
+procedure   TMenuBackgroundFade.OnShow;
+begin
+  FadeTime := SDL_GetTicks;
+end;
+
+procedure   TMenuBackgroundFade.Draw;
+var
+  Progress: real;
+begin
+  if FadeTime = 0 then
+    Progress := Alpha
+  else
+    Progress := Alpha * (SDL_GetTicks - FadeTime) / FADEINTIME;
+
+  if Progress > Alpha then
+  begin
+    FadeTime := 0;
+    Progress := Alpha;
+  end;
+
+  if (UseTexture) then
+  begin //Draw Texture to Screen
+    if (ScreenAct = 1) then //Clear just once when in dual screen mode
+      glClear(GL_DEPTH_BUFFER_BIT);
+
+    glEnable(GL_TEXTURE_2D);
+    glEnable(GL_BLEND);
+    glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
+
+    glColorRGB(Color, Progress);
+    glBindTexture(GL_TEXTURE_2D, Tex.TexNum);
+
+    glBegin(GL_QUADS);
+      glTexCoord2f(Tex.TexX1*Tex.TexW, Tex.TexY1*Tex.TexH);
+      glVertex2f(0, 0);
+
+      glTexCoord2f(Tex.TexX1*Tex.TexW, Tex.TexY2*Tex.TexH);
+      glVertex2f(0, 600);
+
+      glTexCoord2f(Tex.TexX2*Tex.TexW, Tex.TexY2*Tex.TexH);
+      glVertex2f(800, 600);
+
+      glTexCoord2f(Tex.TexX2*Tex.TexW, Tex.TexY1*Tex.TexH);
+      glVertex2f(800, 0);
+    glEnd;
+
+    glDisable(GL_BLEND);
+    glDisable(GL_TEXTURE_2D);
+  end
+  else
+  begin //Clear Screen w/ progress Alpha + Color
+    if (ScreenAct = 1) then //Clear just once when in dual screen mode
+      glClear(GL_DEPTH_BUFFER_BIT);
+      
+    glDisable(GL_TEXTURE_2D);
+    glEnable(GL_BLEND);
+    glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
+
+    glColorRGB(Color, Progress);
+
+    glBegin(GL_QUADS);
+      glVertex2f(0, 0);
+      glVertex2f(0, 600);
+      glVertex2f(800, 600);
+      glVertex2f(800, 0);
+    glEnd;
+
+    glDisable(GL_BLEND);
+  end;  
+end;
+
+end.
diff --git a/src/menu/UMenuBackgroundNone.pas b/src/menu/UMenuBackgroundNone.pas
index 1fccc007..c64f3023 100644
--- a/src/menu/UMenuBackgroundNone.pas
+++ b/src/menu/UMenuBackgroundNone.pas
@@ -1,70 +1,70 @@
-{* UltraStar Deluxe - Karaoke Game
- *
- * UltraStar Deluxe is the legal property of its developers, whose names
- * are too numerous to list here. Please refer to the COPYRIGHT
- * file distributed with this source distribution.
- *
- * 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
- * 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; see the file COPYING. If not, write to
- * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
- * Boston, MA 02110-1301, USA.
- *
- * $URL$
- * $Id$
- *}
-
-unit UMenuBackgroundNone;
-
-interface
-
-{$IFDEF FPC}
-  {$MODE Delphi}
-{$ENDIF}
-
-{$I switches.inc}
-
-uses
-  UThemes,
-  UMenuBackground;
-
-//TMenuBackgroundNone - Just no Background (e.g. for Overlays)
-//--------
-
-type
-  TMenuBackgroundNone = class (TMenuBackground)
-    private
-
-    public
-      constructor Create(const ThemedSettings: TThemeBackground); override;
-      procedure   Draw; override;
-  end;
-
-implementation
-uses
-  gl,
-  glext,
-  UGraphic;
-
-constructor TMenuBackgroundNone.Create(const ThemedSettings: TThemeBackground);
-begin
-  inherited;
-end;
-
-procedure   TMenuBackgroundNone.Draw;
-begin
-  //Do just nothing in here!
-  If (ScreenAct = 1) then //Clear just once when in dual screen mode
-    glClear(GL_DEPTH_BUFFER_BIT);
-end;
-
+{* UltraStar Deluxe - Karaoke Game
+ *
+ * UltraStar Deluxe is the legal property of its developers, whose names
+ * are too numerous to list here. Please refer to the COPYRIGHT
+ * file distributed with this source distribution.
+ *
+ * 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
+ * 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; see the file COPYING. If not, write to
+ * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ *
+ * $URL$
+ * $Id$
+ *}
+
+unit UMenuBackgroundNone;
+
+interface
+
+{$IFDEF FPC}
+  {$MODE Delphi}
+{$ENDIF}
+
+{$I switches.inc}
+
+uses
+  UThemes,
+  UMenuBackground;
+
+//TMenuBackgroundNone - Just no Background (e.g. for Overlays)
+//--------
+
+type
+  TMenuBackgroundNone = class (TMenuBackground)
+    private
+
+    public
+      constructor Create(const ThemedSettings: TThemeBackground); override;
+      procedure   Draw; override;
+  end;
+
+implementation
+uses
+  gl,
+  glext,
+  UGraphic;
+
+constructor TMenuBackgroundNone.Create(const ThemedSettings: TThemeBackground);
+begin
+  inherited;
+end;
+
+procedure   TMenuBackgroundNone.Draw;
+begin
+  //Do just nothing in here!
+  If (ScreenAct = 1) then //Clear just once when in dual screen mode
+    glClear(GL_DEPTH_BUFFER_BIT);
+end;
+
 end.
\ No newline at end of file
diff --git a/src/menu/UMenuBackgroundTexture.pas b/src/menu/UMenuBackgroundTexture.pas
index a1b9e88a..f71637ff 100644
--- a/src/menu/UMenuBackgroundTexture.pas
+++ b/src/menu/UMenuBackgroundTexture.pas
@@ -1,125 +1,126 @@
-{* UltraStar Deluxe - Karaoke Game
- *
- * UltraStar Deluxe is the legal property of its developers, whose names
- * are too numerous to list here. Please refer to the COPYRIGHT
- * file distributed with this source distribution.
- *
- * 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
- * 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; see the file COPYING. If not, write to
- * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
- * Boston, MA 02110-1301, USA.
- *
- * $URL$
- * $Id$
- *}
-
-unit UMenuBackgroundTexture;
-
-interface
-
-{$IFDEF FPC}
-  {$MODE Delphi}
-{$ENDIF}
-
-{$I switches.inc}
-
-uses
-  UThemes,
-  UTexture,
-  UMenuBackground;
-
-//TMenuBackgroundColor - Background Color
-//--------
-
-type
-  TMenuBackgroundTexture = class (TMenuBackground)
-    private
-      Tex: TTexture;
-      Color: TRGB;
-    public
-      constructor Create(const ThemedSettings: TThemeBackground); override;
-      procedure   Draw; override;
-      destructor  Destroy; override;
-  end;
-
-const
-  SUPPORTED_EXTS_BACKGROUNDTEXTURE: array[0..13] of string = ('.png', '.bmp', '.jpg', '.jpeg', '.gif', '.pnm', '.ppm', '.pgm', '.pbm', '.xpm', '.lbm', '.pcx', '.tga', '.tiff');
-
-implementation
-uses
-  USkins,
-  UCommon,
-  SysUtils,
-  gl,
-  glext,
-  UGraphic;
-
-constructor TMenuBackgroundTexture.Create(const ThemedSettings: TThemeBackground);
-var texFilename: string;
-begin
-  inherited;
-
-  if (Length(ThemedSettings.Tex) = 0) then
-    raise EMenuBackgroundError.Create('TMenuBackgroundTexture: No texture filename present');
-
-  Color       := ThemedSettings.Color;
-
-  texFilename := Skin.GetTextureFileName(ThemedSettings.Tex);
-  texFilename := AdaptFilePaths(texFilename);
-  Tex         := Texture.GetTexture(texFilename, TEXTURE_TYPE_PLAIN);
-
-  if (Tex.TexNum = 0) then
-  begin
-    freeandnil(Tex);
-    raise EMenuBackgroundError.Create('TMenuBackgroundTexture: Can''t load texture');
-  end;
-end;
-
-destructor  TMenuBackgroundTexture.Destroy;
-begin
-  //freeandnil(Tex); <- this causes an Access Violation o0
-  inherited;
-end;
-
-procedure   TMenuBackgroundTexture.Draw;
-begin
-  If (ScreenAct = 1) then //Clear just once when in dual screen mode
-    glClear(GL_DEPTH_BUFFER_BIT);
-    
-  glColorRGB(Color);
-
-  glEnable(GL_TEXTURE_2D);
-  glEnable(GL_BLEND);
-  glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
-
-  glBindTexture(GL_TEXTURE_2D, Tex.TexNum);
-
-  glBegin(GL_QUADS);
-    glTexCoord2f(Tex.TexX1*Tex.TexW, Tex.TexY1*Tex.TexH);
-    glVertex2f(0, 0);
-
-    glTexCoord2f(Tex.TexX1*Tex.TexW, Tex.TexY2*Tex.TexH);
-    glVertex2f(0, 600);
-
-    glTexCoord2f(Tex.TexX2*Tex.TexW, Tex.TexY2*Tex.TexH);
-    glVertex2f(800, 600);
-
-    glTexCoord2f(Tex.TexX2*Tex.TexW, Tex.TexY1*Tex.TexH);
-    glVertex2f(800, 0);
-  glEnd;
-
-  glDisable(GL_BLEND);
-  glDisable(GL_TEXTURE_2D);
-end;
-
-end.
+{* UltraStar Deluxe - Karaoke Game
+ *
+ * UltraStar Deluxe is the legal property of its developers, whose names
+ * are too numerous to list here. Please refer to the COPYRIGHT
+ * file distributed with this source distribution.
+ *
+ * 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
+ * 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; see the file COPYING. If not, write to
+ * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ *
+ * $URL$
+ * $Id$
+ *}
+
+unit UMenuBackgroundTexture;
+
+interface
+
+{$IFDEF FPC}
+  {$MODE Delphi}
+{$ENDIF}
+
+{$I switches.inc}
+
+uses
+  UThemes,
+  UTexture,
+  UMenuBackground,
+  UPath;
+
+//TMenuBackgroundColor - Background Color
+//--------
+
+type
+  TMenuBackgroundTexture = class (TMenuBackground)
+    private
+      Tex: TTexture;
+      Color: TRGB;
+    public
+      constructor Create(const ThemedSettings: TThemeBackground); override;
+      procedure   Draw; override;
+      destructor  Destroy; override;
+  end;
+
+const
+  SUPPORTED_EXTS_BACKGROUNDTEXTURE: array[0..13] of string = ('.png', '.bmp', '.jpg', '.jpeg', '.gif', '.pnm', '.ppm', '.pgm', '.pbm', '.xpm', '.lbm', '.pcx', '.tga', '.tiff');
+
+implementation
+uses
+  USkins,
+  UCommon,
+  SysUtils,
+  gl,
+  glext,
+  UGraphic;
+
+constructor TMenuBackgroundTexture.Create(const ThemedSettings: TThemeBackground);
+var
+  texFilename: IPath;
+begin
+  inherited;
+
+  if (Length(ThemedSettings.Tex) = 0) then
+    raise EMenuBackgroundError.Create('TMenuBackgroundTexture: No texture filename present');
+
+  Color       := ThemedSettings.Color;
+
+  texFilename := Skin.GetTextureFileName(ThemedSettings.Tex);
+  Tex         := Texture.GetTexture(texFilename, TEXTURE_TYPE_PLAIN);
+
+  if (Tex.TexNum = 0) then
+  begin
+    freeandnil(Tex);
+    raise EMenuBackgroundError.Create('TMenuBackgroundTexture: Can''t load texture');
+  end;
+end;
+
+destructor  TMenuBackgroundTexture.Destroy;
+begin
+  //freeandnil(Tex); <- this causes an Access Violation o0
+  inherited;
+end;
+
+procedure   TMenuBackgroundTexture.Draw;
+begin
+  If (ScreenAct = 1) then //Clear just once when in dual screen mode
+    glClear(GL_DEPTH_BUFFER_BIT);
+    
+  glColorRGB(Color);
+
+  glEnable(GL_TEXTURE_2D);
+  glEnable(GL_BLEND);
+  glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
+
+  glBindTexture(GL_TEXTURE_2D, Tex.TexNum);
+
+  glBegin(GL_QUADS);
+    glTexCoord2f(Tex.TexX1*Tex.TexW, Tex.TexY1*Tex.TexH);
+    glVertex2f(0, 0);
+
+    glTexCoord2f(Tex.TexX1*Tex.TexW, Tex.TexY2*Tex.TexH);
+    glVertex2f(0, 600);
+
+    glTexCoord2f(Tex.TexX2*Tex.TexW, Tex.TexY2*Tex.TexH);
+    glVertex2f(800, 600);
+
+    glTexCoord2f(Tex.TexX2*Tex.TexW, Tex.TexY1*Tex.TexH);
+    glVertex2f(800, 0);
+  glEnd;
+
+  glDisable(GL_BLEND);
+  glDisable(GL_TEXTURE_2D);
+end;
+
+end.
diff --git a/src/menu/UMenuBackgroundVideo.pas b/src/menu/UMenuBackgroundVideo.pas
index d1ce0f09..9d265764 100644
--- a/src/menu/UMenuBackgroundVideo.pas
+++ b/src/menu/UMenuBackgroundVideo.pas
@@ -1,204 +1,203 @@
-{* UltraStar Deluxe - Karaoke Game
- *
- * UltraStar Deluxe is the legal property of its developers, whose names
- * are too numerous to list here. Please refer to the COPYRIGHT
- * file distributed with this source distribution.
- *
- * 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
- * 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; see the file COPYING. If not, write to
- * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
- * Boston, MA 02110-1301, USA.
- *
- * $URL$
- * $Id$
- *}
-
-unit UMenuBackgroundVideo;
-
-interface
-
-{$IFDEF FPC}
-  {$MODE Delphi}
-{$ENDIF}
-
-{$I switches.inc}
-
-uses
-  UThemes,
-  UMenuBackground,
-  UVideo;
-
-//TMenuBackgroundColor - Background Color
-//--------
-
-type
-  //DefaultBGVideoPlayback = TVideoPlayback_FFmpeg;
-
-{type
-  TBGVideoPool = class;
-
-  PBGVideoPoolItem = ^TBGVideoPoolItem;
-  TBGVideoPoolItem = record
-    Parent: TBGVideoPool;
-    VideoPlayback = IVideoPlayback;
-    ReferenceCounter: cardinal; //Number of Creations
-  end;
-
-  TBGVideo = class
-    private
-      myItem: PBGVideoPoolItem;
-    public
-      constructor Create(Item: PBGVideoPoolItem); override;
-
-      function    GetVideoPlayback: IVideoPlayback;
-      procedure   Draw;
-
-      destructor  Destroy;
-  end;
-
-  TBGVideoPool = class
-    private
-      Items: PBGVideoPoolItem;
-    public
-      constructor Create;
-
-      function    GetBGVideo(filename: string): TBGVideo;
-      procedure   RemoveItem(
-      procedure   FreeAllItems;
-
-      destructor  Destroy;
-  end;
-
-type }
-  TMenuBackgroundVideo = class (TMenuBackground)
-    private
-      fFilename: string;
-    public
-      constructor Create(const ThemedSettings: TThemeBackground); override;
-      procedure   OnShow; override;
-      procedure   Draw; override;
-      procedure   OnFinish; override;
-      destructor  Destroy; override;
-  end;
-
-{var
-  BGVideoPool: TBGVideoPool;  }
-const
-  SUPPORTED_EXTS_BACKGROUNDVIDEO: array[0..6] of string = ('.avi', '.mov', '.divx', '.mpg', '.mp4', '.mpeg', '.m2v');
-
-implementation
-
-uses
-  gl,
-  glext,
-  UMusic,
-  SysUtils,
-  UTime,
-  USkins,
-  UCommon,
-  UGraphic;
-
-constructor TMenuBackgroundVideo.Create(const ThemedSettings: TThemeBackground);
-begin
-  inherited;
-  if (Length(ThemedSettings.Tex) = 0) then
-    raise EMenuBackgroundError.Create('TMenuBackgroundVideo: No video filename present');
-
-  fFileName := Skin.GetTextureFileName(ThemedSettings.Tex);
-  fFileName := AdaptFilePaths( fFileName );
-
-  if fileexists(fFilename) AND VideoPlayback.Open( fFileName ) then
-  begin
-    VideoBGTimer.SetTime(0);
-    VideoPlayback.Play;
-  end
-  else
-    raise EMenuBackgroundError.Create('TMenuBackgroundVideo: Can''t load background video: ' + fFilename);
-end;
-
-destructor  TMenuBackgroundVideo.Destroy;
-begin
-
-end;
-
-procedure   TMenuBackgroundVideo.OnShow;
-begin
-  if VideoPlayback.Open( fFileName ) then
-  begin
-    VideoBGTimer.SetTime(0);
-    VideoPlayback.Play;
-  end;
-end;
-
-procedure   TMenuBackgroundVideo.OnFinish;
-begin
-
-end;
-
-procedure   TMenuBackgroundVideo.Draw;
-begin
-  If (ScreenAct = 1) then //Clear just once when in dual screen mode
-    glClear(GL_DEPTH_BUFFER_BIT);
-
-  VideoPlayback.GetFrame(VideoBGTimer.GetTime());
-    // FIXME: why do we draw on screen 2? Seems to be wrong.
-  VideoPlayback.DrawGL(2);
-end;
-
-// Implementation of TBGVideo
-//--------
-{constructor TBGVideo.Create(Item: PBGVideoPoolItem);
-begin
-  myItem := PBGVideoPoolItem;
-  Inc(myItem.ReferenceCounter);
-end;
-
-destructor  TBGVideo.Destroy;
-begin
-  Dec(myItem.ReferenceCounter);
-end;
-
-function    TBGVideo.GetVideoPlayback: IVideoPlayback;
-begin
-
-end;
-
-procedure   TBGVideo.Draw;
-begin
-
-end;
-
-// Implementation of TBGVideoPool
-//--------
-
-constructor TBGVideoPool.Create;
-begin
-
-end;
-
-destructor  TBGVideoPool.Destroy;
-begin
-
-end;
-
-function    TBGVideoPool.GetBGVideo(filename: string): TBGVideo;
-begin
-
-end;
-
-procedure   TBGVideoPool.FreeAllItems;
-begin
-
-end;  }
-
-end.
+{* UltraStar Deluxe - Karaoke Game
+ *
+ * UltraStar Deluxe is the legal property of its developers, whose names
+ * are too numerous to list here. Please refer to the COPYRIGHT
+ * file distributed with this source distribution.
+ *
+ * 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
+ * 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; see the file COPYING. If not, write to
+ * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ *
+ * $URL$
+ * $Id$
+ *}
+
+unit UMenuBackgroundVideo;
+
+interface
+
+{$IFDEF FPC}
+  {$MODE Delphi}
+{$ENDIF}
+
+{$I switches.inc}
+
+uses
+  UThemes,
+  UMenuBackground,
+  UVideo,
+  UPath;
+
+//TMenuBackgroundColor - Background Color
+//--------
+
+type
+  //DefaultBGVideoPlayback = TVideoPlayback_FFmpeg;
+
+{type
+  TBGVideoPool = class;
+
+  PBGVideoPoolItem = ^TBGVideoPoolItem;
+  TBGVideoPoolItem = record
+    Parent: TBGVideoPool;
+    VideoPlayback = IVideoPlayback;
+    ReferenceCounter: cardinal; //Number of Creations
+  end;
+
+  TBGVideo = class
+    private
+      myItem: PBGVideoPoolItem;
+    public
+      constructor Create(Item: PBGVideoPoolItem); override;
+
+      function    GetVideoPlayback: IVideoPlayback;
+      procedure   Draw;
+
+      destructor  Destroy;
+  end;
+
+  TBGVideoPool = class
+    private
+      Items: PBGVideoPoolItem;
+    public
+      constructor Create;
+
+      function    GetBGVideo(filename: IPath): TBGVideo;
+      procedure   RemoveItem(
+      procedure   FreeAllItems;
+
+      destructor  Destroy;
+  end;
+
+type }
+  TMenuBackgroundVideo = class (TMenuBackground)
+    private
+      fFilename: IPath;
+    public
+      constructor Create(const ThemedSettings: TThemeBackground); override;
+      procedure   OnShow; override;
+      procedure   Draw; override;
+      procedure   OnFinish; override;
+      destructor  Destroy; override;
+  end;
+
+{var
+  BGVideoPool: TBGVideoPool;  }
+const
+  SUPPORTED_EXTS_BACKGROUNDVIDEO: array[0..6] of string = ('.avi', '.mov', '.divx', '.mpg', '.mp4', '.mpeg', '.m2v');
+
+implementation
+
+uses
+  gl,
+  glext,
+  UMusic,
+  SysUtils,
+  UTime,
+  USkins,
+  UCommon,
+  UGraphic;
+
+constructor TMenuBackgroundVideo.Create(const ThemedSettings: TThemeBackground);
+begin
+  inherited;
+  if (Length(ThemedSettings.Tex) = 0) then
+    raise EMenuBackgroundError.Create('TMenuBackgroundVideo: No video filename present');
+
+  fFileName := Skin.GetTextureFileName(ThemedSettings.Tex);
+  if fFilename.IsFile and VideoPlayback.Open(fFileName) then
+  begin
+    VideoBGTimer.SetTime(0);
+    VideoPlayback.Play;
+  end
+  else
+    raise EMenuBackgroundError.Create('TMenuBackgroundVideo: Can''t load background video: ' + fFilename.ToNative);
+end;
+
+destructor  TMenuBackgroundVideo.Destroy;
+begin
+
+end;
+
+procedure   TMenuBackgroundVideo.OnShow;
+begin
+  if VideoPlayback.Open( fFileName ) then
+  begin
+    VideoBGTimer.SetTime(0);
+    VideoPlayback.Play;
+  end;
+end;
+
+procedure   TMenuBackgroundVideo.OnFinish;
+begin
+
+end;
+
+procedure   TMenuBackgroundVideo.Draw;
+begin
+  If (ScreenAct = 1) then //Clear just once when in dual screen mode
+    glClear(GL_DEPTH_BUFFER_BIT);
+
+  VideoPlayback.GetFrame(VideoBGTimer.GetTime());
+    // FIXME: why do we draw on screen 2? Seems to be wrong.
+  VideoPlayback.DrawGL(2);
+end;
+
+// Implementation of TBGVideo
+//--------
+{constructor TBGVideo.Create(Item: PBGVideoPoolItem);
+begin
+  myItem := PBGVideoPoolItem;
+  Inc(myItem.ReferenceCounter);
+end;
+
+destructor  TBGVideo.Destroy;
+begin
+  Dec(myItem.ReferenceCounter);
+end;
+
+function    TBGVideo.GetVideoPlayback: IVideoPlayback;
+begin
+
+end;
+
+procedure   TBGVideo.Draw;
+begin
+
+end;
+
+// Implementation of TBGVideoPool
+//--------
+
+constructor TBGVideoPool.Create;
+begin
+
+end;
+
+destructor  TBGVideoPool.Destroy;
+begin
+
+end;
+
+function    TBGVideoPool.GetBGVideo(filename: IPath): TBGVideo;
+begin
+
+end;
+
+procedure   TBGVideoPool.FreeAllItems;
+begin
+
+end;  }
+
+end.
diff --git a/src/menu/UMenuSelectSlide.pas b/src/menu/UMenuSelectSlide.pas
index f9f6bbae..6bc824f4 100644
--- a/src/menu/UMenuSelectSlide.pas
+++ b/src/menu/UMenuSelectSlide.pas
@@ -48,7 +48,7 @@ type
       // objects
       Text:             TText; // Main text describing option
       TextOpt:          array of TText; // 3 texts in the position of possible options
-      TextOptT:         array of string; // array of names for possible options
+      TextOptT:         array of UTF8String; // array of names for possible options
 
       Texture:          TTexture; // Select Texture
       TextureSBG:       TTexture; // Background Selections Texture
diff --git a/src/menu/UMenuText.pas b/src/menu/UMenuText.pas
index b5507327..276f961b 100644
--- a/src/menu/UMenuText.pas
+++ b/src/menu/UMenuText.pas
@@ -45,8 +45,8 @@ type
   TText = class
     private
       SelectBool:  boolean;
-      TextString:  string;
-      TextTiles:   array of string;
+      TextString:  UTF8String;
+      TextTiles:   array of UTF8String;
 
       STicks:      cardinal;
       SelectBlink: boolean;
@@ -75,22 +75,23 @@ type
       procedure SetSelect(Value: boolean);
       property Selected: boolean read SelectBool write SetSelect;
 
-      procedure SetText(Value: string);
-      property  Text: string read TextString write SetText;
+      procedure SetText(Value: UTF8String);
+      property  Text: UTF8String read TextString write SetText;
 
-      procedure DeleteLastL; // procedure to delete last letter
+      procedure DeleteLastLetter; //< Deletes the rightmost letter
 
       procedure Draw;
       constructor Create; overload;
-      constructor Create(X, Y: real; Text: string); overload;
-      constructor Create(ParX, ParY, ParW: real; ParStyle: integer; ParSize, ParColR, ParColG, ParColB: real; ParAlign: integer; ParText: string; ParReflection: boolean; ParReflectionSpacing: real; ParZ: real); overload;
+      constructor Create(X, Y: real; const Text: UTF8String); overload;
+      constructor Create(ParX, ParY, ParW: real; ParStyle: integer; ParSize, ParColR, ParColG, ParColB: real; ParAlign: integer; const ParText: UTF8String; ParReflection: boolean; ParReflectionSpacing: real; ParZ: real); overload;
   end;
 
 implementation
 
 uses
-  StrUtils,
-  UGraphic;
+  UGraphic,
+  UUnicodeUtils,
+  StrUtils;
 
 procedure TText.SetSelect(Value: boolean);
 begin
@@ -101,7 +102,7 @@ begin
   STicks := SDL_GetTicks() div 550;
 end;
 
-procedure TText.SetText(Value: string);
+procedure TText.SetText(Value: UTF8String);
 var
   NextPos:   cardinal;  // next pos of a space etc.
   LastPos:   cardinal;  // last pos "
@@ -244,23 +245,15 @@ begin
   AddBreak(LastBreak, Length(Value)+1);
 end;
 
-procedure TText.DeleteLastL;
-var
-  S: string;
-  L: integer;
+procedure TText.DeleteLastLetter;
 begin
-  S := TextString;
-  L := Length(S);
-  if (L > 0) then
-    SetLength(S, L-1);
-
-  SetText(S);
+  SetText(UTF8Copy(TextString, 1, LengthUTF8(TextString)-1));
 end;
 
 procedure TText.Draw;
 var
   X2, Y2: real;
-  Text2:  string;
+  Text2:  UTF8String;
   I:      integer;
   Ticks:  cardinal;
 begin
@@ -349,19 +342,19 @@ begin
   Create(0, 0, '');
 end;
 
-constructor TText.Create(X, Y: real; Text: string);
+constructor TText.Create(X, Y: real; const Text: UTF8String);
 begin
   Create(X, Y, 0, 0, 30, 0, 0, 0, 0, Text, false, 0, 0);
 end;
 
 constructor TText.Create(ParX, ParY, ParW: real;
                          ParStyle: integer;
-			 ParSize, ParColR, ParColG, ParColB: real;
-			 ParAlign: integer;
-			 ParText: string;
-			 ParReflection: boolean;
-			 ParReflectionSpacing: real;
-			 ParZ: real);
+                         ParSize, ParColR, ParColG, ParColB: real;
+                         ParAlign: integer;
+                         const ParText: UTF8String;
+                         ParReflection: boolean;
+                         ParReflectionSpacing: real;
+                         ParZ: real);
 begin
   inherited Create;
   Alpha := 1;
-- 
cgit v1.2.3