|
1 | 1 | (******************************************************************************)
|
2 | 2 | (* uGraphiks.pas ??.??.???? *)
|
3 | 3 | (* *)
|
4 |
| -(* Version : 0.10 *) |
| 4 | +(* Version : 0.11 *) |
5 | 5 | (* *)
|
6 | 6 | (* Author : Uwe Schächterle (Corpsman) *)
|
7 | 7 | (* *)
|
|
37 | 37 | (* add Wrap Modes *)
|
38 | 38 | (* 0.09 - added floodfill *)
|
39 | 39 | (* 0.10 - FIX: revert 90* Rotation images back to old algorithm *)
|
| 40 | +(* 0.11 - FIX: revert 90* Rotations to matrix multiplications *) |
40 | 41 | (* *)
|
41 | 42 | (******************************************************************************)
|
42 | 43 |
|
|
786 | 787 |
|
787 | 788 | Procedure UpSideDown(Const Bitmap: TBitmap);
|
788 | 789 | Var
|
789 |
| - Source_intf, Dest_intf: TLazIntfImage; |
790 |
| - DestBM: TBitmap; |
791 |
| - i, j: Integer; |
792 |
| - DestHandle, DestMaskHandle: HBitmap; |
| 790 | + m: TMatrix3x3; |
793 | 791 | Begin
|
794 |
| - // Der MulImage Algorithmus, rundet manchmal komisch, dass sieht man |
795 |
| - // Wenn es Exakt sein mus ! |
796 |
| - Source_intf := TLazIntfImage.Create(0, 0); |
797 |
| - Source_intf.LoadFromBitmap(Bitmap.Handle, Bitmap.MaskHandle); |
798 |
| - DestBM := TBitmap.Create; |
799 |
| - DestBM.Width := Bitmap.Width; |
800 |
| - DestBM.Height := Bitmap.Height; |
801 |
| - Dest_intf := TLazIntfImage.Create(0, 0); |
802 |
| - Dest_intf.LoadFromBitmap(DestBM.Handle, DestBM.MaskHandle); |
803 |
| - For i := 0 To Bitmap.Width - 1 Do Begin |
804 |
| - For j := 0 To Bitmap.Height - 1 Do Begin |
805 |
| - Dest_intf[i, Bitmap.Height - 1 - j] := Source_intf[i, j]; |
806 |
| - End; |
807 |
| - End; |
808 |
| - Dest_intf.CreateBitmaps(DestHandle, DestMaskHandle, false); |
809 |
| - Bitmap.Handle := DestHandle; |
810 |
| - Bitmap.MaskHandle := DestMaskHandle; |
811 |
| - Source_intf.free; |
812 |
| - Dest_intf.free; |
813 |
| - DestBM.free; |
| 792 | + m := IdentityMatrix3x3; |
| 793 | + m[0, 0] := 1; |
| 794 | + m[1, 1] := -1; |
| 795 | + // Revert Middlepoint shifting |
| 796 | + m[0, 2] := 0.5; |
| 797 | + m[1, 2] := 0.5; |
| 798 | + MulImage(Bitmap, m, imNone, wmBlack); |
814 | 799 | End;
|
815 | 800 |
|
816 | 801 | Procedure LeftToRight(Const Bitmap: TBitmap);
|
817 | 802 | Var
|
818 |
| - Source_intf, Dest_intf: TLazIntfImage; |
819 |
| - DestBM: TBitmap; |
820 |
| - i, j: Integer; |
821 |
| - DestHandle, DestMaskHandle: HBitmap; |
| 803 | + m: TMatrix3x3; |
822 | 804 | Begin
|
823 |
| - // Der MulImage Algorithmus, rundet manchmal komisch, dass sieht man |
824 |
| - // Wenn es Exakt sein mus ! |
825 |
| - Source_intf := TLazIntfImage.Create(0, 0); |
826 |
| - Source_intf.LoadFromBitmap(Bitmap.Handle, Bitmap.MaskHandle); |
827 |
| - DestBM := TBitmap.Create; |
828 |
| - DestBM.Width := Bitmap.Width; |
829 |
| - DestBM.Height := Bitmap.Height; |
830 |
| - Dest_intf := TLazIntfImage.Create(0, 0); |
831 |
| - Dest_intf.LoadFromBitmap(DestBM.Handle, DestBM.MaskHandle); |
832 |
| - For i := 0 To Bitmap.Width - 1 Do Begin |
833 |
| - For j := 0 To Bitmap.Height - 1 Do Begin |
834 |
| - Dest_intf[Bitmap.Width - 1 - i, j] := Source_intf[i, j]; |
835 |
| - End; |
836 |
| - End; |
837 |
| - Dest_intf.CreateBitmaps(DestHandle, DestMaskHandle, false); |
838 |
| - Bitmap.Handle := DestHandle; |
839 |
| - Bitmap.MaskHandle := DestMaskHandle; |
840 |
| - Source_intf.free; |
841 |
| - Dest_intf.free; |
842 |
| - DestBM.free; |
| 805 | + m := IdentityMatrix3x3; |
| 806 | + m[0, 0] := -1; |
| 807 | + m[1, 1] := 1; |
| 808 | + // Revert Middlepoint shifting |
| 809 | + m[0, 2] := 0.5; |
| 810 | + m[1, 2] := 0.5; |
| 811 | + MulImage(Bitmap, m, imNone, wmBlack); |
843 | 812 | End;
|
844 | 813 |
|
845 | 814 | Procedure RotateClockWise90Degrees(Const Bitmap: TBitmap);
|
846 | 815 | Var
|
847 |
| - Source_intf, Dest_intf: TLazIntfImage; |
848 |
| - DestBM: TBitmap; |
849 |
| - i, j: Integer; |
850 |
| - DestHandle, DestMaskHandle: HBitmap; |
| 816 | + m: TMatrix3x3; |
851 | 817 | Begin
|
852 |
| - // Der MulImage Algorithmus, rundet manchmal komisch, dass sieht man |
853 |
| - // Wenn es Exakt sein mus ! |
854 |
| - Source_intf := TLazIntfImage.Create(0, 0); |
855 |
| - Source_intf.LoadFromBitmap(Bitmap.Handle, Bitmap.MaskHandle); |
856 |
| - DestBM := TBitmap.Create; |
857 |
| - DestBM.Width := Bitmap.Height; |
858 |
| - DestBM.Height := Bitmap.Width; |
859 |
| - Dest_intf := TLazIntfImage.Create(0, 0); |
860 |
| - Dest_intf.LoadFromBitmap(DestBM.Handle, DestBM.MaskHandle); |
861 |
| - For i := 0 To Bitmap.Width - 1 Do Begin |
862 |
| - For j := 0 To Bitmap.Height - 1 Do Begin |
863 |
| - Dest_intf[Bitmap.Height - 1 - j, i] := Source_intf[i, j]; |
864 |
| - End; |
865 |
| - End; |
866 |
| - Dest_intf.CreateBitmaps(DestHandle, DestMaskHandle, false); |
867 |
| - Bitmap.Handle := DestHandle; |
868 |
| - Bitmap.MaskHandle := DestMaskHandle; |
869 |
| - Source_intf.free; |
870 |
| - Dest_intf.free; |
871 |
| - DestBM.free; |
| 818 | + m := IdentityMatrix3x3; |
| 819 | + m[0, 0] := 0; |
| 820 | + m[1, 1] := 0; |
| 821 | + m[0, 1] := -1; |
| 822 | + m[1, 0] := 1; |
| 823 | + // Revert Middlepoint shifting |
| 824 | + m[0, 2] := 0.5; |
| 825 | + m[1, 2] := 0.5; |
| 826 | + MulImage(Bitmap, m, imNone, wmBlack); |
872 | 827 | End;
|
873 | 828 |
|
874 | 829 | Procedure RotateCounterClockWise90Degrees(Const Bitmap: TBitmap);
|
875 | 830 | Var
|
876 |
| - Source_intf, Dest_intf: TLazIntfImage; |
877 |
| - DestBM: TBitmap; |
878 |
| - i, j: Integer; |
879 |
| - DestHandle, DestMaskHandle: HBitmap; |
| 831 | + m: TMatrix3x3; |
880 | 832 | Begin
|
881 |
| - // Der MulImage Algorithmus, rundet manchmal komisch, dass sieht man |
882 |
| - // Wenn es Exakt sein mus ! |
883 |
| - Source_intf := TLazIntfImage.Create(0, 0); |
884 |
| - Source_intf.LoadFromBitmap(Bitmap.Handle, Bitmap.MaskHandle); |
885 |
| - DestBM := TBitmap.Create; |
886 |
| - DestBM.Width := Bitmap.Height; |
887 |
| - DestBM.Height := Bitmap.Width; |
888 |
| - Dest_intf := TLazIntfImage.Create(0, 0); |
889 |
| - Dest_intf.LoadFromBitmap(DestBM.Handle, DestBM.MaskHandle); |
890 |
| - For i := 0 To Bitmap.Width - 1 Do Begin |
891 |
| - For j := 0 To Bitmap.Height - 1 Do Begin |
892 |
| - Dest_intf[j, bitmap.Width - 1 - i] := Source_intf[i, j]; |
893 |
| - End; |
894 |
| - End; |
895 |
| - Dest_intf.CreateBitmaps(DestHandle, DestMaskHandle, false); |
896 |
| - Bitmap.Handle := DestHandle; |
897 |
| - Bitmap.MaskHandle := DestMaskHandle; |
898 |
| - Source_intf.free; |
899 |
| - Dest_intf.free; |
900 |
| - DestBM.free; |
| 833 | + m := IdentityMatrix3x3; |
| 834 | + m[0, 0] := 0; |
| 835 | + m[1, 1] := 0; |
| 836 | + m[0, 1] := 1; |
| 837 | + m[1, 0] := -1; |
| 838 | + // Revert Middlepoint shifting |
| 839 | + m[0, 2] := 0.5; |
| 840 | + m[1, 2] := 0.5; |
| 841 | + MulImage(Bitmap, m, imNone, wmBlack); |
901 | 842 | End;
|
902 | 843 |
|
903 | 844 | Procedure Rotate180Degrees(Const Bitmap: TBitmap);
|
|
907 | 848 | m := IdentityMatrix3x3;
|
908 | 849 | m[0, 0] := -1;
|
909 | 850 | m[1, 1] := -1;
|
| 851 | + // Revert Middlepoint shifting |
| 852 | + m[0, 2] := 0.5; |
| 853 | + m[1, 2] := 0.5; |
910 | 854 | MulImage(Bitmap, m, imNone, wmBlack);
|
911 | 855 | End;
|
912 | 856 |
|
|
0 commit comments