亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關(guān)于我們
? 蟲蟲下載站

?? cdibcompressor.pas

?? Delphi控件
?? PAS
字號:
unit cDIBCompressor;

{-----------------------------------------------------------------------------
The contents of this file are subject to the Mozilla Public License
Version 1.1 (the "License"); you may not use this file except in compliance
with the License. You may obtain a copy of the License at
http://www.mozilla.org/MPL/MPL-1.1.html

Software distributed under the License is distributed on an "AS IS" basis,
WITHOUT WARRANTY OF ANY KIND, either expressed or implied. See the License for
the specific language governing rights and limitations under the License.

The Original Code is: cDIBCompress.PAS, released September 04, 2000.

The Initial Developer of the Original Code is Peter Morris (pete@droopyeyes.com),
Portions created by Peter Morris are Copyright (C) 2000 Peter Morris.
All Rights Reserved.

Purpose of file:
To handle the compression / decompression of DIB data, and to allow people to register
their own compressors.

Contributor(s):
None as yet


Last Modified: September 04, 2000

You may retrieve the latest version of this file at http://www.droopyeyes.com


Known Issues:
-----------------------------------------------------------------------------}


interface

uses
  Classes, SysUtils, Windows, cDIB;

type
  TAbstractDIBCompressor = class(TPersistent)
  private
  protected
    procedure Shuffle(const Source, Dest; const SourceSize: DWord);
    procedure UnShuffle(const Source, Dest; const SourceSize: Dword);
  public
    function GetGUID: TGUID; virtual; abstract;
    function CanDecompress(const GUID: TGUID): Boolean; virtual; abstract;
    function Compress(const DIB: TAbstractSuperDIB; const Source; var Dest;
      const SourceSize: DWord): DWord; virtual; abstract;
    procedure Decompress(const DIB: TAbstractSuperDIB; const GUID: TGUID;
      const Source; var Dest; const SourceSize, DestSize: DWord); virtual; abstract;
    function GetDisplayName: string; virtual; abstract;

    function GetAboutText: string; virtual;
    function GetAuthor: string; virtual;
    function GetEmail: string; virtual;
    function GetURL: string; virtual;
  end;

procedure RegisterDIBCompressor(const Compressor: TAbstractDIBCompressor);
function CompressorCount: Integer;
function Compressor(Index: Integer): TAbstractDIBCompressor;
procedure Compress(const DIB: TAbstractSuperDIB; const Source, Dest: TStream);
procedure Decompress(const DIB: TAbstractSuperDIB; const Source, Dest: TStream);
function FindCompressor(const GUID: string): TAbstractDIBCompressor;

var
  DefaultCompressor: TAbstractDIBCompressor;

implementation

uses
  COMObj;

type
  EDIBCompressError = class(Exception);

const
  cCompressedSig = 'DIBCMP';

var
  FList: TList;

procedure RegisterDIBCompressor(const Compressor: TAbstractDIBCompressor);
begin
  FList.Add(Compressor);
end;

function CompressorCount: Integer;
begin
  Result := FList.Count;
end;

function Compressor(Index: Integer): TAbstractDIBCompressor;
begin
  if (Index < 0) or (Index >= FList.Count) then
    raise EDIBCompressError.Create('Index ' + IntToStr(Index) + ' out of range.');
  Result := TAbstractDIBCompressor(FList[Index]);
end;

procedure Compress(const DIB: TAbstractSuperDIB; const Source, Dest: TStream);
var
  MSSource, MSDest: TMemoryStream;
  GUID: TGUID;
  OrigPosition: Integer;
  SourceSize, NewDataSize: DWord;
  pSource: Pointer;
begin
  if Source is TMemoryStream then
    MSSource := TMemoryStream(Source)
  else 
  begin
    MSSource := TMemoryStream.Create;
    MSSource.CopyFrom(Source, Source.Size);
    MSSource.Seek(0, 0);
  end;

  SourceSize := Source.Size - Source.Position;

  MSDest := TMemoryStream.Create;
  try
    if not Assigned(DefaultCompressor) then
      Dest.CopyFrom(Source, SourceSize)
    else 
    begin
      OrigPosition := Source.Position;
      MSDest.SetSize(SourceSize);
      pSource := Pointer(Integer(MSSource.Memory) + MSSource.Position);
      NewDataSize :=
        DefaultCompressor.Compress(DIB, pSource^, MSDest.Memory^, SourceSize);
      if NewDataSize > 0 then 
      begin
        MSDest.SetSize(NewDataSize);

        Dest.Write(cCompressedSig, Length(cCompressedSig));

        GUID := DefaultCompressor.GetGuid;
        Dest.Write(GUID, SizeOf(GUID));

        Dest.Write(SourceSize, SizeOf(DWord));
        MSDest.Seek(0, soFromBeginning);
        Dest.CopyFrom(MSDest, MSDest.Size);
      end 
      else 
      begin
        Source.Seek(OrigPosition, soFromBeginning);
        Dest.CopyFrom(Source, Source.Size);
      end;
    end;
  finally
    MSDest.Free;
    if MSSource <> Source then MSSource.Free;
  end;
