Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2008.05.11;
Скачать: CL | DM;

Вниз

Двойная буфферизация(выдернуто из "Вакансия Delphi программист")   Найти похожие ветки 

 
oxffff ©   (2008-03-26 22:10) [160]


> не обращаясь к другим источникам информации.


Честно говоря хваленный неоднократно тут Фэнь Юань вообще избегает данной темы, так что куда мне уж тут.
А судьи кто?


 
oxffff ©   (2008-03-26 22:13) [161]


> Игорь Шевченко ©   (26.03.08 21:33) [156]


Вот то что поддерживает устройство по тексту.

procedure TForm1.Button1Click(Sender: TObject);
const CONST_TECHNOLOGY:array[DT_PLOTTER..DT_DISPFILE] of string=("DT_PLOTTER","DT_RASDISPLAY","DT_RASPRINTER","DT_RASCAMERA","DT_CHARSTRE AM","DT_METAFILE","DT_DISPFILE");
     CONST_TEXTCAPS:array[0..16] of string=(
               "TC_OP_CHARACTER","TC_OP_STROKE","TC_CP_STROKE","TC_CR_90",
               "TC_CR_ANY","TC_SF_X_YINDEP","TC_SA_DOUBLE","TC_SA_INTEGER",
               "TC_SA_CONTIN","TC_EA_DOUBLE","TC_IA_ABLE",
               "TC_UA_ABLE","TC_SO_ABLE","TC_RA_ABLE","TC_VA_ABLE",
               "TC_RESERVED","TC_SCROLLBLT");
var dc:Thandle;
   ATEXTCAPS:DWORD;
   i:integer;

procedure GetTextCap(IDX:DWORD);
begin
if LONGBOOL((ATEXTCAPS AND (1 shl IDX))) then Memo1.Lines.add(CONST_TEXTCAPS[IDX]);
end;

begin
dc:=GetDC(handle);
Memo1.lines.add(CONST_TECHNOLOGY[GetDeviceCaps(dc,TECHNOLOGY)]);
Memo1.lines.add("NUMFONTS "+Inttostr(GetDeviceCaps(dc,NUMFONTS)));
ATEXTCAPS:=GetDeviceCaps(dc,TEXTCAPS);
for i:=0 to length(CONST_TEXTCAPS)-1 do GetTextCap(i);
end;


 
oxffff ©   (2008-03-26 22:14) [162]

ReleaseDC естественно.


 
Игорь Шевченко ©   (2008-03-26 22:23) [163]


> Вы не ответили на вопрос. Зачем проводить анализ изображение
> в случае программной отрисовки?


Еще раз - адаптер умеет выводить текст сам. Драйвер адаптера об этом осведомлен. Ты же утверждаешь, что весь вывод производится на bitmap, который ты выбрал по GetCurrentObject из DC, а потом этот битмап пересылается в адаптер. Как в этом случае используются возможности адаптера по выводу текста ?


 
oxffff ©   (2008-03-26 22:25) [164]


> oxffff ©   (26.03.08 22:10) [160]


Тыкаю носом в Феня Юаня стр. 119. Он пишет то же самое о чем я говорю.

Создается впечатление, что кто плохо не внимательно читал.
А кто вообще не читал и ему не мешает.


 
Игорь Шевченко ©   (2008-03-26 22:27) [165]

oxffff ©   (26.03.08 22:13) [161]

Уважаемый, а где собственно доказательства твоих умозаключений из [146] ?

Не стоит сбиваться на второстепенные вопросы, давай ты уже потдвердишь то, что утверждаешь, а именно, что битмап, который выбирается по GetCurrentObject из оконного DC является или буфером, или окном в видеопамять, или чем-либо еще, на чем рисуется и что потом отдается видеоадаптеру.


 
oxffff ©   (2008-03-26 22:27) [166]


> Еще раз - адаптер умеет выводить текст сам. Драйвер адаптера
> об этом осведомлен. Ты же утверждаешь, что весь вывод производится
> на bitmap, который ты выбрал по GetCurrentObject из DC,
> а потом этот битмап пересылается в адаптер. Как в этом случае
> используются возможности адаптера по выводу текста ?


Я вам 10 раз повторяю, что поверхность может быть создана адаптером в его памяти, исходная поверхность из RAM копируется в VRAM. Происходит аппаратная операция. И итоговая поверхность возвращается или не возращается в RAM. Мы же с вами это уже обсудили постов 60 назад.


 
oxffff ©   (2008-03-26 22:30) [167]


> Игорь Шевченко ©   (26.03.08 22:27) [165]


