Subversion Repositories Kolibri OS

Rev

Rev 6836 | 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. ; img_w, img_h - переменные куда будут записаны размеры открываемого
  28. ;    изображения, не обязательные параметры
  29. ; bytes_p_p - сколько байт памяти брать на пиксель, не обязательный параметр
  30. ;    если не указан берется 3. Минимальное значение должно быть не меньше 3.
  31. macro load_image_file path, buf, img_w, img_h, bytes_p_p
  32. {
  33. local .end_open
  34. if path eqtype '' ;проверяем задан ли строкой параметр path
  35.         local .path_str
  36.         jmp @f
  37.                 .path_str db path ;формируем локальную переменную
  38.                 db 0
  39.         @@:
  40.         ;32 - стандартный адрес по которому должен быть буфер с системным путем
  41.         copy_path .path_str,[32],file_name,0
  42. else
  43.         copy_path path,[32],file_name,0 ;формируем полный путь к файлу изображения, подразумеваем что он в одной папке с программой
  44. end if
  45.     mov [run_file_70.Function], SSF_GET_INFO
  46.     mov [run_file_70.Position], 0
  47.     mov [run_file_70.Flags], 0
  48.     mov dword[run_file_70.Count], 0
  49.     mov dword[run_file_70.Buffer], open_b
  50.     mov byte[run_file_70+20], 0
  51.     mov dword[run_file_70.FileName], file_name
  52.     mcall SF_FILE,run_file_70
  53.         or eax,eax
  54.         jnz .end_open
  55.  
  56.     mov ecx,dword[open_b+32] ;+32 qword: размер файла в байтах
  57.     stdcall mem.Alloc,ecx ;выделяем память для изображения
  58.         mov [buf],eax
  59.         mov [run_file_70.Function], SSF_READ_FILE
  60.         mov [run_file_70.Position], 0
  61.         mov [run_file_70.Flags], 0
  62.         mov [run_file_70.Count], ecx
  63.         mov [run_file_70.Buffer], eax
  64.         mov byte[run_file_70+20], 0
  65.         mov [run_file_70.FileName], file_name
  66.         mcall SF_FILE,run_file_70 ;загружаем файл изображения
  67.         cmp ebx,0xffffffff
  68.         je .end_open
  69.                 ;определяем вид изображения и пишем его параметры
  70.                 stdcall [img_decode], [buf],ebx,0
  71.                 mov ebx,eax
  72.                 ;определяем размер декодированного изображения
  73.                 mov ecx,[eax+4] ;+4 = image width
  74. if img_w eq
  75. else
  76.                 mov dword[img_w],ecx
  77. end if
  78. if img_h eq
  79.                 imul ecx,[eax+8] ;+8 = image height
  80. else
  81.                 mov eax,[eax+8] ;+8 = image height
  82.                 mov dword[img_h],eax
  83.                 imul ecx,eax
  84. end if
  85. if bytes_p_p eq
  86.                 imul ecx,3 ;need for r,g,b
  87. else
  88.                 imul ecx,bytes_p_p
  89. end if
  90.                 stdcall mem.ReAlloc,[buf],ecx ;изменяем размер для буфера
  91.                 mov [buf],eax
  92.                 stdcall [img_to_rgb2], ebx,[buf] ;преобразуем изображение к формату rgb
  93.                 stdcall [img_destroy], ebx ;удаляем временный буфер с параметрами изображения
  94.         .end_open:
  95. }
  96.