Changeset 349 for branches/highdpi/Packages/CevoComponents/ScreenTools.pas
- Timestamp:
- Apr 6, 2021, 8:11:02 PM (3 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
branches/highdpi/Packages/CevoComponents/ScreenTools.pas
r303 r349 8 8 {$ENDIF} 9 9 StringTables, LCLIntf, LCLType, SysUtils, Classes, Graphics, Controls, Math, 10 Forms, Menus, GraphType ;10 Forms, Menus, GraphType, fgl, UGraphicSet, LazFileUtils; 11 11 12 12 type … … 25 25 TLoadGraphicFileOptions = set of TLoadGraphicFileOption; 26 26 27 TFontType = (ftNormal, ftSmall, ftTiny, ftCaption, ftButton); 27 28 28 29 {$IFDEF WINDOWS} … … 38 39 function HexStringToColor(S: string): integer; 39 40 function LoadGraphicFile(Bmp: TDpiBitmap; FileName: string; Options: TLoadGraphicFileOptions = []): boolean; 40 function LoadGraphicSet(const Name: string): integer; 41 procedure Dump(dst: TDpiBitmap; HGr, xDst, yDst, Width, Height, xGr, yGr: integer); 42 procedure Sprite(Canvas: TDpiCanvas; HGr, xDst, yDst, Width, Height, xGr, yGr: integer); 41 function LoadGraphicSet(const Name: string): TGraphicSet; 42 function LoadGraphicSet2(const Name: string): TGraphicSet; 43 procedure Dump(dst: TDpiBitmap; HGr: TGraphicSet; xDst, yDst, Width, Height, xGr, yGr: integer); 44 procedure BitmapReplaceColor(Dst: TDpiBitmap; X, Y, Width, Height: Integer; OldColor, NewColor: TColor); 45 procedure Sprite(Canvas: TDpiCanvas; HGr: TGraphicSet; xDst, yDst, Width, Height, xGr, yGr: integer); 43 46 overload; 44 procedure Sprite(dst: TDpiBitmap; HGr ,xDst, yDst, Width, Height, xGr, yGr: integer);47 procedure Sprite(dst: TDpiBitmap; HGr: TGraphicSet; xDst, yDst, Width, Height, xGr, yGr: integer); 45 48 overload; 46 49 procedure MakeBlue(Dst: TDpiBitmap; X, Y, Width, Height: Integer); 47 50 procedure MakeRed(Dst: TDpiBitmap; X, Y, Width, Height: Integer); 48 51 procedure ImageOp_B(dst, Src: TDpiBitmap; xDst, yDst, xSrc, ySrc, Width, Height: Integer); 49 procedure ImageOp_BCC(dst, Src: TDpiBitmap; 50 xDst, yDst, xSrc, ySrc, Width, Height, Color1, Color2: Integer); 52 procedure ImageOp_BCC(Dst, Src: TDpiBitmap; 53 xDst, yDst, xSrc, ySrc, Width, Height, Color1, Color2: Integer); overload; 54 procedure ImageOp_BCC(Dst, Src: TDpiBitmap; 55 DstPos: TPoint; SrcRect: TRect; Color1, Color2: Integer); overload; 51 56 procedure ImageOp_CBC(Dst, Src: TDpiBitmap; xDst, yDst, xSrc, ySrc, Width, Height, 52 57 Color0, Color2: Integer); … … 88 93 procedure VLightGradient(ca: TDpiCanvas; x, y, Height, Color: integer); 89 94 procedure VDarkGradient(ca: TDpiCanvas; x, y, Height, Kind: integer); 95 procedure UnderlinedTitleValue(Canvas: TDpiCanvas; Title, Value: string; X, Y, Width: Integer); 90 96 procedure NumberBar(dst: TDpiBitmap; x, y: integer; Cap: string; val: integer; 91 97 const T: TTexture); … … 97 103 Kind, x, y, size, pos, Growth, max: integer; IndicateComplete: boolean; 98 104 const T: TTexture); 99 procedure PaintLogo( ca: TDpiCanvas; x, y, clLight, clShade: integer);105 procedure PaintLogo(Canvas: TDpiCanvas; X, Y, LightColor, ShadeColor: integer); 100 106 function SetMainTextureByAge(Age: integer): boolean; 101 107 procedure LoadPhrases; 102 108 procedure Texturize(Dest, Texture: TDpiBitmap; TransparentColor: Cardinal); 103 109 procedure DarkenImage(Bitmap: TDpiBitmap; Change: Integer); 110 procedure UnshareBitmap(Bitmap: TDpiBitmap); 104 111 105 112 const 106 nGrExtmax = 64; 113 TransparentColor1 = $FF00FF; 114 TransparentColor2 = $7F007F; 115 107 116 wMainTexture = 640; 108 117 hMainTexture = 480; 109 118 110 // template positions in Template.bmp 111 xLogo = 1; 112 yLogo = 1; 113 wLogo = 122; 114 hLogo = 23; // logo 115 xBBook = 1; 116 yBBook = 74; 117 wBBook = 143; 118 hBBook = 73; // big book 119 xSBook = 72; 120 ySBook = 37; 121 wSBook = 72; 122 hSBook = 36; // small book 119 // template positions in Templates.png 123 120 xNation = 1; 124 121 yNation = 25; … … 133 130 134 131 EmptySpaceColor = $101010; 135 136 // template positions in System2.bmp137 xOrna = 156;138 yOrna = 1;139 wOrna = 27;140 hOrna = 26; // ornament141 132 142 133 // color matrix … … 167 158 cliWater = 4; 168 159 169 type170 TGrExtDescr = record { don't use dynamic strings here! }171 Name: string[31];172 Data: TDpiBitmap;173 Mask: TDpiBitmap;174 pixUsed: array [Byte] of Byte;175 end;176 177 TGrExtDescrSize = record { for size calculation only - must be the same as178 TGrExtDescr, but without pixUsed }179 Name: string[31];180 Data: TDpiBitmap;181 Mask: TDpiBitmap;182 end;183 184 TFontType = (ftNormal, ftSmall, ftTiny, ftCaption, ftButton);185 186 160 var 187 161 Phrases: TStringTable; 188 162 Phrases2: TStringTable; 189 nGrExt: Integer; 190 GrExt: array [0 .. nGrExtmax - 1] of ^TGrExtDescr; 191 HGrSystem: Integer; 192 HGrSystem2: Integer; 163 GrExt: TGraphicSets; 164 HGrSystem: TGraphicSet; 165 HGrSystem2: TGraphicSet; 193 166 ClickFrameColor: Integer; 194 167 MainTextureAge: Integer; 195 168 MainTexture: TTexture; 196 Templates: T DpiBitmap;169 Templates: TGraphicSet; 197 170 Colors: TDpiBitmap; 198 171 Paper: TDpiBitmap; … … 203 176 InitOrnamentDone: Boolean; 204 177 Phrases2FallenBackToEnglish: Boolean; 178 179 // Graphic set items 180 CityMark1: TGraphicSetItem; 181 CityMark2: TGraphicSetItem; 182 Ornament: TGraphicSetItem; 183 Logo: TGraphicSetItem; 184 BigBook: TGraphicSetItem; 185 SmallBook: TGraphicSetItem; 186 MenuLogo: TGraphicSetItem; 187 LinkArrows: TGraphicSetItem; 188 ScienceNationDot: TGraphicSetItem; 189 ResearchIcon: TGraphicSetItem; 190 ChangeIcon: TGraphicSetItem; 191 TreasuryIcon: TGraphicSetItem; 192 StarshipDeparted: TGraphicSetItem; 193 WeightOn: TGraphicSetItem; 194 WeightOff: TGraphicSetItem; 205 195 206 196 UniFont: array [TFontType] of TDpiFont; … … 489 479 end; 490 480 491 function LoadGraphicSet(const Name: string): Integer; 492 var 493 I, x, y, xmax, OriginalColor: Integer; 481 function LoadGraphicSet(const Name: string): TGraphicSet; 482 var 483 x: Integer; 484 y: Integer; 485 OriginalColor: Integer; 494 486 FileName: string; 495 Source: TDpiBitmap; 496 DataPixel, MaskPixel: TPixelPointer; 497 begin 498 I := 0; 499 while (I < nGrExt) and (GrExt[i].Name <> Name) do 500 Inc(I); 501 Result := I; 502 if I = nGrExt then begin 503 Source := TDpiBitmap.Create; 504 Source.PixelFormat := pf24bit; 487 DataPixel: TPixelPointer; 488 MaskPixel: TPixelPointer; 489 begin 490 Result := GrExt.SearchByName(Name); 491 if not Assigned(Result) then begin 492 Result := GrExt.AddNew(Name); 505 493 FileName := GetGraphicsDir + DirectorySeparator + Name; 506 if not LoadGraphicFile(Source, FileName) then begin 507 Result := -1; 494 // Do not apply gamma during file load as it would affect also transparency colors 495 if not LoadGraphicFile(Result.Data, FileName, [gfNoGamma]) then begin 496 Result := nil; 508 497 Exit; 509 498 end; 510 499 511 GetMem(GrExt[nGrExt], SizeOf(TGrExtDescrSize) + Source.Height div 49 * 10); 512 GrExt[nGrExt].Name := Name; 513 514 xmax := Source.Width - 1; // allows 4-byte access even for last pixel 515 // Why there was that limit? 516 //if xmax > 970 then 517 // xmax := 970; 518 519 GrExt[nGrExt].Data := Source; 520 GrExt[nGrExt].Data.PixelFormat := pf24bit; 521 GrExt[nGrExt].Mask := TDpiBitmap.Create; 522 GrExt[nGrExt].Mask.PixelFormat := pf24bit; 523 GrExt[nGrExt].Mask.SetSize(Source.Width, Source.Height); 524 525 GrExt[nGrExt].Data.BeginUpdate; 526 GrExt[nGrExt].Mask.BeginUpdate; 527 DataPixel := PixelPointer(GrExt[nGrExt].Data); 528 MaskPixel := PixelPointer(GrExt[nGrExt].Mask); 529 for y := 0 to ScaleToNative(Source.Height) - 1 do begin 530 for x := 0 to ScaleToNative(xmax) - 1 do begin 500 FileName := ExtractFileNameWithoutExt(FileName) + GraphicSetFileExt; 501 if FileExists(FileName) then 502 Result.LoadFromFile(FileName); 503 504 Result.ResetPixUsed; 505 506 Result.Mask.SetSize(Result.Data.Width, Result.Data.Height); 507 508 Result.Data.BeginUpdate; 509 Result.Mask.BeginUpdate; 510 DataPixel := PixelPointer(Result.Data); 511 MaskPixel := PixelPointer(Result.Mask); 512 for y := 0 to ScaleToNative(Result.Data.Height) - 1 do begin 513 for x := 0 to ScaleToNative(Result.Data.Width) - 1 do begin 531 514 OriginalColor := DataPixel.Pixel^.ARGB and $FFFFFF; 532 if (OriginalColor = $FF00FF) or (OriginalColor = $7F007F) then 533 begin // transparent 534 MaskPixel.Pixel^.ARGB := $FFFFFF; 535 DataPixel.Pixel^.ARGB := DataPixel.Pixel^.ARGB and $FF000000; 536 end 537 else begin 538 MaskPixel.Pixel^.ARGB := $000000; // non-transparent 539 if Gamma <> 100 then 540 DataPixel.Pixel^ := ApplyGammaToPixel(DataPixel.Pixel^); 515 if (OriginalColor = TransparentColor1) or (OriginalColor = TransparentColor2) then begin 516 MaskPixel.Pixel^.R := $FF; 517 MaskPixel.Pixel^.G := $FF; 518 MaskPixel.Pixel^.B := $FF; 519 DataPixel.Pixel^.R := 0; 520 DataPixel.Pixel^.G := 0; 521 DataPixel.Pixel^.B := 0; 522 end else begin 523 MaskPixel.Pixel^.R := $00; 524 MaskPixel.Pixel^.G := $00; 525 MaskPixel.Pixel^.B := $00; 541 526 end; 542 527 DataPixel.NextPixel; … … 546 531 MaskPixel.NextLine; 547 532 end; 548 GrExt[nGrExt].Data.EndUpdate; 549 GrExt[nGrExt].Mask.EndUpdate; 550 551 FillChar(GrExt[nGrExt].pixUsed, GrExt[nGrExt].Data.Height div 49 * 10, 0); 552 Inc(nGrExt); 553 end; 554 end; 555 556 procedure Dump(dst: TDpiBitmap; HGr, xDst, yDst, Width, Height, xGr, yGr: integer); 533 Result.Data.EndUpdate; 534 Result.Mask.EndUpdate; 535 536 if Gamma <> 100 then 537 ApplyGammaToBitmap(Result.Data); 538 end; 539 end; 540 541 function LoadGraphicSet2(const Name: string): TGraphicSet; 542 var 543 FileName: string; 544 begin 545 Result := GrExt.SearchByName(Name); 546 if not Assigned(Result) then begin 547 Result := GrExt.AddNew(Name); 548 FileName := GetGraphicsDir + DirectorySeparator + Name; 549 if not LoadGraphicFile(Result.Data, FileName, [gfNoGamma]) then begin 550 Result := nil; 551 Exit; 552 end; 553 554 FileName := ExtractFileNameWithoutExt(FileName) + GraphicSetFileExt; 555 if FileExists(FileName) then 556 Result.LoadFromFile(FileName); 557 558 Result.ResetPixUsed; 559 end; 560 end; 561 562 procedure Dump(dst: TDpiBitmap; HGr: TGraphicSet; xDst, yDst, Width, Height, xGr, yGr: integer); 557 563 begin 558 564 DpiBitCanvas(dst.Canvas, xDst, yDst, Width, Height, 559 GrExt[HGr].Data.Canvas, xGr, yGr); 565 HGr.Data.Canvas, xGr, yGr); 566 end; 567 568 procedure BitmapReplaceColor(Dst: TDpiBitmap; X, Y, Width, Height: Integer; OldColor, NewColor: TColor); 569 var 570 XX, YY: Integer; 571 PixelPtr: TPixelPointer; 572 begin 573 Dst.BeginUpdate; 574 PixelPtr := PixelPointer(Dst, ScaleToNative(X), ScaleToNative(Y)); 575 for YY := 0 to ScaleToNative(Height) - 1 do begin 576 for XX := 0 to ScaleToNative(Width) - 1 do begin 577 if PixelPtr.Pixel^.RGB = SwapRedBlue(OldColor) then begin 578 PixelPtr.Pixel^.RGB := SwapRedBlue(NewColor); 579 end; 580 PixelPtr.NextPixel; 581 end; 582 PixelPtr.NextLine; 583 end; 584 Dst.EndUpdate; 560 585 end; 561 586 … … 734 759 end; 735 760 761 procedure ImageOp_BCC(Dst, Src: TDpiBitmap; DstPos: TPoint; SrcRect: TRect; 762 Color1, Color2: Integer); 763 begin 764 ImageOp_BCC(Dst, Src, DstPos.X, DstPos.Y, SrcRect.Left, SrcRect.Top, 765 SrcRect.Width, SrcRect.Height, Color1, Color2); 766 end; 767 736 768 procedure ImageOp_CBC(Dst, Src: TDpiBitmap; xDst, yDst, xSrc, ySrc, Width, Height, 737 769 Color0, Color2: Integer); … … 820 852 end; 821 853 822 procedure Sprite(Canvas: TDpiCanvas; HGr ,xDst, yDst, Width, Height, xGr, yGr: integer);854 procedure Sprite(Canvas: TDpiCanvas; HGr: TGraphicSet; xDst, yDst, Width, Height, xGr, yGr: integer); 823 855 begin 824 856 DpiBitCanvas(Canvas, xDst, yDst, Width, Height, 825 GrExt[HGr].Mask.Canvas, xGr, yGr, SRCAND);857 HGr.Mask.Canvas, xGr, yGr, SRCAND); 826 858 DpiBitCanvas(Canvas, xDst, yDst, Width, Height, 827 GrExt[HGr].Data.Canvas, xGr, yGr, SRCPAINT);828 end; 829 830 procedure Sprite(dst: TDpiBitmap; HGr ,xDst, yDst, Width, Height, xGr, yGr: integer);859 HGr.Data.Canvas, xGr, yGr, SRCPAINT); 860 end; 861 862 procedure Sprite(dst: TDpiBitmap; HGr: TGraphicSet; xDst, yDst, Width, Height, xGr, yGr: integer); 831 863 begin 832 864 DpiBitCanvas(dst.Canvas, xDst, yDst, Width, Height, 833 GrExt[HGr].Mask.Canvas, xGr, yGr, SRCAND);865 HGr.Mask.Canvas, xGr, yGr, SRCAND); 834 866 DpiBitCanvas(dst.Canvas, xDst, yDst, Width, Height, 835 GrExt[HGr].Data.Canvas, xGr, yGr, SRCPAINT);867 HGr.Data.Canvas, xGr, yGr, SRCPAINT); 836 868 end; 837 869 … … 1011 1043 Shade := ColorToColor32(MainTexture.clBevelShade and $FCFCFC shr 2 * 3 + 1012 1044 MainTexture.clBevelLight and $FCFCFC shr 2); 1013 GrExt[HGrSystem2].Data.BeginUpdate;1014 PixelPtr := PixelPointer( GrExt[HGrSystem2].Data, ScaleToNative(xOrna), ScaleToNative(yOrna));1045 HGrSystem2.Data.BeginUpdate; 1046 PixelPtr := PixelPointer(HGrSystem2.Data, ScaleToNative(Ornament.Left), ScaleToNative(Ornament.Top)); 1015 1047 if PixelPtr.BytesPerPixel = 3 then begin 1016 for Y := 0 to ScaleToNative( hOrna) - 1 do begin1017 for X := 0 to ScaleToNative( wOrna) - 1 do begin1018 P := Color32ToColor(PixelPtr.Pixel^. GetRGB);1019 if P = $0000FF then PixelPtr.Pixel^. SetRGB(Light)1020 else if P = $FF0000 then PixelPtr.Pixel^. SetRGB(Shade);1048 for Y := 0 to ScaleToNative(Ornament.Height) - 1 do begin 1049 for X := 0 to ScaleToNative(Ornament.Width) - 1 do begin 1050 P := Color32ToColor(PixelPtr.Pixel^.RGB); 1051 if P = $0000FF then PixelPtr.Pixel^.RGB := Light 1052 else if P = $FF0000 then PixelPtr.Pixel^.RGB := Shade; 1021 1053 PixelPtr.NextPixel; 1022 1054 end; … … 1024 1056 end; 1025 1057 end else begin 1026 for Y := 0 to ScaleToNative( hOrna) - 1 do begin1027 for X := 0 to ScaleToNative( wOrna) - 1 do begin1058 for Y := 0 to ScaleToNative(Ornament.Height) - 1 do begin 1059 for X := 0 to ScaleToNative(Ornament.Width) - 1 do begin 1028 1060 P := Color32ToColor(PixelPtr.Pixel^.ARGB); 1029 1061 if P = $0000FF then PixelPtr.Pixel^.ARGB := Light … … 1035 1067 end; 1036 1068 InitOrnamentDone := True; 1037 GrExt[HGrSystem2].Data.EndUpdate;1069 HGrSystem2.Data.EndUpdate; 1038 1070 end; 1039 1071 1040 1072 procedure InitCityMark(const T: TTexture); 1041 1073 var 1042 x, y, intensity: Integer; 1043 begin 1044 for x := 0 to 9 do 1045 for y := 0 to 9 do 1046 if GrExt[HGrSystem].Mask.Canvas.Pixels[66 + x, 47 + y] = 0 then 1074 x: Integer; 1075 y: Integer; 1076 Intensity: Integer; 1077 begin 1078 for x := 0 to CityMark1.Width - 1 do begin 1079 for y := 0 to CityMark1.Height - 1 do begin 1080 if HGrSystem.Mask.Canvas.Pixels[CityMark1.Left + x, CityMark1.Top + y] = 0 then 1047 1081 begin 1048 intensity := GrExt[HGrSystem].Data.Canvas.Pixels[66+1049 x, 47+ y] and $FF;1050 GrExt[HGrSystem].Data.Canvas.Pixels[77 + x, 47+ y] :=1051 T.clMark and $FF * intensity div $FF + T.clMark shr 8 and1052 $FF * intensity div $FF shl 8 + T.clMark shr 16 and1053 $FF * intensity div $FF shl 16;1082 Intensity := HGrSystem.Data.Canvas.Pixels[CityMark1.Left + 1083 x, CityMark1.Top + y] and $FF; 1084 HGrSystem.Data.Canvas.Pixels[CityMark2.Left + x, CityMark2.Top + y] := 1085 T.clMark and $FF * Intensity div $FF + T.clMark shr 8 and 1086 $FF * Intensity div $FF shl 8 + T.clMark shr 16 and 1087 $FF * Intensity div $FF shl 16; 1054 1088 end; 1055 DpiBitCanvas(GrExt[HGrSystem].Mask.Canvas, 77, 47, 10, 10, 1056 GrExt[HGrSystem].Mask.Canvas, 66, 47); 1089 end; 1090 end; 1091 DpiBitCanvas(HGrSystem.Mask.Canvas, CityMark2.Left, CityMark2.Top, CityMark1.Width, CityMark1.Width, 1092 HGrSystem.Mask.Canvas, CityMark1.Left, CityMark1.Top); 1057 1093 end; 1058 1094 … … 1153 1189 procedure Corner(ca: TDpiCanvas; x, y, Kind: Integer; const T: TTexture); 1154 1190 begin 1155 { DpiBitCanvas(ca,x,y,8,8, GrExt[T.HGr].Mask.Canvas,1191 { DpiBitCanvas(ca,x,y,8,8,T.HGr.Mask.Canvas, 1156 1192 T.xGr+29+Kind*9,T.yGr+89,SRCAND); 1157 DpiBitCanvas(ca,x,y,8,8, GrExt[T.HGr].Data.Canvas,1193 DpiBitCanvas(ca,x,y,8,8,T.HGr.Data.Canvas, 1158 1194 T.xGr+29+Kind*9,T.yGr+89,SRCPAINT); } 1159 1195 end; … … 1163 1199 procedure PaintIcon(x, y, Kind: Integer); 1164 1200 begin 1165 DpiBitCanvas(ca, x, y + 6, 10, 10, GrExt[HGrSystem].Mask.Canvas,1201 DpiBitCanvas(ca, x, y + 6, 10, 10, HGrSystem.Mask.Canvas, 1166 1202 66 + Kind mod 11 * 11, 115 + Kind div 11 * 11, SRCAND); 1167 DpiBitCanvas(ca, x, y + 6, 10, 10, GrExt[HGrSystem].Data.Canvas,1203 DpiBitCanvas(ca, x, y + 6, 10, 10, HGrSystem.Data.Canvas, 1168 1204 66 + Kind mod 11 * 11, 115 + Kind div 11 * 11, SRCPAINT); 1169 1205 end; … … 1173 1209 sp: string; 1174 1210 shadow: Boolean; 1211 Text: string; 1175 1212 begin 1176 1213 Inc(x); … … 1196 1233 else 1197 1234 begin 1198 Textout(xp, y, copy(sp, 1, p - 1)); 1199 Inc(xp, ca.TextWidth(copy(sp, 1, p - 1))); 1235 Text := Copy(sp, 1, p - 1); 1236 Textout(xp, y, Text); 1237 Inc(xp, ca.TextWidth(Text)); 1200 1238 if not shadow then 1201 1239 case sp[p + 1] of … … 1305 1343 (16, 12, 8, 4, 0, -4, -8, -12 - 24, -16 + 16, -20, -24, -28, -32, -36, -40, -44); 1306 1344 begin 1307 Gradient(ca, x, y, 0, 1, Width, 0, GrExt[HGrSystem].Data.Canvas.Pixels1345 Gradient(ca, x, y, 0, 1, Width, 0, HGrSystem.Data.Canvas.Pixels 1308 1346 [187, 137 + Kind], Brightness); 1309 1347 end; … … 1323 1361 begin 1324 1362 Gradient(ca, x, y, 1, 0, 0, Height, 1325 GrExt[HGrSystem].Data.Canvas.Pixels[187, 137 + Kind], Brightness); 1363 HGrSystem.Data.Canvas.Pixels[187, 137 + Kind], Brightness); 1364 end; 1365 1366 procedure UnderlinedTitleValue(Canvas: TDpiCanvas; Title, Value: string; X, Y, Width: Integer); 1367 begin 1368 DLine(Canvas, X, X + Width, Y + 19, MainTexture.clBevelLight, MainTexture.clBevelShade); 1369 RisedTextOut(Canvas, X, Y, Title); 1370 RisedTextOut(Canvas, X + Width - BiColorTextWidth(Canvas, Value), Y, Value); 1326 1371 end; 1327 1372 … … 1385 1430 begin 1386 1431 DpiBitCanvas(dst.Canvas, xIcon + 4 + i * (14 * ld div sd), yIcon + 2 + 1, 14, 1387 14, GrExt[HGrSystem].Mask.Canvas, 67 + Kind mod 8 * 15,1432 14, HGrSystem.Mask.Canvas, 67 + Kind mod 8 * 15, 1388 1433 70 + Kind div 8 * 15, SRCAND); 1389 1434 Sprite(dst, HGrSystem, xIcon + 3 + i * (14 * ld div sd), yIcon + 2, … … 1394 1439 DpiBitCanvas(dst.Canvas, xIcon + 4 + (val mod 10) * 1395 1440 (14 * ld div sd) + i * (14 * ld div sd), yIcon + 3, 14, 14, 1396 GrExt[HGrSystem].Mask.Canvas, 67 + 7 mod 8 * 15,1441 HGrSystem.Mask.Canvas, 67 + 7 mod 8 * 15, 1397 1442 70 + 7 div 8 * 15, SRCAND); 1398 1443 Sprite(dst, HGrSystem, xIcon + 3 + (val mod 10) * … … 1418 1463 begin 1419 1464 DpiBitCanvas(dst.Canvas, xIcon + 4 + i * (14 * ld div sd), yIcon + 3, 14, 14, 1420 GrExt[HGrSystem].Mask.Canvas, 67 + Kind mod 8 * 15,1465 HGrSystem.Mask.Canvas, 67 + Kind mod 8 * 15, 1421 1466 70 + Kind div 8 * 15, SRCAND); 1422 1467 Sprite(dst, HGrSystem, xIcon + 3 + i * (14 * ld div sd), yIcon + 2, … … 1427 1472 DpiBitCanvas(dst.Canvas, xIcon + 4 + (val div 10) * 1428 1473 (14 * ld div sd) + i * (10 * ld div sd), yIcon + 7, 10, 10, 1429 GrExt[HGrSystem].Mask.Canvas, 66 + Kind mod 11 * 11,1474 HGrSystem.Mask.Canvas, 66 + Kind mod 11 * 11, 1430 1475 115 + Kind div 11 * 11, SRCAND); 1431 1476 Sprite(dst, HGrSystem, xIcon + 3 + (val div 10) * … … 1463 1508 for i := 0 to pos div 8 - 1 do 1464 1509 DpiBitCanvas(ca, x + i * 8, y, 8, 7, 1465 GrExt[HGrSystem].Data.Canvas, 104, 9 + 8 * Kind);1510 HGrSystem.Data.Canvas, 104, 9 + 8 * Kind); 1466 1511 DpiBitCanvas(ca, x + 8 * (pos div 8), y, pos - 8 * (pos div 8), 7, 1467 GrExt[HGrSystem].Data.Canvas, 104, 9 + 8 * Kind);1512 HGrSystem.Data.Canvas, 104, 9 + 8 * Kind); 1468 1513 if Growth > 0 then 1469 1514 begin 1470 1515 for i := 0 to Growth div 8 - 1 do 1471 1516 DpiBitCanvas(ca, x + pos + i * 8, y, 8, 7, 1472 GrExt[HGrSystem].Data.Canvas, 112, 9 + 8 * Kind);1517 HGrSystem.Data.Canvas, 112, 9 + 8 * Kind); 1473 1518 DpiBitCanvas(ca, x + pos + 8 * (Growth div 8), y, 1474 Growth - 8 * (Growth div 8), 7, GrExt[HGrSystem].Data.Canvas,1519 Growth - 8 * (Growth div 8), 7, HGrSystem.Data.Canvas, 1475 1520 112, 9 + 8 * Kind); 1476 1521 end … … 1479 1524 for i := 0 to -Growth div 8 - 1 do 1480 1525 DpiBitCanvas(ca, x + pos + i * 8, y, 8, 7, 1481 GrExt[HGrSystem].Data.Canvas, 104, 1);1526 HGrSystem.Data.Canvas, 104, 1); 1482 1527 DpiBitCanvas(ca, x + pos + 8 * (-Growth div 8), y, -Growth - 1483 1528 8 * (-Growth div 8), 7, 1484 GrExt[HGrSystem].Data.Canvas, 104, 1);1529 HGrSystem.Data.Canvas, 104, 1); 1485 1530 end; 1486 1531 Brush.Color := $000000; … … 1505 1550 end; 1506 1551 1507 procedure PaintLogo(ca: TDpiCanvas; x, y, clLight, clShade: Integer); 1508 begin 1509 // TODO: Explicitly clear background to black but in fact BitBlt SRCCOPY should do it 1510 LogoBuffer.Canvas.FillRect(0, 0, LogoBuffer.Width, LogoBuffer.Height); 1511 DpiBitCanvas(LogoBuffer.Canvas, 0, 0, wLogo, hLogo, ca, x, y); 1512 ImageOp_BCC(LogoBuffer, Templates, 0, 0, 1, 1, wLogo, hLogo, 1513 clLight, clShade); 1514 DpiBitCanvas(ca, x, y, wLogo, hLogo, LogoBuffer.Canvas, 0, 0); 1552 procedure PaintLogo(Canvas: TDpiCanvas; X, Y, LightColor, ShadeColor: Integer); 1553 begin 1554 UnshareBitmap(LogoBuffer); 1555 DpiBitCanvas(LogoBuffer.Canvas, 0, 0, Logo.Width, Logo.Height, Canvas, X, Y); 1556 ImageOp_BCC(LogoBuffer, Templates.Data, Point(0, 0), Logo.BoundsRect, 1557 LightColor, ShadeColor); 1558 DpiBitCanvas(Canvas, X, Y, Logo.Width, Logo.Height, LogoBuffer.Canvas, 0, 0); 1515 1559 end; 1516 1560 … … 1611 1655 end; 1612 1656 1613 function ScaleToNative(Value: Integer): Integer; 1614 begin 1615 Result := Value; 1616 end; 1617 1618 function ScaleFromNative(Value: Integer): Integer; 1619 begin 1620 Result := Value; 1657 procedure UnshareBitmap(Bitmap: TDpiBitmap); 1658 begin 1659 // FillRect cause image data to be freed so subsequent BitBlt can access valid image data 1660 Bitmap.Canvas.FillRect(0, 0, 0, 0); 1621 1661 end; 1622 1662 … … 1695 1735 LoadPhrases; 1696 1736 LoadFonts; 1697 LoadGraphicFile(Templates, GetGraphicsDir + DirectorySeparator + 1698 'Templates.png', [gfNoGamma]); 1737 Templates := LoadGraphicSet2('Templates.png'); 1738 with Templates do begin 1739 Logo := GetItem('Logo'); 1740 BigBook := GetItem('BigBook'); 1741 SmallBook := GetItem('SmallBook'); 1742 MenuLogo := GetItem('MenuLogo'); 1743 LinkArrows := GetItem('LinkArrows'); 1744 ScienceNationDot := GetItem('ScienceNationDot'); 1745 ResearchIcon := GetItem('Research'); 1746 ChangeIcon := GetItem('Change'); 1747 TreasuryIcon := GetItem('Treasury'); 1748 StarshipDeparted := GetItem('StarshipDeparted'); 1749 WeightOn := GetItem('WeightOn'); 1750 WeightOff := GetItem('WeightOff'); 1751 end; 1752 1699 1753 LoadGraphicFile(Colors, GetGraphicsDir + DirectorySeparator + 'Colors.png'); 1700 1754 LoadGraphicFile(Paper, GetGraphicsDir + DirectorySeparator + 'Paper.jpg'); … … 1714 1768 {$ENDIF} 1715 1769 1716 LogoBuffer := TDpiBitmap.Create;1717 LogoBuffer.PixelFormat := pf24bit;1718 LogoBuffer.SetSize(wBBook, hBBook);1719 1720 1770 for Section := Low(TFontType) to High(TFontType) do 1721 1771 UniFont[Section] := TDpiFont.Create; 1722 1772 1723 nGrExt := 0; 1773 GrExt := TGraphicSets.Create; 1774 1724 1775 HGrSystem := LoadGraphicSet('System.png'); 1776 CityMark1 := HGrSystem.GetItem('CityMark1'); 1777 CityMark2 := HGrSystem.GetItem('CityMark2'); 1778 1725 1779 HGrSystem2 := LoadGraphicSet('System2.png'); 1726 Templates := TDpiBitmap.Create;1727 Templates.PixelFormat := pf24bit; 1780 Ornament := HGrSystem2.GetItem('Ornament'); 1781 1728 1782 Colors := TDpiBitmap.Create; 1729 1783 Colors.PixelFormat := pf24bit; … … 1734 1788 MainTexture.Image := TDpiBitmap.Create; 1735 1789 MainTextureAge := -2; 1736 ClickFrameColor := GrExt[HGrSystem].Data.Canvas.Pixels[187, 175];1790 ClickFrameColor := HGrSystem.Data.Canvas.Pixels[187, 175]; 1737 1791 InitOrnamentDone := False; 1738 1792 GenerateNames := True; 1739 1793 1740 1794 LoadAssets; 1795 1796 LogoBuffer := TDpiBitmap.Create; 1797 LogoBuffer.PixelFormat := pf24bit; 1798 LogoBuffer.SetSize(BigBook.Width, BigBook.Height); 1741 1799 end; 1742 1800 1743 1801 procedure UnitDone; 1744 var1745 I: integer;1746 1802 begin 1747 1803 RestoreResolution; 1748 for I := 0 to nGrExt - 1 do begin 1749 FreeAndNil(GrExt[I].Data); 1750 FreeAndNil(GrExt[I].Mask); 1751 FreeMem(GrExt[I]); 1752 end; 1753 1804 FreeAndNil(GrExt); 1754 1805 ReleaseFonts; 1755 1756 1806 FreeAndNil(Phrases); 1757 1807 FreeAndNil(Phrases2); … … 1759 1809 FreeAndNil(BigImp); 1760 1810 FreeAndNil(Paper); 1761 FreeAndNil(Templates);1762 1811 FreeAndNil(Colors); 1763 1812 FreeAndNil(MainTexture.Image);
Note:
See TracChangeset
for help on using the changeset viewer.