173 lines
4.5 KiB
Plaintext
173 lines
4.5 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 UTexture;
|
||
|
||
{$mode objfpc}{$H+}
|
||
|
||
interface
|
||
|
||
uses
|
||
Classes, Imaging, ImagingTypes, ImagingClasses, UMulBlock, UArt, UGenericIndex;
|
||
|
||
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;
|
||
|
||
implementation
|
||
|
||
uses
|
||
UGameResources;//, Logging;
|
||
|
||
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;
|
||
|
||
end.
|
||
|