unit ULyrics;
interface
uses SysUtils, gl, glext, UMusic;
type
TWord = record
X: real;
Y: real;
Size: real;
Width: real;
Text: string;
ColR: real;
ColG: real;
ColB: real;
Scale: real;
Done: real;
FontStyle: integer;
Italic: boolean;
Selected: boolean;
end;
TLyric = class
private
AlignI: integer;
XR: real;
YR: real;
SizeR: real;
SelectedI: integer;
ScaleR: real;
StyleI: integer; // 0 - one selection, 1 - long selection, 2 - one selection with fade to normal text, 3 - long selection with fade with color from left
FontStyleI: integer; // font number
Word: array of TWord;
procedure SetX(Value: real);
procedure SetY(Value: real);
function GetClientX: real;
procedure SetAlign(Value: integer);
function GetSize: real;
procedure SetSize(Value: real);
procedure SetSelected(Value: integer);
procedure SetDone(Value: real);
procedure SetScale(Value: real);
procedure SetStyle(Value: integer);
procedure SetFStyle(Value: integer);
procedure Refresh;
procedure DrawNormal(W: integer);
procedure DrawPlain(W: integer);
procedure DrawScaled(W: integer);
procedure DrawSlide(W: integer);
public
ColR: real;
ColG: real;
ColB: real;
ColSR: real;
ColSG: real;
ColSB: real;
Italic: boolean;
Text: string; // LCD
published
property X: real write SetX;
property Y: real write SetY;
property ClientX: real read GetClientX;
property Align: integer write SetAlign;
property Size: real read GetSize write SetSize;
property Selected: integer read SelectedI write SetSelected;
property Done: real write SetDone;
property Scale: real write SetScale;
property Style: integer write SetStyle;
property FontStyle: integer write SetFStyle;
procedure AddWord(Text: string);
procedure AddCzesc(NrCzesci: integer); //AddLine?
procedure ChangeCurText(Text: String);
function SelectedLetter: integer; // LCD
function SelectedLength: integer; // LCD
procedure Clear;
procedure Draw;
end;
var
Lyric: TLyric;
implementation
uses TextGL, UGraphic, UDrawTexture;
procedure TLyric.SetX(Value: real);
begin
XR := Value;
end;
procedure TLyric.SetY(Value: real);
begin
YR := Value;
end;
function TLyric.GetClientX: real;
begin
Result := Word[0].X;
end;
procedure TLyric.SetAlign(Value: integer);
begin
AlignI := Value;
// if AlignInt = 0 then beep;
end;
function TLyric.GetSize: real;
begin
Result := SizeR;
end;
procedure TLyric.SetSize(Value: real);
begin
SizeR := Value;
end;
procedure TLyric.SetSelected(Value: integer);
var
W: integer;
begin
if (StyleI = 0) or (StyleI = 2) or (StyleI = 4) then begin
if (SelectedI > -1) and (SelectedI <= High(Word)) then begin
Word[SelectedI].Selected := false;
Word[SelectedI].ColR := ColR;
Word[SelectedI].ColG := ColG;
Word[SelectedI].ColB := ColB;
Word[SelectedI].Done := 0;
end;
SelectedI := Value;
if (Value > -1) and (Value <= High(Word)) then begin
Word[Value].Selected := true;
Word[Value].ColR := ColSR;
Word[Value].ColG := ColSG;
Word[Value].ColB := ColSB;
Word[Value].Scale := ScaleR;
end;
end;
if (StyleI = 1) or (StyleI = 3) then begin
if (SelectedI > -1) and (SelectedI <= High(Word)) then begin
for W := SelectedI to High(Word) do begin
Word[W].Selected := false;
Word[W].ColR := ColR;
Word[W].ColG := ColG;
Word[W].ColB := ColB;
Word[W].Done := 0;
end;
end;
SelectedI := Value;
if (Value > -1) and (Value <= High(Word)) then begin
for W := 0 to Value do begin
Word[W].Selected := true;
Word[W].ColR := ColSR;
Word[W].ColG := ColSG;
Word[W].ColB := ColSB;
Word[W].Scale := ScaleR;
Word[W].Done := 1;
end;
end;
end;
Refresh;
end;
procedure TLyric.SetDone(Value: real);
var
W: integer;
begin
W := SelectedI;
if W > -1 then
Word[W].Done := Value;
end;
procedure TLyric.SetScale(Value: real);
begin
ScaleR := Value;
end;
procedure TLyric.SetStyle(Value: integer);
begin
StyleI := Value;
end;
procedure TLyric.SetFStyle(Value: integer);
begin
FontStyleI := Value;
end;
procedure TLyric.AddWord(Text: string);
var
WordNum: integer;
begin
WordNum := Length(Word);
SetLength(Word, WordNum + 1);
if WordNum = 0 then begin
Word[WordNum].X := XR;
end else begin
Word[WordNum].X := Word[WordNum - 1].X + Word[WordNum - 1].Width;
end;
Word[WordNum].Y := YR;
Word[WordNum].Size := SizeR;
Word[WordNum].FontStyle := FontStyleI; // new
SetFontStyle(FontStyleI);
SetFontSize(SizeR);
Word[WordNum].Width := glTextWidth(pchar(Text));
Word[WordNum].Text := Text;
Word[WordNum].ColR := ColR;
Word[WordNum].ColG := ColG;
Word[WordNum].ColB := ColB;
Word[WordNum].Scale := 1;
Word[WordNum].Done := 0;
Word[WordNum].Italic := Italic;
Refresh;
end;
procedure TLyric.AddCzesc(NrCzesci: integer);
var
N: integer;
begin
Clear;
for N := 0 to Czesci[0].Czesc[NrCzesci].HighNut do begin
Italic := Czesci[0].Czesc[NrCzesci].Nuta[N].FreeStyle;
AddWord(Czesci[0].Czesc[NrCzesci].Nuta[N].Tekst);
Text := Text + Czesci[0].Czesc[NrCzesci].Nuta[N].Tekst;
end;
Selected := -1;
end;
procedure TLyric.Clear;
begin
{ ColR := Skin_FontR;
ColG := Skin_FontG;
ColB := Skin_FontB;}
SetLength(Word, 0);
Text := '';
SelectedI := -1;
end;
procedure TLyric.Refresh;
var
W: integer;
TotWidth: real;
begin
if AlignI = 1 then begin
TotWidth := 0;
for W := 0 to High(Word) do
TotWidth := TotWidth + Word[W].Width;
Word[0].X := XR - TotWidth / 2;
for W := 1 to High(Word) do
Word[W].X := Word[W - 1].X + Word[W - 1].Width;
end;
end;
procedure TLyric.Draw;
var
W: integer;
begin
case StyleI of
0:
begin
for W := 0 to High(Word) do
DrawNormal(W);
end;
1:
begin
for W := 0 to High(Word) do
DrawPlain(W);
end;
2: // zoom
begin
for W := 0 to High(Word) do
if not Word[W].Selected then
DrawNormal(W);
for W := 0 to High(Word) do
if Word[W].Selected then
DrawScaled(W);
end;
3: // slide
begin
for W := 0 to High(Word) do begin
if not Word[W].Selected then
DrawNormal(W)
else
DrawSlide(W);
end;
end;
4: // ball
begin
for W := 0 to High(Word) do
DrawNormal(W);
for W := 0 to High(Word) do
if Word[W].Selected then begin
Tex_Ball.X := (Word[W].X - 10) + Word[W].Done * Word[W].Width;
Tex_Ball.Y := 480 - 10*sin(Word[W].Done * pi);
Tex_Ball.W := 20;
Tex_Ball.H := 20;
DrawTexture(Tex_Ball);
end;
end;
end; // case
end;
procedure TLyric.DrawNormal(W: integer);
begin
SetFontStyle(Word[W].FontStyle);
SetFontPos(Word[W].X+ 10*ScreenX, Word[W].Y);
SetFontSize(Word[W].Size);
SetFontItalic(Word[W].Italic);
glColor3f(Word[W].ColR, Word[W].ColG, Word[W].ColB);
glPrint(pchar(Word[W].Text));
end;
procedure TLyric.DrawPlain(W: integer);
var
D: real;
begin
D := Word[W].Done; // przyrost
SetFontStyle(Word[W].FontStyle);
SetFontPos(Word[W].X, Word[W].Y);
SetFontSize(Word[W].Size);
SetFontItalic(Word[W].Italic);
if D = 0 then
glColor3f(ColR, ColG, ColB)
else
glColor3f(ColSR, ColSG, ColSB);
glPrint(pchar(Word[W].Text));
end;
procedure TLyric.DrawScaled(W: integer);
var
D: real;
begin
// previous plus dynamic scaling effect
D := 1-Word[W].Done; // przyrost
SetFontStyle(Word[W].FontStyle);
SetFontPos(Word[W].X - D * Word[W].Width * (Word[W].Scale - 1) / 2 + (D+1)*10*ScreenX, Word[W].Y - D * 1.5 * Word[W].Size *(Word[W].Scale - 1));
SetFontSize(Word[W].Size + D * (Word[W].Size * Word[W].Scale - Word[W].Size));
SetFontItalic(Word[W].Italic);
glColor3f(Word[W].ColR, Word[W].ColG, Word[W].ColB);
glPrint(pchar(Word[W].Text))
end;
procedure TLyric.DrawSlide(W: integer);
var
D: real;
begin
D := Word[W].Done; // przyrost
SetFontStyle(Word[W].FontStyle);
SetFontPos(Word[W].X, Word[W].Y);
SetFontSize(Word[W].Size);
SetFontItalic(Word[W].Italic);
glColor3f(Word[W].ColR, Word[W].ColG, Word[W].ColB);
glPrintDone(pchar(Word[W].Text), D, ColR, ColG, ColB);
end;
function TLyric.SelectedLetter; // LCD
var
W: integer;
begin
Result := 1;
for W := 0 to SelectedI-1 do
Result := Result + Length(Word[W].Text);
end;
function TLyric.SelectedLength: integer; // LCD
begin
Result := Length(Word[SelectedI].Text);
end;
procedure TLyric.ChangeCurText(Text: String);
begin
Word[Selected].Text := Text;
end;
end.