Перечитайте заново Юаня, судя по всему вы пропустили некоторые моменты.
Стр.119-122.
И я тоже обязательно его прочитаю, во всяком случае добавлю в копилку еще знаний. За Юаня спасибо, прикуплю обязательно.


 
Игорь Шевченко ©   (2008-03-26 22:32) [168]

oxffff ©   (26.03.08 22:25) [164]


> стр. 119. Он пишет то же самое о чем я говорю.


А процитировать не затруднит ? А то у меня книжки сейчас под рукой нету, в страницу не могу посмотреть.


> Тыкаю носом


И повежливее, дружок, повежливее


 
Игорь Шевченко ©   (2008-03-26 22:32) [169]


> Я вам 10 раз повторяю, что поверхность может быть создана
> адаптером в его памяти


Доказательства в студию


 
oxffff ©   (2008-03-26 22:36) [170]


> И повежливее, дружок, повежливее


Это не вам лично. :)

Уж не обижайтесь. А то Юань Юань, сказали бы где прочитать.
И тема закрыта была. Звиняйте. :)

У меня скан из инета. И то стр. 119 и 122.
120 и 121 нет.

Сейчас полную версию пытаюсь найти


 
oxffff ©   (2008-03-26 22:42) [171]


> Игорь Шевченко ©   (26.03.08 22:32) [169]
>
> > Я вам 10 раз повторяю, что поверхность может быть создана
>
> > адаптером в его памяти
>
>
> Доказательства в студию


DrvCopyBits EngCreateDeviceSurface


 
Игорь Шевченко ©   (2008-03-26 22:46) [172]


> EngCreateDeviceSurface


Это я в курсе вообще-то. Это вообще-то функция Win32k.sys, которая вызывает соответствующую функцию драйвера, и которая поверхность к битмапу в DC никоим боком не относится.


 
oxffff ©   (2008-03-26 22:59) [173]


> Игорь Шевченко ©   (26.03.08 22:46) [172]


Интересно а про бит гранулярности вы тоже знаете и про IRQL? :)
Так что предлагаю без лишних "это я тоже знаю". А зачем спрашиваете?.
Ну да ладно теперь к делу.

Итак мы с вами в предыдущих постах сошлись во мнении, что существует некая общая поверхность, окном в которую является window DC битмап.
Также мы выяснили (стр.119-122, 120-121стр. у меня нет), что в процессе драйвер може создавать свои поверхности, а также поверхности могут быть созданы в RAM памяти управляемые GRE.
Так же там написано, что результат программных и аппаратных операций смешивается.
Таким образом можно сделать вывод, что window DC битмап является окном на одну из таких поверхностей (а именно итоговую). Но процессе ее получения могут быть созданы несколько GRE и device managed поверхностей.
Теперь вопрос, вас еще что-то не устраивает?


 
Игорь Шевченко ©   (2008-03-26 23:08) [174]

oxffff ©   (26.03.08 22:59) [173]


> Итак мы с вами в предыдущих постах сошлись во мнении, что
> существует некая общая поверхность, окном в которую является
> window DC битмап.


Нет, не сошлись. Именно это я и прошу доказать.

Я имею мнение, что существует поверхность растра, для устройства, на которой в итоге и производится рисование, как методами GRE (ядерная часть GDI)m так и методами адаптера, которые методы вызываются общими фукциями для ядерной части GDI.


> Также мы выяснили (стр.119-122, 120-121стр. у меня нет),
>  что в процессе драйвер може создавать свои поверхности,
>  а также поверхности могут быть созданы в RAM памяти управляемые
> GRE.


В этом сходимся, все верно.


> Таким образом можно сделать вывод, что window DC битмап
> является окном на одну из таких поверхностей (а именно итоговую).
>  Но процессе ее получения могут быть созданы несколько GRE
> и device managed поверхностей


Нельзя сделать вывод. Я специально смотрел на битмап у DC разынх окон. Еще раз повторю, что у окон класса, например, tooltip_class32 это вполне валидный битмап, с размерами.

Со стилем класса CS_SAVEBITS он не соотносится.


 
Rouse_ ©   (2008-03-26 23:09) [175]

Мдя... А кто-то еще в немастерстве весь форум за исключение Сергея М. упрекал... От оно как оказывается...


 
oxffff ©   (2008-03-26 23:12) [176]


> Rouse_ ©   (26.03.08 23:09) [175]


Ну тебя лично я уже на немастерстве подлавливал.
Ты насколько помню передачей параметра и работой c EAX напортачил.
Да и где твои работы по расширению возможностей языка?


 
Fantasist...   (2008-03-26 23:16) [177]


