CentrED/UOLib/UTexture.pas

173 lines
4.5 KiB
Plaintext
Raw Normal View History

2015-05-01 12:14:15 +02:00
(*
* 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 UTexture;
{$mode objfpc}{$H+}
interface
uses
Classes, Imaging, ImagingTypes, ImagingClasses, UMulBlock, UArt, UGenericIndex;
2015-05-01 12:14:15 +02:00
type
TTexture = class(TMulBlock)
constructor Create(AData: TStream; AIndex: TGenericIndex); overload;
constructor Create(AExtra: Integer); overload;
destructor Destroy; override;
function Clone: TTexture; override;
function GetSize: Integer; override;
procedure Write(AData: TStream); override;
procedure RefreshBuffer;
protected
FGraphic: TSingleImage;
FBuffer: TStream;
FExtra: Integer;
public
property Graphic: TSingleImage read FGraphic;
property Buffer: TStream read FBuffer;
property Extra: Integer read FExtra write FExtra;
end;
TOldTexture = class(TTexture)
constructor Create(AData: TStream; AIndex: TGenericIndex); overload;
constructor Create(AExtra: Integer); overload;
constructor Create(AId: Cardinal);
private
FArtTile: TArt;
end;
2015-05-01 12:14:15 +02:00
implementation
uses
UGameResources;//, Logging;
2015-05-01 12:14:15 +02:00
constructor TTexture.Create(AData: TStream; AIndex: TGenericIndex);
var
size: Integer;
begin
FExtra := AIndex.Various;
if FExtra = 0 then
size := 64
else
size := 128;
FGraphic := TSingleImage.CreateFromParams(size, size, ifX1R5G5B5);
if assigned(AData) then
begin
AData.Position := AIndex.Lookup;
AData.Read(FGraphic.Bits^, size * size * 2);
end;
FGraphic.Format := ifX8R8G8B8;
end;
constructor TTexture.Create(AExtra: Integer);
var
size: Integer;
begin
FExtra := AExtra;
if AExtra = 0 then
size := 64
else
size := 128;
FGraphic := TSingleImage.CreateFromParams(size, size, ifX8R8G8B8);
FBuffer := TMemoryStream.Create;
end;
destructor TTexture.Destroy;
begin
if FGraphic <> nil then FGraphic.Free;
if FBuffer <> nil then FBuffer.Free;
inherited;
end;
function TTexture.Clone: TTexture;
begin
Result := TTexture.Create(FExtra);
Result.FGraphic.Assign(Self.Graphic);
end;
procedure TTexture.Write(AData: TStream);
begin
FBuffer.Position := 0;
AData.CopyFrom(FBuffer, FBuffer.Size);
end;
function TTexture.GetSize: Integer;
begin
RefreshBuffer;
Result := FBuffer.Size
end;
procedure TTexture.RefreshBuffer;
var
argbGraphic: TSingleImage;
begin
argbGraphic := TSingleImage.CreateFromImage(FGraphic);
argbGraphic.Format := ifX1R5G5B5;
FBuffer.Size := 0;
if (argbGraphic.Height > 0) and (argbGraphic.Width > 0) then
begin
if (argbGraphic.Height < 128) or (argbGraphic.Width < 128) then
begin
FExtra := 0;
argbGraphic.Resize(64, 64, rfNearest);
end else
begin
FExtra := 1;
argbGraphic.Resize(128, 128, rfNearest);
end;
FBuffer.Write(argbGraphic.Bits^, argbGraphic.Height * argbGraphic.Width * 2);
end;
argbGraphic.Free;
end;
// TOldTexture - перегрузка класса, для работы с текстурами пре альфа клиента
constructor TOldTexture.Create(AId: Cardinal);
var
extradata: Integer;
begin
FArtTile := ResMan.Art.GetArt($4000 + AId, 0, nil, False);
if (FArtTile.Graphic.Width <= 64) then extradata := 0 else extradata := 1;
inherited Create(extradata); // Клиент использует не правильные текстуры
FArtTile.Graphic.StretchTo(0,0,FArtTile.Graphic.Width,FArtTile.Graphic.Height,
FGraphic, 0,0,FGraphic.Width,FGraphic.Height, rfBilinear );
//FArtTile.Destroy; // Надо ли удалять тайл?
end;
constructor TOldTexture.Create(AData: TStream; AIndex: TGenericIndex);
begin
inherited Create(0);
end;
constructor TOldTexture.Create(AExtra: Integer);
begin
inherited Create(AExtra);
end;
2015-05-01 12:14:15 +02:00
end.