Subversion Repositories Kolibri OS

Rev

Rev 6879 | Blame | Compare with Previous | Last modification | View Log | RSS feed

  1. ;
  2. ; Макросы для декодирования изображений чрез функции библиотеки libimg.
  3. ;
  4. ; (1) макрос load_image_file:
  5. ;
  6. ; Проверяет размер полученного файла с изображением.
  7. ; Выделяет под него память и загружает туда файл.
  8. ; Определяет размер памяти необходимой для распаковки изображения.
  9. ; Перевыделяет память, и распаковывает изображение из форматов jpg, png, ...
  10. ;    в формат rgb который можно выводить на экран через сист. функцию.
  11. ; При необходимости можно также получить размеры открываемого изображения для
  12. ;    их дальнейшего использования в программе.
  13. ;
  14. ; В использующей программе должна быть подключена библиотека libimg,
  15. ;    объявлена переменная file_name размером около 4096 байт,
  16. ;    а также структура run_file_70 типа FileInfoBlock.
  17. ;
  18. ; (2) макрос include_image_file:
  19. ;
  20. ; Внедряет изображение в файл программы.
  21. ; Определяет размер памяти необходимой для распаковки изображения.
  22. ; Выделяет память, и распаковывает изображение из форматов jpg, png, ...
  23. ;    в формат rgb который можно выводить на экран через сист. функцию.
  24. ; При необходимости можно также получить размеры внедренного изображения для
  25. ;    их дальнейшего использования в программе.
  26.  
  27. ; подключение некоторых необходимых файлов:
  28. include 'dll.inc'
  29. include 'develop/libraries/box_lib/load_lib.mac'
  30. include 'develop/libraries/libs-dev/libio/libio.inc'
  31.  
  32. align 4
  33. open_b rb 560
  34.  
  35. txt_err_img_file:
  36. if lang eq ru
  37.         db 'Ошибка N'
  38. .n: db '* при открытии файла '
  39. else
  40.         db 'Error N'
  41. .n: db '*. Can',39,'t open file '
  42. end if
  43. .f: dd 0,0
  44.  
  45. ; path - может быть переменной или строковым параметром
  46. ; buf - переменная куда будет записан указатель на изображение в формате rgb,
  47. ;    в случае если файл не откроется то будет записан 0
  48. ; img_w, img_h - переменные куда будут записаны размеры открываемого
  49. ;    изображения, не обязательные параметры
  50. ; bytes_p_p - сколько байт памяти брать на пиксель, не обязательный параметр
  51. ;    если не указан берется 3. Минимальное значение должно быть не меньше 3.
  52. macro load_image_file path, buf, img_w, img_h, bytes_p_p
  53. {
  54. local .err_open
  55. local .end_open
  56.  
  57. if path eqtype '' ;проверяем задан ли строкой параметр path
  58.         local .path_str
  59.         jmp @f
  60.                 .path_str db path ;формируем локальную переменную
  61.                 db 0
  62.         @@:
  63.         ;32 - стандартный адрес по которому должен быть буфер с системным путем
  64.         copy_path .path_str,[32],file_name,0
  65. else
  66.         copy_path path,[32],file_name,0 ;формируем полный путь к файлу изображения, подразумеваем что он в одной папке с программой
  67. end if
  68.         mov dword[buf],0
  69.  
  70.         mov [run_file_70.Function], SSF_GET_INFO
  71.         mov [run_file_70.Position], 0
  72.         mov [run_file_70.Flags], 0
  73.         mov dword[run_file_70.Count], 0
  74.         mov dword[run_file_70.Buffer], open_b
  75.         mov byte[run_file_70+20], 0
  76.         mov dword[run_file_70.FileName], file_name
  77.         mcall SF_FILE,run_file_70
  78.         or eax,eax
  79.         jnz .err_open
  80.  
  81.                 mov ecx,dword[open_b+32] ;+32 qword: размер файла в байтах
  82.                 stdcall mem.Alloc,ecx ;выделяем память для изображения
  83.                 mov [buf],eax
  84.                 mov [run_file_70.Function], SSF_READ_FILE
  85.                 mov [run_file_70.Position], 0
  86.                 mov [run_file_70.Flags], 0
  87.                 mov [run_file_70.Count], ecx
  88.                 mov [run_file_70.Buffer], eax
  89.                 mov byte[run_file_70+20], 0
  90.                 mov [run_file_70.FileName], file_name
  91.                 mcall SF_FILE,run_file_70 ;загружаем файл изображения
  92.                 test eax,eax
  93.                 jnz .err_open
  94.                 cmp ebx,0xffffffff
  95.                 je .end_open
  96.                         ;определяем вид изображения и пишем его параметры
  97.                         stdcall [img_decode], [buf],ebx,0
  98.                         mov ebx,eax
  99.                         ;определяем размер декодированного изображения
  100.                         mov ecx,[eax+4] ;+4 = image width
  101. if img_w eq
  102. else
  103.                         mov dword[img_w],ecx
  104. end if
  105. if img_h eq
  106.                         imul ecx,[eax+8] ;+8 = image height
  107. else
  108.                         mov eax,[eax+8] ;+8 = image height
  109.                         mov dword[img_h],eax
  110.                         imul ecx,eax
  111. end if
  112. if bytes_p_p eq
  113.                         imul ecx,3 ;need for r,g,b
  114. else
  115.                         imul ecx,bytes_p_p
  116. end if
  117.                         stdcall mem.ReAlloc,[buf],ecx ;изменяем размер для буфера
  118.                         mov [buf],eax
  119.                         stdcall [img_to_rgb2], ebx,[buf] ;преобразуем изображение к формату rgb
  120.                         stdcall [img_destroy], ebx ;удаляем временный буфер с параметрами изображения
  121.                         jmp .end_open
  122.         .err_open:
  123.                 add al,'0'
  124.                 mov byte[txt_err_img_file.n],al
  125. if path eqtype ''
  126.                 mov eax,dword[.path_str]
  127.                 mov dword[txt_err_img_file.f],eax
  128.                 mov eax,dword[.path_str+4]
  129. else
  130.                 mov eax,dword[path]
  131.                 mov dword[txt_err_img_file.f],eax
  132.                 mov eax,dword[path+4]
  133. end if
  134.                 mov dword[txt_err_img_file.f+4],eax
  135.                 mov byte[txt_err_img_file.f+7],0
  136.                 notify_window_run txt_err_img_file
  137.         .end_open:
  138. }
  139.  
  140.  
  141.  
  142. ; path - имя включаемого файла
  143. ; buf - переменная куда будет записан указатель на изображение в формате rgb
  144. ; img_w, img_h - переменные куда будут записаны размеры изображения,
  145. ;    не обязательные параметры
  146. ; bytes_p_p - сколько байт памяти брать на пиксель, не обязательный параметр
  147. ;    если не указан берется 3. Минимальное значение должно быть не меньше 3.
  148. macro include_image_file path, buf, img_w, img_h, bytes_p_p
  149. {
  150. local .beg_file
  151. local .end_file
  152.  
  153. jmp .end_file
  154. align 4
  155. .beg_file:
  156.         file path
  157. .end_file:
  158.  
  159.         ;определяем вид изображения и пишем его параметры
  160.         stdcall [img_decode], .beg_file,.end_file-.beg_file,0
  161.         mov ebx,eax
  162.         ;определяем размер декодированного изображения
  163.         mov ecx,[eax+4] ;+4 = image width
  164. if img_w eq
  165. else
  166.         mov dword[img_w],ecx
  167. end if
  168. if img_h eq
  169.         imul ecx,[eax+8] ;+8 = image height
  170. else
  171.         mov eax,[eax+8] ;+8 = image height
  172.         mov dword[img_h],eax
  173.         imul ecx,eax
  174. end if
  175. if bytes_p_p eq
  176.         imul ecx,3 ;need for r,g,b
  177. else
  178.         imul ecx,bytes_p_p
  179. end if
  180.         stdcall mem.Alloc,ecx ;изменяем размер для буфера
  181.         mov [buf],eax
  182.         stdcall [img_to_rgb2], ebx,[buf] ;преобразуем изображение к формату rgb
  183.         stdcall [img_destroy], ebx ;удаляем временный буфер с параметрами изображения
  184. }