Kofee - Flash player

Processing, playback of audio and video
  • ЕМНИП когда еще не было 68 функции для управления памятью, был какой-то менеджер памяти для приложений основанный на 64 функции. Может у кого сохранился его код исходный.

    UPD Вот тема viewtopic.php?f=2&t=146
  • Сделал DisplayList и Dictionary. Каждый элемент этих двух структур занимает одну страницу памяти, но в принципе я придумал как использовать "лишнюю" память, по крайней мере для Dictionary. Можно записывать туда предварительно объявляемый обьект в удобной для последующей обработки структуре. Сейчас элемент Dictionary имеет такую структуру:

    Code: Select all

    ; Dictionary Item:
    ;     .CharacterId  dw ?
    ;     .Type         dw ?
    ;     .Address      dd ?
    а элемент DisplayList такую:

    Code: Select all

    ; DisplayList Item:
    ;     .CharacterId  dw ?
    ;     .Depth        dw ?
    ;     .Address      dd ?
    Сделал (частично) парсинг Shape. Только Shape с Newstyles ещё не поддерживаются.
    Прикрутил графическую библиотеку Buf2D. Как оказалось она замечательно подходит для флеша!
    Функции линии, кривой Безье по трём точкам, рисование в памяти, возможность сбрасывать изображение из одного буфера в другой, это как раз то, что нужно. В настоящее время не хватает возможности указывать толщину линии и функций заливки.

    Временно сделал рендеринг Shape'ов в один общий буфер на этапе объявления (DefineShape, DefineShape2, DefineShape3). Обрабатываются линии и кривые Безье, цвета линий пока ещё не задаются как следует. Буфер изображения не очищается, так что вся графика накладывается друг на друга, а не "анимируется". В парсере ещё есть несколько ошибок, из-за которых плеер иногда вылетает (потом исправлю).

    Надо будет сделать:
    1. Отдельный буфер изображения под каждый Shape.
    2. Трансформацию Shape на этапе помещения в DisplayList.
    3. Очищать общий буфер изображения при входе в ShowFrame.
    4. В ShowFrame скидывать изображения из буферов изображений, записанных в DisplayList в общий буфер (ImageBuffer0).
    5. Добавить задание цветов и толщины линий, заливку, градиенты и битмапы, вывод звука и т.д.
    6. Исправить имеющиеся ошибки в парсере.
    KOFEE.7z (40.22 KiB)
    Downloaded 367 times
    Здесь 3 swf файла для примера.
    testfiles.7z (41.22 KiB)
    Downloaded 358 times
  • Вот так они должны выглядеть:
    Spoiler:
    Файл сделанный по заказу Gluk'a :)
    1mn_1.PNG (10.42 KiB)
    Файл сделанный по заказу Gluk'a :) Viewed 8291 times
    Spoiler:
    Пример из спецификации на формат SWF от компании Adobe
    Adobe_1.PNG (4.87 KiB)
    Пример из спецификации на формат SWF от компании Adobe Viewed 8291 times
    Spoiler:
    Информация на одну из лучших демок
    Heaven7_1.PNG (34.35 KiB)
    Информация на одну из лучших демок Viewed 8291 times
  • а вот так их сейчас показывает Kofee:
    Spoiler:
    Файл сделанный по заказу Gluk'a :)
    1MN.PNG (6.96 KiB)
    Файл сделанный по заказу Gluk'a :) Viewed 8288 times
    Spoiler:
    Пример из спецификации на формат SWF от компании Adobe
    ADOBE.PNG (6.12 KiB)
    Пример из спецификации на формат SWF от компании Adobe Viewed 8288 times
    Spoiler:
    Информация на одну из лучших демок
    HEAVEN7.PNG (22.01 KiB)
    Информация на одну из лучших демок Viewed 8288 times
  • Asper
    Если есть необходимость, могу прикрутить OpenDialog. Load_Lib уже используется, а данные для Proc_Lib много места не займут. Вообще наверное пора над интерфейсом поработать и залить исходники на SVN, если не против.
  • Mario
    Если хочешь прикрути OpenDialog и залей на SVN. Только код ещё будет сильно видоизменён, с учётом всего вышеперечисленного.
  • Ну, я надеюсь ты не глядя заливать на SVN не станешь.
    И потом уже будешь работать с той версией. Иначе весь смысл потеряется.
  • Mario wrote:Ну, я надеюсь ты не глядя заливать на SVN не станешь.
    И потом уже будешь работать с той версией. Иначе весь смысл потеряется.
    Естесственно. Я хотел сказать, что текущие исходники ещё очень сырые.
  • Посмотрел рисунки в сообщении:
    Asper wrote:а вот так их сейчас показывает Kofee:
    Меня смущает то что 3-й круг получился разорванным ... Сразу возникает вопрос: допустил ли я ошибку при программировании функции buf2d_circle ?
  • IgorA, насколько я понимаю (из недавнего сообщения Asper'а), в SWF нет такого примитива, как окружность, и она рисуется с помощью кривых Безье.
    И мы уже давно не пешки,
    Мы пули, мы орлы, и решки!
    Война ютит бинарный код,
    Умри, или иди вперед!
  • Gluk правильно понимает. Круг состоит из 8 кривых Безье, это и в спецификации на SWF есть. Ошибка вероятнее всего у меня в парсере, и это не третий, а первый круг. От библиотеки Buf2D нужно будет ещё задание толщины линий и разные заливки:
    1. Сплошная заливка указанным цветом
    2. Разного рода градиентные заливки
    3. Заливка битмапом
  • Asper wrote:Круг состоит из 8 кривых Безье
    это хорошо а то я подумал что глючит функция рисования окружности
    Asper wrote:нужно будет ещё задание толщины линий
    думаю есть 2 пути решения:
    1) сделать кисть в виде окружности, которую вызывать при прорисовке вместо функции ставящей 1-ну точку (сейчас рисование линий сделано через 1-ну точку). Недостатком может быть медленная прорисовка, т. к. большинство точек кисти будут совпадать.
    2) найти какие-либо специальные алгоритмы для рисования толстых линий (возможно даже сглаженных, с заданием дробной толщины линии), тут без fpu не обойтись
    Asper wrote:и разные заливки
    В заливке самое главное правильно определить пиксели, которые будут заливаемыми. Когда-то я программировал на С++ рекурсивный алгоритм для заливки контура, ограниченного определенным цветом. Тот алгоритм я не хочу использовать, т. к. в нем выделялся массив для заливаемых точек, и чем больше закрашиваемая область тем больший объем памяти требовался для заливки.
  • специальные алгоритмы для рисования толстых линий (возможно даже сглаженных, с заданием дробной толщины линии), тут без fpu не обойтись
    Вот уж где FPU не нужен, для таких вещей как раз используют Fixed-point math.
    http://algolist.manual.ru/graphics/painting/line.php
    http://enlight.ru/demo/faq/smth.phtml?q ... tialiasing (вот это долго искал)
    http://enlight.ru/demo/faq/smth.phtml?query=alg_line_aa (вот это то что нужно)
    Хотя, по факту это уже давно задача GPU...
  • IgorA
    Насчет толщин линий посмотри то, что предлагает Nable.
    Насчёт заливок, хранить массив заливаемых точек абсолютно не нужно.
    Например алгоритм сплошной заливки примерно следующий (не проверял).

    Code: Select all

    int ResetColor (x,y,fillcolor, backcolor)
    {
       c1=GetColor(x,y);
       if (c1!=backcolor) return 0;
       SetColor(x,y,fillcolor);
       return 1;
    }
    
    void FloodFill (int x, int y, int fillcolor, int backcolor)
    {
       int result;
       SetColor(x,y,fillcolor);
       //Рекурсивный алгоритм по 4 соседним точкам
       result=ResetColor(x-1,y,fillcolor,backcolor);
       if (result) FloodFill(x-1,y,fillcolor,backcolor);
    
       result=ResetColor(x,y-1,fillcolor,backcolor);
       if (result) FloodFill(x,y-1,fillcolor,backcolor);
    
       result=ResetColor(x+1,y,fillcolor,backcolor);
       if (result) FloodFill(x+1,y,fillcolor,backcolor);
    
       result=ResetColor(x,y+1,fillcolor,backcolor);
       if (result) FloodFill(x,y+1,fillcolor,backcolor);
    }
  • Who is online

    Users browsing this forum: Bing [Bot] and 5 guests