> А судьи кто?


Никаких судей, совершенно верно. Никаких претензий.
Самому просто интересно было бы об этом узнать, но в этой ветке пока очень мало конкретных фактов. Правда, со стороны Игоря мнение ощущается гораздо более подтвержденным (ничего личного).


 
Игорь Шевченко ©   (2008-03-26 23:20) [178]

Fantasist...   (26.03.08 23:16) [177]

Очевидно мне надо зарегистрироваться под другим ником


 
oxffff ©   (2008-03-26 23:30) [179]


> Нет, не сошлись. Именно это я и прошу доказать.
>
> Я имею мнение, что существует поверхность растра, для устройства,
>  на которой в итоге и производится рисование, как методами
> GRE (ядерная часть GDI)m так и методами адаптера, которые
> методы вызываются общими фукциями для ядерной части GDI.
>


Давайте определять местоположение итогового растра.
Это поверхности видеопамяти. А поскольку device формат может не является DIB форматом, то и получить его описание через вызов упомянутой функции приводит к промаху.


> Нельзя сделать вывод. Я специально смотрел на битмап у DC
> разынх окон. Еще раз повторю, что у окон класса, например,
>  tooltip_class32 это вполне валидный битмап, с размерами.
>


Для небольших областей, не имеет смысл вызывать аппаратные функци, если вызов сравним по затратам с программной отрисовкой. И не будет penalty для перекачки VRAM<->RAM преобразования формата в DIB и обратно. Поэтому такая поверхность может быть кеширована в GRE поверхности которая DIB и соотвественно вызов Getobject успешный.
А возможно используется поверхность последней операции. которая может быть пребуфером в RAM или VRAM(но не являться front поверхностью).

Доказать это можно только посидев в отладчике ядра и отследив весь IRP стек.
У вас есть время? У меня его нет.


 
oxffff ©   (2008-03-26 23:34) [180]


> А возможно используется поверхность последней операции.
> которая может быть пребуфером в RAM или VRAM(но не являться
> front поверхностью).


И поэтому в зависимости от ее положения она либо DIB либо DEVICE формата. Соответствующим образом ведет себя и Getobject.
Я именно к этому склоняюсь.


 
oxffff ©   (2008-03-26 23:41) [181]


> Я имею мнение, что существует поверхность растра, для устройства,
>  на которой в итоге и производится рисование, как методами
> GRE (ядерная часть GDI)m так и методами адаптера, которые
> методы вызываются общими фукциями для ядерной части GDI.
>


Я все таки думаю нужно различать местоположение поверхности.

Вы согласны с тем, что если поверхность device - то рисует устройство, но не x86 код?

А если GRE поверхность значит она в RAM - и рисовать может как x86 код (программный отрисовщик), либо использовать отражение видеопамяти на RAM память, что честно говоря менее эффективно чем использование VRAM.


 
Игорь Шевченко ©   (2008-03-26 23:48) [182]

oxffff ©   (26.03.08 23:30) [179]

Давайте пойдем не от логики - мы все таки не на философском диспуте, Windows вполне конкретная программа, работает по вполне конкретным алгоритмам, их можно проверить. Вот от этого и пойдем.


> А поскольку device формат может не является DIB форматом,
>  то и получить его описание через вызов упомянутой функции
> приводит к промаху.


А что, в DC может сидеть объект, который нельзя опросить функцией GetObject ? Наверное его можно опросить другой функцией ?


 
oxffff ©   (2008-03-26 23:54) [183]


> А что, в DC может сидеть объект, который нельзя опросить
> функцией GetObject ?


Так я ваш пример поправил как раз на провале GetObject.

>Наверное его можно опросить другой функцией ?

Знаете скажите.


 
Игорь Шевченко ©   (2008-03-26 23:55) [184]


> Вы согласны с тем, что если поверхность device - то рисует
> устройство, но не x86 код?


Нет, не согласен.
Это всего лишь формат растра.
На растрах DDB может рисовать GDI, что он вполне успешно и делает.


 
oxffff ©   (2008-03-26 23:58) [185]


> Игорь Шевченко ©   (26.03.08 23:48) [182]


GetObject(a,sizeof(b),@b);
Дальше sysenter я естественно не добрался.


 
oxffff ©   (2008-03-27 00:00) [186]


> Игорь Шевченко ©   (26.03.08 23:55) [184]


Скажите а где расположены device поверхности(в какой памяти)?
И как туда (VRAM) доберется x86 код?


 
oxffff ©   (2008-03-27 00:19) [187]


