Если нет других вариантов, то похоже, что так и придётся делать.art_zh wrote:Пока можешь работать со страничками, только помечай где в коде надо будет переделывать на malloc()
Kofee - Flash player
ЕМНИП когда еще не было 68 функции для управления памятью, был какой-то менеджер памяти для приложений основанный на 64 функции. Может у кого сохранился его код исходный.
UPD Вот тема viewtopic.php?f=2&t=146
UPD Вот тема viewtopic.php?f=2&t=146
Сделал DisplayList и Dictionary. Каждый элемент этих двух структур занимает одну страницу памяти, но в принципе я придумал как использовать "лишнюю" память, по крайней мере для Dictionary. Можно записывать туда предварительно объявляемый обьект в удобной для последующей обработки структуре. Сейчас элемент Dictionary имеет такую структуру:
а элемент DisplayList такую:
Сделал (частично) парсинг Shape. Только Shape с Newstyles ещё не поддерживаются.
Прикрутил графическую библиотеку Buf2D. Как оказалось она замечательно подходит для флеша!
Функции линии, кривой Безье по трём точкам, рисование в памяти, возможность сбрасывать изображение из одного буфера в другой, это как раз то, что нужно. В настоящее время не хватает возможности указывать толщину линии и функций заливки.
Временно сделал рендеринг Shape'ов в один общий буфер на этапе объявления (DefineShape, DefineShape2, DefineShape3). Обрабатываются линии и кривые Безье, цвета линий пока ещё не задаются как следует. Буфер изображения не очищается, так что вся графика накладывается друг на друга, а не "анимируется". В парсере ещё есть несколько ошибок, из-за которых плеер иногда вылетает (потом исправлю).
Надо будет сделать:
1. Отдельный буфер изображения под каждый Shape.
2. Трансформацию Shape на этапе помещения в DisplayList.
3. Очищать общий буфер изображения при входе в ShowFrame.
4. В ShowFrame скидывать изображения из буферов изображений, записанных в DisplayList в общий буфер (ImageBuffer0).
5. Добавить задание цветов и толщины линий, заливку, градиенты и битмапы, вывод звука и т.д.
6. Исправить имеющиеся ошибки в парсере. Здесь 3 swf файла для примера.
Code: Select all
; Dictionary Item:
; .CharacterId dw ?
; .Type dw ?
; .Address dd ?
Code: Select all
; DisplayList Item:
; .CharacterId dw ?
; .Depth dw ?
; .Address dd ?
Прикрутил графическую библиотеку Buf2D. Как оказалось она замечательно подходит для флеша!
Функции линии, кривой Безье по трём точкам, рисование в памяти, возможность сбрасывать изображение из одного буфера в другой, это как раз то, что нужно. В настоящее время не хватает возможности указывать толщину линии и функций заливки.
Временно сделал рендеринг Shape'ов в один общий буфер на этапе объявления (DefineShape, DefineShape2, DefineShape3). Обрабатываются линии и кривые Безье, цвета линий пока ещё не задаются как следует. Буфер изображения не очищается, так что вся графика накладывается друг на друга, а не "анимируется". В парсере ещё есть несколько ошибок, из-за которых плеер иногда вылетает (потом исправлю).
Надо будет сделать:
1. Отдельный буфер изображения под каждый Shape.
2. Трансформацию Shape на этапе помещения в DisplayList.
3. Очищать общий буфер изображения при входе в ShowFrame.
4. В ShowFrame скидывать изображения из буферов изображений, записанных в DisplayList в общий буфер (ImageBuffer0).
5. Добавить задание цветов и толщины линий, заливку, градиенты и битмапы, вывод звука и т.д.
6. Исправить имеющиеся ошибки в парсере. Здесь 3 swf файла для примера.
Вот так они должны выглядеть:
Spoiler:
Spoiler:
Spoiler:
а вот так их сейчас показывает Kofee:
Spoiler:
Spoiler:
Spoiler:
Asper
Если есть необходимость, могу прикрутить OpenDialog. Load_Lib уже используется, а данные для Proc_Lib много места не займут. Вообще наверное пора над интерфейсом поработать и залить исходники на SVN, если не против.
Если есть необходимость, могу прикрутить OpenDialog. Load_Lib уже используется, а данные для Proc_Lib много места не займут. Вообще наверное пора над интерфейсом поработать и залить исходники на SVN, если не против.
Mario
Если хочешь прикрути OpenDialog и залей на SVN. Только код ещё будет сильно видоизменён, с учётом всего вышеперечисленного.
Если хочешь прикрути OpenDialog и залей на SVN. Только код ещё будет сильно видоизменён, с учётом всего вышеперечисленного.
Ну, я надеюсь ты не глядя заливать на SVN не станешь.
И потом уже будешь работать с той версией. Иначе весь смысл потеряется.
И потом уже будешь работать с той версией. Иначе весь смысл потеряется.
Естесственно. Я хотел сказать, что текущие исходники ещё очень сырые.Mario wrote:Ну, я надеюсь ты не глядя заливать на SVN не станешь.
И потом уже будешь работать с той версией. Иначе весь смысл потеряется.
Посмотрел рисунки в сообщении:
Меня смущает то что 3-й круг получился разорванным ... Сразу возникает вопрос: допустил ли я ошибку при программировании функции buf2d_circle ?Asper wrote:а вот так их сейчас показывает Kofee:
IgorA, насколько я понимаю (из недавнего сообщения Asper'а), в SWF нет такого примитива, как окружность, и она рисуется с помощью кривых Безье.
И мы уже давно не пешки,
Мы пули, мы орлы, и решки!
Война ютит бинарный код,
Умри, или иди вперед!
Мы пули, мы орлы, и решки!
Война ютит бинарный код,
Умри, или иди вперед!
Gluk правильно понимает. Круг состоит из 8 кривых Безье, это и в спецификации на SWF есть. Ошибка вероятнее всего у меня в парсере, и это не третий, а первый круг. От библиотеки Buf2D нужно будет ещё задание толщины линий и разные заливки:
1. Сплошная заливка указанным цветом
2. Разного рода градиентные заливки
3. Заливка битмапом
1. Сплошная заливка указанным цветом
2. Разного рода градиентные заливки
3. Заливка битмапом
это хорошо а то я подумал что глючит функция рисования окружностиAsper wrote:Круг состоит из 8 кривых Безье
думаю есть 2 пути решения:Asper wrote:нужно будет ещё задание толщины линий
1) сделать кисть в виде окружности, которую вызывать при прорисовке вместо функции ставящей 1-ну точку (сейчас рисование линий сделано через 1-ну точку). Недостатком может быть медленная прорисовка, т. к. большинство точек кисти будут совпадать.
2) найти какие-либо специальные алгоритмы для рисования толстых линий (возможно даже сглаженных, с заданием дробной толщины линии), тут без fpu не обойтись
В заливке самое главное правильно определить пиксели, которые будут заливаемыми. Когда-то я программировал на С++ рекурсивный алгоритм для заливки контура, ограниченного определенным цветом. Тот алгоритм я не хочу использовать, т. к. в нем выделялся массив для заливаемых точек, и чем больше закрашиваемая область тем больший объем памяти требовался для заливки.Asper wrote:и разные заливки
Вот уж где FPU не нужен, для таких вещей как раз используют Fixed-point math.специальные алгоритмы для рисования толстых линий (возможно даже сглаженных, с заданием дробной толщины линии), тут без fpu не обойтись
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.
Насчёт заливок, хранить массив заливаемых точек абсолютно не нужно.
Например алгоритм сплошной заливки примерно следующий (не проверял).
Насчет толщин линий посмотри то, что предлагает 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: No registered users and 3 guests