end;

procedure Decompress(const DIB: TAbstractSuperDIB; const Source, Dest: TStream);
var
  I: Integer;
  FCompressor: TAbstractDIBCompressor;
  Signature: array[0..5] of Char;
  GUID: TGUID;
  NeedCompressor: Boolean;
  OrigPosition: Integer;
  OrigDataSize: DWord;
  MSSource, MSDest: TMemoryStream;
  pSource: Pointer;
begin
  NeedCompressor := False;
  OrigPosition := Source.Position;
  OrigDataSize := 0;
  if Source.Size >= Length(cCompressedSIG) + SizeOf(TGUID) + SizeOf(DWord) then 
  begin
    Source.Read(Signature[0], 6);
    if Signature = cCompressedSig then 
    begin
      Source.Read(GUID, SizeOf(GUID));
      Source.Read(OrigDataSize, SizeOf(DWord));
      NeedCompressor := True;
    end 
    else
      Source.Seek(OrigPosition, soFromBeginning);
  end;

  if not NeedCompressor then
    Dest.CopyFrom(Source, Source.Size)
  else 
  begin
    FCompressor := nil;
    for I := FList.Count - 1 downto 0 do
      with TAbstractDIBCompressor(FList[I]) do
        if CanDecompress(GUID) then 
        begin
          FCompressor := TAbstractDIBCompressor(FList[I]);
          break;
        end;

    if FCompressor = nil then
      raise EDIBCompressError.Create('Could not find a suitable decompressor.')
    else 
    begin
      //If a memory stream, point to that data
      if Source is TMemoryStream then
        MSSource := TMemoryStream(Source)
      else 
      begin
        //If not a memory stream, Copy the data to a memory stream
        MSSource := TMemoryStream.Create;
        MSSource.CopyFrom(Source, Source.Size - Source.Position);
        MSSource.Seek(0, soFromBeginning);
      end;

      pSource := Pointer(Integer(MSSource.Memory) + MSSource.Position);

      MSDest := TMemoryStream.Create;
      try
        MSDest.SetSize(OrigDataSize);
        FCompressor.Decompress(DIB, GUID, pSource^, MSDest.Memory^,
          MSSource.Size - MSSource.Position, OrigDataSize);
        MSDest.Seek(0, soFromBeginning);
        Dest.CopyFrom(MSDest, MSDest.Size);
      finally
        MSDest.Free;
        if MSSource <> Source then MSSource.Free;
      end;
    end;
  end;
end;



{ TAbstractDIBCompressor }

function TAbstractDIBCompressor.GetAboutText: string;
begin
  Result := 'No information supplied';
end;

function TAbstractDIBCompressor.GetAuthor: string;
begin
  Result := 'No information supplied';
end;

function TAbstractDIBCompressor.GetEmail: string;
begin
  Result := '';
end;

function TAbstractDIBCompressor.GetURL: string;
begin
  Result := '';
end;

function FindCompressor(const GUID: string): TAbstractDIBCompressor;
var
  I: Integer;
begin
  Result := nil;
  for I := FList.Count - 1 downto 0 do 
    if GUIDToString(TAbstractDIBCompressor(FList[I]).GetGUID) = GUID then 
    begin
      Result := TAbstractDIBCompressor(FList[I]);
      break;
    end;
end;

procedure TAbstractDIBCompressor.Shuffle(const Source; const Dest;
  const SourceSize: DWord);
asm
      push ESI
      push EDI
      push EBX

      mov  EBX, Source
      mov  EDX, SourceSize
      mov  EDI, Dest

      //Alpha
      mov  ECX, EDX
      mov  ESI, EBX
      inc  EBX
      shr  ECX, 2
  @AlphaLoop:
      mov  al, [ESI]
      lea  ESI, [ESI+4]
      mov  [EDI], al
      inc  EDI
      dec  ECX
      jnz  @AlphaLoop

      //Blue
      mov  ECX, EDX
      mov  ESI, EBX
      inc  EBX
      shr  ECX, 2
  @BlueLoop:
      mov  al, [ESI]
      lea  ESI, [ESI+4]
      mov  [EDI], al
      inc  EDI
      dec  ECX
      jnz  @BlueLoop

      //Green
      mov  ECX, EDX
      mov  ESI, EBX
      inc  EBX
      shr  ECX, 2
  @GreenLoop:
      mov  al, [ESI]
      lea  ESI, [ESI+4]
      mov  [EDI], al
      inc  EDI
      dec  ECX
      jnz  @GreenLoop

      //Red
      mov  ECX, EDX
      mov  ESI, EBX
      inc  EBX
      shr  ECX, 2
  @RedLoop:
      mov  al, [ESI]
      lea  ESI, [ESI+4]
      mov  [EDI], al
      inc  EDI
      dec  ECX
      jnz  @RedLoop

      pop  EBX
      pop  EDI
      pop  ESI
