IPB
ЛогинПароль:

> Внимание!

1. Пользуйтесь тегами кода. - [code] ... [/code]
2. Точно указывайте язык, название и версию компилятора (интерпретатора).
3. Название темы должно быть информативным.
В описании темы указываем язык!!!

Наладить общение поможет, если вы подпишитесь по почте на новые темы в этом форуме.

> Арифметика указателей, АДА
сообщение
Сообщение #1


Злостный любитель
*****

Группа: Пользователи
Сообщений: 1 755
Пол: Мужской

Репутация: -  62  +


Я не понял, как именно надо использовать пакет System.Storage_Elements
Итак, задача такая, у меня есть тип

type TColor is new Interfaces.Unsigned_32;
type AColor is access all TColor;

type TBitmap is new Controlled with record
Handle : HBITMAP;
DC : HDC;
Mem : aliased AColor; -- или удобнее aliased PVOID?
SizeX, SizeY, Depth : integer;
end record;


У него есть метод:

function Get_Pixel(B: TBitmap; X, Y: integer) return AColor;
-- возвращает указатель на пиксел с данными координатами
pragma Inline(Get_Pixel);

function Get_Pixel(B: TBitmap; X, Y: integer) return AColor is
begin
Assert((X >= 0) and (X < B.SizeX) and (Y >= 0) and (Y < B.SizeY));
return B.Mem + X + Y * B.SizeX;
end;



Последняя функция не компилируется. Что надо сделать, чтобы она скомпилировалась?
Кстати, здесь мне очень важна скорость, с точностью до лишних тактов и копирований чисел туда-сюда.


--------------------
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
 
 Ответить  Открыть новую тему 
Ответов
сообщение
Сообщение #2


Злостный любитель
*****

Группа: Пользователи
Сообщений: 1 755
Пол: Мужской

Репутация: -  62  +


> Как память выделяется под TBitmap.Mem, можно посмотреть?


procedure Set_Size(B: in out TBitmap; X, Y, D: integer) is
BI: aliased BitmapInfo;
ScreenDC: HDC;
i: INT;
o: HGDIOBJ;
p: PVOID;

type aaColor is access all aColor;
type PPVoid is access all PVOID;

function To_PVOID is new Ada.Unchecked_Conversion(PBitmapInfo, PVOID);
function To_PPVOID is new Ada.Unchecked_Conversion(aaColor, PPVOID);
begin
Finalize(B);

p := MemSet(To_PVOID(BI'Unchecked_Access), 0, BI'Size / 8);

BI.bmiHeader.biSize := BI.bmiHeader'Size / 8;
BI.bmiHeader.biWidth := LONG(X);
BI.bmiHeader.biHeight := LONG(Y);
BI.bmiHeader.biPlanes := 1;
BI.bmiHeader.biBitCount := USHORT(D);

ScreenDC := GetDC(System.Null_Address);
B.DC := CreateCompatibleDC(ScreenDC);
B.SizeX := X;
B.SizeY := Y;
B.Depth := D;
B.Handle := CreateDIBSection( B.DC, BI'Unchecked_Access, DIB_RGB_COLORS, To_PPVOID(B.Mem'Access), System.Null_Address, 0);
o := SelectObject(B.DC, B.Handle);
i := ReleaseDC(System.Null_Address, ScreenDC);
end;



> По-моему, ты избрал неправильный путь...

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


--------------------
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 

Сообщений в этой теме


 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 





- Текстовая версия 17.06.2024 3:19
500Gb HDD, 6Gb RAM, 2 Cores, 7 EUR в месяц — такие хостинги правда бывают
Связь с администрацией: bu_gen в домене octagram.name