Конференция "FreePascal" » Модуль Texture.pas от Jan Horn [Win32]
 
  • П7 (18.10.04 01:27) [0]
    У кого-нибудь имеется перепиленная под FPC версия этого чуда?
    И вообще, кто-нибудь OpenGL под FPC програмит? Какие модули для работы с текстурами используете? (:
  • Alek Aaz (18.10.04 04:46) [1]
    Нада GLScene в Lazarus запихать :) Компоненты под Kylix есть, инструкция по конвертации тоже :)
  • Magikan © (18.10.04 05:18) [2]
    Я стандартными средствами OpenGL пользуюсь плюс оригинальные либы с хидерами для Delphi/FreePascal
  • П7 (18.10.04 13:37) [3]
    Что-то я там по работе с текстурами ничего не нашёл. Максимум - это некошенрный пример загрузки bmp из файла ресурсов... ):
  • Stargazer (19.10.04 22:00) [4]
    Я программирую на FPC+OpenGL!
    Загрузку текстур делал в связке KOL+JpegObj.
    Кому интересно, пишите на мыло, могу выслать исходники.
  • Magikan © (20.10.04 05:54) [5]
    Много от KOL используется?
  • П7 (20.10.04 09:48) [6]
    Не, JPG мне неинтересен из-за своей непрактичности для моих целей. Да, размер маленький, но качество и отсутствие альфы всё портят. У меня товарищь написал гораздо более лучший алгоритм сжатия изображений, основанный на фрактальном сжатии. Вот только нужно его расшевелить, что он исходниками поделился. Это лучше чем JPG. А вот TGA рулит именно из-за альфы. ВотЪ! (:
  • Stargazer (25.10.04 21:33) [7]
    Magikan

    Да не очень много. Загрузка из потока и сохранение в поток.

    П7

    А сколько времени занимает кодирование рисунка во фрактал?
  • П7 (26.10.04 02:15) [8]
    Много. Но это не главное. Главнее декодирование, которое происходит быстро.
  • Stargazer (29.10.04 21:00) [9]
    Фрактальное сжатие - это, конечно, круто.
    Но JPEG - известный и испытанный формат, с известными подводными камнями.
    Так что не всё так гладко.
  • П7 (30.10.04 14:42) [10]
    Естественно не всё. Зато он платный, а своё не только бесплатно, но порой и бабло приносит! (:
  • Magikan © (31.10.04 12:34) [11]
    Нихрена JPEG не платный. У него даже формат открыт.
  • Stargazer (31.10.04 19:07) [12]
    Платность/бесплатность - это уже другой вопрос.
    Интересны технические аспекты.
  • Wyvern (12.11.04 23:31) [13]

    > У кого-нибудь имеется перепиленная под FPC версия этого
    > чуда?

    Только под TGA: 24, 32 бита, несжатый.
  • Wyvern (14.11.04 00:00) [14]
    Спасибо человекам из этой темки: "Помогите перевести с ASM на Pascal" :)
    Теперь сжатые грузит.
    Кстати в этом модуле не хватает в конце функции LoadTGATexture не хватает строки:
    CloseFile(TGAFile);

    А на счёт формата: ИМХА TGA лучше чем JPEG и BMP (поддержка альфа канала, отсутствие артефактов как у JPEG'а).
  • Wyvern (19.11.04 13:51) [15]
    Вот собственно сам модуль:

    unit TGA_Texture;

    //Модуль загрузки TGA текстуры.

    {$MODE DELPHI}
    {$asmmode Intel}

    interface

    uses
     Windows, Gl, Glu;

    function LoadTGATexture(Filename: String; var Texture: GLuint): Boolean;

    implementation

    procedure CopySwapPixel(const source, destination: Pointer);
    asm
    push eax
    push edx
    push ebx
    mov eax, source
    mov edx, destination
    mov bl,[eax+0]
    mov bh,[eax+1]
    mov [edx+2],bl
    mov [edx+1],bh
    mov bl,[eax+2]
    mov bh,[eax+3]
    mov [edx+0],bl
    mov [edx+3],bh
    pop ebx
    pop edx
    pop eax
    end;

    function FileExists (Const FileName: String) : Boolean;
    var
     Handle: THandle;
     FindData: TWin32FindData;
    begin
     Handle := FindFirstFile(Pchar(FileName), @FindData);
     Result:=Handle <> INVALID_HANDLE_VALUE;
     If Result then
       Windows.FindClose(Handle);
    end;

    function CreateTexture(Width, Height, Format: Word; pData: Pointer) : Integer;
    var
     PTexture : PGLuint;
     Texture : GLuint;
    begin
     new(PTexture);
     glGenTextures(1, PTexture);
     Texture := PTexture^;
     dispose(PTexture);
     glBindTexture(GL_TEXTURE_2D, Texture);
     glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);  {Цвет текстуры смешивается с цветом объекта}
    //  glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_BLEND);  {Цвет текстуры инвертируется и смешивается с цветом объекта}
    //  glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_DECAL);  {Цвет текстуры не смешивается с цветом объекта}

     { Select a filtering type. BiLinear filtering produces very good results with little performance impact
       GL_NEAREST               - Basic texture (grainy looking texture)
       GL_LINEAR                - BiLinear filtering
       GL_LINEAR_MIPMAP_NEAREST - Basic mipmapped texture
       GL_LINEAR_MIPMAP_LINEAR  - BiLinear Mipmapped texture
     }  

     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
    //  glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR);

     if Format = GL_RGBA then
       gluBuild2DMipmaps(GL_TEXTURE_2D, GL_RGBA, Width, Height, GL_RGBA, GL_UNSIGNED_BYTE, pData)
       else
         gluBuild2DMipmaps(GL_TEXTURE_2D, 3, Width, Height, GL_RGB, GL_UNSIGNED_BYTE, pData);

     result :=Texture;
    end;

    function LoadTGATexture(Filename: String; var Texture: GLuint): Boolean; //Загружает только не сжатые 24 или 32 бтные TGA файлы.
    var
     TGAHeader : packed record   // Заголовок TGA файла
       FileType     : Byte;
       ColorMapType : Byte;
       ImageType    : Byte;
       ColorMapSpec : Array[0..4] of Byte;
       OrigX  : Array [0..1] of Byte;
       OrigY  : Array [0..1] of Byte;
       Width  : Array [0..1] of Byte;
       Height : Array [0..1] of Byte;
       BPP    : Byte;
       ImageInfo : Byte;
     end;
     TGAFile   : File;
     bytesRead : Integer;
     image     : Pointer;
     CompImage : Pointer;
     Width, Height : Integer;
     ColorDepth    : Integer;
     ImageSize     : Integer;
     BufferIndex : Integer;
     currentByte : Integer;
     CurrentPixel : Integer;
     I : Integer;
     Front: ^Byte;
     Back: ^Byte;
     Temp: Byte;
     BytePerPixel: Byte;

    begin
     result :=FALSE;
     GetMem(Image, 0);
     if FileExists(Filename) then
       begin
         AssignFile(TGAFile, Filename);
         Reset(TGAFile, 1);

         // Читаем заголовок
         BlockRead(TGAFile, TGAHeader, SizeOf(TGAHeader));
       end
       else
       begin
         MessageBox(0, PChar('File not found  - ' + Filename), PChar('TGA Texture'), MB_OK);
         Exit;
       end;

     if (TGAHeader.ImageType <> 2) and    { TGA_RGB, RGBA }
        (TGAHeader.ImageType <> 10) then  { Сжатые TGA_RGB, RGBA }
       begin
         CloseFile(tgaFile);
         MessageBox(0, PChar('Couldn''t load "'+ Filename +'". Формат TGA файла не поддерживается.'), PChar('TGA File Error'), MB_OK);
         Exit;
       end;

       // Don't support colormapped files
     if TGAHeader.ColorMapType <> 0 then
       begin
         CloseFile(TGAFile);
         MessageBox(0, PChar('Couldn''t load "'+ Filename +'". Colormapped TGA files not supported.'), PChar('TGA File Error'), MB_OK);
         Exit;
       end;

     // Получем ширину, высоту и глубину цвета
     Width  := TGAHeader.Width[0]  + TGAHeader.Width[1]  * 256;
     Height := TGAHeader.Height[0] + TGAHeader.Height[1] * 256;
     ColorDepth := TGAHeader.BPP;
     BytePerPixel := ColorDepth div 8;
     ImageSize  := Width*Height * BytePerPixel;

     if BytePerPixel < 3 then
       begin
         CloseFile(TGAFile);
         MessageBox(0, PChar('Couldn''t load "'+ Filename +'". Only 24 and 32 bit TGA files supported.'), PChar('TGA File Error'), MB_OK);
         Exit;
       end;

     GetMem(Image, ImageSize);

     if TGAHeader.ImageType = 2 then   // Standard 24, 32 bit TGA file
     begin

       BlockRead(TGAFile, image^, ImageSize, bytesRead);
       if bytesRead <> ImageSize then
         begin
           CloseFile(TGAFile);
           MessageBox(0, PChar('Couldn''t read file "'+ Filename +'".'), PChar('TGA File Error'), MB_OK);
           Exit;
         end;
       CloseFile(tgaFile);

       // Смена R и B компонент цвета.
       for I :=0 to Width * Height - 1 do
       begin
         Front := Pointer(Integer(Image) + I * BytePerPixel);
         Back := Pointer(Integer(Image) + I * BytePerPixel + 2);
         Temp := Front^;
         Front^ := Back^;
         Back^ := Temp;
       end;
       if BytePerPixel = 3 then
         Texture := CreateTexture(Width, Height, GL_RGB, Image)
         else
           Texture := CreateTexture(Width, Height, GL_RGBA, Image);
     end;

     if TGAHeader.ImageType = 10 then
     begin
       ColorDepth :=ColorDepth DIV 8;
       CurrentByte :=0;
       CurrentPixel :=0;
       BufferIndex :=0;

       GetMem(CompImage, FileSize(TGAFile)-sizeOf(TGAHeader));
       BlockRead(TGAFile, CompImage^, FileSize(TGAFile)-sizeOf(TGAHeader), BytesRead);   // load compressed data into memory
       if bytesRead <> FileSize(TGAFile)-sizeOf(TGAHeader) then
       begin
         CloseFile(TGAFile);
         MessageBox(0, PChar('Couldn''t read file "'+ Filename +'".'), PChar('TGA File Error'), MB_OK);
         Exit;
       end;
       CloseFile(tgaFile);

       // Extract pixel information from compressed data
       repeat
         Front := Pointer(Integer(CompImage) + BufferIndex);
         Inc(BufferIndex);
         if Front^ < 128 then
         begin
           For I := 0 to Front^ do
           begin
             CopySwapPixel(Pointer(Integer(CompImage)+BufferIndex+I*ColorDepth), Pointer(Integer(image)+CurrentByte));
             CurrentByte := CurrentByte + ColorDepth;
             inc(CurrentPixel);
           end;
           BufferIndex :=BufferIndex + (Front^+1)*ColorDepth
         end
         else
         begin
           For I := 0 to Front^ -128 do
           begin
             CopySwapPixel(Pointer(Integer(CompImage)+BufferIndex), Pointer(Integer(image)+CurrentByte));
             CurrentByte := CurrentByte + ColorDepth;
             inc(CurrentPixel);
           end;
           BufferIndex :=BufferIndex + ColorDepth
         end;
       until CurrentPixel >= Width*Height;

     if BytePerPixel = 3 then
       Texture := CreateTexture(Width, Height, GL_RGB, Image)
       else
         Texture := CreateTexture(Width, Height, GL_RGBA, Image);
      end;
     Result :=TRUE;
     FreeMem(Image, ImageSize);
    end;

    end.
  • Wyvern (13.12.04 22:36) [16]
    > У кого-нибудь имеется перепиленная под FPC версия этого
    > чуда?

    Благодоря великому и могучему интернету, нашёл непонятно чего из которого удалось выдернуть загрузку JPEG файлов.
    Собственно результат:
    http://wyvern.nightmail.ru/Texture.zip
    Загружает TGA (24, 32 Bit) и JPEG изображения.
  • Sniper17 (25.12.04 23:16) [17]
    Слушай поделись чем нибудь(лучше если это будет пакет с одним примером т.е. всё что надо ля запуска) - я никак не могу завести OpenGL на FPc ;-)
  • Stargazer (25.12.04 23:42) [18]
    Sniper17,
    мыло давай, пришлю свой пакетик для пуска OpenGL.
  • Sniper17 (27.12.04 13:26) [19]
    ogldelphi [at-at] mail.ru
  • Sniper17 (27.12.04 13:35) [20]
    Я завёл OpenGL только на GLUT... но меня это не устраивает... хочется на dglOpenGL.pas (v1.5) ;-) Ну или на крайняк на OpenGL.pas

    >>Stargazer  
    Незабудь сделать максимальное сжатие... лучше 7-zip формат 7z(если есть) но и RAR'ом подойдёт! =)
  • Wyvern (30.12.04 00:54) [21]
    dglOpenGL.pas
    К FPC нормально цепляется, только кое-что переделать пришлось.
    Модуль лежит здесь: http://wyvern.nightmail.ru/dglOpenGL_for_FPC.rar
    Кстати модуль Texture первоначально делался под dglOpenGL ;)
    Лежит здесь: http://wyvern.nightmail.ru/Texture_for_dglOpenGL.rar
    Как будет время, сделаю базовую прогу.
  • Wyvern (30.12.04 21:20) [22]
    Вот базовая прога (source + bin) под dglOpenGL, с самодельным OpenGL'овским прогрессбаром (клавиши + и -).
    Лежит здесь: http://wyvern.nightmail.ru/OpenGL_Template.rar
  • Sniper17 (31.12.04 16:20) [23]
    Компилятором 1.0.10 не компилится ;-(
  • Sniper17 (31.12.04 16:24) [24]
    Ошибки в модуле Textures....
  • Wyvern (31.12.04 20:18) [25]
    Sniper17>Компилятором 1.0.10 не компилится ;-(
    ?
    Компилил с помощью DevPascal c прицепленным компилятором 1.0.10
    Бинарник же как-то получился...

    Sniper17>Ошибки в модуле Textures....
    Какие?

    Сглючил файл OpenGL_Template.dp.

    Его содержание должно быть таким:

    [Project]
    FileName=D:\DevPas\Project\OpenGL_Template\OpenGL_Template.dp
    Name=OpenGLTemplate
    MainUnit=D:\DevPas\Project\OpenGL_Template\Texture.pas
    UnitCount=3
    ResFiles=D:\DevPas\Project\OpenGL_Template\rsrc.rc
    NoConsole=1
    IsDll=0
    Icon=D:\DevPas\Project\OpenGL_Template\CobraMK3.ico
    CompilerOptions=
    IncludeDirs=
    ObjFile=
    [Unit1]
    FileName=D:\DevPas\Project\OpenGL_Template\Main.pas
    FileTime=832481002
    [Unit2]
    FileName=D:\DevPas\Project\OpenGL_Template\Texture.pas
    FileTime=832481002
    [Unit3]
    FileName=D:\DevPas\Project\OpenGL_Template\OGLT_Modules.pas
    FileTime=832481528
  • Sniper17 (31.12.04 22:11) [26]
    Ну не знаю.. у меня нет DevPascal у меня только IDE под DOS ;-)))
    Пытался компилить main.pas... получается только если отрубить textures и файл exe какой то большой 900Kb ж-(
  • Sniper17 (01.01.05 04:11) [27]
    Скачал Dev-Pascal... создал проект.. добавил файлы скомпилировал ресурс (иконку)... Далее компилирую, выдаётся Compiler and Linker window... в нём hint'ы и никакого exe файла не получается! ;-(((
  • Wyvern (01.01.05 15:15) [28]
    Из FPC 1.0.10 берём папку BIN и UNITS и заменяем ими аналогичные в DevPas (те что в DevPas надо грохнуть или переместить куда-нибудь).
    Правим файл devpas.ini следующим образом (предполагаестся, что DevPas установлен на диске D):

    [Directories]
    BinDir=D:\DevPas\bin\win32\
    PasDir=D:\DevPas\units\win32\;D:\DevPas\units\win32\rtl\;D:\DevPas\units\win32\fcl\
    LibDir=D:\DevPas\units\win32\;D:\DevPas\units\win32\rtl\;D:\DevPas\units\win32\fcl\
    AddDir=0
    Dir=
    AddCommands=0
    Commands=
    [Saved_Dirs_Freepascal]
    BinDir=D:\DevPas\bin\win32\
    PasDir=D:\DevPas\units\win32\;D:\DevPas\units\win32\rtl\;D:\DevPas\units\win32\fcl\
    LibDir=D:\DevPas\units\win32\;D:\DevPas\units\win32\rtl\;D:\DevPas\units\win32\fcl\

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

    Вот вроде бы всё, если не поможет попробую выложить DevPas со встроенным FPC 1.0.10 (всё это хозяйство около 9~10 МБ весит RAR3.xx + Мах сжатие + непрерывный архив, и через момед тягать фиговато  :(  ).
  • Sniper17 (01.01.05 18:27) [29]
    Сделал всё как написано... (промучался почти час ;-)))

    Скопилировал тестовый "проект"

    program Untitled;
    var
    i: Integer;
    begin
    i:=i+1;
    end.
    Компилируется пишет "Project 2 compiled successfully" exe создаётся и жизнь хороша ;-)
    Пытаюсь скомпилтровать OpenGL шаблон... нифига
    Куча вот таких сообщений
    "633 / 14 texture.pas Hint: Local type PHUFF is not used"
    И в конце НЕ пишется "compiled successfully" и exe не создаётся! ;-(
  • Sniper17 (01.01.05 18:35) [30]
    Всё получилось! Порядок модулей надо было поменять! ;-)))))
  • Wyvern (01.01.05 22:14) [31]
    Sniper17>Всё получилось! Порядок модулей надо было поменять!
    Тады ура :) .
    А насчёт сообщений:
    "633 / 14 texture.pas Hint: Local type PHUFF is not used"
    Это функция загрузки JPG файлов, я допинал её чтоб заработала отдельно от кучи других модулей (в оригинале она должна была загружать GIF, TGA, JPG, PNG?) цепляла к себе ДиректХы и ещё всякого разного (JPG не зеркалила, да и ошибочки были некоторые).
  • Sniper17 (03.01.05 01:38) [32]
    >>Wyvern:
    теперь вопрос как думаешь стоит ли переписать мою OpenGL недо-гамезу под FreePascal... будут ли ОЩУТИМЫЕ ПЛЮСЫ?
  • Wyvern (04.01.05 00:40) [33]
    Sniper17:
    как думаешь стоит ли переписать мою OpenGL недо-гамезу под FreePascal... будут ли ОЩУТИМЫЕ ПЛЮСЫ?

    Ощутимые в чём, в скорости - не знаю, в объёме - а смысл (текстурный модуль выигрывает порядка 50 кило, т.к. не используется запись JPG изображений, но при нынешних объёмах памяти это несуществено), разве что можешь продавать её за денежку без отчислений борланду и т.п. (вроде бы).
    Ну и чисто для себя, типа Я МОГУ. :)
  • Sniper17 (04.01.05 01:14) [34]
    А как насчёт директив типа {$mmx} и опций компилера target processor, Level1 и Level2 optimization?
  • Wyvern (04.01.05 16:02) [35]
    >>Sniper17:
    А как насчёт директив типа {$mmx} и опций компилера target processor, Level1 и Level2 optimization?

    Я в такие тонкости ещё не влезал. %)
  • Sniper17 (04.01.05 16:20) [36]
    Wyvern: а я первое что смотрю - это опции компилятора.. %-)
  • frame © (02.02.05 01:26) [37]
    Как-то всё у вас тут тяжело, если эта тема кого-то ещё интересует, могу выложить свои исходники и пояснить, если что, программы у меня на чистом Win32API, компилятся как в Delphi так и FreePascal
  • Sniper17 (03.02.05 18:03) [38]
    Конечно интересует! =)
  • frame © (04.02.05 02:23) [39]
    Мой пример: http://opengl.land.ru/files/example1.zip
    Иногда проще написать самому, чем добиться этого от окружающих =)
    Сам юнит называется texload.pas, к нему же пример использования.
    Если возникнут вопросы - на главной странице сайта есть мой номер ICQ.
    Советую также посмотреть http://www.itc.ua/print.phtml?ID=15800
  • frame © (04.02.05 02:39) [40]
    Вот забыл. Основной файл - template.dpr. Если компилировать в Delphi то ничего менять не нужно, если в FreePascal - расширение вместо dpr на pas поменять (хотя если не менять оно тоже скомпилируется, только в fp.exe подсветка синтаксиса на этом файле работать не будет).
  • Sniper17 (04.02.05 15:07) [41]
    FPC скомпилил без вопросов! ;-)  Delphi 7 не хочет - обижается на стоки ReadFile(F,Header,SizeOF(Header),n,nil) фразами
    [Error] TexLoad.pas(179): Types of actual and formal var parameters must be identical
  • frame © (04.02.05 18:46) [42]
    Delphi7 не для OpenGL на мой взгляд, у меня Delphi 3 - всё ок! Хотя я всё равно разберусь ;) Вот, кстати http://opengl.land.ru/files/header.zip ->
    моя версия gl.pp (только для win32!) - по идее, должно уменьшить размер exe на 20-30кб
  • frame © (04.02.05 22:37) [43]
    Попробуй посмотреть, какие параметры требует ReadFile в Delphi7. Мне кажется, если два последних поменять с Integer на Longint или что-то в этом роде, то должно работать.
  • Sniper17 (07.02.05 17:44) [44]
    Кстати не работает на 1.9.6. Работает только на 1.0.10 ;-(
  • frame © (08.02.05 00:42) [45]
    В IDE нужно поставить mode-release, тогда всё заработает. У меня с коммандной строки всё компилируется и запускается без проблем.
    Для gl.pp нужно включить smartlink (он собственно, для этого режима и делался)
    Вы ж как-то поинформативней описуйте ошибки ;)
  • Wyvern (25.02.05 15:30) [46]
    >>frame: Как-то всё у вас тут тяжело
    Так онож ещё и JPG грузит (да и заголовочный файл ипользуется нестандартный dglOpenGL.pas, всё-в-одном).
    >>frame: Иногда проще написать самому, чем добиться этого от окружающих =)
    Всегда :о)
  • Sniper17 (26.02.05 13:25) [47]
    новый dglOpenGL.pas с версии 1.6 поддерживает и FPC=)
    Может переделать?
  • Wyvern (27.02.05 23:13) [48]
    >>Sniper17: новый dglOpenGL.pas с версии 1.6 поддерживает и FPC
    Уже 1.6 есть, это хорошо :о)
    1.5 тоже FPC поддерживает, только как-то коряво.

    >>Sniper17: Может переделать?
    Чего переделать?
  • Romtek (01.08.05 19:16) [49]
    Модуль texload.pas не скомпилировался:
    Texture.pas(508,31) Error: You can not reach COSTAB from that code
    Texture.pas(564,31) Error: You can not reach COSTAB from that code


    отсюда:
    PROCEDURE invDCTfix(var dst,src:Tblocklongint);assembler;
  • имя (23.07.09 14:42) [50]
    Удалено модератором
  • 0x00FF00 (15.11.09 16:02) [51]
    звиняюсь за некропостинг, однако не удержусь:


    > procedure CopySwapPixel(const source, destination: Pointer);
    > asm push eax push edx push ebx mov eax, source mov edx,
    > destination mov bl,[eax+0] mov bh,[eax+1] mov [edx+2],bl
    > mov [edx+1],bh mov bl,[eax+2] mov bh,[eax+3] mov [edx+0],
    > bl mov [edx+3],bh pop ebx pop edx pop eaxend;


    о хосспаде...
    кто писал это... этот... код?
    есть ведь гораздо более быстрые (алсо, вменяемые) способы!

    EAX: [ 0 1 2 3 ]
    EDX: [ 2 1 0 3 ]

    напоминает RGBA -> BGRA переход, правда?
    не проще ли будет сделать вот так:

    procedure CopySwapPixel(const source, destination: Pointer);
    asm
     MOV ECX, [EAX];
     BSWAP ECX;
     ROR ECX, 8;
     MOV [EDX], ECX;
    end;


    по х86-соглашениям (а этот код определённо заточен под 32, если Pointer-ы имеют четырёхбайтный размер), стандартная pascal-евская директива вызова предполагает наличие в EAX первого параметра, а в EDX — второго.
    на протяжении всех 4 строчек ни тот, ни другой, в полном согласии с директивой const, вручную не меняются.
    по тем же соглашениям, *CX и *DX — это регистры, сохраняемые вызывающим, т.е. вызываемая подпрограмма о них заботиться не должна.

    единственное замечание — указанный код не заработает на процессоре классом ниже *486.
    впрочем, не думаю, что в наше время кто-то попытается для раскодировки всяческой мультимедии пользовать триставосьмидесятники %)
    но если уж вдруг, могу предоставить код и для них:

    procedure CopySwapPixel(const source, destination: Pointer);
    asm
     MOV ECX, [EAX];
     XCHG CL, CH;
     ROL ECX, 16;
     XCHG CL, CH;
     ROL ECX, 8;
     MOV [EDX], ECX;
    end;



    (была, впрочем, реализация и в три строки, только, к сожалению, забыл принцип, там использовавшийся. пусть уж так. кому они, в конце концов, нужны на десктопах, эти триставосьмидесятники...)
  • Sergey (20.01.10 17:11) [52]
    У меня почему-то компилятор ругается на директивы {$MODE DELPHI}
    {$asmmode Intel}
  • 0x00FF00 (27.01.10 19:10) [53]

    > У меня почему-то компилятор ругается на директивы
    > {$MODE DELPHI} {$asmmode Intel}

    возможно, компилятор не тот? =)
    взгляни на название конференции.
 
Конференция "FreePascal" » Модуль Texture.pas от Jan Horn [Win32]
Есть новые Нет новых   [118656   +18][b:0.001][p:0.002]