ViewVC Help
View File | Revision Log | View Changeset | Root Listing
root/Oni2/oup/current/Global/OniImgClass.pas
(Generate patch)

Comparing oup/current/Global/OniImgClass.pas (file contents):
Revision 128 by alloc, Wed Mar 28 00:57:53 2007 UTC vs.
Revision 181 by alloc, Sat May 19 17:54:34 2007 UTC

# Line 2 | Line 2 | unit OniImgClass;
2  
3   interface
4  
5 < uses Math, Dialogs, Types, SysUtils, Classes, Data, ConnectionManager, TypeDefs;
5 > uses Math, Dialogs, Types, SysUtils, Classes, Data, ConnectionManager, TypeDefs,
6 >  Imaging, ImagingTypes;
7  
8   type
9    TImgDataType = set of (DT_OniReverted, DT_Oni, DT_Decoded32);
10  
11 +
12   type
13    TOniImage = class
14    private
# Line 17 | Line 19 | type
19      FDepth:     Byte;
20      FStoreType: Byte;
21  
22 +    FImage:     TImageData;
23 +
24      function ResizeImage(oldx, oldy: Integer; img: TByteData): TByteData;
25      procedure RevertImage;
26      procedure DecompressImage;
27    protected
28    public
29 +    property Image:     TImageData   Read FImage     Write FImage;
30      property Loaded:    Boolean      Read FLoaded    Write FLoaded;
31      property DataType:  TImgDataType Read FDataType  Write FDataType;
32      property Width:     Word         Read FWidth     Write FWidth;
# Line 35 | Line 40 | type
40      function LoadFromPSpc(ConnectionID, FileID: Integer): Boolean;
41      function LoadFromTXMP(ConnectionID, FileID: Integer): Boolean;
42      function LoadFromTXMB(ConnectionID, FileID: Integer): Boolean;
43 +    function GetImgSize(w,h, storetype: Integer): Integer;
44      function GetImageDataSize(fading: Boolean): Integer;
45  
46      procedure DecodeImageTo32bit;
# Line 56 | Line 62 | type
62   implementation
63  
64   //uses Functions;
65 <
60 <
65 > uses Img_DDSTypes;
66  
67  
68   constructor TOniImage.Create;
# Line 69 | Line 74 | begin
74    Self.FHeight    := 0;
75    Self.FDepth     := 0;
76    Self.FStoreType := 0;
77 +
78 +  InitImage(FImage);
79   end;
80  
81  
# Line 472 | Line 479 | end;
479   function TOniImage.LoadFromTXMP(ConnectionID, FileID: Integer): Boolean;
480   var
481    img_addr: Integer;
482 +  data: TMemoryStream;
483 +  hdr: TDDSDXTHeader;
484 +  imginfo: Integer;
485 +  x,y, i: Integer;
486   begin
487    Result := True;
488    ConManager.Connection[ConnectionID].LoadDatFilePart(fileid, $8C, SizeOf(Self.FWidth), @Self.FWidth);
489    ConManager.Connection[ConnectionID].LoadDatFilePart(fileid, $8E, SizeOf(Self.FHeight), @Self.FHeight);
490 <  ConManager.Connection[ConnectionID].LoadDatFilePart(fileid, $90, SizeOf(Self.FStoreType),
491 <    @Self.FStoreType);
490 >  ConManager.Connection[ConnectionID].LoadDatFilePart(fileid, $90, SizeOf(Self.FStoreType), @Self.FStoreType);
491 >  ConManager.Connection[ConnectionID].LoadDatFilePart(fileid, $88, SizeOf(imginfo), @imginfo);
492    if ConManager.Connection[ConnectionID].DataOS = DOS_WIN then
493      ConManager.Connection[ConnectionID].LoadDatFilePart(fileid, $9C, SizeOf(img_addr), @img_addr)
494    else
# Line 485 | Line 496 | begin
496  
497    case Self.FStoreType of
498      0, 1, 2:
488    begin
489      SetLength(Self.FData, Self.FWidth * Self.FHeight * 2);
499        Self.FDepth := 16;
491    end;
500      8:
493    begin
494      SetLength(Self.FData, Self.FWidth * Self.FHeight * 4);
501        Self.FDepth := 32;
496    end;
502      9:
498    begin
499      SetLength(Self.FData, Self.FWidth * Self.FHeight div 2);
503        Self.FDepth := 16;
501    end;
504      else
505        Result := False;
506        Exit;
507    end;
508  
509    if ConManager.Connection[ConnectionID].DataOS = DOS_WIN then
510 +    ConManager.Connection[ConnectionID].LoadRawFile(fileid, $9C, TStream(data))
511 +  else
512 +    ConManager.Connection[ConnectionID].LoadRawFile(fileid, $A0, TStream(data));
513 +
514 +  with hdr do
515 +  begin
516 +    FOURCC := 'DDS ';
517 +    with SURFACEDESC2 do
518 +    begin
519 +      Size := 124;
520 +      Flags := DDSD_CAPS or DDSD_PIXELFORMAT or DDSD_WIDTH or DDSD_HEIGHT;
521 +      if FStoreType = 9 then
522 +        Flags := Flags or DDSD_LINEARSIZE
523 +      else
524 +        Flags := Flags or DDSD_PITCH;
525 +      if (imginfo and $01) > 0 then
526 +        Flags := Flags or DDSD_MIPMAPCOUNT;
527 +      Height := FHeight;
528 +      Width := FWidth;
529 +      if FStoreType = 9 then
530 +        PitchOrLinearSize := FWidth * FHeight div 2
531 +      else
532 +        PitchOrLinearSize := FWidth * FDepth div 2;
533 +      Depth := 0;
534 +      MipMapCount := 1;
535 +      x := FWidth;
536 +      y := FHeight;
537 +      while (x > 1) and (y > 1) do
538 +      begin
539 +        x := x div 2;
540 +        y := y div 2;
541 +        Inc(MipMapCount);
542 +      end;
543 +      for i := 1 to 11 do
544 +        Reserved[i] := 0;
545 +      with PIXELFORMAT do
546 +      begin
547 +        Size := 32;
548 +        if FStoreType = 9 then
549 +          Flags := DDPF_FOURCC
550 +        else
551 +          Flags := DDPF_RGB;
552 +      end;
553 +    end;
554 +  end;
555 +  LoadImageFromStream(data, FImage);
556 + {
557 +  if ConManager.Connection[ConnectionID].DataOS = DOS_WIN then
558      ConManager.Connection[ConnectionID].LoadRawFile(fileid, $9C, FData)
559    else
560      ConManager.Connection[ConnectionID].LoadRawFile(fileid, $A0, FData);
561 <
561 > }
562    Self.FDataType := [DT_OniReverted, DT_Oni];
563   end;
564  
# Line 583 | Line 633 | end;
633  
634  
635  
636 + function TOniImage.GetImgSize(w,h, storetype: Integer): Integer;
637 + begin
638 +  case storetype of
639 +    0, 1, 2:
640 +      Result := w*h*2;
641 +    8:
642 +      Result := w*h*4;
643 +    9:
644 +      Result := Max(1, w div 4) * Max(1, h div 4) * 8;
645 +  else
646 +    Result := -1;
647 +  end;
648 + end;
649 +
650  
651   function TOniImage.GetImageDataSize(fading: Boolean): Integer;
652   var
653    size: Integer;
654    x, y: Word;
591
592  function GetImgSize(w,h, storetype: Integer): Integer;
593  begin
594    case storetype of
595      0, 1, 2:
596        Result := w*h*2;
597      8:
598        Result := w*h*4;
599      9:
600        Result :=  Max(1, w div 4) * Max(1, h div 4) * 8;
601    else
602      Result := -1;
603    end;
604  end;
605
655   begin
656    x    := Self.FWidth;
657    y    := Self.FHeight;

Diff Legend

Removed lines
+ Added lines
< Changed lines (old)
> Changed lines (new)