123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203 |
- (*
- gba_fade.pas 18/06/2006 4.19.14
- ------------------------------------------------------------------------------
- Part of this file is a raw porting of libgba library for gba (you can find it
- at http://www.devkitpro.org).
-
- As this is a direct port from c, I'm pretty sure that something could not work
- as you expect. I am even more sure that this code could be written better, so
- if you think that I have made some mistakes or you have some better
- implemented functions, let me know [francky74 (at) gmail (dot) com]
- Enjoy!
- Conversion by Legolas (http://itaprogaming.free.fr) for freepascal compiler
- (http://www.freepascal.org)
-
- Copyright (C) 2006 Francesco Lombardi
-
- This library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Lesser General Public
- License as published by the Free Software Foundation; either
- version 2.1 of the License, or (at your option) any later version.
-
- This library 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
- Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public
- License along with this library; if not, write to the Free Software
- Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- ------------------------------------------------------------------------------
- *)
-
- unit gba_fade;
- {$i def.inc}
- interface
- uses
- gba_types, gba_regs, gba_video, gba_core;
- var
- CurrentPalette: array [0..511] of word;
- FadeTable: array [0..(512*3*2)-1] of smallint;
-
- procedure GetCurrentPalette();
- procedure SetPalette(Palette: pword);
- procedure DoFade(FadeCount: dword);
- procedure FadeToGrayScale(FrameCount: dword);
- procedure FadeToPalette(const NewPalette: pword; FrameCount: dword);
- procedure FadeToGray(gray: word; FrameCount: dword);
- implementation
- procedure GetCurrentPalette();
- var
- i: dword;
- Src: ^word;
- Dest: ^word;
- begin
- Src := BG_COLORS;
- Dest := CurrentPalette;
- for i := 0 to 511 do
- Dest[i] := dword(Src[i]);
- end;
- procedure SetPalette(Palette: pword);
- var
- i: dword;
- Src, Dest: ^word;
- begin
- Src := Palette;
- Dest := BG_COLORS;
- for i := 0 to 511 do
- Dest[i] := dword(Src[i]);
- end;
- procedure DoFade(FadeCount: dword);
- var
- r, g, b: word;
- i, count, color: dword;
- src: ^smallint;
- dest: ^word;
- begin
- for count := 0 to FadeCount - 1 do
- begin
- src := FadeTable;
- dest := CurrentPalette;
- i := 0;
- while i < 512 do
- begin
- r := Src[(i*6)+1];
- r := r + Src[(i*6)];
- Src[(i*6)+1] := r;
-
- g := Src[(i*6)+3];
- g := g + Src[(i*6)+2];
- Src[(i*6)+3] := g;
-
- b := Src[(i*6)+5];
- b := b + Src[(i*6)+4];
- Src[(i*6)+5] := b;
-
- color := (r shr 8) or ((g shr 8) shl 5) or ((b shr 8) shl 10);
- Dest[i] := color;
- inc(i);
- end;
- WaitForVBlank();
- SetPalette(CurrentPalette);
- end;
- end;
- procedure FadeToGray(gray: word; FrameCount: dword);
- var
- index, r, g, b, color: dword;
- src: ^word;
- table: ^smallint;
- begin
- GetCurrentPalette();
- src := CurrentPalette;
-
- for index :=0 to 511 do
- begin
- color := src[index];
- r := (color and $1f) shl 8;
- g := ((color shr 5) and $1f) shl 8;
- b := ((color shr 10) and $1f) shl 8;
-
- FadeTable[(index*6)] := ((gray shl 8)-r) div FrameCount;
- FadeTable[(index*6)+1] := r;
-
- FadeTable[(index*6)+2] := ((gray shl 8)-g) div FrameCount;
- FadeTable[(index*6)+3] := g;
-
- FadeTable[(index*6)+4] := ((gray shl 8)-b) div FrameCount;
- FadeTable[(index*6)+5] := b;
- end;
- DoFade( FrameCount);
- end;
- procedure FadeToPalette(const NewPalette: pword; FrameCount: dword);
- var
- index: dword;
- color: word;
- r1, r2, g1, g2, b1, b2: smallint;
- Src: ^word;
- Dest: ^word;
- Table: ^smallint;
- begin
- GetCurrentPalette();
- Src := CurrentPalette;
- Dest := NewPalette;
- Table := FadeTable;
-
- for index := 0 to 511 do
- begin
- color := Src[index];
- r1 := (color and $1f) shl 8;
- g1 := ((color shr 5) and $1f) shl 8;
- b1 := ((color shr 10) and $1f) shl 8;
-
- color := Dest[index];
- r2 := (color and $1f) shl 8;
- g2 := ((color shr 5) and $1f) shl 8;
- b2 := ((color shr 10) and $1f) shl 8;
-
- Table[(index*6)] := (r2 - r1) div FrameCount;
- Table[(index*6)+1] := r1;
- Table[(index*6)+2] := (g2 - g1) div FrameCount;
- Table[(index*6)+3] := g1;
- Table[(index*6)+4] := (b2 - b1) div FrameCount;
- Table[(index*6)+5] := b1;
- end;
- DoFade(FrameCount);
- end;
- procedure FadeToGrayScale(FrameCount: dword);
- var
- index: dword;
- gray: word;
- r,g,b: smallint;
- Src: ^word;
- Dest: ^word;
- Table: ^smallint;
- GrayScalePalette: array [0..511] of word;
- begin
- GetCurrentPalette();
- Src := CurrentPalette;
- Table := FadeTable;
- for index := 0 to 511 do
- begin
- r := (Src[index] and $1f);
- g := ((Src[index] shr 5) and $1f);
- b := ((Src[index] shr 10) and $1f);
- Gray := (r shr 2) + (r shr 4) + (g shr 1) + (g shr 4) + (b shr 3);
- GrayScalePalette[index] := RGB(gray, gray, gray);
- end;
- FadeToPalette(GrayScalePalette, FrameCount);
- end;
- end.
|