lazarus-ccr/components/rgbgraphics/rgbutils.pas
tomb0 4ee0dd740f - implementation for Carbon interface
- fix compilation after graphics rewrite
- improved example application

git-svn-id: https://svn.code.sf.net/p/lazarus-ccr/svn@251 8e941d3f-bd1b-0410-a28a-d453659cc2b4
2007-09-02 15:12:14 +00:00

185 lines
3.7 KiB
ObjectPascal

{
/***************************************************************************
RGBUtils.pas
***************************************************************************/
*****************************************************************************
* *
* See the file COPYING.modifiedLGPL, included in this distribution, *
* for details about the copyright. *
* *
* 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. *
* *
*****************************************************************************
Author: Tom Gregorovic (_tom_@centrum.cz)
Abstract:
}
unit RGBUtils;
{$ifdef fpc}
{$mode objfpc}{$H+}
{$endif}
interface
uses
Classes, SysUtils;
type
TIntArray = array of Integer;
function DivideTrunc(Src, Dest: Integer): TIntArray;
function GetMidPoints(const A: TIntArray): TIntArray;
function GetDifference(const A: TIntArray): TIntArray;
procedure SwapInt(var A, B: Integer);
procedure SwapPtr(var A, B: Pointer);
procedure MinMax(var A, B: Integer);
procedure SortRect(var X1, Y1, X2, Y2: Integer); overload;
procedure SortRect(var R: TRect); overload;
procedure ClipDimension(ClipMin, ClipMax: Integer;
var DstPos, SrcPos, SrcSize: Integer);
operator =(A, B: TPoint): Boolean;
implementation
(*
DivideTrunc divides bigger value of Src and Dest into array of chunks.
Length(Result) = Min(Src, Dest)
*)
function DivideTrunc(Src, Dest: Integer): TIntArray;
var
I: Integer;
VMax, VMin: Integer;
P, D: Single;
begin
if Dest > Src then
begin
VMax := Dest;
VMin := Src;
end
else
begin
VMax := Src;
VMin := Dest;
end;
SetLength(Result, VMin);
P := 0;
D := VMax / VMin;
for I := 0 to High(Result) do
begin
Result[I] := Round(P + D) - Round(P);
P := P + D;
end;
end;
(*
GetMidPoints returns array of absolute positions of the middle in each chunk.
*)
function GetMidPoints(const A: TIntArray): TIntArray;
var
I, P, V: Integer;
begin
SetLength(Result, Length(A));
P := 0;
for I := 0 to High(A) do
begin
V := A[I];
Result[I] := V shr 1 + P;
Inc(P, V);
end;
end;
(*
GetDifference returns array of diffences between positions.
*)
function GetDifference(const A: TIntArray): TIntArray;
var
I, P: Integer;
begin
SetLength(Result, Length(A));
P := 0;
for I := 0 to High(A) do
begin
Result[I] := A[I] - P;
P := A[I];
end;
end;
operator =(A, B: TPoint): Boolean;
begin
Result := (A.X = B.X) and (A.Y = B.Y);
end;
procedure SwapInt(var A, B: Integer);
var
C: Integer;
begin
C := A;
A := B;
B := C;
end;
procedure SwapPtr(var A, B: Pointer);
var
C: Pointer;
begin
C := A;
A := B;
B := C;
end;
procedure MinMax(var A, B: Integer);
var
T: Integer;
begin
if A > B then
begin
T := A;
A := B;
B := T;
end;
end;
procedure SortRect(var X1, Y1, X2, Y2: Integer);
begin
MinMax(X1, X2);
MinMax(Y1, Y2);
end;
procedure SortRect(var R: TRect);
begin
MinMax(R.Left, R.Right);
MinMax(R.Top, R.Bottom);
end;
procedure ClipDimension(ClipMin, ClipMax: Integer;
var DstPos, SrcPos, SrcSize: Integer);
var
C: Integer;
begin
if ClipMin > DstPos then
begin
C := ClipMin - DstPos;
Inc(SrcPos, C);
Dec(SrcSize, C);
DstPos := ClipMin;
end;
if ClipMax < DstPos + SrcSize then SrcSize := ClipMax - DstPos;
end;
end.