Subversion Repositories Kolibri OS

Rev

Rev 6200 | Rev 6879 | Go to most recent revision | Blame | Compare with Previous | Last modification | View Log | RSS feed

  1. ;
  2. ; Макрос для загрузки изображений чрез функции библиотеки libimg.
  3. ; Действия которые делает макрос load_image_file:
  4. ;
  5. ; Проверяет размер полученного файла с изображением.
  6. ; Выделяет под него память и загружает туда файл.
  7. ; Определяет размер памяти необходимой для распаковки изображения.
  8. ; Перевыделяет память, и распаковывает изображение из форматов jpg, png, ...
  9. ;    в формат rgb который можно выводить на экран через сист. функцию.
  10. ; При необходимости можно также получить размеры открываемого изображения для
  11. ;    их дальнейшего использования в программе.
  12. ;
  13. ; В использующей программе должна быть подключена библиотека libimg,
  14. ;    объявлена переменная file_name размером около 4096 байт,
  15. ;    а также структура run_file_70 типа FileInfoBlock.
  16.  
  17. ; подключение некоторых необходимых файлов:
  18. include 'dll.inc'
  19. include 'develop/libraries/box_lib/load_lib.mac'
  20. include 'libio.inc'
  21.  
  22. align 4
  23. open_b rb 560
  24.  
  25. ; path - может быть переменной или строковым параметром
  26. ; buf - переменная куда будет записан указатель на изображение в формате rgb,
  27. ;    в случае если файл не откроется то будет записан 0
  28. ; img_w, img_h - переменные куда будут записаны размеры открываемого
  29. ;    изображения, не обязательные параметры
  30. ; bytes_p_p - сколько байт памяти брать на пиксель, не обязательный параметр
  31. ;    если не указан берется 3. Минимальное значение должно быть не меньше 3.
  32. macro load_image_file path, buf, img_w, img_h, bytes_p_p
  33. {
  34. local .end_open
  35. if path eqtype '' ;проверяем задан ли строкой параметр path
  36.         local .path_str
  37.         jmp @f
  38.                 .path_str db path ;формируем локальную переменную
  39.                 db 0
  40.         @@:
  41.         ;32 - стандартный адрес по которому должен быть буфер с системным путем
  42.         copy_path .path_str,[32],file_name,0
  43. else
  44.         copy_path path,[32],file_name,0 ;формируем полный путь к файлу изображения, подразумеваем что он в одной папке с программой
  45. end if
  46.         mov dword[buf],0
  47.  
  48.     mov [run_file_70.Function], SSF_GET_INFO
  49.     mov [run_file_70.Position], 0
  50.     mov [run_file_70.Flags], 0
  51.     mov dword[run_file_70.Count], 0
  52.     mov dword[run_file_70.Buffer], open_b
  53.     mov byte[run_file_70+20], 0
  54.     mov dword[run_file_70.FileName], file_name
  55.     mcall SF_FILE,run_file_70
  56.         or eax,eax
  57.         jnz .end_open
  58.  
  59.     mov ecx,dword[open_b+32] ;+32 qword: размер файла в байтах
  60.     stdcall mem.Alloc,ecx ;выделяем память для изображения
  61.         mov [buf],eax
  62.         mov [run_file_70.Function], SSF_READ_FILE
  63.         mov [run_file_70.Position], 0
  64.         mov [run_file_70.Flags], 0
  65.         mov [run_file_70.Count], ecx
  66.         mov [run_file_70.Buffer], eax
  67.         mov byte[run_file_70+20], 0
  68.         mov [run_file_70.FileName], file_name
  69.         mcall SF_FILE,run_file_70 ;загружаем файл изображения
  70.         cmp ebx,0xffffffff
  71.         je .end_open
  72.                 ;определяем вид изображения и пишем его параметры
  73.                 stdcall [img_decode], [buf],ebx,0
  74.                 mov ebx,eax
  75.                 ;определяем размер декодированного изображения
  76.                 mov ecx,[eax+4] ;+4 = image width
  77. if img_w eq
  78. else
  79.                 mov dword[img_w],ecx
  80. end if
  81. if img_h eq
  82.                 imul ecx,[eax+8] ;+8 = image height
  83. else
  84.                 mov eax,[eax+8] ;+8 = image height
  85.                 mov dword[img_h],eax
  86.                 imul ecx,eax
  87. end if
  88. if bytes_p_p eq
  89.                 imul ecx,3 ;need for r,g,b
  90. else
  91.                 imul ecx,bytes_p_p
  92. end if
  93.                 stdcall mem.ReAlloc,[buf],ecx ;изменяем размер для буфера
  94.                 mov [buf],eax
  95.                 stdcall [img_to_rgb2], ebx,[buf] ;преобразуем изображение к формату rgb
  96.                 stdcall [img_destroy], ebx ;удаляем временный буфер с параметрами изображения
  97.         .end_open:
  98. }
  99.