Всем привет!
Начинаю реализовывать понемногу своё желание иметь флеш плеер в Колибри.
Об этом своём желании я уже упоминал раньше в теме про fliplayer viewtopic.php?f=9&t=1172
Вот здесь пока только заготовка на будующее http://ftp.kolibrios.org/users/Asper/Kofee/
P.S. Давно ничего не писал и даже не было времени заглянуть на форум, но я непременно вернусь к активной деятельности. Вот только дипломную работу сдам.
Kofee - Flash player
-
Last edited by Asper on Thu Jun 25, 2009 6:41 am, edited 1 time in total.
Да и ещё http://www.adobe.com/devnet/swf/pdf/swf ... ec_v10.pdf - очень толковая документация по формату swf, всё, что нужно программисту ничего лишнего. Первый раз встретилась англоязычная документация "без воды".
Ещё если есть люди кого интересует вопрос написания флеш плеера рекомендую скачать gnash - флеш плеер, который может выдавать лог по ходу парсинга флеш флайла. Gnash можно использовать в качестве дефлешера (термин сам только что придумал по аналогии с дизассемблером, декомпилятором и т.д.), чтобы меньше времени тратить на высчитывание битовых полей, при тестировании.
Ещё если есть люди кого интересует вопрос написания флеш плеера рекомендую скачать gnash - флеш плеер, который может выдавать лог по ходу парсинга флеш флайла. Gnash можно использовать в качестве дефлешера (термин сам только что придумал по аналогии с дизассемблером, декомпилятором и т.д.), чтобы меньше времени тратить на высчитывание битовых полей, при тестировании.
Last edited by Asper on Thu Jun 25, 2009 6:41 am, edited 1 time in total.
Я недавно думал написать программу, с использованием прозрачных изображений, и с градиентными переходами от одного цвета к другому.
Asper ты можешь взять для своего плеера функцию ColSm, хотя может подобные функции у тебя уже есть
Asper ты можешь взять для своего плеера функцию ColSm, хотя может подобные функции у тебя уже есть
Code: Select all
;input:
; edx = transparent color
; edi = background color
;output:
; edx = combine color
ColSm:
.........
- Attachments
-
-
color_t.7z (1.33 KiB)
- В программе рисуется красный прямоугольник, а под ним синий цвет. А степень прозрачности разная, за счет чего получается плавный переход.
Downloaded 462 times
-
Спасибо за код. Реализацией вывода фреймов на экран и вообще векторной графикой ещё не занимался, программа пока что делает только общий парсинг swf (не cws) файлов, и вызывает соответсвующую функцию-обработчик тега из таблицы тегов, если тег не реализован (адрес обработчика = 0) тег просто отбрасывается и парсер берется за следующий тег. На текущий момент реализован только тег № 9 - установка фонового цвета.
как работа с плеером , продвигается ?
Мы не часть этого мира , мы его творцы
Пока ещё не было возможности им заняться. Написал пока что DisplayList и Dictionary. Следующий шаг скорее всего вывод shape'ов на экран.
Вкратце опишу работу Kofee (текущей версии).
Сейчас плеер состоит из 6 модулей:
1. Kofee.asm - Основной модуль плеера.
2. DisplayList.inc - Модуль отвечающий за работу со словарем (Dictionary) и Списком Отображения (DisplayList). Пока не доработан.
3. tags.inc - Содержит таблицу тегов (массив указателей на функции) и функции-обработчики тегов.
4. bitStream.inc - Предназначен для работы с битовыми полями. Пока содержит одну функцию Read_Bitfield для чтения битового поля заданной длины с указанной позиции (адрес первого байта битового поля в памяти и номер первого бита битового поля в указанном байте).
5. dataTypes.inc - Типы данных SWF.
6. aspAPI.inc - Функции API KolibriOS.
Алгоритм работы программы.
В настоящее время реализована, только функция-обработчик тега № 9 (установка фонового цвета).
Сейчас плеер состоит из 6 модулей:
1. Kofee.asm - Основной модуль плеера.
2. DisplayList.inc - Модуль отвечающий за работу со словарем (Dictionary) и Списком Отображения (DisplayList). Пока не доработан.
3. tags.inc - Содержит таблицу тегов (массив указателей на функции) и функции-обработчики тегов.
4. bitStream.inc - Предназначен для работы с битовыми полями. Пока содержит одну функцию Read_Bitfield для чтения битового поля заданной длины с указанной позиции (адрес первого байта битового поля в памяти и номер первого бита битового поля в указанном байте).
5. dataTypes.inc - Типы данных SWF.
6. aspAPI.inc - Функции API KolibriOS.
Алгоритм работы программы.
Code: Select all
ProcessFile: ; Общая процедура обработки файла.
call ReadHeader ; Считываем заголовок SWF файла.
jc .out ; если файл не SWF то выход.
call Memory_Init ; На основе информации полученной из заголовка инициализируем память.
jc .out ; если ошибка то выход
call ReadFile2Memory ; Считываем весь файл в память
jc .out ; если ошибка ФС то выход
; call ResizeWindowToFrame ;Если раскомментировать эту строку, то окно будет
; автоматически изменено до размеров фрейма.
call ParseSWFFile ; Процедура общего парсинга SWF файла.
jc .out
call Memory_Done ; Освобождение памяти.
.out: ; Выход.
ret
proc ParseSWFFile stdcall
locals
lTag dw ?
endl
mov esi, dword [Buffer]
add esi, dword [file_header_size]
xor ecx, ecx
.next_tag:
; Read tag (Читаем тег)
lodsw
mov word [lTag], ax
mov ebx, eax
and ebx, 0xFFC0
shr ebx, 6 ; ebx = tag type
and eax, 0x3F ; eax = tag length
cmp eax, 0x3F ; is long tag ? (длинный тег?)
jne @f
lodsd
@@:
if DEBUG
pusha
stdcall bar, 90, 150, 50, 50, 0;x3377
; TagType
stdcall prints, 10, 150, dbgTagType, TEXTCOLOR
stdcall print_num, 90, 150, ebx, 0, NUMCOLOR
; TagLen
stdcall prints, 10, 160, dbgTagLen, TEXTCOLOR
stdcall print_num, 90, 160, eax, 0, NUMCOLOR
; TagEnd
stdcall prints, 10, 170, dbgTagEnd, TEXTCOLOR
add eax, esi
sub eax, dword [Buffer]
stdcall print_num, 90, 170, eax, 0, NUMCOLOR
; TagIndex
stdcall prints, 10, 190, dbgTagIndex, TEXTCOLOR
stdcall print_num, 90, 190, ecx, 0, NUMCOLOR
popa
end if
cmp ebx, TAGS_NUM ; Skip tags with TagType field greater then the TagsTable
jg @f ; Пропускаем тег, если значение поля TagType больше размера таблицы тегов
mov edi, TagsTable
shl ebx, 2 ; ebx*=4
add edi, ebx
shr ebx, 2
cmp dword [edi], 0
je @f
call dword [edi] ; Call the tag service routine (Вызов функции-обработчика тега)
jc .err_out
@@:
add esi, eax
mov dword [filepos], esi
inc ecx
mov eax, 11 ; Test if there is an event in the queue. (Не забываем реагировать на события KolibriOS).
int 0x40
call ProcessEvent
; cmp ebx, 2 ; DEBUG: Terminate on the tag type = ebx ; А это для отладки
; je .out
;cmp ecx, 2 ; DEBUG: Terminate on the tag number = ecx ; И это для отладки тоже
;je .out
; Test that the filepointer esi not greater than start of the Buffer + FileLength
; Проверка на то, чтобы указатель текущего смещения, содержащийся в esi не больше
; чем начало буфера данных (SWF файл в памяти) Buffer + длина файла FileLength
mov eax, esi
sub eax, dword [Buffer]
cmp eax, dword [FileHeader.FileLength]
jg .err_out
test ebx, ebx ; tag type = 0 <- 'End' tag
jnz .next_tag
; cmp eax, dword [FileHeader.FileLength] ; Does 'End' tag for a sprite ?
; jl .next_tag ; if yes - continue loop
.out:
clc
ret
.err_out:
stc
ret
endp
а это возможно в дальнейшем, чтобы часть Kofee стала библиотекой для использования во всяких разных каких-нибудь ( ) других приложениях?
И мы уже давно не пешки,
Мы пули, мы орлы, и решки!
Война ютит бинарный код,
Умри, или иди вперед!
Мы пули, мы орлы, и решки!
Война ютит бинарный код,
Умри, или иди вперед!
Так и задумывалось, но на этапе разработки мне проще зашить весь код в программу. Когда станет более-менее юзабельно сделать библиотеку не составит труда, а Kofee как флэшплеер будет вызывать функции из этой библиотеки.
думаю, нам для Kofee и программной реализации viewtopic.php?f=2&t=1489 не помешает разработать или улучшить существующую какую-нибудь библиотеку, позволяющую формировать в памяти изображения на основе примитивов, кривых Безье, поддерживающую сглаживание, обводки объектов разными типами линий, и т.п.
Есть идеи?
Есть идеи?
И мы уже давно не пешки,
Мы пули, мы орлы, и решки!
Война ютит бинарный код,
Умри, или иди вперед!
Мы пули, мы орлы, и решки!
Война ютит бинарный код,
Умри, или иди вперед!
Посмотрел Pixlib, Buf2D, libGFX, gb_lib. Больше всего подходит Buf2D как наиболее развитая библиотека.
Spoiler:
Вступление
Документация к свободной библиотеке buf2d.asm, для ОС Колибри. Эта библиотека создана для работы с 2d изображениями. С ее помощьью можно создавать буфера с изображениями в памяти, и при необходимости выводить их на экран. Изображения можно накладывать одно на другое, поддерживается работа с прозрачными изображениями, есть функция рисования лини пока на этом все.
Последнее обновление библиотеки 30.07.10.
Форматы буферов
Поддерживается 3 формата буферов. Каждая функция при работе с буферами может быть расчитана на работу с определенными форматами изображений.
8 бит
Сожержит альфа канал a (прозрачность) изображения. На экран не выводится. Используется для созданя 32-битных буферов.
24 бит
Данный буфер содержит изображение в формате rgb. Может выводится на экран.
32 бит
Содержит прозрачное изображение в формате rgba. На экран не выводится. Используется для наложения изображений.
Функции
Почти все функции 1-м параметром принимают указатель на структуру буфера, из которой могут использоваться параметры, нужные для работы конкретной функции. Пример структуры буфера изображения:
align 4
buf_0:
dd 0 ;+ 0 указатель на буфер изображения
dw 100 ;+ 4 отступ слева
dw 10 ;+ 6 отступ справа
dd 150 ;+ 8 ширина
dd 100 ;+12 высота
dd 0x80 ;+16 фоновый цвет
db 24 ;+20 бит на пиксель
lib_init
Эта функция получает указатели на функции работы с памятью, вызыватся должна при загрузке библиотеки. Можете использовать макрос @use_library_mem, для ее автоматической настройки.
buf2d_create
Создает буфер и чистит его фоновым цветом.
buf2d_create_f_img
Создает буфер на основе изображения в формате rgb.
buf2d_clear
Чистит буфер фоновым цветом.
buf2d_draw
Рисует буфер на экране (работает через системную ф. 7). Рисуются только буфера с глубиной цвета 24 бита.
buf2d_delete
Освобождает память занятую изображением буфера.
buf2d_line
Рисует в буфере линию с заданным цветом и координатами. Пример использования:
stdcall [buf2d_line], buf_0, 30,10, 110,70, 0xffff00 ;рисуем линию
где buf_0 - структура буфера в котором будет рисоваться линия; 30, 10, 110, 70 - координаты линии; 0xffff00 - цвет линии.
buf2d_rect_by_size
Рисует прямоугольник, по двум координатам, 2-я координата задана по размеру.
stdcall [buf2d_rect_by_size], buf_0, 10,10,150,100, 0x8080
где buf_0 - структура буфера в котором будет рисоваться прямоугольник; 10, 10 - координаты левого верхнего угла; 150, 100 - размер прямоугольника; 0x8080 - цвет линии.
buf2d_circle
Рисует в буфере окружность с заданным цветом и радиусом. Пример использования:
stdcall [buf2d_circle], buf_0, 25, 70, 15, 0xff0000
где buf_0 - структура буфера в котором будет рисоваться окружность; 25, 70 - координаты центра; 15 - радиус; 0xff0000 - цвет.
buf2d_img_hdiv2
Сжимает изображение в буфере по высоте в 2 раза, при этом размер самого буфера не уменьшается.
buf2d_img_wdiv2
Сжимает изображение в буфере по ширине в 2 раза, при этом размер самого буфера не уменьшается.
buf2d_conv_24_to_8
Преобразование буфера из 24-битного в 8-битный. При преобразовании указывается какой цвет берать: 0-синий, 1-зеленый, 2-красный. Остальные цвета при преобразовании теряются.
buf2d_conv_24_to_32
Преобразование буфера из 24-битного в 32-битный. При преобразовании указывается также 8-битный буфер, который будет использован для создания альфа канала. Пример:
stdcall [buf2d_conv_24_to_32],buf_a,buf_b ;делаем буфер rgba 32бит
До выполнения функции буфер buf_a должен быть 24 битным, а буфер buf_b - 8 битным. После выполнения функции буфер buf_a станет 32 битным, буфер buf_b не изменится.
buf2d_bit_blt
Рисует в буфере изображение из другого буфера в указанных координатах. Буфер в котором рисут (приемник) должен быть 24 битным, а тот который рисуется (источник) 24 или 32 битным. Если буфер источник 32 битный, то его прозрачность при рисовании не учитывается, для учета прозрачности используется функция buf2d_bit_blt_transp.
buf2d_bit_blt_transp
Рисует в буфере изображение из другого буфера в указанных координатах, при этом учитывается прозрачность. Буфер который будет нарисован должен быть 32 битным, а тот в котором рисуют 24 битным.
buf2d_bit_blt_alpha
Рисует в буфере изображение из другого буфера в указанных координатах, при этом учитывается прозрачность. Буфер который будет нарисован должен быть 8 битным, а тот в котором рисуют 24 битным.
buf2d_cruve_bezier
Рисует по трем точкам отрезок кривой безье.
buf2d_convert_text_matrix
Преобразует матрицу с текстом размером 16*16 в размер 1*256. Необходимо для создания матрицы для рисования текста. Перед использованием данной функции предполагается что есть изображение с полным набором символов размером 16 столбцов на 16 строк, из которого предварительно был создан 8 битный буфер.
stdcall [buf2d_create_f_img], buf_1,[image_data] ;создаем буфер 24 бит на основе данных изображения
stdcall [buf2d_conv_24_to_8], buf_1,1 ;делаем буфер прозрачности 8 бит
stdcall [buf2d_convert_text_matrix], buf_1
где buf_1 - структура буфера для формирования текстовой матрицы; image_data - данные изображения текстовой матрицы в формате rgb, размером 16*16 символов.
buf2d_draw_text
Рисует текст в буфере, используя матрицу с текстом размером 1*256 символов. Пример:
stdcall [buf2d_draw_text], buf_0, buf_1,some_text,20,10,0x4040ff ;рисуем строку с текстом
где buf_0 - структура буфера в котором будет рисоваться текст; buf_1 - структура буфера с текстовой матрицей в формате 8 бит, размером 1*256 символов; some_text - текст, который будет выведен в буфер buf_0.
buf2d_crop_color
Обрезание буфера, по указанному цвету. Функция используется для уменьшения памяти, занимаемой буфером. Отрезаются крайние части буфера имеющие одинаковый цвет. Пример:
stdcall [buf2d_crop_color], buf_0,0xffffff,BUF2D_OPT_CROP_TOP+BUF2D_OPT_CROP_BOTTOM
где buf_0 - структура буфера который будет обрезан; 0xffffff - цвет по которому будет обрезаться буфер; BUF2D_OPT_CROP_TOP и BUF2D_OPT_CROP_BOTTOM - константы, указывающие с каких сторон обрезать буфер.
buf2d_offset_h
Сдвиг изображения в буфере по высоте вверх или вниз.
Константы
BUF2D_OPT_CROP_TOP equ 1
Константа для функции buf2d_crop_color, обозначает обрезку буфера сверху
BUF2D_OPT_CROP_LEFT equ 2
Константа для функции buf2d_crop_color, обозначает обрезку буфера слева
BUF2D_OPT_CROP_BOTTOM equ 4
Константа для функции buf2d_crop_color, обозначает обрезку буфера снизу
BUF2D_OPT_CROP_RIGHT equ 8
Константа для функции buf2d_crop_color, обозначает обрезку буфера справа
Вообще работа остановилась на том, что для Dictionary и DisplayList нужен обычный аллокатор памяти, который будет выделять столько памяти, сколько запрошено, а не целую страницу на каждую мелочь. Я старался писать Kofee "оптимально" и такой расход памяти мне не нравится. Вообще аллокатор по-моему можно написать и в третьем кольце на основе текущей сис. функции выделяющей память, только вот писать менеджер памяти мне не хочется.
Какие есть предложения?
Какие есть предложения?
Статично зарезервировать.Asper wrote: Какие есть предложения?
Нельзя. Во-первых я уже сказал, что стараюсь оптимизировать программу, где могу. Во-вторых нельзя предугать размер памяти, которая может понадобиться. Файлы swf могут содержать от нескольких тегов до нескольких тысяч.Mario wrote:Статично зарезервировать.
Asper
"Мелкие" аллокации для приложений нужны, но реализовать их на практике с нынешним менеджером памяти очень сложно. Он в принципе не может отслеживать блоки меньше 1 страницы. "Ядерный" malloc() работает только благодаря инвариантности верхних линейных адресов. В нижнем адресном пространстве будет чехарда при переключении задач.
Я сейчас работаю над принципиально новым "деревянным" менеджером памяти для Колибри-А, хочу также встроить туда и "мелкий" сервис.
До конца года надеюсь успеть.
Пока можешь работать со страничками, только помечай где в коде надо будет переделывать на malloc()
"Мелкие" аллокации для приложений нужны, но реализовать их на практике с нынешним менеджером памяти очень сложно. Он в принципе не может отслеживать блоки меньше 1 страницы. "Ядерный" malloc() работает только благодаря инвариантности верхних линейных адресов. В нижнем адресном пространстве будет чехарда при переключении задач.
Я сейчас работаю над принципиально новым "деревянным" менеджером памяти для Колибри-А, хочу также встроить туда и "мелкий" сервис.
До конца года надеюсь успеть.
Пока можешь работать со страничками, только помечай где в коде надо будет переделывать на malloc()
Who is online
Users browsing this forum: No registered users and 4 guests