end;

//The idea is we read 1 byte
//write 1 byte
//skip the dest forward 3 pixels
procedure TAbstractDIBCompressor.UnShuffle(const Source, Dest;
  const SourceSize: Dword); assembler;
asm
      push ESI
      push EDI
      push EBX

      mov  ESI, Source
      mov  EBX, Dest
      mov  EDX, SourceSize


      //Alpha
      mov  ECX, EDX
      mov  EDI, EBX
      inc  EBX
      shr  ECX, 2
  @AlphaLoop:
      mov  al, [ESI]
      inc  ESI
      mov  [EDI], al
      lea  EDI, [EDI+4]
      dec  ECX
      jnz  @AlphaLoop

      //Blue
      mov  ECX, EDX
      mov  EDI, EBX
      inc  EBX
      shr  ECX, 2
  @BlueLoop:
      mov  al, [ESI]
      inc  ESI
      mov  [EDI], al
      lea  EDI, [EDI+4]
      dec  ECX
      jnz  @BlueLoop

      //Green
      mov  ECX, EDX
      mov  EDI, EBX
      inc  EBX
      shr  ECX, 2
  @GreenLoop:
      mov  al, [ESI]
      inc  ESI
      mov  [EDI], al
      lea  EDI, [EDI+4]
      dec  ECX
      jnz  @GreenLoop

      //Red
      mov  ECX, EDX
      mov  EDI, EBX
      inc  EBX
      shr  ECX, 2
  @RedLoop:
      mov  al, [ESI]
      inc  ESI
      mov  [EDI], al
      lea  EDI, [EDI+4]
      dec  ECX
      jnz  @RedLoop


      pop  EBX
      pop  EDI
      pop  ESI
end;

initialization
  FList := TList.Create;

finalization
  while FList.Count > 0 do 
  begin
    TAbstractDIBCompressor(FList[0]).Free;
    FList.Delete(0);
  end;
end.