> Наверное его можно опросить другой функцией ?


HGDIOBJ

The 24th bit position says whether it is a stock object or not.
Как раз GetObject и валится на одном из таких.


 
Игорь Шевченко ©   (2008-03-27 00:20) [188]

oxffff ©   (27.03.08 00:00) [186]

Если ты помнишь, разговор начался с того, имеет ли оконный DC буфер. Я сильно надеюсь, что мы уже убедились в том, что не имеет ?

В противном случае я продолжаю ждать доказательств.

Кстати: http://www.delphimaster.ru/books/978531800297/

и http://www.dasbook.ru/index.php?book=290


> Скажите а где расположены device поверхности(в какой памяти)?


Что есть "device поверхности" ?


 
Игорь Шевченко ©   (2008-03-27 00:23) [189]


> HGDIOBJ
>
> The 24th bit position says whether it is a stock object
> or not.


     ADC := GetDC(Wnd);
     try
       HBM := GetCurrentObject (ADC, OBJ_BITMAP);
       ShowMessageFmt("%.8x", [Integer(HBM)]);

Показывает 01050050. 24-й бит установлен в единицу (01)


 
oxffff ©   (2008-03-27 00:29) [190]


> ли ты помнишь, разговор начался с того, имеет ли оконный
> DC буфер. Я сильно надеюсь, что мы уже убедились в том,
> что не имеет ?


С вами разговор начался с этого. С этим я согласен, в том смысле что нет у него персонального буфера, но есть общий и не один при отрисовке.


 
oxffff ©   (2008-03-27 00:31) [191]

01050050 shr 16

gdi_objtypeb_bitmap      = 0x05,


 
oxffff ©   (2008-03-27 00:36) [192]


> Что есть "device поверхности" ?


В моем понимании, это поверхность device формата расположенная в видеопамяти или отображенной  RAM памяти, доступная видеоадаптеру и над которой он(видеоадаптер) выполняет аппаратные операции.

GRE поверхность поверхность RAM памяти, над которой выполняются операции программно, либо аппаратно в случае отображения (однако это менее эффективно чем аппаратные операции в видеопамяти)


 
Игорь Шевченко ©   (2008-03-27 00:37) [193]

oxffff ©   (27.03.08 00:31) [191]


> 01050050 shr 16
>
> gdi_objtypeb_bitmap      = 0x05,


Да, потому что GetCurrentObject(ADC, OBJ_BITMAP)

осталось сделать shr 24 и убедиться, что бит stock object установлен.


 
oxffff ©   (2008-03-27 00:39) [194]


> Игорь Шевченко ©   (27.03.08 00:23) [189]


Наша задача установить причину поведения Getobject.
Я свое мнение озвучил. А где ваше? :)

P.S. Пошел спать. Завтра(сегодня) я очень надеюсь продолжим изыскания.
Может и Юаня успею прочитать, относящееся к теме.


 
oxffff ©   (2008-03-27 00:41) [195]


> Да, потому что GetCurrentObject(ADC, OBJ_BITMAP)


Вообще то  OBJ_BITMAP=7.


 
Игорь Шевченко ©   (2008-03-27 00:42) [196]

oxffff ©   (27.03.08 00:41) [195]


> Вообще то  OBJ_BITMAP=7.


Это несвязанные константы. Типы handle GDI и типы выбираемых объектов.
Опять же, Фэнь Юань. Я кстати ссылку на книжку дал.


 
oxffff ©   (2008-03-27 00:48) [197]


> Это несвязанные константы. Типы handle GDI и типы выбираемых
> объектов.
> Опять же, Фэнь Юань. Я кстати ссылку на книжку дал.


Юань, Юань.  
Google  HGDIOBJ structure.  :)

Но вопрос о Getobject остается и о типе поверхности остается.
Кстати а у tooltip_class32 какой интересно тип для которого Getobject отрабатывает.

P.S. Все теперь точно спать.


 
Игорь Шевченко ©   (2008-03-27 12:59) [198]


> Кстати а у tooltip_class32 какой интересно тип для которого
> Getobject отрабатывает.


HBITMAP


 
oxffff ©   (2008-03-27 13:32) [199]


> Игорь Шевченко ©   (27.03.08 12:59) [198]


:).

Вид handle побитово.


 
Игорь Шевченко ©   (2008-03-27 14:14) [200]


> Вид handle побитово.


BC05126E

Вот, собственно, программка:

unit main;

interface
uses
 Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
 Dialogs, StdCtrls;

