Ignore:
Timestamp:
Apr 6, 2021, 8:11:02 PM (3 years ago)
Author:
chronos
Message:
  • Modified: Merged trunk branch version r348 into highdpi branch.
File:
1 edited

Legend:

Unmodified
Added
Removed
  • branches/highdpi/Packages/CevoComponents/ScreenTools.pas

    r303 r349  
    88  {$ENDIF}
    99  StringTables, LCLIntf, LCLType, SysUtils, Classes, Graphics, Controls, Math,
    10   Forms, Menus, GraphType;
     10  Forms, Menus, GraphType, fgl, UGraphicSet, LazFileUtils;
    1111
    1212type
     
    2525  TLoadGraphicFileOptions = set of TLoadGraphicFileOption;
    2626
     27  TFontType = (ftNormal, ftSmall, ftTiny, ftCaption, ftButton);
    2728
    2829{$IFDEF WINDOWS}
     
    3839function HexStringToColor(S: string): integer;
    3940function 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);
     41function LoadGraphicSet(const Name: string): TGraphicSet;
     42function LoadGraphicSet2(const Name: string): TGraphicSet;
     43procedure Dump(dst: TDpiBitmap; HGr: TGraphicSet; xDst, yDst, Width, Height, xGr, yGr: integer);
     44procedure BitmapReplaceColor(Dst: TDpiBitmap; X, Y, Width, Height: Integer; OldColor, NewColor: TColor);
     45procedure Sprite(Canvas: TDpiCanvas; HGr: TGraphicSet; xDst, yDst, Width, Height, xGr, yGr: integer);
    4346  overload;
    44 procedure Sprite(dst: TDpiBitmap; HGr, xDst, yDst, Width, Height, xGr, yGr: integer);
     47procedure Sprite(dst: TDpiBitmap; HGr: TGraphicSet; xDst, yDst, Width, Height, xGr, yGr: integer);
    4548  overload;
    4649procedure MakeBlue(Dst: TDpiBitmap; X, Y, Width, Height: Integer);
    4750procedure MakeRed(Dst: TDpiBitmap; X, Y, Width, Height: Integer);
    4851procedure 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);
     52procedure ImageOp_BCC(Dst, Src: TDpiBitmap;
     53  xDst, yDst, xSrc, ySrc, Width, Height, Color1, Color2: Integer); overload;
     54procedure ImageOp_BCC(Dst, Src: TDpiBitmap;
     55  DstPos: TPoint; SrcRect: TRect; Color1, Color2: Integer); overload;
    5156procedure ImageOp_CBC(Dst, Src: TDpiBitmap; xDst, yDst, xSrc, ySrc, Width, Height,
    5257  Color0, Color2: Integer);
     
    8893procedure VLightGradient(ca: TDpiCanvas; x, y, Height, Color: integer);
    8994procedure VDarkGradient(ca: TDpiCanvas; x, y, Height, Kind: integer);
     95procedure UnderlinedTitleValue(Canvas: TDpiCanvas; Title, Value: string; X, Y, Width: Integer);
    9096procedure NumberBar(dst: TDpiBitmap; x, y: integer; Cap: string; val: integer;
    9197  const T: TTexture);
     
    97103  Kind, x, y, size, pos, Growth, max: integer; IndicateComplete: boolean;
    98104  const T: TTexture);
    99 procedure PaintLogo(ca: TDpiCanvas; x, y, clLight, clShade: integer);
     105procedure PaintLogo(Canvas: TDpiCanvas; X, Y, LightColor, ShadeColor: integer);
    100106function SetMainTextureByAge(Age: integer): boolean;
    101107procedure LoadPhrases;
    102108procedure Texturize(Dest, Texture: TDpiBitmap; TransparentColor: Cardinal);
    103109procedure DarkenImage(Bitmap: TDpiBitmap; Change: Integer);
     110procedure UnshareBitmap(Bitmap: TDpiBitmap);
    104111
    105112const
    106   nGrExtmax = 64;
     113  TransparentColor1 = $FF00FF;
     114  TransparentColor2 = $7F007F;
     115
    107116  wMainTexture = 640;
    108117  hMainTexture = 480;
    109118
    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
    123120  xNation = 1;
    124121  yNation = 25;
     
    133130
    134131  EmptySpaceColor = $101010;
    135 
    136   // template positions in System2.bmp
    137   xOrna = 156;
    138   yOrna = 1;
    139   wOrna = 27;
    140   hOrna = 26; // ornament
    141132
    142133  // color matrix
     
    167158  cliWater = 4;
    168159
    169 type
    170   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 as
    178       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 
    186160var
    187161  Phrases: TStringTable;
    188162  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;
    193166  ClickFrameColor: Integer;
    194167  MainTextureAge: Integer;
    195168  MainTexture: TTexture;
    196   Templates: TDpiBitmap;
     169  Templates: TGraphicSet;
    197170  Colors: TDpiBitmap;
    198171  Paper: TDpiBitmap;
     
    203176  InitOrnamentDone: Boolean;
    204177  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;
    205195
    206196  UniFont: array [TFontType] of TDpiFont;
     
    489479end;
    490480
    491 function LoadGraphicSet(const Name: string): Integer;
    492 var
    493   I, x, y, xmax, OriginalColor: Integer;
     481function LoadGraphicSet(const Name: string): TGraphicSet;
     482var
     483  x: Integer;
     484  y: Integer;
     485  OriginalColor: Integer;
    494486  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;
     489begin
     490  Result := GrExt.SearchByName(Name);
     491  if not Assigned(Result) then begin
     492    Result := GrExt.AddNew(Name);
    505493    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;
    508497      Exit;
    509498    end;
    510499
    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
    531514        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;
    541526        end;
    542527        DataPixel.NextPixel;
     
    546531      MaskPixel.NextLine;
    547532    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;
     539end;
     540
     541function LoadGraphicSet2(const Name: string): TGraphicSet;
     542var
     543  FileName: string;
     544begin
     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;
     560end;
     561
     562procedure Dump(dst: TDpiBitmap; HGr: TGraphicSet; xDst, yDst, Width, Height, xGr, yGr: integer);
    557563begin
    558564  DpiBitCanvas(dst.Canvas, xDst, yDst, Width, Height,
    559     GrExt[HGr].Data.Canvas, xGr, yGr);
     565    HGr.Data.Canvas, xGr, yGr);
     566end;
     567
     568procedure BitmapReplaceColor(Dst: TDpiBitmap; X, Y, Width, Height: Integer; OldColor, NewColor: TColor);
     569var
     570  XX, YY: Integer;
     571  PixelPtr: TPixelPointer;
     572begin
     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;
    560585end;
    561586
     
    734759end;
    735760
     761procedure ImageOp_BCC(Dst, Src: TDpiBitmap; DstPos: TPoint; SrcRect: TRect;
     762  Color1, Color2: Integer);
     763begin
     764  ImageOp_BCC(Dst, Src, DstPos.X, DstPos.Y, SrcRect.Left, SrcRect.Top,
     765    SrcRect.Width, SrcRect.Height, Color1, Color2);
     766end;
     767
    736768procedure ImageOp_CBC(Dst, Src: TDpiBitmap; xDst, yDst, xSrc, ySrc, Width, Height,
    737769  Color0, Color2: Integer);
     
    820852end;
    821853
    822 procedure Sprite(Canvas: TDpiCanvas; HGr, xDst, yDst, Width, Height, xGr, yGr: integer);
     854procedure Sprite(Canvas: TDpiCanvas; HGr: TGraphicSet; xDst, yDst, Width, Height, xGr, yGr: integer);
    823855begin
    824856  DpiBitCanvas(Canvas, xDst, yDst, Width, Height,
    825     GrExt[HGr].Mask.Canvas, xGr, yGr, SRCAND);
     857    HGr.Mask.Canvas, xGr, yGr, SRCAND);
    826858  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);
     860end;
     861
     862procedure Sprite(dst: TDpiBitmap; HGr: TGraphicSet; xDst, yDst, Width, Height, xGr, yGr: integer);
    831863begin
    832864  DpiBitCanvas(dst.Canvas, xDst, yDst, Width, Height,
    833     GrExt[HGr].Mask.Canvas, xGr, yGr, SRCAND);
     865    HGr.Mask.Canvas, xGr, yGr, SRCAND);
    834866  DpiBitCanvas(dst.Canvas, xDst, yDst, Width, Height,
    835     GrExt[HGr].Data.Canvas, xGr, yGr, SRCPAINT);
     867    HGr.Data.Canvas, xGr, yGr, SRCPAINT);
    836868end;
    837869
     
    10111043  Shade := ColorToColor32(MainTexture.clBevelShade and $FCFCFC shr 2 * 3 +
    10121044    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));
    10151047  if PixelPtr.BytesPerPixel = 3 then begin
    1016     for Y := 0 to ScaleToNative(hOrna) - 1 do begin
    1017       for X := 0 to ScaleToNative(wOrna) - 1 do begin
    1018         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;
    10211053        PixelPtr.NextPixel;
    10221054      end;
     
    10241056    end;
    10251057  end else begin
    1026     for Y := 0 to ScaleToNative(hOrna) - 1 do begin
    1027       for X := 0 to ScaleToNative(wOrna) - 1 do begin
     1058    for Y := 0 to ScaleToNative(Ornament.Height) - 1 do begin
     1059      for X := 0 to ScaleToNative(Ornament.Width) - 1 do begin
    10281060        P := Color32ToColor(PixelPtr.Pixel^.ARGB);
    10291061        if P = $0000FF then PixelPtr.Pixel^.ARGB := Light
     
    10351067  end;
    10361068  InitOrnamentDone := True;
    1037   GrExt[HGrSystem2].Data.EndUpdate;
     1069  HGrSystem2.Data.EndUpdate;
    10381070end;
    10391071
    10401072procedure InitCityMark(const T: TTexture);
    10411073var
    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;
     1077begin
     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
    10471081      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 and
    1052           $FF * intensity div $FF shl 8 + T.clMark shr 16 and
    1053           $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;
    10541088      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);
    10571093end;
    10581094
     
    11531189procedure Corner(ca: TDpiCanvas; x, y, Kind: Integer; const T: TTexture);
    11541190begin
    1155   { DpiBitCanvas(ca,x,y,8,8,GrExt[T.HGr].Mask.Canvas,
     1191  { DpiBitCanvas(ca,x,y,8,8,T.HGr.Mask.Canvas,
    11561192    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,
    11581194    T.xGr+29+Kind*9,T.yGr+89,SRCPAINT); }
    11591195end;
     
    11631199  procedure PaintIcon(x, y, Kind: Integer);
    11641200  begin
    1165     DpiBitCanvas(ca, x, y + 6, 10, 10, GrExt[HGrSystem].Mask.Canvas,
     1201    DpiBitCanvas(ca, x, y + 6, 10, 10, HGrSystem.Mask.Canvas,
    11661202      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,
    11681204      66 + Kind mod 11 * 11, 115 + Kind div 11 * 11, SRCPAINT);
    11691205  end;
     
    11731209  sp: string;
    11741210  shadow: Boolean;
     1211  Text: string;
    11751212begin
    11761213  Inc(x);
     
    11961233          else
    11971234          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));
    12001238            if not shadow then
    12011239              case sp[p + 1] of
     
    13051343    (16, 12, 8, 4, 0, -4, -8, -12 - 24, -16 + 16, -20, -24, -28, -32, -36, -40, -44);
    13061344begin
    1307   Gradient(ca, x, y, 0, 1, Width, 0, GrExt[HGrSystem].Data.Canvas.Pixels
     1345  Gradient(ca, x, y, 0, 1, Width, 0, HGrSystem.Data.Canvas.Pixels
    13081346    [187, 137 + Kind], Brightness);
    13091347end;
     
    13231361begin
    13241362  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);
     1364end;
     1365
     1366procedure UnderlinedTitleValue(Canvas: TDpiCanvas; Title, Value: string; X, Y, Width: Integer);
     1367begin
     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);
    13261371end;
    13271372
     
    13851430      begin
    13861431        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,
    13881433          70 + Kind div 8 * 15, SRCAND);
    13891434        Sprite(dst, HGrSystem, xIcon + 3 + i * (14 * ld div sd), yIcon + 2,
     
    13941439        DpiBitCanvas(dst.Canvas, xIcon + 4 + (val mod 10) *
    13951440          (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,
    13971442          70 + 7 div 8 * 15, SRCAND);
    13981443        Sprite(dst, HGrSystem, xIcon + 3 + (val mod 10) *
     
    14181463      begin
    14191464        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,
    14211466          70 + Kind div 8 * 15, SRCAND);
    14221467        Sprite(dst, HGrSystem, xIcon + 3 + i * (14 * ld div sd), yIcon + 2,
     
    14271472        DpiBitCanvas(dst.Canvas, xIcon + 4 + (val div 10) *
    14281473          (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,
    14301475          115 + Kind div 11 * 11, SRCAND);
    14311476        Sprite(dst, HGrSystem, xIcon + 3 + (val div 10) *
     
    14631508    for i := 0 to pos div 8 - 1 do
    14641509      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);
    14661511    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);
    14681513    if Growth > 0 then
    14691514    begin
    14701515      for i := 0 to Growth div 8 - 1 do
    14711516        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);
    14731518      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,
    14751520        112, 9 + 8 * Kind);
    14761521    end
     
    14791524      for i := 0 to -Growth div 8 - 1 do
    14801525        DpiBitCanvas(ca, x + pos + i * 8, y, 8, 7,
    1481           GrExt[HGrSystem].Data.Canvas, 104, 1);
     1526          HGrSystem.Data.Canvas, 104, 1);
    14821527      DpiBitCanvas(ca, x + pos + 8 * (-Growth div 8), y, -Growth -
    14831528        8 * (-Growth div 8), 7,
    1484         GrExt[HGrSystem].Data.Canvas, 104, 1);
     1529        HGrSystem.Data.Canvas, 104, 1);
    14851530    end;
    14861531    Brush.Color := $000000;
     
    15051550end;
    15061551
    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);
     1552procedure PaintLogo(Canvas: TDpiCanvas; X, Y, LightColor, ShadeColor: Integer);
     1553begin
     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);
    15151559end;
    15161560
     
    16111655end;
    16121656
    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;
     1657procedure UnshareBitmap(Bitmap: TDpiBitmap);
     1658begin
     1659  // FillRect cause image data to be freed so subsequent BitBlt can access valid image data
     1660  Bitmap.Canvas.FillRect(0, 0, 0, 0);
    16211661end;
    16221662
     
    16951735  LoadPhrases;
    16961736  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
    16991753  LoadGraphicFile(Colors, GetGraphicsDir + DirectorySeparator + 'Colors.png');
    17001754  LoadGraphicFile(Paper, GetGraphicsDir + DirectorySeparator + 'Paper.jpg');
     
    17141768  {$ENDIF}
    17151769
    1716   LogoBuffer := TDpiBitmap.Create;
    1717   LogoBuffer.PixelFormat := pf24bit;
    1718   LogoBuffer.SetSize(wBBook, hBBook);
    1719 
    17201770  for Section := Low(TFontType) to High(TFontType) do
    17211771    UniFont[Section] := TDpiFont.Create;
    17221772
    1723   nGrExt := 0;
     1773  GrExt := TGraphicSets.Create;
     1774
    17241775  HGrSystem := LoadGraphicSet('System.png');
     1776  CityMark1 := HGrSystem.GetItem('CityMark1');
     1777  CityMark2 := HGrSystem.GetItem('CityMark2');
     1778
    17251779  HGrSystem2 := LoadGraphicSet('System2.png');
    1726   Templates := TDpiBitmap.Create;
    1727   Templates.PixelFormat := pf24bit;
     1780  Ornament := HGrSystem2.GetItem('Ornament');
     1781
    17281782  Colors := TDpiBitmap.Create;
    17291783  Colors.PixelFormat := pf24bit;
     
    17341788  MainTexture.Image := TDpiBitmap.Create;
    17351789  MainTextureAge := -2;
    1736   ClickFrameColor := GrExt[HGrSystem].Data.Canvas.Pixels[187, 175];
     1790  ClickFrameColor := HGrSystem.Data.Canvas.Pixels[187, 175];
    17371791  InitOrnamentDone := False;
    17381792  GenerateNames := True;
    17391793
    17401794  LoadAssets;
     1795
     1796  LogoBuffer := TDpiBitmap.Create;
     1797  LogoBuffer.PixelFormat := pf24bit;
     1798  LogoBuffer.SetSize(BigBook.Width, BigBook.Height);
    17411799end;
    17421800
    17431801procedure UnitDone;
    1744 var
    1745   I: integer;
    17461802begin
    17471803  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);
    17541805  ReleaseFonts;
    1755 
    17561806  FreeAndNil(Phrases);
    17571807  FreeAndNil(Phrases2);
     
    17591809  FreeAndNil(BigImp);
    17601810  FreeAndNil(Paper);
    1761   FreeAndNil(Templates);
    17621811  FreeAndNil(Colors);
    17631812  FreeAndNil(MainTexture.Image);
Note: See TracChangeset for help on using the changeset viewer.