-
Как вот такое перевести в паскаль: #define MAKEFOURCC(ch0, ch1, ch2, ch3) \
((DWORD)(BYTE)(ch0) | ((DWORD)(BYTE)(ch1) << 8) | \
((DWORD)(BYTE)(ch2) << 16) | ((DWORD)(BYTE)(ch3) << 24 )) Понятно, что это будет какая то функция типа такой: function MAKEFOURCC(ch0: ???; ch1: ???; ch2: ???; ch3: ???): ???; begin ??? end; Че то я не соображу никак :(
-
Четыре байта объединяют в один LogWord. Можно делать сдвигами байтов, а можно записывая байты в нужное место при помощи вариантной записи.
-
> Четыре байта объединяют в один LogWord.
Ааа. Точно! Спасибо.
-
> [2] DVM © (14.11.08 23:26)
Я просто константами написал. const
FOURCC_DXT1 = $31545844;
FOURCC_DXT2 = $32545844;
FOURCC_DXT3 = $33545844;
FOURCC_DXT4 = $34545844;
FOURCC_DXT5 = $35545844;
-
Кстати, могу поделится кодом загрузки dds. поддерживает dtx1/3/5 и RGBA
-
> @!!ex © (15.11.08 10:00) [4]
Спасибо, но у меня это в совсем другом контексте используется. Точнее не у меня, а в SDK тут одном стороннем. Это не DirectDraw и даже близко к нему не стояло. Собственно, я вчера под вечер уже плохо соображал, мог бы и сам додуматься (да и DirectDraw.PAS оно вроде есть) function MAKEFOURCC(ch0, ch1, ch2, ch3: Char) : DWORD;
begin
Result := DWORD(byte(ch0) shl 0) or
DWORD(byte(ch1) shl 8) or
DWORD(byte(ch2) shl 16) or
DWORD(byte(ch3) shl 24);
end;
-
> function MAKEFOURCC(ch0, ch1, ch2, ch3: Char) : DWORD;
> begin
> Result := DWORD(byte(ch0) shl 0) or
> DWORD(byte(ch1) shl 8) or
> DWORD(byte(ch2) shl 16) or
> DWORD(byte(ch3) shl 24);
> end; только лишние "телодвижения"... проще function MAKEFOURCC(charr: array of byte): DWORD;
var ch: DWORD absolute charr;
begin
result:= ch;
end; но, чуть изменится вызов, добавятся скобки MAKEFOURCC([1, 2, 3, 4])
-
> только лишние "телодвижения"... > проще > function MAKEFOURCC(charr: array of byte): DWORD; > var ch: DWORD absolute charr; > begin > result:= ch; > end; > но, чуть изменится вызов, добавятся скобки > MAKEFOURCC([1, 2, 3, 4])
Тогда лишние телодвижения будут при вызовах, т.к. ее там везде вызывают так:
MAKEFOURCC('G','R','A','Y') MAKEFOURCC('U','Y','V','Y') MAKEFOURCC('R','G','B',' ')
и т.д
-
> Тогда лишние телодвижения будут при вызовах, т.к. ее там везде вызывают так: какие? MAKEFOURCC(['G','R','A','Y']) MAKEFOURCC(['U','Y','V','Y']) MAKEFOURCC(['R','G','B',' '])
ну и array of byte заменить на array of char
????
-
в оригинале [0] приводится к BYTE, вот я byte и поставил, а так это все одно, в С так вообще различия byte/char нету, delphi просто более "затипизированный" язык. что чисто для проверок компилятором, а явные преобразования это уже на совесть программиста, должен знать что делает.
-
кстати можно тогда еще немного упростить... типа function MAKEFOURCC(charr: pchar): DWORD;
var ch: ^DWORD absolute charr;
begin
result:= ch^;
end; тогда вызов MAKEFOURCC('GRAY');
-
> sniknik © (15.11.08 12:55) [8]
> какие?
> ну и array of byte заменить на array of char
Если заменить, то не будет. Если же не заменять, то приводить надо будет каждый символ к байту.
> sniknik © (15.11.08 13:08) [10]
Да, так конечно хорошо, но мне надо максимально сохранить совместимость с оригиналом, чтобы не было разночтений потом у других с документацией на SDK. Проблема конечно небольшая, но все же там написано, вызывать так: MAKEFOURCC('G','R','A','Y').
Раз уж пошел разговор, может кто-нибудь объяснит мне почему в си использовали вот эту странную конструкцию #define MAKEFOURCC вместо того, чтобы просто сделать функцию ?
-
это макрос, в си это вычисляется компилятором и на место в программе уже вставляется константа, программа при работе не делает уже никаких вычислений... а функция это вызов процедуры, передача параметров, возврат параметров, т.е. накладные расходы там где их можно избежать.
-
> sniknik © (15.11.08 13:34) [12]
Ясно, спасибо.
Еще есть один вопрос:
В си: VOID IDGetPicture(HDEVICE Hdv,UINT *ImgTegg,VOID **Images); Где: Images - Указатель на массив указателей изображений.
Как лучше написать в паскале: procedure IDGetPicture(Hdv: HDEVICE; ImgTegg: pUINT; Images: Pointer); Так нормально, ведь тоже правильно будет?
-
> procedure IDGetPicture(Hdv: HDEVICE; ImgTegg: pUINT; Images: > Pointer);
procedure IDGetPicture(Hdv: HDEVICE; ImgTegg: pUINT; var Images: Pointer);
-
я ввёл тип TChars = array[0..3] of char;
в хедере, где требуется "указывать" MAKEFOURCC (dword или integer), выставляю тип TChars. Поэтому вместо
MAKEFOURCC(['G','R','A','Y']) MAKEFOURCC(['U','Y','V','Y']) MAKEFOURCC(['R','G','B',' '])
вполне проходит 'GRAY' 'UYVY' 'RGB '
-
> Игорь Шевченко © (15.11.08 14:07) [14]
> var Images: Pointer);
Спасибо.
-
> вполне проходит > 'GRAY'
> sniknik © (15.11.08 13:08) [10] > тогда вызов > MAKEFOURCC('GRAY');
> я ввёл тип TChars = array[0..3] of char; лучше бы ввел тип MAKEFOURCC = ^DWORD;
тогда xxx:= MAKEFOURCC(PChar('GRAY'))^;
чуток "страшненькая" форма записи, но это тоже не вычисляется при работе программы, простое приведение типа, что есть то и запишется (т.е. по этому критерию это будет полным аналогом твоего макроса из C)
-
> sniknik © (15.11.08 16:02)
все варианты с Char прийдется переделывать в Д2009.
-
> все варианты с Char прийдется переделывать в Д2009. т.е. с самого начала, с [0] где char (как оказалось) уже бессмысленно что-то делать, т.к. придётся переделывать, так? и что теперь делать то? жуть. а там разве не оставили однобайтных строк, и все только в двухбайтном юникоде? вериться с трудом... т.е. вообще не вериться.
вот это лично для тебя, запиши и заучи, т.к. судя то [18] для тебя это "откровение" которым ты со всеми делишься. - универсального кода, под абсолютно все версии чего либо не бывает (как и вообще универсального), с этим придётся мирится и если уж есть желание таскать код из версии в версию то пусть будет и желание переделывать под них.
|