| 29 |  |  | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 30 |  | constructor Create; | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 31 |  | procedure Free; | 
 
 
 
 
 
 
 
 
 | 32 | – | function Load(ConnectionID, FileID: Integer): Boolean; | 
 
 
 
 
 
 
 
 
 | 33 | – | function LoadFromPSpc(ConnectionID, FileID: Integer): Boolean; | 
 
 
 
 
 
 
 
 
 | 34 | – | function LoadFromTXMP(ConnectionID, FileID: Integer): Boolean; | 
 
 
 
 
 
 
 
 
 | 35 | – | function LoadFromTXMB(ConnectionID, FileID: Integer): Boolean; | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 32 |  |  | 
 
 
 
 
 
 
 
 
 
 
 | 33 | < | procedure SaveDataToStream(MipMaps: Boolean; var Target: TStream); | 
 
 
 
 
 
 
 
 
 | 33 | > | function GetImageSize(MipMaps: Boolean): Integer; | 
 
 
 
 
 
 
 
 
 
 
 | 34 |  |  | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 35 |  | function LoadFromFile(filename: String): Boolean; | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 36 |  | function WriteToFile(filename: String): Boolean; | 
 
 
 
 
 
 
 
 
 
 
 | 37 | < |  | 
 
 
 
 
 
 
 
 
 | 37 | > | procedure SaveDataToStream(MipMaps: Boolean; var Target: TStream); | 
 
 
 
 
 
 
 
 
 
 
 | 38 |  | procedure DrawOnCanvas(Canvas: TCanvas; Index: Integer); | 
 
 
 
 
 
 
 
 
 
 
 | 39 | < | function GetImageSize(MipMaps: Boolean): Integer; | 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 | 39 | > |  | 
 
 
 
 
 | 40 | > | function Load(ConnectionID, FileID: Integer): Boolean; | 
 
 
 
 
 | 41 | > | function LoadFromTXMP(ConnectionID, FileID: Integer): Boolean; | 
 
 
 
 
 | 42 | > | function LoadFromTXMB(ConnectionID, FileID: Integer): Boolean; | 
 
 
 
 
 | 43 | > | function LoadFromPSpc(ConnectionID, FileID: Integer): Boolean; | 
 
 
 
 
 
 
 
 
 
 
 | 44 |  | published | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 45 |  | end; | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 46 |  |  | 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 | 50 |  | uses Img_DDSTypes, ImagingComponents; | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 51 |  |  | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 52 |  |  | 
 
 
 
 
 
 
 
 
 | 53 | – | procedure TOniImage.DrawOnCanvas(Canvas: TCanvas; Index: Integer); | 
 
 
 
 
 
 
 
 
 | 54 | – | var | 
 
 
 
 
 
 
 
 
 | 55 | – | singleimg: TImageData; | 
 
 
 
 
 
 
 
 
 | 56 | – | rect: TRect; | 
 
 
 
 
 
 
 
 
 | 57 | – | begin | 
 
 
 
 
 
 
 
 
 | 58 | – | InitImage(singleimg); | 
 
 
 
 
 
 
 
 
 | 59 | – | CloneImage(FImages[Index-1], singleimg); | 
 
 
 
 
 
 
 
 
 | 60 | – | ConvertImage(singleimg, ifX8R8G8B8); | 
 
 
 
 
 
 
 
 
 | 61 | – | rect.Left := 0; | 
 
 
 
 
 
 
 
 
 | 62 | – | rect.Top := 0; | 
 
 
 
 
 
 
 
 
 | 63 | – | rect.Right := singleimg.Width - 1; | 
 
 
 
 
 
 
 
 
 | 64 | – | rect.Bottom := singleimg.Height - 1; | 
 
 
 
 
 
 
 
 
 | 65 | – | Canvas.Brush.Color := $C8D0D4; | 
 
 
 
 
 
 
 
 
 | 66 | – | Canvas.FillRect(Canvas.ClipRect); | 
 
 
 
 
 
 
 
 
 | 67 | – | DisplayImageData(Canvas, rect, singleimg, rect); | 
 
 
 
 
 
 
 
 
 | 68 | – | FreeImage(singleimg); | 
 
 
 
 
 
 
 
 
 | 69 | – | end; | 
 
 
 
 
 
 
 
 
 | 70 | – |  | 
 
 
 
 
 
 
 
 
 | 71 | – |  | 
 
 
 
 
 
 
 
 
 | 72 | – |  | 
 
 
 
 
 
 
 
 
 | 73 | – | constructor TOniImage.Create; | 
 
 
 
 
 
 
 
 
 | 74 | – | begin | 
 
 
 
 
 
 
 
 
 | 75 | – | end; | 
 
 
 
 
 
 
 
 
 | 76 | – |  | 
 
 
 
 
 
 
 
 
 | 77 | – |  | 
 
 
 
 
 
 
 
 
 | 78 | – |  | 
 
 
 
 
 
 
 
 
 | 79 | – | procedure TOniImage.Free; | 
 
 
 
 
 
 
 
 
 | 80 | – | begin | 
 
 
 
 
 
 
 
 
 | 81 | – | FreeImagesInArray(FImages); | 
 
 
 
 
 
 
 
 
 | 82 | – | end; | 
 
 
 
 
 
 
 
 
 | 83 | – |  | 
 
 
 
 
 
 
 
 
 | 84 | – |  | 
 
 
 
 
 
 
 
 
 | 85 | – |  | 
 
 
 
 
 
 
 
 
 | 86 | – |  | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 53 |  | function TOniImage.GetImage(MipGen: Integer): TImageData; | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 54 |  | begin | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 55 |  | if MipGen <= Length(FImages) then | 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 | 60 |  | end; | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 61 |  |  | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 62 |  |  | 
 
 
 
 
 
 
 
 
 | 97 | – |  | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 63 |  | function TOniImage.GetWidth(MipGen: Integer): Integer; | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 64 |  | begin | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 65 |  | if MipGen <= Length(FImages) then | 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 | 109 |  | end; | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 110 |  |  | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 111 |  |  | 
 
 
 
 
 
 
 
 
 
 
 | 112 | < | function TOniImage.Load(ConnectionID, FileID: Integer): Boolean; | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 113 | < | var | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 114 | < | FileInfo: TFileInfo; | 
 
 
 
 
 
 
 
 
 | 112 | > |  | 
 
 
 
 
 | 113 | > |  | 
 
 
 
 
 | 114 | > | constructor TOniImage.Create; | 
 
 
 
 
 
 
 
 
 
 
 | 115 |  | begin | 
 
 
 
 
 
 
 
 
 | 151 | – | FileInfo := ConManager.Connection[ConnectionID].GetFileInfo(fileid); | 
 
 
 
 
 
 
 
 
 | 152 | – | if FileInfo.Extension = 'PSpc' then | 
 
 
 
 
 
 
 
 
 | 153 | – | Result := LoadFromPSpc(ConnectionID, fileid) | 
 
 
 
 
 
 
 
 
 | 154 | – | else if FileInfo.Extension = 'TXMB' then | 
 
 
 
 
 
 
 
 
 | 155 | – | Result := LoadFromTXMB(ConnectionID, fileid) | 
 
 
 
 
 
 
 
 
 | 156 | – | else if FileInfo.Extension = 'TXMP' then | 
 
 
 
 
 
 
 
 
 | 157 | – | Result := LoadFromTXMP(ConnectionID, fileid) | 
 
 
 
 
 
 
 
 
 | 158 | – | else | 
 
 
 
 
 
 
 
 
 | 159 | – | Result := False; | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 116 |  | end; | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 117 |  |  | 
 
 
 
 
 
 
 
 | 118 | + | procedure TOniImage.Free; | 
 
 
 
 
 
 
 
 | 119 | + | begin | 
 
 
 
 
 
 
 
 | 120 | + | FreeImagesInArray(FImages); | 
 
 
 
 
 
 
 
 | 121 | + | end; | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 122 |  |  | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 123 |  |  | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 124 |  |  | 
 
 
 
 
 
 
 
 
 | 165 | – | function TOniImage.LoadFromPSpc(ConnectionID, FileID: Integer): Boolean; | 
 
 
 
 
 
 
 
 
 | 166 | – | type | 
 
 
 
 
 
 
 
 
 | 167 | – | TPoint = packed record | 
 
 
 
 
 
 
 
 
 | 168 | – | X, Y: Word; | 
 
 
 
 
 
 
 
 
 | 169 | – | end; | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 125 |  |  | 
 
 
 
 
 
 
 
 
 
 
 | 126 | < | TPSpc = packed record | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 172 | < | p1:   array[0..8] of TPoint; | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 173 | < | p2:   array[0..8] of TPoint; | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 174 | < | TXMP: Integer; | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 175 | < | end; | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 176 | < |  | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 177 | < | TPart = packed record | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 178 | < | x_txmp, y_txmp: Word; | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 179 | < | x_pspc, y_pspc: Word; | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 180 | < | w, h:    Word; | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 181 | < | imgdata: TImageData; | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 182 | < | used:    Boolean; | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 183 | < | end; | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 184 | < | const | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 185 | < | PartMatch: array[0..8] of Byte = (0, 3, 6, 1, 4, 7, 2, 5, 8); | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 186 | < | stretch_x: Integer = 1; | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 187 | < | stretch_y: Integer = 1; | 
 
 
 
 
 
 
 
 
 | 126 | > | function TOniImage.GetImageSize(MipMaps: Boolean): Integer; | 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 | 127 |  | var | 
 
 
 
 
 
 
 
 
 | 189 | – | x, y: Word; | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 128 |  | i: Integer; | 
 
 
 
 
 
 
 
 | 129 | + | begin | 
 
 
 
 
 
 
 
 | 130 | + | if Length(FImages) > 0 then | 
 
 
 
 
 
 
 
 | 131 | + | begin | 
 
 
 
 
 
 
 
 | 132 | + | Result := FImages[0].Size; | 
 
 
 
 
 
 
 
 | 133 | + | if mipmaps then | 
 
 
 
 
 
 
 
 | 134 | + | for i := 1 to High(FImages) do | 
 
 
 
 
 
 
 
 | 135 | + | Result := Result + FImages[i].Size; | 
 
 
 
 
 
 
 
 | 136 | + | end | 
 
 
 
 
 
 
 
 | 137 | + | else | 
 
 
 
 
 
 
 
 | 138 | + | Result := -1; | 
 
 
 
 
 
 
 
 | 139 | + | end; | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 140 |  |  | 
 
 
 
 
 
 
 
 
 | 192 | – | PSpc:     TPSpc; | 
 
 
 
 
 
 
 
 
 | 193 | – | txmpimg:  TOniImage; | 
 
 
 
 
 
 
 
 
 | 194 | – | //  txmpdata: TByteData; | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 141 |  |  | 
 
 
 
 
 
 
 
 
 | 196 | – | parts:    array[0..8] of TPart; | 
 
 
 
 
 
 
 
 
 | 197 | – | part:     Byte; | 
 
 
 
 
 
 
 
 
 | 198 | – | cols:     array[0..2] of Word; | 
 
 
 
 
 
 
 
 
 | 199 | – | rows:     array[0..2] of Word; | 
 
 
 
 
 
 
 
 
 | 200 | – | col, row: Byte; | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 142 |  |  | 
 
 
 
 
 
 
 
 
 
 
 | 143 | < | pspcimage: TImageData; | 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 | 143 | > |  | 
 
 
 
 
 | 144 | > | function TOniImage.LoadFromFile(filename: String): Boolean; | 
 
 
 
 
 
 
 
 
 
 
 | 145 |  | begin | 
 
 
 
 
 
 
 
 
 
 
 | 146 | < | ConManager.Connection[ConnectionID].LoadDatFilePart(fileid, $08, SizeOf(PSpc), @PSpc); | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 147 | < | PSpc.TXMP := PSpc.TXMP div 256; | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 148 | < | if PSpc.TXMP = 0 then | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 149 | < | begin | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 208 | < | Result := False; | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 209 | < | Exit; | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 210 | < | end; | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 211 | < | txmpimg := TOniImage.Create; | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 212 | < | txmpimg.Load(ConnectionID, PSpc.TXMP); | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 213 | < | CloneImage(txmpimg.Image[1], pspcimage); | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 214 | < | txmpimg.Free; | 
 
 
 
 
 
 
 
 
 | 146 | > | Result := LoadMultiImageFromFile(filename, FImages); | 
 
 
 
 
 | 147 | > | if not Result then | 
 
 
 
 
 | 148 | > | ShowMessage('Couldn''t load image file'); | 
 
 
 
 
 | 149 | > | end; | 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 | 150 |  |  | 
 
 
 
 
 
 
 
 
 | 216 | – | with pspc do | 
 
 
 
 
 
 
 
 
 | 217 | – | begin | 
 
 
 
 
 
 
 
 
 | 218 | – | for i := 0 to 2 do | 
 
 
 
 
 
 
 
 
 | 219 | – | begin | 
 
 
 
 
 
 
 
 
 | 220 | – | cols[i] := 0; | 
 
 
 
 
 
 
 
 
 | 221 | – | rows[i] := 0; | 
 
 
 
 
 
 
 
 
 | 222 | – | end; | 
 
 
 
 
 
 
 
 
 | 223 | – | for i := 0 to 8 do | 
 
 
 
 
 
 
 
 
 | 224 | – | begin | 
 
 
 
 
 
 
 
 
 | 225 | – | part := PartMatch[i]; | 
 
 
 
 
 
 
 
 
 | 226 | – | col  := i div 3; | 
 
 
 
 
 
 
 
 
 | 227 | – | row  := i mod 3; | 
 
 
 
 
 
 
 
 
 | 228 | – | if (p2[i].X > 0) or (p2[i].Y > 0) then | 
 
 
 
 
 
 
 
 
 | 229 | – | begin | 
 
 
 
 
 
 
 
 
 | 230 | – | parts[part].x_txmp := p1[i].X;// - 1; | 
 
 
 
 
 
 
 
 
 | 231 | – | parts[part].y_txmp := p1[i].Y;// - 1; | 
 
 
 
 
 
 
 
 
 | 232 | – | parts[part].x_pspc := 0; | 
 
 
 
 
 
 
 
 
 | 233 | – | if col > 0 then | 
 
 
 
 
 
 
 
 
 | 234 | – | for x := 0 to col - 1 do | 
 
 
 
 
 
 
 
 
 | 235 | – | Inc(parts[part].x_pspc, cols[x]); | 
 
 
 
 
 
 
 
 
 | 236 | – | parts[part].y_pspc := 0; | 
 
 
 
 
 
 
 
 
 | 237 | – | if row > 0 then | 
 
 
 
 
 
 
 
 
 | 238 | – | for y := 0 to row - 1 do | 
 
 
 
 
 
 
 
 
 | 239 | – | Inc(parts[part].y_pspc, rows[y]); | 
 
 
 
 
 
 
 
 
 | 240 | – | parts[part].w := Max(p2[i].X - p1[i].X, 1);// + 1; | 
 
 
 
 
 
 
 
 
 | 241 | – | parts[part].h := Max(p2[i].Y - p1[i].Y, 1);// + 1; | 
 
 
 
 
 
 
 
 
 | 242 | – | parts[part].used := True; | 
 
 
 
 
 
 
 
 
 | 243 | – | cols[col] := parts[part].w; | 
 
 
 
 
 
 
 
 
 | 244 | – | rows[row] := parts[part].h; | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 151 |  |  | 
 
 
 
 
 
 
 
 
 
 
 | 152 | < | NewImage(parts[part].w, parts[part].h, pspcimage.Format, parts[part].imgdata); | 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 | 152 | > | function TOniImage.WriteToFile(filename: String): Boolean; | 
 
 
 
 
 | 153 | > | begin | 
 
 
 
 
 | 154 | > | Result := SaveMultiImageToFile(filename, FImages); | 
 
 
 
 
 | 155 | > | end; | 
 
 
 
 
 
 
 
 
 
 
 | 156 |  |  | 
 
 
 
 
 
 
 
 
 | 248 | – | CopyRect(pspcimage, | 
 
 
 
 
 
 
 
 
 | 249 | – | parts[part].x_txmp, parts[part].y_txmp, parts[part].w, parts[part].h, | 
 
 
 
 
 
 
 
 
 | 250 | – | parts[part].imgdata, 0, 0); | 
 
 
 
 
 
 
 
 
 | 251 | – | end | 
 
 
 
 
 
 
 
 
 | 252 | – | else | 
 
 
 
 
 
 
 
 
 | 253 | – | begin | 
 
 
 
 
 
 
 
 
 | 254 | – | parts[part].used := False; | 
 
 
 
 
 
 
 
 
 | 255 | – | end; | 
 
 
 
 
 
 
 
 
 | 256 | – | end; | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 157 |  |  | 
 
 
 
 
 
 
 
 
 | 258 | – | end; | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 158 |  |  | 
 
 
 
 
 
 
 
 
 
 
 | 159 | < | for i := 0 to 8 do | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 160 | < | begin | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 161 | < | if parts[i].used then | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 162 | < | begin | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 163 | < | //      SaveImageToFile('M:\' + IntToStr(i) + '.bmp', parts[i].imgdata); | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 164 | < | end; | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 165 | < | end; | 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 | 159 | > | procedure TOniImage.DrawOnCanvas(Canvas: TCanvas; Index: Integer); | 
 
 
 
 
 | 160 | > | var | 
 
 
 
 
 | 161 | > | singleimg: TImageData; | 
 
 
 
 
 | 162 | > | rect: TRect; | 
 
 
 
 
 | 163 | > | begin | 
 
 
 
 
 | 164 | > | InitImage(singleimg); | 
 
 
 
 
 | 165 | > | CloneImage(FImages[Index-1], singleimg); | 
 
 
 
 
 | 166 | > | ConvertImage(singleimg, ifX8R8G8B8); | 
 
 
 
 
 | 167 | > | rect.Left := 0; | 
 
 
 
 
 | 168 | > | rect.Top := 0; | 
 
 
 
 
 | 169 | > | rect.Right := singleimg.Width - 1; | 
 
 
 
 
 | 170 | > | rect.Bottom := singleimg.Height - 1; | 
 
 
 
 
 | 171 | > | Canvas.Brush.Color := $C8D0D4; | 
 
 
 
 
 | 172 | > | Canvas.FillRect(Canvas.ClipRect); | 
 
 
 
 
 | 173 | > | DisplayImageData(Canvas, rect, singleimg, rect); | 
 
 
 
 
 | 174 | > | FreeImage(singleimg); | 
 
 
 
 
 | 175 | > | end; | 
 
 
 
 
 
 
 
 
 
 
 | 176 |  |  | 
 
 
 
 
 
 
 
 
 | 268 | – | SetLength(FImages, 1); | 
 
 
 
 
 
 
 
 
 | 269 | – | x := cols[0] + cols[1] * stretch_x + cols[2]; | 
 
 
 
 
 
 
 
 
 | 270 | – | y := rows[0] + rows[1] * stretch_y + rows[2]; | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 177 |  |  | 
 
 
 
 
 
 
 
 
 | 272 | – | NewImage(x, y, pspcimage.Format, FImages[0]); | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 178 |  |  | 
 
 
 
 
 
 
 
 
 
 
 | 179 | < | x := 0; | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 180 | < | for col := 0 to 2 do | 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 | 179 | > |  | 
 
 
 
 
 | 180 | > | procedure TOniImage.SaveDataToStream(MipMaps: Boolean; var Target: TStream); | 
 
 
 
 
 | 181 | > | var | 
 
 
 
 
 | 182 | > | images: TDynImageDataArray; | 
 
 
 
 
 | 183 | > | mem: TMemoryStream; | 
 
 
 
 
 | 184 | > | i: Integer; | 
 
 
 
 
 | 185 | > | begin | 
 
 
 
 
 | 186 | > | if Length(FImages) = 0 then | 
 
 
 
 
 | 187 | > | Exit; | 
 
 
 
 
 | 188 | > | if MipMaps then | 
 
 
 
 
 
 
 
 
 
 
 | 189 |  | begin | 
 
 
 
 
 
 
 
 
 
 
 | 190 | < | y := 0; | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 278 | < | for row := 0 to 2 do | 
 
 
 
 
 
 
 
 
 | 190 | > | if Length(FImages) = 1 then | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 191 |  | begin | 
 
 
 
 
 
 
 
 
 
 
 | 192 | < | part := row*3 + col; | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 281 | < | if parts[part].used then | 
 
 
 
 
 
 
 
 
 | 192 | > | if not GenerateMipMaps(FImages[0], 0, images) then | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 193 |  | begin | 
 
 
 
 
 
 
 
 
 
 
 | 194 | < | if (row = 1) and (col = 1) then | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 195 | < | StretchRect(parts[part].imgdata, 0, 0, parts[part].w, parts[part].h, | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 285 | < | FImages[0], x, y, parts[part].w * stretch_x, parts[part].h * stretch_y, rfNearest) | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 286 | < | else | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 287 | < | if (row = 1) then | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 288 | < | StretchRect(parts[part].imgdata, 0, 0, parts[part].w, parts[part].h, | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 289 | < | FImages[0], x, y, parts[part].w, parts[part].h * stretch_y, rfNearest) | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 290 | < | else | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 291 | < | if (col = 1) then | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 292 | < | StretchRect(parts[part].imgdata, 0, 0, parts[part].w, parts[part].h, | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 293 | < | FImages[0], x, y, parts[part].w * stretch_x, parts[part].h, rfNearest) | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 294 | < | else | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 295 | < | CopyRect(parts[part].imgdata, 0, 0, parts[part].w, parts[part].h, | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 296 | < | FImages[0], x, y ); | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 297 | < | if row = 1 then | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 298 | < | y := y + parts[part].h * stretch_y | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 299 | < | else | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 300 | < | y := y + parts[part].h; | 
 
 
 
 
 
 
 
 
 | 194 | > | ShowMessage('Could not generate MipMaps'); | 
 
 
 
 
 | 195 | > | Exit; | 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 | 196 |  | end; | 
 
 
 
 
 
 
 
 | 197 | + | end | 
 
 
 
 
 
 
 
 | 198 | + | else | 
 
 
 
 
 
 
 
 | 199 | + | begin | 
 
 
 
 
 
 
 
 | 200 | + | SetLength(images, Length(FImages)); | 
 
 
 
 
 
 
 
 | 201 | + | for i := 0 to High(FImages) do | 
 
 
 
 
 
 
 
 | 202 | + | CloneImage(FImages[i], images[i]); | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 203 |  | end; | 
 
 
 
 
 
 
 
 
 
 
 | 204 | < | if cols[col] > 0 then | 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 | 204 | > | mem := TMemoryStream.Create; | 
 
 
 
 
 | 205 | > | if not SaveMultiImageToStream('dds', mem, images) then | 
 
 
 
 
 
 
 
 
 
 
 | 206 |  | begin | 
 
 
 
 
 
 
 
 
 
 
 | 207 | < | if (col = 1) then | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 208 | < | x := x + parts[part].w * stretch_x | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 209 | < | else | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 210 | < | x := x + parts[part].w; | 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 | 207 | > | ShowMessage('Could not save images to stream'); | 
 
 
 
 
 | 208 | > | Exit; | 
 
 
 
 
 | 209 | > | end; | 
 
 
 
 
 | 210 | > | FreeImagesInArray(images); | 
 
 
 
 
 | 211 | > | end | 
 
 
 
 
 | 212 | > | else | 
 
 
 
 
 | 213 | > | begin | 
 
 
 
 
 | 214 | > | mem := TMemoryStream.Create; | 
 
 
 
 
 | 215 | > | if not SaveImageToStream('dds', mem, FImages[0]) then | 
 
 
 
 
 | 216 | > | begin | 
 
 
 
 
 | 217 | > | ShowMessage('Could not save image to stream'); | 
 
 
 
 
 | 218 | > | Exit; | 
 
 
 
 
 
 
 
 
 
 
 | 219 |  | end; | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 220 |  | end; | 
 
 
 
 
 
 
 
 | 221 | + | if not Assigned(Target) then | 
 
 
 
 
 
 
 
 | 222 | + | Target := TMemoryStream.Create; | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 223 |  |  | 
 
 
 
 
 
 
 
 
 
 
 | 224 | < | FreeImage(pspcimage); | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 225 | < | for i := 0 to 8 do | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 226 | < | if parts[i].used then | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 227 | < | FreeImage(parts[i].imgdata); | 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 | 224 | > | mem.Seek(128, soFromBeginning); | 
 
 
 
 
 | 225 | > | Target.CopyFrom(mem, mem.Size - 128); | 
 
 
 
 
 | 226 | > | mem.Free; | 
 
 
 
 
 | 227 | > | Target.Seek(0, soFromBeginning); | 
 
 
 
 
 | 228 | > | end; | 
 
 
 
 
 | 229 | > |  | 
 
 
 
 
 | 230 | > |  | 
 
 
 
 
 | 231 | > |  | 
 
 
 
 
 | 232 | > |  | 
 
 
 
 
 | 233 | > |  | 
 
 
 
 
 | 234 | > | function TOniImage.Load(ConnectionID, FileID: Integer): Boolean; | 
 
 
 
 
 | 235 | > | var | 
 
 
 
 
 | 236 | > | FileInfo: TFileInfo; | 
 
 
 
 
 | 237 | > | begin | 
 
 
 
 
 | 238 | > | FileInfo := ConManager.Connection[ConnectionID].GetFileInfo(fileid); | 
 
 
 
 
 | 239 | > | if FileInfo.Extension = 'PSpc' then | 
 
 
 
 
 | 240 | > | Result := LoadFromPSpc(ConnectionID, fileid) | 
 
 
 
 
 | 241 | > | else if FileInfo.Extension = 'TXMB' then | 
 
 
 
 
 | 242 | > | Result := LoadFromTXMB(ConnectionID, fileid) | 
 
 
 
 
 | 243 | > | else if FileInfo.Extension = 'TXMP' then | 
 
 
 
 
 | 244 | > | Result := LoadFromTXMP(ConnectionID, fileid) | 
 
 
 
 
 | 245 | > | else | 
 
 
 
 
 | 246 | > | Result := False; | 
 
 
 
 
 
 
 
 
 
 
 | 247 |  | end; | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 248 |  |  | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 249 |  |  | 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 | 261 |  | _storetype: Byte; | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 262 |  | _depth: Byte; | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 263 |  | begin | 
 
 
 
 
 
 
 
 
 
 
 | 264 | < | Result := True; | 
 
 
 
 
 
 
 
 
 | 264 | > | Result := False; | 
 
 
 
 
 
 
 
 
 
 
 | 265 |  | ConManager.Connection[ConnectionID].LoadDatFilePart(fileid, $8C, SizeOf(_width), @_width); | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 266 |  | ConManager.Connection[ConnectionID].LoadDatFilePart(fileid, $8E, SizeOf(_height), @_height); | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 267 |  | ConManager.Connection[ConnectionID].LoadDatFilePart(fileid, $90, SizeOf(_storetype), @_storetype); | 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 | 375 |  | else | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 376 |  | ConManager.Connection[ConnectionID].LoadRawFile(fileid, $A0, TStream(data)); | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 377 |  |  | 
 
 
 
 
 
 
 
 
 | 447 | – | //  data.Seek(0, soFromBeginning); | 
 
 
 
 
 
 
 
 
 | 448 | – | //  data.SaveToFile('m:\test.txmp'); | 
 
 
 
 
 
 
 
 
 | 449 | – |  | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 378 |  | data.Seek(0, soFromBeginning); | 
 
 
 
 
 
 
 
 
 
 
 | 379 | < | result := LoadMultiImageFromStream(data, FImages); | 
 
 
 
 
 
 
 
 
 | 379 | > | Result := LoadMultiImageFromStream(data, FImages); | 
 
 
 
 
 
 
 
 
 
 
 | 380 |  | data.Free; | 
 
 
 
 
 
 
 
 
 
 
 | 381 | < | { | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 454 | < | if result then | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 455 | < | begin | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 456 | < | for i := 0 to High(FImages) do | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 457 | < | begin | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 458 | < | data := TMemoryStream.Create; | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 459 | < | data.Write(FImages[i].Bits^, FImages[i].Size); | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 460 | < | data.Seek(0, soFromBeginning); | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 461 | < | data.SaveToFile('m:\test.txmp.'+IntToStr(i)); | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 462 | < | data.Free; | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 463 | < | end; | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 464 | < | end; | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 465 | < | } | 
 
 
 
 
 
 
 
 
 | 381 | > |  | 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 | 382 |  | if not result then | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 383 |  | begin | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 384 |  | ShowMessage('Error while loading file' + #13#10 + DetermineStreamFormat(data)); | 
 
 
 
 
 
 
 
 
 | 469 | – | //    data.SaveToFile('m:\prob.dds'); | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 385 |  | end; | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 386 |  | end; | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 387 |  |  | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 388 |  |  | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 389 |  |  | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 390 |  |  | 
 
 
 
 
 
 
 
 | 391 | + |  | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 392 |  | function TOniImage.LoadFromTXMB(ConnectionID, FileID: Integer): Boolean; | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 393 |  | var | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 394 |  | i, x, y, imgid: Integer; | 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 | 400 |  |  | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 401 |  | width, height: Word; | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 402 |  | begin | 
 
 
 
 
 
 
 
 | 403 | + | Result := False; | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 404 |  | ConManager.Connection[ConnectionID].LoadDatFilePart(fileid, $10, SizeOf(width), @width); | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 405 |  | ConManager.Connection[ConnectionID].LoadDatFilePart(fileid, $12, SizeOf(height), @height); | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 406 |  | ConManager.Connection[ConnectionID].LoadDatFilePart(fileid, $18, SizeOf(cols), @cols); | 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 | 435 |  | end; | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 436 |  | for i := 0 to linkcount - 1 do | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 437 |  | images[i].Free; | 
 
 
 
 
 
 
 
 | 438 | + | Result := True; | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 439 |  | end; | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 440 |  |  | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 441 |  |  | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 442 |  |  | 
 
 
 
 
 
 
 
 
 
 
 | 443 | < | procedure TOniImage.SaveDataToStream(MipMaps: Boolean; var Target: TStream); | 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 | 443 | > |  | 
 
 
 
 
 | 444 | > |  | 
 
 
 
 
 | 445 | > | function TOniImage.LoadFromPSpc(ConnectionID, FileID: Integer): Boolean; | 
 
 
 
 
 | 446 | > | type | 
 
 
 
 
 | 447 | > | TPoint = packed record | 
 
 
 
 
 | 448 | > | X, Y: Word; | 
 
 
 
 
 | 449 | > | end; | 
 
 
 
 
 | 450 | > |  | 
 
 
 
 
 | 451 | > | TPSpc = packed record | 
 
 
 
 
 | 452 | > | p1:   array[0..8] of TPoint; | 
 
 
 
 
 | 453 | > | p2:   array[0..8] of TPoint; | 
 
 
 
 
 | 454 | > | TXMP: Integer; | 
 
 
 
 
 | 455 | > | end; | 
 
 
 
 
 | 456 | > |  | 
 
 
 
 
 | 457 | > | TPart = packed record | 
 
 
 
 
 | 458 | > | x_txmp, y_txmp: Word; | 
 
 
 
 
 | 459 | > | x_pspc, y_pspc: Word; | 
 
 
 
 
 | 460 | > | w, h:    Word; | 
 
 
 
 
 | 461 | > | imgdata: TImageData; | 
 
 
 
 
 | 462 | > | used:    Boolean; | 
 
 
 
 
 | 463 | > | end; | 
 
 
 
 
 | 464 | > | const | 
 
 
 
 
 | 465 | > | PartMatch: array[0..8] of Byte = (0, 3, 6, 1, 4, 7, 2, 5, 8); | 
 
 
 
 
 | 466 | > | stretch_x: Integer = 1; | 
 
 
 
 
 | 467 | > | stretch_y: Integer = 1; | 
 
 
 
 
 
 
 
 
 
 
 | 468 |  | var | 
 
 
 
 
 
 
 
 
 
 
 | 469 | < | images: TDynImageDataArray; | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 528 | < | mem: TMemoryStream; | 
 
 
 
 
 
 
 
 
 | 469 | > | x, y: Word; | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 470 |  | i: Integer; | 
 
 
 
 
 
 
 
 | 471 | + |  | 
 
 
 
 
 
 
 
 | 472 | + | PSpc:     TPSpc; | 
 
 
 
 
 
 
 
 | 473 | + | txmpimg:  TOniImage; | 
 
 
 
 
 
 
 
 | 474 | + |  | 
 
 
 
 
 
 
 
 | 475 | + | parts:    array[0..8] of TPart; | 
 
 
 
 
 
 
 
 | 476 | + | part:     Byte; | 
 
 
 
 
 
 
 
 | 477 | + | cols:     array[0..2] of Word; | 
 
 
 
 
 
 
 
 | 478 | + | rows:     array[0..2] of Word; | 
 
 
 
 
 
 
 
 | 479 | + | col, row: Byte; | 
 
 
 
 
 
 
 
 | 480 | + |  | 
 
 
 
 
 
 
 
 | 481 | + | pspcimage: TImageData; | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 482 |  | begin | 
 
 
 
 
 
 
 
 
 
 
 | 483 | < | if Length(FImages) = 0 then | 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 | 483 | > | ConManager.Connection[ConnectionID].LoadDatFilePart(fileid, $08, SizeOf(PSpc), @PSpc); | 
 
 
 
 
 | 484 | > | PSpc.TXMP := PSpc.TXMP div 256; | 
 
 
 
 
 | 485 | > | if PSpc.TXMP = 0 then | 
 
 
 
 
 | 486 | > | begin | 
 
 
 
 
 | 487 | > | Result := False; | 
 
 
 
 
 
 
 
 
 
 
 | 488 |  | Exit; | 
 
 
 
 
 
 
 
 
 
 
 | 489 | < | if MipMaps then | 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 | 489 | > | end; | 
 
 
 
 
 | 490 | > | txmpimg := TOniImage.Create; | 
 
 
 
 
 | 491 | > | txmpimg.Load(ConnectionID, PSpc.TXMP); | 
 
 
 
 
 | 492 | > | CloneImage(txmpimg.Image[1], pspcimage); | 
 
 
 
 
 | 493 | > | txmpimg.Free; | 
 
 
 
 
 | 494 | > |  | 
 
 
 
 
 | 495 | > | Result := False; | 
 
 
 
 
 | 496 | > |  | 
 
 
 
 
 | 497 | > | with pspc do | 
 
 
 
 
 
 
 
 
 
 
 | 498 |  | begin | 
 
 
 
 
 
 
 
 
 
 
 | 499 | < | if Length(FImages) = 1 then | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 536 | < | begin | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 537 | < | if not GenerateMipMaps(FImages[0], 0, images) then | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 538 | < | begin | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 539 | < | ShowMessage('Could not generate MipMaps'); | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 540 | < | Exit; | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 541 | < | end; | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 542 | < | end | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 543 | < | else | 
 
 
 
 
 
 
 
 
 | 499 | > | for i := 0 to 2 do | 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 | 500 |  | begin | 
 
 
 
 
 
 
 
 
 
 
 | 501 | < | SetLength(images, Length(FImages)); | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 502 | < | for i := 0 to High(FImages) do | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 547 | < | CloneImage(FImages[i], images[i]); | 
 
 
 
 
 
 
 
 
 | 501 | > | cols[i] := 0; | 
 
 
 
 
 | 502 | > | rows[i] := 0; | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 503 |  | end; | 
 
 
 
 
 
 
 
 
 
 
 | 504 | < | mem := TMemoryStream.Create; | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 550 | < | if not SaveMultiImageToStream('dds', mem, images) then | 
 
 
 
 
 
 
 
 
 | 504 | > | for i := 0 to 8 do | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 505 |  | begin | 
 
 
 
 
 
 
 
 
 
 
 | 506 | < | ShowMessage('Could not save images to stream'); | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 507 | < | Exit; | 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 | 506 | > | part := PartMatch[i]; | 
 
 
 
 
 | 507 | > | col  := i div 3; | 
 
 
 
 
 | 508 | > | row  := i mod 3; | 
 
 
 
 
 | 509 | > | if (p2[i].X > 0) or (p2[i].Y > 0) then | 
 
 
 
 
 | 510 | > | begin | 
 
 
 
 
 | 511 | > | parts[part].x_txmp := p1[i].X;// - 1; | 
 
 
 
 
 | 512 | > | parts[part].y_txmp := p1[i].Y;// - 1; | 
 
 
 
 
 | 513 | > | parts[part].x_pspc := 0; | 
 
 
 
 
 | 514 | > | if col > 0 then | 
 
 
 
 
 | 515 | > | for x := 0 to col - 1 do | 
 
 
 
 
 | 516 | > | Inc(parts[part].x_pspc, cols[x]); | 
 
 
 
 
 | 517 | > | parts[part].y_pspc := 0; | 
 
 
 
 
 | 518 | > | if row > 0 then | 
 
 
 
 
 | 519 | > | for y := 0 to row - 1 do | 
 
 
 
 
 | 520 | > | Inc(parts[part].y_pspc, rows[y]); | 
 
 
 
 
 | 521 | > | parts[part].w := Max(p2[i].X - p1[i].X, 1);// + 1; | 
 
 
 
 
 | 522 | > | parts[part].h := Max(p2[i].Y - p1[i].Y, 1);// + 1; | 
 
 
 
 
 | 523 | > | parts[part].used := True; | 
 
 
 
 
 | 524 | > | cols[col] := parts[part].w; | 
 
 
 
 
 | 525 | > | rows[row] := parts[part].h; | 
 
 
 
 
 | 526 | > |  | 
 
 
 
 
 | 527 | > | NewImage(parts[part].w, parts[part].h, pspcimage.Format, parts[part].imgdata); | 
 
 
 
 
 | 528 | > |  | 
 
 
 
 
 | 529 | > | CopyRect(pspcimage, | 
 
 
 
 
 | 530 | > | parts[part].x_txmp, parts[part].y_txmp, parts[part].w, parts[part].h, | 
 
 
 
 
 | 531 | > | parts[part].imgdata, 0, 0); | 
 
 
 
 
 | 532 | > | end | 
 
 
 
 
 | 533 | > | else | 
 
 
 
 
 | 534 | > | begin | 
 
 
 
 
 | 535 | > | parts[part].used := False; | 
 
 
 
 
 | 536 | > | end; | 
 
 
 
 
 
 
 
 
 
 
 | 537 |  | end; | 
 
 
 
 
 
 
 
 
 
 
 | 538 | < | FreeImagesInArray(images); | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 539 | < | end | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 540 | < | else | 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 | 538 | > |  | 
 
 
 
 
 | 539 | > | end; | 
 
 
 
 
 | 540 | > |  | 
 
 
 
 
 | 541 | > | for i := 0 to 8 do | 
 
 
 
 
 
 
 
 
 
 
 | 542 |  | begin | 
 
 
 
 
 
 
 
 
 
 
 | 543 | < | mem := TMemoryStream.Create; | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 560 | < | if not SaveImageToStream('dds', mem, FImages[0]) then | 
 
 
 
 
 
 
 
 
 | 543 | > | if parts[i].used then | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 544 |  | begin | 
 
 
 
 
 
 
 
 
 
 
 | 545 | < | ShowMessage('Could not save image to stream'); | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 563 | < | Exit; | 
 
 
 
 
 
 
 
 
 | 545 | > | //      SaveImageToFile('M:\' + IntToStr(i) + '.bmp', parts[i].imgdata); | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 546 |  | end; | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 547 |  | end; | 
 
 
 
 
 
 
 
 
 | 566 | – | if not Assigned(Target) then | 
 
 
 
 
 
 
 
 
 | 567 | – | Target := TMemoryStream.Create; | 
 
 
 
 
 
 
 
 
 | 568 | – |  | 
 
 
 
 
 
 
 
 
 | 569 | – | //  mem.Seek(0, soFromBeginning); | 
 
 
 
 
 
 
 
 
 | 570 | – | //  mem.SaveToFile('m:\dds.dds'); | 
 
 
 
 
 
 
 
 
 | 571 | – |  | 
 
 
 
 
 
 
 
 
 | 572 | – | mem.Seek(128, soFromBeginning); | 
 
 
 
 
 
 
 
 
 | 573 | – | Target.CopyFrom(mem, mem.Size - 128); | 
 
 
 
 
 
 
 
 
 | 574 | – | mem.Free; | 
 
 
 
 
 
 
 
 
 | 575 | – | Target.Seek(0, soFromBeginning); | 
 
 
 
 
 
 
 
 
 | 576 | – | end; | 
 
 
 
 
 
 
 
 
 | 577 | – |  | 
 
 
 
 
 
 
 
 
 | 578 | – |  | 
 
 
 
 
 
 
 
 
 | 579 | – | function TOniImage.LoadFromFile(filename: String): Boolean; | 
 
 
 
 
 
 
 
 
 | 580 | – | begin | 
 
 
 
 
 
 
 
 
 | 581 | – | if not LoadMultiImageFromFile(filename, FImages) then | 
 
 
 
 
 
 
 
 
 | 582 | – | ShowMessage('Couldn''t load image file'); | 
 
 
 
 
 
 
 
 
 | 583 | – | end; | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 548 |  |  | 
 
 
 
 
 
 
 
 | 549 | + | SetLength(FImages, 1); | 
 
 
 
 
 
 
 
 | 550 | + | x := cols[0] + cols[1] * stretch_x + cols[2]; | 
 
 
 
 
 
 
 
 | 551 | + | y := rows[0] + rows[1] * stretch_y + rows[2]; | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 552 |  |  | 
 
 
 
 
 
 
 
 
 
 
 | 553 | < | function TOniImage.WriteToFile(filename: String): Boolean; | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 587 | < | begin | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 588 | < | SaveMultiImageToFile(filename, FImages); | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 589 | < | end; | 
 
 
 
 
 
 
 
 
 | 553 | > | NewImage(x, y, pspcimage.Format, FImages[0]); | 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 | 554 |  |  | 
 
 
 
 
 
 
 
 | 555 | + | x := 0; | 
 
 
 
 
 
 
 
 | 556 | + | for col := 0 to 2 do | 
 
 
 
 
 
 
 
 | 557 | + | begin | 
 
 
 
 
 
 
 
 | 558 | + | y := 0; | 
 
 
 
 
 
 
 
 | 559 | + | for row := 0 to 2 do | 
 
 
 
 
 
 
 
 | 560 | + | begin | 
 
 
 
 
 
 
 
 | 561 | + | part := row*3 + col; | 
 
 
 
 
 
 
 
 | 562 | + | if parts[part].used then | 
 
 
 
 
 
 
 
 | 563 | + | begin | 
 
 
 
 
 
 
 
 | 564 | + | if (row = 1) and (col = 1) then | 
 
 
 
 
 
 
 
 | 565 | + | StretchRect(parts[part].imgdata, 0, 0, parts[part].w, parts[part].h, | 
 
 
 
 
 
 
 
 | 566 | + | FImages[0], x, y, parts[part].w * stretch_x, parts[part].h * stretch_y, rfNearest) | 
 
 
 
 
 
 
 
 | 567 | + | else | 
 
 
 
 
 
 
 
 | 568 | + | if (row = 1) then | 
 
 
 
 
 
 
 
 | 569 | + | StretchRect(parts[part].imgdata, 0, 0, parts[part].w, parts[part].h, | 
 
 
 
 
 
 
 
 | 570 | + | FImages[0], x, y, parts[part].w, parts[part].h * stretch_y, rfNearest) | 
 
 
 
 
 
 
 
 | 571 | + | else | 
 
 
 
 
 
 
 
 | 572 | + | if (col = 1) then | 
 
 
 
 
 
 
 
 | 573 | + | StretchRect(parts[part].imgdata, 0, 0, parts[part].w, parts[part].h, | 
 
 
 
 
 
 
 
 | 574 | + | FImages[0], x, y, parts[part].w * stretch_x, parts[part].h, rfNearest) | 
 
 
 
 
 
 
 
 | 575 | + | else | 
 
 
 
 
 
 
 
 | 576 | + | CopyRect(parts[part].imgdata, 0, 0, parts[part].w, parts[part].h, | 
 
 
 
 
 
 
 
 | 577 | + | FImages[0], x, y ); | 
 
 
 
 
 
 
 
 | 578 | + | if row = 1 then | 
 
 
 
 
 
 
 
 | 579 | + | y := y + parts[part].h * stretch_y | 
 
 
 
 
 
 
 
 | 580 | + | else | 
 
 
 
 
 
 
 
 | 581 | + | y := y + parts[part].h; | 
 
 
 
 
 
 
 
 | 582 | + | end; | 
 
 
 
 
 
 
 
 | 583 | + | end; | 
 
 
 
 
 
 
 
 | 584 | + | if cols[col] > 0 then | 
 
 
 
 
 
 
 
 | 585 | + | begin | 
 
 
 
 
 
 
 
 | 586 | + | if (col = 1) then | 
 
 
 
 
 
 
 
 | 587 | + | x := x + parts[part].w * stretch_x | 
 
 
 
 
 
 
 
 | 588 | + | else | 
 
 
 
 
 
 
 
 | 589 | + | x := x + parts[part].w; | 
 
 
 
 
 
 
 
 | 590 | + | end; | 
 
 
 
 
 
 
 
 | 591 | + | end; | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 592 |  |  | 
 
 
 
 
 
 
 
 | 593 | + | FreeImage(pspcimage); | 
 
 
 
 
 
 
 
 | 594 | + | for i := 0 to 8 do | 
 
 
 
 
 
 
 
 | 595 | + | if parts[i].used then | 
 
 
 
 
 
 
 
 | 596 | + | FreeImage(parts[i].imgdata); | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 597 |  |  | 
 
 
 
 
 
 
 
 
 
 
 | 598 | < | function TOniImage.GetImageSize(MipMaps: Boolean): Integer; | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 594 | < | var | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 595 | < | i: Integer; | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 596 | < | begin | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 597 | < | if Length(FImages) > 0 then | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 598 | < | begin | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 599 | < | Result := FImages[0].Size; | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 600 | < | if mipmaps then | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 601 | < | for i := 1 to High(FImages) do | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 602 | < | Result := Result + FImages[i].Size; | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 603 | < | end | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 604 | < | else | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 605 | < | Result := -1; | 
 
 
 
 
 
 
 
 
 | 598 | > | Result := True; | 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 | 599 |  | end; | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 600 |  |  | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 601 |  | end. |