?? 快捷鍵說明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
东方欧美亚洲色图在线| 国产精品三级电影| 欧美蜜桃一区二区三区| 91国偷自产一区二区三区观看| www.欧美精品一二区| 国产高清一区日本| 成人综合婷婷国产精品久久蜜臀| 成人中文字幕合集| 91麻豆蜜桃一区二区三区| 色综合久久综合| 色女孩综合影院| 欧美日韩一区精品| 777午夜精品视频在线播放| 日韩欧美视频一区| 精品电影一区二区| 国产肉丝袜一区二区| 欧美极品美女视频| 亚洲婷婷综合色高清在线| 一区二区三区资源| 日韩国产精品久久久久久亚洲| 美日韩一区二区| 国产精品 欧美精品| k8久久久一区二区三区| 欧美在线小视频| 欧美一区二区三区小说| 国产欧美日韩久久| 亚洲精品福利视频网站| 免费日本视频一区| 高清av一区二区| 欧美性做爰猛烈叫床潮| 精品电影一区二区三区| 全国精品久久少妇| 激情综合色播五月| 国产不卡视频在线观看| 97久久精品人人澡人人爽| 国产91丝袜在线观看| 欧美日韩一区在线| 日韩免费电影网站| 中文av一区特黄| 国产精品的网站| 日产国产高清一区二区三区| 国产一区二区三区在线观看精品 | 精品视频在线视频| 欧美一区在线视频| 亚洲欧洲三级电影| 亚洲图片激情小说| 另类小说一区二区三区| 懂色av一区二区三区蜜臀| 欧美日韩电影在线| 欧美xxxxx牲另类人与| 亚洲精品免费一二三区| 首页国产欧美久久| 成人性色生活片免费看爆迷你毛片| 91亚洲国产成人精品一区二区三 | 一区二区三区精品在线| 美女视频黄免费的久久| 成人一区二区三区视频在线观看| 欧美日韩在线直播| 26uuu色噜噜精品一区二区| 亚洲黄色小视频| 精品影视av免费| 在线免费观看日韩欧美| 日韩一区二区麻豆国产| 一区二区三区电影在线播| 久久丁香综合五月国产三级网站| 色久优优欧美色久优优| 欧美一区二区三区影视| 一区二区三区四区视频精品免费| 激情深爱一区二区| 欧美绝品在线观看成人午夜影视| 精品国产一二三区| 国产精品天美传媒| 黑人精品欧美一区二区蜜桃| ㊣最新国产の精品bt伙计久久| 久久伊99综合婷婷久久伊| 亚洲综合视频在线观看| 精品一区二区三区欧美| 欧美理论电影在线| 中文av一区特黄| 国产老妇另类xxxxx| 在线观看91视频| 亚洲欧美区自拍先锋| 精品一区二区免费| 欧美精品久久天天躁| 亚洲天天做日日做天天谢日日欢| 国产乱码精品一区二区三区忘忧草 | 午夜国产精品影院在线观看| 成人免费毛片片v| 久久久久久99久久久精品网站| 亚洲一区在线观看免费观看电影高清| 99久久精品久久久久久清纯| 日韩欧美一区在线观看| 丝袜美腿亚洲综合| 在线亚洲人成电影网站色www| 亚洲欧洲精品成人久久奇米网| 激情成人综合网| 精品日本一线二线三线不卡| 午夜成人免费电影| 制服丝袜日韩国产| 亚洲444eee在线观看| 欧美日韩久久久一区| 一区二区三区日本| 在线精品亚洲一区二区不卡| 中文字幕在线一区免费| 国模无码大尺度一区二区三区| 欧美卡1卡2卡| 理论电影国产精品| 欧美一二三区在线| 蜜臀av一区二区在线免费观看 | 一本大道综合伊人精品热热| 国产精品伦一区二区三级视频| 国产一区在线看| 国产片一区二区| 国产成人亚洲综合色影视| 国产精品色哟哟| 成人性生交大合| 亚洲精选在线视频| 色哟哟一区二区| 亚洲成人一区在线| 欧美三级电影网站| 久久99久国产精品黄毛片色诱| 日韩一区国产二区欧美三区| 国产精品一品二品| 中文字幕免费不卡在线| 99久久国产免费看| 亚洲免费av观看| 3atv在线一区二区三区| 毛片基地黄久久久久久天堂| 久久久www成人免费无遮挡大片| 国产呦精品一区二区三区网站| 中文字幕乱码久久午夜不卡| 成人黄色av网站在线| 亚洲综合精品久久| 宅男在线国产精品| 国产激情一区二区三区桃花岛亚洲| 国产午夜亚洲精品羞羞网站| 色婷婷一区二区| 午夜精品久久久久久久99水蜜桃| 精品日韩欧美在线| 国产高清视频一区| 亚洲午夜影视影院在线观看| 欧美精品xxxxbbbb| 国产成人av电影| 亚洲精品日韩专区silk| 欧美一级黄色录像| 国产精品1区二区.| 午夜精品久久久| 精品奇米国产一区二区三区| 成人黄色777网| 国产精品久久三区| 欧美人牲a欧美精品| 国产91富婆露脸刺激对白| 亚洲人精品一区| 久久综合狠狠综合久久综合88| 成人高清视频在线| 久久精品国产亚洲一区二区三区| 久久精品视频在线免费观看| 欧美日韩一级大片网址| 国内精品久久久久影院色| 亚洲一区二区三区中文字幕 | 久久久精品人体av艺术| 欧洲一区在线观看| 国产一区二区三区在线观看免费| 午夜久久久久久久久久一区二区| 亚洲精品在线观| 制服丝袜中文字幕一区| 激情综合色丁香一区二区| 亚洲午夜久久久久久久久久久 | 国产原创一区二区| 国产亚洲欧洲997久久综合| 91尤物视频在线观看| 捆绑调教一区二区三区| 亚洲欧美电影一区二区| 久久久久久免费| 欧美亚一区二区| www.亚洲免费av| 麻豆国产精品官网| 婷婷六月综合亚洲| 国产精品嫩草久久久久| 亚洲精品一区二区三区香蕉| 欧美性欧美巨大黑白大战| 91色乱码一区二区三区| 毛片av中文字幕一区二区| 五月婷婷久久丁香| 亚洲三级免费电影| 国产精品色婷婷| 欧美色区777第一页| 91久久精品国产91性色tv| 国产91色综合久久免费分享| 日韩国产欧美三级| 丝袜美腿成人在线| 亚洲精品日韩综合观看成人91| 国产精品免费免费| 欧美一区中文字幕| 91精品国产免费久久综合| 欧美老女人在线| 欧美性生活影院| 欧美三级视频在线观看| 91免费版在线| 99精品视频一区|