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

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

?? cdibpalette.pas

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

{-----------------------------------------------------------------------------
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: cDIBPalette.PAS, released August 28, 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:
This handles the rendering of 32bit images to 8 bit display modes through use of
a Colour cube.  This is at least 30 times faster than simply using BitBlt.

Contributor(s):
Sylane - sylane@excite.com
  Assign
  ImportFromRAWFile
  ResetPalette
  PaletteEditor

Last Modified: August 28, 2000

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


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


interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs;

type
  TColorTable = array[0..63, 0..63, 0..63] of Byte;
  PColorTable = ^TColorTable;

  TDIBPalette = class(TComponent)
  private
    { Private declarations }
    //FColors is just used for streaming purposes
    FUseTable: Boolean;
    FLUT: PColorTable;
    pPal: PLogPalette;
    hPalCurrent: HPalette;
    FOldWndProc: TWndMethod;
    FOwner: TCustomForm;
    procedure FormWndProc(var message: TMessage);
    procedure LoadColorsFromStream(S: TStream);
    procedure LoadTableFromStream(S: TStream);
    procedure SaveColorsToStream(S: TStream);
    procedure SaveTableToStream(S: TStream);
    procedure SetTable(const Value: Boolean);
    procedure UpdateLUT;
    procedure WMPaletteChanged(var Message: TMessage);
    procedure WMQueryNewPalette(var Message: TMessage);
  protected
    { Protected declarations }
    procedure DefineProperties(Filer: TFiler); override;
    procedure Loaded; override;
  public
    { Public declarations }
    constructor Create(AOwner: TComponent); override;
    destructor Destroy; override;

    procedure Assign(Source: TPersistent); override;
    function ColorDistance(const C1, C2: tagPaletteEntry): Integer;
    function FastColorMatch(const Color: tagPaletteEntry): Byte;
    procedure ImportFromFile(const aFilename: string);
    procedure ImportFromRawFile(const aFileName: string);
    procedure ResetPalette;
    function SlowColorMatch(const Color: tagPaletteEntry): Byte;
    procedure UpdateFromBitmap(const Bitmap: TBitmap);
    procedure UpdatePalette;

    property ColorTable: PColorTable read FLUT;
    property PAL: PLogPalette read pPal;
    property Palette: HPalette read hPalCurrent;
  published
    { Published declarations }
    property UseTable: Boolean read FUseTable write SetTable;
  end;

implementation

type
  EDIBPaletteError = class(Exception);
  THackCustomForm = class(TCustomForm);

  { TDIBPalette }

constructor TDIBPalette.Create(AOwner: TComponent);
var
  X: Integer;
  NewPal: pLogPalette;
begin
  if not (AOwner is TCustomForm) then
    raise EDIBPaletteError.Create('Palette owner must be a TCustomForm.');

  //Get more memory than we need, just so we have enough space
  GetMem(NewPal, 4 {bytes} * 255 {Palette entries});
  if NewPal = nil then
    raise EDIBPaletteError.Create('Could not get enough memory for a palette.');

  inherited;
  FOwner := TCustomForm(Owner);
  pPal := NewPal;
  pPal.palVersion := $300;
  pPal.palNumEntries := 235;
  for X := 0 to 234 do 
  begin
    pPal.palPalEntry[X].peRed := 255 - x;
    pPal.palPalEntry[X].peGreen := 255 - X;
    pPal.palPalEntry[X].peBlue := 255 - X;
    pPal.palPalEntry[X].peFlags := 0;
  end;
  UpdatePalette;

  if not (csDesigning in FOwner.ComponentState) then 
  begin
    FOldWndProc := THackCustomForm(Owner).WindowProc;
    THackCustomForm(Owner).WindowProc := FormWndProc;
  end;
end;

procedure TDIBPalette.DefineProperties(Filer: TFiler);
begin
  inherited;
  Filer.DefineBinaryProperty('DIBPaletteColors', LoadColorsFromStream,
    SaveColorsToStream, True);
  Filer.DefineBinaryProperty('DIBPaletteTable', LoadTableFromStream,
    SaveTableToStream, FUseTable);
end;

destructor TDIBPalette.Destroy;
begin
  DeleteObject(hPalCurrent);
  FreeMem(pPal);
  pPal := nil;
  if FLUT <> nil then FreeMem(FLUT);
  if not (csDestroying in FOwner.ComponentState) then
    if not (csDesigning in FOwner.ComponentState) then
      THackCustomForm(FOwner).WindowProc := FOldWndProc;
  inherited;
end;

procedure TDIBPalette.FormWndProc(var message: TMessage);
begin
  case Message.msg of
    WM_PaletteChanged: WMPaletteChanged(Message);
    WM_QueryNewPalette: WMQueryNewPalette(Message);
    else
      FOldWndProc(Message);
  end;
end;

procedure TDIBPalette.UpdateFromBitmap(const Bitmap: TBitmap);
begin
  GetPaletteEntries(Bitmap.Palette, 0, 235, pPal.palPalEntry[0]);
  UpdatePalette;
  if UseTable then UpdateLUT;
  SendMessage(FOwner.Handle, WM_QueryNewPalette, 0, 0);
end;

procedure TDIBPalette.LoadColorsFromStream(S: TStream);
var
  X: Integer;
  Value: Byte;
begin
  if S.Size = 0 then exit;
  if S.Size <> (235 * 4) then
    raise EDIBPaletteError.Create('Invalid palette stream.');


  for X := 0 to 234 do 
  begin
    S.ReadBuffer(Value, 1);
    pPal.palPalEntry[X].peRed := Value;
    S.ReadBuffer(Value, 1);
    pPal.palPalEntry[X].peGreen := Value;
    S.ReadBuffer(Value, 1);
    pPal.palPalEntry[X].peBlue := Value;
    S.ReadBuffer(Value, 1);
    pPal.palPalEntry[X].peFlags := Value;
  end;
  UpdatePalette;
end;

procedure TDIBPalette.SaveColorsToStream(S: TStream);
var
  X: Integer;
  Value: Byte;
begin
  for X := 0 to 234 do 
  begin
    Value := pPal.palPalEntry[X].peRed;
    S.WriteBuffer(Value, 1);
    Value := pPal.palPalEntry[X].peGreen;
    S.WriteBuffer(Value, 1);
    Value := pPal.palPalEntry[X].peBlue;
    S.WriteBuffer(Value, 1);
    Value := pPal.palPalEntry[X].peFlags;
    S.WriteBuffer(Value, 1);
  end;
end;

procedure TDIBPalette.UpdatePalette;
  //var
  //  OrigUseTable: Boolean;
begin
  //  OrigUseTable := UseTable;
  //  UseTable := False;
  if hPalCurrent <> 0 then DeleteObject(hPalCurrent);
  hPalCurrent := CreatePalette(pPal^);
  //  UseTable := OrigUseTable;
end;

procedure TDIBPalette.WMPaletteChanged(var Message: TMessage);
var
  DC: Integer;
  OldPal: HPalette;
begin
  //Our app has (probably) just become the foreground application,
  //windows is asking us if we have a custom palette.
  //Don't respond to this message if the sender (wparam) is our form
  with THackCustomForm(Owner) do 
  begin
    if THandle(Message.wParam) <> Handle then 
    begin
      DC := GetDC(Handle);
      OldPal := SelectPalette(DC, hPalCurrent, True);

      //Only need to repaint if logical palette has been remapped
      if RealizePalette(DC) > 0 then Invalidate;
      SelectPalette(DC, OldPal, True);
      RealizePalette(DC);
      ReleaseDC(Handle, DC);
    end;
  end;
end;

procedure TDIBPalette.WMQueryNewPalette(var Message: TMessage);
var
  DC: HDC;
  OldPal: HPalette;
begin
  //Some other app is in the foreground.
  //Windows is asking us what our palette looks like so it can fit in as many
  //of our colors as possible (along with all of the other apps current visible)
  Message.Result := 0;
  with THackCustomForm(Owner) do 
  begin
    DC := GetDC(Handle);
    OldPal := SelectPalette(DC, hPalCurrent, False);
    Message.Result := RealizePalette(DC);
    SelectPalette(DC, OldPal, True);
    RealizePalette(DC);
    ReleaseDC(Handle, DC);
    if Message.Result > 0 then Invalidate;
  end;
  THackCustomForm(FOwner).PaletteChanged(False);
end;

procedure TDIBPalette.ImportFromFile(const aFilename: string);
var
  BMP: TBitmap;
begin
  BMP := TBitmap.Create;
  try
    BMP.LoadFromFile(aFileName);
    if BMP.PixelFormat <> pf8bit then
      raise EDIBPaletteError.Create('Bitmap must be 8 bit.');
    UpdateFromBitmap(BMP);
  finally
    BMP.Free;
  end;
end;

procedure TDIBPalette.Loaded;
begin
  inherited;
  UpdatePalette;
end;

procedure TDIBPalette.SetTable(const Value: Boolean);
begin
  FUseTable := Value;
  if not Value and (FLUT <> nil) then 
  begin
    Freemem(FLUT);
    FLUT := nil;
  end;
  if (FLUT = nil) and Value then GetMem(FLUT, 64 * 64 * 64);
  if not (csLoading in ComponentState) and Value then UpdateLUT;
end;

procedure TDIBPalette.UpdateLUT;
var
  R, G, B: Byte;
  T: tagPaletteEntry;
  OrigCaption: string;
begin
  OrigCaption := Application.Mainform.Caption;
  T.peFlags := 0;
  for B := 0 to 63 do
  begin
    if csDesigning in ComponentState then
      Application.MainForm.Caption := 'Processing ' + IntToStr(B * 100 div 63) + '%';
    T.peBlue := B * 4;
    for G := 0 to 63 do
    begin
      T.peGreen := G * 4;
      for R := 0 to 63 do
      begin
        T.peRed := R * 4;
        FLUT[B, G, R] := SlowColorMatch(T);
      end;
    end;
  end;
  Application.Mainform.Caption := OrigCaption;
end;

function TDIBPalette.ColorDistance(const C1, C2: tagPaletteEntry): Integer;
var
  DX, DY, DZ: Integer;
begin
  DX := C1.peRed - C2.peRed;
  DY := C1.peGreen - C2.peGreen;
  DZ := C1.peBlue - C2.peBlue;
  Result := DX * DX + DY * DY + DZ * DZ;
end;

function TDIBPalette.SlowColorMatch(const Color: tagPaletteEntry): Byte;
var
  X: Byte;
  LastDist, BestDist: Integer;
begin
  Result := 0;
  BestDist := ColorDistance(pPal.palPalEntry[0], Color);

  X := 1;
  repeat
    LastDist := ColorDistance(pPal.palPalEntry[X], Color);
    if (LastDist < BestDist) or (X = 0) then 
    begin
      Result := X;
      BestDist := LastDist;
      if LastDist = 0 then break;
    end;
    Inc(X);
  until (X = 235);
end;

procedure TDIBPalette.LoadTableFromStream(S: TStream);
begin
  if FLUT = nil then Getmem(FLUT, 64 * 64 * 64);
  S.Read(Flut[0, 0, 0], 64 * 64 * 64);
end;

procedure TDIBPalette.SaveTableToStream(S: TStream);
begin
  S.Write(Flut[0, 0, 0], 64 * 64 * 64);
end;

function TDIBPalette.FastColorMatch(const Color: tagPaletteEntry): Byte;
begin
  if FLUT = nil then 
  begin
    Result := 0;
    exit;
  end;

  Result := FLUT[Color.peBlue div 4, Color.peGreen div 4, Color.peRed div 4];
end;

procedure TDIBPalette.Assign(Source: TPersistent);
begin
  inherited;
  if not (Source is TDIBPalette) then
    raise Exception.Create('Not a TDIBPalette Component');

  if Assigned((Source as TDIBPalette).FLUT) then
  begin
    if FLUT = nil then Getmem(FLUT, 64 * 64 * 64);
    Move((Source as TDIBPalette).FLUT^, FLUT^, 64 * 64 * 64);
  end 
  else if Assigned(FLUT) then
  begin
    FreeMem(FLUT);
    FLUT := nil;
  end;

  Move((Source as TDIBPalette).pPal^, pPal^, 4 * 255);
  hPalCurrent := 0;
  UpdatePalette;
end;

procedure TDIBPalette.ImportFromRawFile(const aFileName: string);
var
  lFile: file;
  lReadCount: Integer;
  lIndex: Integer;
  lBuffer: array [0..767] of Byte;
begin
  AssignFile(lFile, aFileName);
  Reset(lFile, 1);
  BlockRead(lFile, lBuffer, 768, lReadCount);
  CloseFile(lFile);
  if (lReadCount <> 768) then
    raise Exception.Create('Invalid Palette File');
  for lIndex := 0 to 234 do
  begin
    pPal.palPalEntry[lIndex].peRed := lBuffer[3 * lIndex];
    pPal.palPalEntry[lIndex].peGreen := lBuffer[3 * lIndex + 1];
    pPal.palPalEntry[lIndex].peBlue := lBuffer[3 * lIndex + 2];
    pPal.palPalEntry[lIndex].peFlags := 0;
  end;
  UpdatePalette;
end;

procedure TDIBPalette.ResetPalette;
var
  lIndex: Integer;
begin
  pPal.palVersion := $300;
  pPal.palNumEntries := 235;
  for lIndex := 0 to 234 do 
  begin
    pPal.palPalEntry[lIndex].peRed := 255 - lIndex;
    pPal.palPalEntry[lIndex].peGreen := 255 - lIndex;
    pPal.palPalEntry[lIndex].peBlue := 255 - lIndex;
    pPal.palPalEntry[lIndex].peFlags := 0;
  end;
  UpdatePalette;
end;

end.

?? 快捷鍵說明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
香蕉久久一区二区不卡无毒影院 | 亚洲精品写真福利| 精品视频在线免费看| 国产一区日韩二区欧美三区| 亚洲一二三区在线观看| 国产视频一区二区在线| 欧美日本高清视频在线观看| zzijzzij亚洲日本少妇熟睡| 青娱乐精品在线视频| 一级中文字幕一区二区| 国产亚洲一区二区三区在线观看| 欧美日韩美女一区二区| 91麻豆国产在线观看| 国产成人免费视频精品含羞草妖精| 日韩av电影天堂| 亚洲一二三区在线观看| 亚洲视频免费在线观看| 国产欧美久久久精品影院| 亚洲精品一区在线观看| 欧美剧在线免费观看网站 | 欧美一二区视频| 在线免费亚洲电影| 色综合网站在线| 99久久精品99国产精品| 国产成人99久久亚洲综合精品| 久久99深爱久久99精品| 日本亚洲免费观看| 三级欧美在线一区| 日韩av在线播放中文字幕| 亚洲成人在线网站| 亚洲 欧美综合在线网络| 亚洲日本电影在线| 最新高清无码专区| 一区免费观看视频| 亚洲日本乱码在线观看| 亚洲乱码国产乱码精品精小说| 中文字幕不卡在线播放| 国产精品每日更新在线播放网址 | 国产视频一区在线播放| 日韩欧美激情一区| 日韩欧美一区二区视频| 日韩一区二区在线看| 日韩欧美成人午夜| 久久夜色精品国产噜噜av| 久久蜜桃香蕉精品一区二区三区| 精品日韩在线观看| 久久嫩草精品久久久精品 | 三级精品在线观看| 日本91福利区| 久久成人免费网| 国产精品自拍网站| 91在线一区二区三区| 欧洲精品在线观看| 91麻豆精品国产91久久久久| 精品久久国产字幕高潮| 久久久亚洲精华液精华液精华液| 久久精品视频在线看| 国产精品日韩精品欧美在线| 亚洲另类在线制服丝袜| 亚洲第一综合色| 蜜臀久久99精品久久久久久9| 精品一区二区三区视频在线观看| 国产精品综合二区| 91麻豆福利精品推荐| 欧美美女一区二区| 精品日韩99亚洲| 亚洲欧洲日产国产综合网| 亚洲成a人v欧美综合天堂下载| 免费xxxx性欧美18vr| 国产乱码精品一品二品| 91麻豆精品视频| 666欧美在线视频| 久久蜜桃一区二区| 亚洲精品免费电影| 另类的小说在线视频另类成人小视频在线| 国产一区二区三区| 日本高清无吗v一区| 日韩欧美亚洲一区二区| 中文字幕不卡在线观看| 亚洲成av人片在线观看无码| 狠狠色丁香久久婷婷综合_中| 成人高清免费观看| 欧美日韩久久一区二区| 国产午夜久久久久| 亚洲成a人v欧美综合天堂| 国产精品99久久久久久久女警| 色综合久久久久综合| 欧美一卡二卡三卡| 亚洲欧洲精品一区二区精品久久久 | 欧美电视剧在线看免费| 中文字幕在线一区二区三区| 人人爽香蕉精品| www.av精品| 日韩三级在线免费观看| ...av二区三区久久精品| 奇米一区二区三区| 99国产欧美另类久久久精品| 日韩无一区二区| 亚洲视频在线一区| 国产一区二区三区免费播放| 欧美色爱综合网| 国产精品久久久久久户外露出| 日本亚洲欧美天堂免费| 色综合久久99| 欧美高清在线一区二区| 久久疯狂做爰流白浆xx| 欧美性xxxxxxxx| 国产精品的网站| 国产一区二区三区四区五区入口 | 国产成人一区在线| 91精品在线免费观看| 一区二区三区国产精品| 大白屁股一区二区视频| 精品99久久久久久| 石原莉奈在线亚洲二区| 日本韩国精品在线| 日韩一区有码在线| 成人影视亚洲图片在线| 久久综合色一综合色88| 日本vs亚洲vs韩国一区三区| 在线免费亚洲电影| 一区二区三区中文在线观看| 99天天综合性| 亚洲国产成人私人影院tom| 国产伦精品一区二区三区免费迷| 91精品国产乱码久久蜜臀| 亚洲成a人v欧美综合天堂下载| 91色在线porny| 亚洲欧洲av色图| 97久久超碰精品国产| 国产精品美女久久久久久久久 | 亚洲激情中文1区| 99久久精品久久久久久清纯| 国产精品久久久久影院亚瑟| 成人不卡免费av| 国产精品色眯眯| av爱爱亚洲一区| 国产精品国产三级国产aⅴ中文| 粉嫩av一区二区三区| 国产欧美一区二区三区网站| 国产黄色精品视频| 中文字幕+乱码+中文字幕一区| 豆国产96在线|亚洲| 亚洲欧洲三级电影| 色婷婷综合中文久久一本| 艳妇臀荡乳欲伦亚洲一区| 欧美日韩一级片在线观看| 亚洲不卡在线观看| 91 com成人网| 麻豆传媒一区二区三区| 精品电影一区二区三区 | 成人免费视频一区二区| 亚洲欧美偷拍卡通变态| 色婷婷国产精品久久包臀| 亚洲国产精品一区二区www在线 | 色综合久久久久综合| 洋洋成人永久网站入口| 欧美日韩精品系列| 欧美aa在线视频| 国产三级精品视频| 色综合一个色综合| 日韩一区精品字幕| 国产亚洲一本大道中文在线| 不卡一区在线观看| 亚洲国产精品久久久久婷婷884| 制服丝袜日韩国产| 国产夫妻精品视频| 亚洲女性喷水在线观看一区| 欧美日韩在线一区二区| 国产老女人精品毛片久久| 亚洲欧美一区二区三区孕妇| 91精品国产免费久久综合| 国产电影一区二区三区| 亚洲激情在线激情| 欧美mv日韩mv国产网站app| av中文字幕不卡| 日韩国产欧美视频| 中文字幕精品一区| 欧美日韩久久一区| 国产成人丝袜美腿| 亚洲va韩国va欧美va| 国产午夜亚洲精品羞羞网站| 在线观看欧美黄色| 国内外成人在线| 夜夜精品视频一区二区| 欧美精品一区视频| 在线视频一区二区三区| 国产一二精品视频| 亚洲图片有声小说| 日本一区二区视频在线| 3atv一区二区三区| 99国产精品久久久久| 麻豆成人久久精品二区三区小说| 国产精品免费视频网站| 日韩免费电影网站| 在线日韩国产精品| av电影一区二区| 激情综合网天天干| 天堂精品中文字幕在线| 成人欧美一区二区三区|