type
 TForm1 = class(TForm)
   ListBox1: TListBox;
   Button1: TButton;
   Button2: TButton;
   procedure Button1Click(Sender: TObject);
   procedure FormCreate(Sender: TObject);
   procedure Button2Click(Sender: TObject);
 private
   procedure RefreshWindowList;
 end;

var
 Form1: TForm1;

implementation
uses
 HSHookUtils;

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
begin
 RefreshWindowList;
end;

function EnumWindowProc (Wnd: HWND; Param: LPARAM): Integer; stdcall;
var
 AClassName: array[0..255] of char;
 AStyle: DWORD;
begin
 GetClassName(Wnd, AClassName, SizeOf(AClassName));
 AStyle := GetClassLong(Wnd, GCL_STYLE);
 with TForm1(Param) do
   ListBox1.Items.AddObject(Format("%s (%.8x)", [AClassName, AStyle]),
     TObject(Wnd));
 Result := 1;
end;

procedure TForm1.Button2Click(Sender: TObject);
const
 GOStatus: array[Boolean] of string = ("Failed", "Success");
var
 Wnd: HWND;
 ADC: HDC;
 Bmp: HBITMAP;
 Info: TagBITMAP;
 Success: Boolean;
 BmInfoStr: string;
begin
 if ListBox1.ItemIndex <> -1 then
 begin
   Wnd := HWND(ListBox1.Items.Objects[ListBox1.ItemIndex]);
   if IsWindow(Wnd) then
   begin
     ADC := GetWindowDC(Wnd);
     try
       Bmp := GetCurrentObject(ADC, OBJ_BITMAP);
       Success := GetObject(Bmp, SizeOf(Info), @Info) <> 0;
       if Success then
         BmInfoStr := Format("%d (%d x %d)", [Info.bmType, Info.bmWidth,
           Info.bmHeight])
       else
         BmInfoStr := "No info";
       ShowMessageFmt("%.8x = %s (%s) %s", [Integer(Bmp), DecodeGDIHandle(Bmp),
         GOStatus[Success], BMInfoStr]);
     finally
       ReleaseDC(Wnd, ADC);
     end;
   end;
 end;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
 RefreshWindowList;
end;

procedure TForm1.RefreshWindowList;
begin
 ListBox1.Clear;
 EnumWindows(@EnumWindowProc, LPARAM(Self));
end;

end.


unit HSHookUtils;

interface

function DecodeGDIHandle (const AHandle: Cardinal): string;
 
implementation
uses
  SysUtils;

function DecodeGDIHandle (const AHandle : Cardinal) : String;
var
 StockObject : Boolean;
 ObjectType,
 Index : Integer;
 ObjectTypeName : String;
begin
 if (AHandle = 0) then begin
   Result := "NULL";
   Exit;
 end;
 StockObject := (AHandle AND $800000) <> 0;
 ObjectType  := (AHandle SHR 16) AND $7F;
 Index := LOWORD(AHandle);
 case ObjectType of
 1:
   ObjectTypeName := "HDC";
 4:
   ObjectTypeName := "HRGN";
 5:
   ObjectTypeName := "HBITMAP";
 8:
   ObjectTypeName := "HPALETTE";
 $0A:
   ObjectTypeName := "HFONT";
 $10:
   ObjectTypeName := "HBRUSH";
 $21:
   ObjectTypeName := "HENHMETAFILE";
 $30:
   ObjectTypeName := "HPEN";
 $50:
   ObjectTypeName := "HEXTPEN";
 else
   ObjectTypeName := "*ERROR*"+Format("%.2x", [ObjectType]);
 end;
 if StockObject then
   ObjectTypeName := "S_"+ObjectTypeName;
 Result := Format("%s(%.4x)", [ObjectTypeName, Index]);
end;

end.


Можешь сам попробовать



Страницы: 1 2 3 4 5 6 вся ветка

Текущий архив: 2008.05.11;
Скачать: CL | DM;

Наверх




Память: 0.86 MB
Время: 0.047 c
2-1208152850
lewka-serdceed
2008-04-14 10:00
2008.05.11
ComboBox в ячейке StringGrid


2-1207842186
smartleds
2008-04-10 19:43
2008.05.11
Еще вопрос а как можно програмно нажать кнопку


15-1206806482
Denis__
2008-03-29 19:01
2008.05.11
KERNEL32.DLL


2-1207809049
TRSteep
2008-04-10 10:30
2008.05.11
Классы и ошибки


2-1208144663
Balkonnn
2008-04-14 07:44
2008.05.11
Запись в качестве свойства класса