| 47 |  |  | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 48 |  | implementation | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 49 |  |  | 
 
 
 
 
 
 
 
 
 | 50 | – | //uses Functions; | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 50 |  | uses Img_DDSTypes, ImagingComponents; | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 51 |  |  | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 52 |  |  | 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 | 178 |  | x_txmp, y_txmp: Word; | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 179 |  | x_pspc, y_pspc: Word; | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 180 |  | w, h:    Word; | 
 
 
 
 
 
 
 
 
 
 
 | 181 | < | imgdata: TByteData; | 
 
 
 
 
 
 
 
 
 | 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 = 50; | 
 
 
 
 
 
 
 
 | 187 | + | stretch_y: Integer = 1; | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 188 |  | var | 
 
 
 
 
 
 
 
 
 
 
 | 189 | < | x, y, pixel: Word; | 
 
 
 
 
 
 
 
 
 | 189 | > | x, y: Word; | 
 
 
 
 
 
 
 
 
 
 
 | 190 |  | i: Integer; | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 191 |  |  | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 192 |  | PSpc:     TPSpc; | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 193 |  | txmpimg:  TOniImage; | 
 
 
 
 
 
 
 
 
 
 
 | 194 | < | txmpdata: TByteData; | 
 
 
 
 
 
 
 
 
 | 194 | > | //  txmpdata: TByteData; | 
 
 
 
 
 
 
 
 
 
 
 | 195 |  |  | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 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; | 
 
 
 
 
 
 
 
 | 201 | + |  | 
 
 
 
 
 
 
 
 | 202 | + | pspcimage: TImageData; | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 203 |  | begin | 
 
 
 
 
 
 
 
 
 | 201 | – | (* | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 204 |  | ConManager.Connection[ConnectionID].LoadDatFilePart(fileid, $08, SizeOf(PSpc), @PSpc); | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 205 |  | PSpc.TXMP := PSpc.TXMP div 256; | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 206 |  | if PSpc.TXMP = 0 then | 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 | 209 |  | Exit; | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 210 |  | end; | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 211 |  | txmpimg := TOniImage.Create; | 
 
 
 
 
 
 
 
 
 
 
 | 212 | < | txmpimg.LoadFromTXMP(ConnectionID, PSpc.TXMP); | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 213 | < | txmpimg.DecodeImageTo32bit; | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 214 | < | //  txmpimg.WriteToBMP('C:\file.bmp'); | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 215 | < | txmpimg.GetAs32bit(txmpdata); | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 216 | < | {    ShowMessage(IntToStr(txmpimg.Width)+'x'+IntToStr(txmpimg.Height)); | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 215 | < | for i:=0 to High(txmpdata) do | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 216 | < | txmpimg.Data[i]:=txmpdata[i]; | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 217 | < | txmpimg.WriteToBMP('D:\file2.bmp'); | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 218 | < | } | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 219 | < | with PSpc do | 
 
 
 
 
 
 
 
 
 | 212 | > | txmpimg.Load(ConnectionID, PSpc.TXMP); | 
 
 
 
 
 | 213 | > | CloneImage(txmpimg.Image[1], pspcimage); | 
 
 
 
 
 | 214 | > | txmpimg.Free; | 
 
 
 
 
 | 215 | > |  | 
 
 
 
 
 | 216 | > | with pspc do | 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 | 217 |  | begin | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 218 |  | for i := 0 to 2 do | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 219 |  | begin | 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 | 242 |  | parts[part].used := True; | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 243 |  | cols[col] := parts[part].w; | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 244 |  | rows[row] := parts[part].h; | 
 
 
 
 
 
 
 
 
 
 
 | 245 | < | SetLength(parts[part].imgdata, parts[part].w * parts[part].h * 4); | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 246 | < | for y := 0 to parts[part].h - 1 do | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 247 | < | begin | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 248 | < | for x := 0 to parts[part].w - 1 do | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 249 | < | begin | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 250 | < | for pixel := 0 to 3 do | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 254 | < | begin | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 255 | < | parts[part].imgdata[(y * parts[part].w + x) * 4 + pixel] := | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 256 | < | txmpdata[((parts[part].y_txmp + y) * txmpimg.Width + | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 257 | < | parts[part].x_txmp + x) * 4 + pixel]; | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 258 | < | end; | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 259 | < | end; | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 260 | < | end; | 
 
 
 
 
 
 
 
 
 | 245 | > |  | 
 
 
 
 
 | 246 | > | NewImage(parts[part].w, parts[part].h, pspcimage.Format, parts[part].imgdata); | 
 
 
 
 
 | 247 | > |  | 
 
 
 
 
 | 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 | 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 | 257 |  |  | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 258 |  | end; | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 259 |  |  | 
 
 
 
 
 
 
 
 
 | 270 | – | txmpimg.Free; | 
 
 
 
 
 
 
 
 
 | 271 | – | txmpimg := TOniImage.Create; | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 260 |  | for i := 0 to 8 do | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 261 |  | begin | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 262 |  | if parts[i].used then | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 263 |  | begin | 
 
 
 
 
 
 
 
 
 
 
 | 264 | < | SetLength(txmpimg.FData, Length(parts[i].imgdata)); | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 277 | < | for pixel := 0 to High(parts[i].imgdata) do | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 278 | < | txmpimg.Data[pixel] := parts[i].imgdata[pixel]; | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 279 | < | txmpimg.Width := parts[i].w; | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 280 | < | txmpimg.Height    := parts[i].h; | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 281 | < | txmpimg.StoreType := 8; | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 282 | < | txmpimg.DataType  := [DT_Decoded32]; | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 283 | < | txmpimg.Depth     := 32; | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 284 | < | txmpimg.WriteToBMP('M:\' + IntToStr(i) + '.bmp'); | 
 
 
 
 
 
 
 
 
 | 264 | > | //      SaveImageToFile('M:\' + IntToStr(i) + '.bmp', parts[i].imgdata); | 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 | 265 |  | end; | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 266 |  | end; | 
 
 
 
 
 
 
 
 
 | 287 | – | txmpimg.Free; | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 267 |  |  | 
 
 
 
 
 
 
 
 
 
 
 | 268 | < | Self.FWidth  := 0; | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 269 | < | Self.FHeight := 0; | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 270 | < | for i := 0 to 2 do | 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 | 268 | > | SetLength(FImages, 1); | 
 
 
 
 
 | 269 | > | x := cols[0] + cols[1] * stretch_x + cols[2]; | 
 
 
 
 
 | 270 | > | y := rows[0] + rows[1] * stretch_y + rows[2]; | 
 
 
 
 
 | 271 | > |  | 
 
 
 
 
 | 272 | > | NewImage(x, y, pspcimage.Format, FImages[0]); | 
 
 
 
 
 | 273 | > |  | 
 
 
 
 
 | 274 | > | x := 0; | 
 
 
 
 
 | 275 | > | for col := 0 to 2 do | 
 
 
 
 
 
 
 
 
 
 
 | 276 |  | begin | 
 
 
 
 
 
 
 
 
 
 
 | 277 | < | Inc(Self.FWidth, cols[i]); | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 278 | < | Inc(Self.FHeight, rows[i]); | 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 | 277 | > | y := 0; | 
 
 
 
 
 | 278 | > | for row := 0 to 2 do | 
 
 
 
 
 | 279 | > | begin | 
 
 
 
 
 | 280 | > | part := row*3 + col; | 
 
 
 
 
 | 281 | > | if (row = 1) and (col = 1) then | 
 
 
 
 
 | 282 | > | StretchRect(parts[part].imgdata, 0, 0, parts[part].w, parts[part].h, | 
 
 
 
 
 | 283 | > | FImages[0], x, y, parts[part].w * stretch_x, parts[part].h * stretch_y, rfNearest) | 
 
 
 
 
 | 284 | > | else | 
 
 
 
 
 | 285 | > | if (row = 1) then | 
 
 
 
 
 | 286 | > | StretchRect(parts[part].imgdata, 0, 0, parts[part].w, parts[part].h, | 
 
 
 
 
 | 287 | > | FImages[0], x, y, parts[part].w, parts[part].h * stretch_y, rfNearest) | 
 
 
 
 
 | 288 | > | else | 
 
 
 
 
 | 289 | > | if (col = 1) then | 
 
 
 
 
 | 290 | > | StretchRect(parts[part].imgdata, 0, 0, parts[part].w, parts[part].h, | 
 
 
 
 
 | 291 | > | FImages[0], x, y, parts[part].w * stretch_x, parts[part].h, rfNearest) | 
 
 
 
 
 | 292 | > | else | 
 
 
 
 
 | 293 | > | CopyRect(parts[part].imgdata, 0, 0, parts[part].w, parts[part].h, | 
 
 
 
 
 | 294 | > | FImages[0], x, y ); | 
 
 
 
 
 | 295 | > | if row = 1 then | 
 
 
 
 
 | 296 | > | y := y + parts[part].h * stretch_y | 
 
 
 
 
 | 297 | > | else | 
 
 
 
 
 | 298 | > | y := y + parts[part].h; | 
 
 
 
 
 | 299 | > | end; | 
 
 
 
 
 | 300 | > | if (part mod 3) = 1 then | 
 
 
 
 
 | 301 | > | x := x + parts[part].w * stretch_x | 
 
 
 
 
 | 302 | > | else | 
 
 
 
 
 | 303 | > | x := x + parts[part].w; | 
 
 
 
 
 
 
 
 
 
 
 | 304 |  | end; | 
 
 
 
 
 
 
 
 
 | 296 | – | SetLength(Self.FData, Self.FWidth * Self.FHeight * 4); | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 305 |  |  | 
 
 
 
 
 
 
 
 
 
 
 | 306 | < | //Combine data parts | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 307 | < |  | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 308 | < | Self.FDepth     := 32; | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 309 | < | Self.FStoreType := 8; | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 302 | < | Self.FDataType  := [DT_Decoded32]; | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 303 | < | //    Self.RevertImage; | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 304 | < | *) | 
 
 
 
 
 
 
 
 
 | 306 | > | FreeImage(pspcimage); | 
 
 
 
 
 | 307 | > | for i := 0 to 8 do | 
 
 
 
 
 | 308 | > | if parts[i].used then | 
 
 
 
 
 | 309 | > | FreeImage(parts[i].imgdata); | 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 | 310 |  | end; | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 311 |  |  | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 312 |  |  | 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 | 469 |  |  | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 470 |  | function TOniImage.LoadFromTXMB(ConnectionID, FileID: Integer): Boolean; | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 471 |  | var | 
 
 
 
 
 
 
 
 
 
 
 | 472 | < | i, x, y, x2, y2, pixelid, imgid: Integer; | 
 
 
 
 
 
 
 
 
 | 472 | > | i, x, y, imgid: Integer; | 
 
 
 
 
 
 
 
 
 
 
 | 473 |  | rows, cols: Word; | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 474 |  | linkcount: Integer; | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 475 |  | link: Integer; |