154 lines
3.7 KiB
Plaintext
154 lines
3.7 KiB
Plaintext
(*
|
|
* CDDL HEADER START
|
|
*
|
|
* The contents of this file are subject to the terms of the
|
|
* Common Development and Distribution License, Version 1.0 only
|
|
* (the "License"). You may not use this file except in compliance
|
|
* with the License.
|
|
*
|
|
* You can obtain a copy of the license at
|
|
* http://www.opensource.org/licenses/cddl1.php.
|
|
* See the License for the specific language governing permissions
|
|
* and limitations under the License.
|
|
*
|
|
* When distributing Covered Code, include this CDDL HEADER in each
|
|
* file and include the License file at
|
|
* http://www.opensource.org/licenses/cddl1.php. If applicable,
|
|
* add the following below this CDDL HEADER, with the fields enclosed
|
|
* by brackets "[]" replaced with your own identifying * information:
|
|
* Portions Copyright [yyyy] [name of copyright owner]
|
|
*
|
|
* CDDL HEADER END
|
|
*
|
|
*
|
|
* Portions Copyright 2007 Andreas Schneider
|
|
*)
|
|
unit UHueProvider;
|
|
|
|
{$mode objfpc}{$H+}
|
|
|
|
interface
|
|
|
|
uses
|
|
SysUtils, Classes, Contnrs, UMulProvider, UMulBlock, UHue;
|
|
|
|
type
|
|
THueProvider = class(TMulProvider)
|
|
constructor Create(AData: TStream; AReadOnly: Boolean = False); overload; override;
|
|
constructor Create(AData: string; AReadOnly: Boolean = False); overload; override;
|
|
destructor Destroy; override;
|
|
protected
|
|
FHueGroups: TObjectList;
|
|
procedure InitList;
|
|
function CalculateOffset(AID: Integer): Integer; override;
|
|
function GetData(AID, AOffset: Integer): TMulBlock; override;
|
|
procedure SetData(AID, AOffset: Integer; ABlock: TMulBlock); override;
|
|
function GetHue(AIndex: Integer): THue;
|
|
function GetCount: Integer;
|
|
public
|
|
function GetBlock(AID: Integer): TMulBlock; override;
|
|
property Hues[Index: Integer]: THue read GetHue;
|
|
property Count: Integer read GetCount;
|
|
end;
|
|
|
|
implementation
|
|
|
|
{ THueProvider }
|
|
|
|
function THueProvider.CalculateOffset(AID: Integer): Integer;
|
|
begin
|
|
Result := (AID div 8) * 708 + (AID mod 8) * 88;
|
|
end;
|
|
|
|
constructor THueProvider.Create(AData: TStream; AReadOnly: Boolean = False);
|
|
begin
|
|
inherited;
|
|
InitList;
|
|
end;
|
|
|
|
constructor THueProvider.Create(AData: string; AReadOnly: Boolean = False);
|
|
begin
|
|
inherited;
|
|
InitList;
|
|
end;
|
|
|
|
destructor THueProvider.Destroy;
|
|
begin
|
|
FHueGroups.Free;
|
|
inherited;
|
|
end;
|
|
|
|
function THueProvider.GetBlock(AID: Integer): TMulBlock;
|
|
begin
|
|
Result := GetData(AID, 0);
|
|
end;
|
|
|
|
function THueProvider.GetCount: Integer;
|
|
begin
|
|
Result := FHueGroups.Count * 8;
|
|
end;
|
|
|
|
function THueProvider.GetData(AID, AOffset: Integer): TMulBlock;
|
|
var
|
|
group, entry: Integer;
|
|
begin
|
|
group := (AID div 8) mod FHueGroups.Count;
|
|
entry := AID mod 8;
|
|
Result := TMulBlock(THueGroup(FHueGroups.Items[group]).HueEntries[entry].Clone);
|
|
Result.ID := AID;
|
|
Result.OnChanged := @OnChanged;
|
|
Result.OnFinished := @OnFinished;
|
|
end;
|
|
|
|
function THueProvider.GetHue(AIndex: Integer): THue;
|
|
var
|
|
group, entry: Integer;
|
|
begin
|
|
group := (AIndex div 8) mod FHueGroups.Count;
|
|
entry := AIndex mod 8;
|
|
Result := THue(THueGroup(FHueGroups.Items[group]).HueEntries[entry]);
|
|
Result.ID := AIndex;
|
|
end;
|
|
|
|
procedure THueProvider.InitList;
|
|
var
|
|
i: Integer;
|
|
begin
|
|
FHueGroups := TObjectList.Create;
|
|
FHueGroups.Count := FData.Size div 708;
|
|
FData.Position := 0;
|
|
i := 0;
|
|
while FData.Position < FData.Size do
|
|
begin
|
|
FHueGroups.Items[i] := THueGroup.Create(FData);
|
|
Inc(i);
|
|
end;
|
|
end;
|
|
|
|
procedure THueProvider.SetData(AID, AOffset: Integer;
|
|
ABlock: TMulBlock);
|
|
var
|
|
group, entry: Integer;
|
|
begin
|
|
group := AID div 8;
|
|
entry := AID mod 8;
|
|
|
|
if (group >= FHueGroups.Count) or (group < 0) then
|
|
begin
|
|
group := FHueGroups.Count;
|
|
FHueGroups.Add(THueGroup.Create(nil));
|
|
entry := 0;
|
|
end;
|
|
|
|
THueGroup(FHueGroups.Items[group]).HueEntries[entry] := THue(ABlock.Clone);
|
|
|
|
if not FReadOnly then
|
|
begin
|
|
FData.Position := AOffset;
|
|
ABlock.Write(FData);
|
|
end;
|
|
end;
|
|
|
|
end.
|
|
|