Ignore:
Timestamp:
Sep 6, 2020, 11:44:12 AM (4 years ago)
Author:
chronos
Message:
  • Modified: Replace two magenta colors transparency with alpha channel transparency in some PNG images. Internally game still uses transparency with bitmap mask.
File:
1 edited

Legend:

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

    r256 r278  
    397397end;
    398398
     399procedure FillRectBitmap(Bitmap: TBitmap; Color: TColor32);
     400var
     401  Ptr: TPixelPointer;
     402  X, Y: Integer;
     403begin
     404  Bitmap.BeginUpdate;
     405  Ptr := PixelPointer(Bitmap);
     406  for Y := 0 to Bitmap.Height - 1 do begin
     407    for X := 0 to Bitmap.Width - 1 do begin
     408      Ptr.Pixel^.ARGB := Color;
     409      Ptr.NextPixel;
     410    end;
     411    Ptr.NextLine;
     412  end;
     413  Bitmap.EndUpdate;
     414end;
     415
    399416function LoadGraphicFile(bmp: TBitmap; Path: string; Options: Integer): Boolean;
    400417var
     
    424441  if ExtractFileExt(Path) = '.png' then begin
    425442    Png := TPortableNetworkGraphic.Create;
    426     Png.PixelFormat := Bmp.PixelFormat;
    427443    try
    428444      Png.LoadFromFile(Path);
     
    432448    if Result then
    433449    begin
    434       if Options and gfNoGamma = 0 then
    435         bmp.PixelFormat := pf24bit;
    436       bmp.SetSize(Png.Width, Png.Height);
     450      Bmp.Assign(Png);
     451      //Bmp.SetSize(Png.Width, Png.Height);
     452      //Bmp.PixelFormat := Png.PixelFormat;
     453      //Bmp.Canvas.FillRect(0, 0, Bmp.Width, Bmp.Height);
     454      //FillRectBitmap(Bmp, $00000000);
    437455      if (Png.RawImage.Description.Format = ricfGray) then
    438456      begin
     
    440458        Bmp.PixelFormat := pf24bit;
    441459        CopyGray8BitTo24bitBitmap(Bmp, Png);
    442       end
    443       else
    444         Bmp.Canvas.draw(0, 0, Png);
     460      end;
     461      //else
     462        //Bmp.Canvas.Draw(0, 0, Png);
     463      //Bmp.SaveToFile(Path + '.bmp');
    445464    end;
    446465    Png.Free;
     
    475494  FileName: string;
    476495  Source: TBitmap;
    477   DataPixel, MaskPixel: TPixelPointer;
     496  SourcePixel: TPixelPointer;
     497  DataPixel: TPixelPointer;
     498  MaskPixel: TPixelPointer;
    478499begin
    479500  I := 0;
     
    483504  if I = nGrExt then begin
    484505    Source := TBitmap.Create;
    485     Source.PixelFormat := pf24bit;
    486506    FileName := GetGraphicsDir + DirectorySeparator + Name;
    487507    if not LoadGraphicFile(Source, FileName) then begin
     
    493513    GrExt[nGrExt].Name := Name;
    494514
    495     xmax := Source.Width - 1; // allows 4-byte access even for last pixel
     515    //xmax := Source.Width - 1; // allows 4-byte access even for last pixel
    496516    // Why there was that limit?
    497517    //if xmax > 970 then
    498518    //  xmax := 970;
    499519
    500     GrExt[nGrExt].Data := Source;
     520    GrExt[nGrExt].Data := TBitmap.Create;
    501521    GrExt[nGrExt].Data.PixelFormat := pf24bit;
     522    GrExt[nGrExt].Data.SetSize(Source.Width, Source.Height);
    502523    GrExt[nGrExt].Mask := TBitmap.Create;
    503524    GrExt[nGrExt].Mask.PixelFormat := pf24bit;
    504525    GrExt[nGrExt].Mask.SetSize(Source.Width, Source.Height);
    505526
     527    // Extract data and mask from transparent image
     528    Source.BeginUpdate;
    506529    GrExt[nGrExt].Data.BeginUpdate;
    507530    GrExt[nGrExt].Mask.BeginUpdate;
     531    SourcePixel := PixelPointer(Source);
    508532    DataPixel := PixelPointer(GrExt[nGrExt].Data);
    509533    MaskPixel := PixelPointer(GrExt[nGrExt].Mask);
    510534    for y := 0 to ScaleToNative(Source.Height) - 1 do begin
    511       for x := 0 to ScaleToNative(xmax) - 1 do begin
    512         OriginalColor := DataPixel.Pixel^.ARGB and $FFFFFF;
    513         if (OriginalColor = $FF00FF) or (OriginalColor = $7F007F) then
    514         begin // transparent
     535      for x := 0 to ScaleToNative(Source.Width) - 1 do begin
     536        if SourcePixel.Pixel^.ARGB = $00000000 then begin // transparent
    515537          MaskPixel.Pixel^.ARGB := $FFFFFF;
    516           DataPixel.Pixel^.ARGB := DataPixel.Pixel^.ARGB and $FF000000;
     538          DataPixel.Pixel^.ARGB := 0;
    517539        end
    518540        else begin
    519541          MaskPixel.Pixel^.ARGB := $000000; // non-transparent
     542          DataPixel.Pixel^.ARGB := SourcePixel.Pixel^.ARGB and $FFFFFF;
    520543          if Gamma <> 100 then
    521544            DataPixel.Pixel^ := ApplyGammaToPixel(DataPixel.Pixel^);
    522545        end;
     546        SourcePixel.NextPixel;
    523547        DataPixel.NextPixel;
    524548        MaskPixel.NextPixel;
    525549      end;
     550      SourcePixel.NextLine;
    526551      DataPixel.NextLine;
    527552      MaskPixel.NextLine;
    528553    end;
     554    Source.EndUpdate;
    529555    GrExt[nGrExt].Data.EndUpdate;
    530556    GrExt[nGrExt].Mask.EndUpdate;
     
    532558    FillChar(GrExt[nGrExt].pixUsed, GrExt[nGrExt].Data.Height div 49 * 10, 0);
    533559    Inc(nGrExt);
     560
     561    Source.Free;
    534562  end;
    535563end;
     
    15441572  for Y := 0 to ScaleToNative(Dest.Height) - 1 do begin
    15451573    for X := 0 to ScaleToNative(Dest.Width) - 1 do begin
    1546       if (DstPixel.Pixel^.ARGB and $FFFFFF) = TransparentColor then begin
     1574      if (DstPixel.Pixel^.ARGB and $ffffff) = TransparentColor then begin
    15471575        SrcPixel.SetXY(X mod TexWidth, Y mod TexHeight);
    15481576        DstPixel.Pixel^.B := SrcPixel.Pixel^.B;
Note: See TracChangeset for help on using the changeset viewer.