From 024cd8ec5174d2ff7c870bb680fc557203dc4880 Mon Sep 17 00:00:00 2001 From: "Kirill Lipatov (Leency)" Date: Mon, 16 Mar 2015 14:20:32 +0000 Subject: [PATCH] WebView 1.1: Zoom2x, a lot of fixes for download manager git-svn-id: svn://kolibrios.org@5519 a494cfbc-eb01-0410-851d-a64ba20cac60 --- programs/cmm/TWB/TWB.c | 47 ++-- programs/cmm/TWB/links.h | 10 +- programs/cmm/browser/History.txt | 449 ------------------------------ programs/cmm/browser/WebView.c | 54 ++-- programs/cmm/browser/downloader.h | 126 +++++---- programs/cmm/browser/menu_rmb.h | 11 +- programs/cmm/lib/draw_buf.h | 67 ++++- programs/cmm/lib/gui.h | 4 +- 8 files changed, 207 insertions(+), 561 deletions(-) delete mode 100644 programs/cmm/browser/History.txt diff --git a/programs/cmm/TWB/TWB.c b/programs/cmm/TWB/TWB.c index f4820d6408..e4f2540114 100644 --- a/programs/cmm/TWB/TWB.c +++ b/programs/cmm/TWB/TWB.c @@ -10,6 +10,7 @@ char header[2048]; struct TWebBrowser { llist list; + dword draw_line_height, draw_line_width, draw_list_height; DrawBufer DrawBuf; void Prepare(); void Parse(); @@ -61,7 +62,7 @@ char anchor[256]; void TWebBrowser::DrawPage() { - int start_x, start_y, line_length, stolbec_len, magrin_left=5; + int start_x, start_y, zstart_x, zstart_y, line_length, zline_length, stolbec_len, magrin_left=5; if (!header) { @@ -77,18 +78,21 @@ void TWebBrowser::DrawPage() { start_x = stolbec * 6 + list.x + magrin_left; start_y = stroka * list.line_h + list.y + magrin_left; + zstart_x = stolbec * 6 + magrin_left * DrawBuf.zoomf + list.x; + zstart_y = stroka * list.line_h * DrawBuf.zoomf + magrin_left + list.y; stolbec_len = strlen(#line); line_length = stolbec_len * 6; + zline_length = stolbec_len * 6 * DrawBuf.zoomf; WriteBufText(start_x, 0, 0x88, text_colors[text_color_index], #line, buf_data); - IF (b_text) WriteBufText(start_x+1, 0, 0x88, text_colors[text_color_index], #line, buf_data); - IF (i_text) { stolbec++; DrawBuf.Skew(start_x, 0, line_length, list.line_h); } - IF (s_text) DrawBuf.DrawBar(start_x, 4, line_length, 1, text_colors[text_color_index]); - IF (u_text) DrawBuf.DrawBar(start_x, 8, line_length, 1, text_colors[text_color_index]); - IF (link) { - UnsafeDefineButton(start_x-2, start_y-1, line_length + 3, 10, PageLinks.count + 400 + BT_HIDE, 0xB5BFC9); + if (b_text) WriteBufText(start_x+1, 0, 0x88, text_colors[text_color_index], #line, buf_data); + if (i_text) { stolbec++; DrawBuf.Skew(start_x, 0, line_length, list.line_h); } + if (s_text) DrawBuf.DrawBar(start_x, 4, line_length, 1, text_colors[text_color_index]); + if (u_text) DrawBuf.DrawBar(start_x, 8, line_length, 1, text_colors[text_color_index]); + if (link) { DrawBuf.DrawBar(start_x, 8, line_length, 1, text_colors[text_color_index]); - PageLinks.AddText(#line, line_length, list.line_h, UNDERLINE); + UnsafeDefineButton(zstart_x-2, zstart_y-1, zline_length + 3, DrawBuf.zoomf * 10, PageLinks.count + 400 + BT_HIDE, 0xB5BFC9); + PageLinks.AddText(#line, zline_length, draw_line_height, UNDERLINE); } stolbec += stolbec_len; } @@ -145,6 +149,10 @@ void TWebBrowser::Parse(){ stolbec = 0; line = 0; + draw_line_height = list.line_h * DrawBuf.zoomf; + draw_line_width = list.w * DrawBuf.zoomf; + draw_list_height = list.h * DrawBuf.zoomf; + if (pre_text<>2) { pre_text=0; @@ -247,7 +255,7 @@ void TWebBrowser::Parse(){ if (stolbec + strlen(#line) > list.column_max) Perenos(); DrawPage(); line = NULL; - if (tag) SetTextStyle(list.x + 5, stroka * list.line_h + list.y + 5); //обработка тегов + if (tag) SetTextStyle(WB1.DrawBuf.zoomf * 5 + list.x, stroka * draw_line_height + list.y + 5); //обработка тегов tag = parametr = tagparam = ignor_param = NULL; break; default: @@ -265,8 +273,8 @@ void TWebBrowser::Parse(){ } DrawPage(); NewLine(); - DrawBar(list.x, stroka * list.line_h + list.y + 5, list.w, -stroka * list.line_h + list.h - 5, bg_color); - DrawBar(list.x, list.visible * list.line_h + list.y + 4, list.w, -list.visible * list.line_h + list.h - 4, bg_color); + DrawBar(list.x, stroka * draw_line_height + list.y + 5, draw_line_width, -stroka * draw_line_height + draw_list_height - 5, bg_color); + DrawBar(list.x, list.visible * draw_line_height + list.y + 4, draw_line_width, -list.visible * draw_line_height + draw_list_height - 4, bg_color); if (list.first == 0) list.count = stroka; if (anchor) //если посреди текста появится новый якорь - будет бесконечный цикл { @@ -380,7 +388,7 @@ void TWebBrowser::SetTextStyle(int left1, top1) { link = 1; text_colors[text_color_index] = link_color_inactive; - PageLinks.AddLink(#options, stolbec*6+left1, top1-2); + PageLinks.AddLink(#options, DrawBuf.zoomf * stolbec*6+left1, top1-2); } if (anchor) && (!strcmp(#parametr, "name=")) { @@ -548,7 +556,7 @@ void TWebBrowser::SetTextStyle(int left1, top1) { if (opened) { NewLine(); - if (stroka > -1) && (stroka - 2 < list.visible) DrawBuf.DrawBar(li_tab * 5 * 6 + left1 - 5, list.line_h/2-2, 2, 2, 0x555555); + if (stroka > -1) && (stroka - 2 < list.visible) DrawBuf.DrawBar(li_tab * 5 * 6 + list.x, list.line_h/2-2, 2, 2, 0x555555); } return; } @@ -606,10 +614,12 @@ void TWebBrowser::DrawScroller() scroll_wv.cur_area = list.visible; scroll_wv.position = list.first; - scroll_wv.all_redraw=0; + scroll_wv.all_redraw = 0; scroll_wv.start_x = list.x + list.w; scroll_wv.start_y = list.y; - scroll_wv.size_y=list.h; + + scroll_wv.size_y = list.h * DrawBuf.zoomf; + scroll_wv.start_x = list.w * DrawBuf.zoomf + list.x; scrollbar_v_draw(#scroll_wv); } @@ -617,18 +627,19 @@ void TWebBrowser::DrawScroller() void TWebBrowser::NewLine() { - int onleft; - int ontop; + int onleft, ontop, zontop; onleft = list.x + 5; ontop = stroka * list.line_h + list.y + 5; - if (!stroka) DrawBar(list.x, list.y, list.w, 5, bg_color); + zontop = stroka * list.line_h * DrawBuf.zoomf + list.y + 5; + if (!stroka) DrawBar(list.x, list.y, draw_line_width, 5, bg_color); if (t_html) && (!t_body) return; if (ontop>=list.y) && ( ontop < list.h+list.y-10) && (!anchor) { if (text_align == ALIGN_CENTER) DrawBuf.AlignCenter(onleft,ontop,list.w,list.line_h,stolbec * 6); if (text_align == ALIGN_RIGHT) DrawBuf.AlignRight(onleft,ontop,list.w,list.line_h,stolbec * 6); DrawBuf.bufy = ontop; + DrawBuf.zbufy = zontop; DrawBuf.Show(); DrawBuf.Fill(bg_color); } diff --git a/programs/cmm/TWB/links.h b/programs/cmm/TWB/links.h index c82a518bcc..98d1a934f9 100644 --- a/programs/cmm/TWB/links.h +++ b/programs/cmm/TWB/links.h @@ -76,11 +76,11 @@ void LinksArray::Hover(dword mx, my, link_col_in, link_col_a, bg_col) { if (active==i) return; CursorPointer.Set(); - if (links[active].underline) DrawBar(links[active].x,links[active].y+10,links[active].w,1, link_col_in); - if (links[i].underline) DrawBar(links[i].x,links[i].y+10,links[i].w,1, bg_col); + if (links[active].underline) DrawBar(links[active].x, WB1.list.line_h - WB1.DrawBuf.zoomf * WB1.DrawBuf.zoomf + links[active].y,links[active].w, WB1.DrawBuf.zoomf, link_col_in); + if (links[i].underline) DrawBar(links[i].x, WB1.list.line_h - WB1.DrawBuf.zoomf * WB1.DrawBuf.zoomf + links[i].y,links[i].w, WB1.DrawBuf.zoomf, bg_col); active = i; - status_text.start_x = progress_bar.left+progress_bar.width+10; - status_text.start_y = Form.cheight-STATUSBAR_H+3; + status_text.start_x = wv_progress_bar.left + wv_progress_bar.width + 10; + status_text.start_y = Form.cheight - STATUSBAR_H + 3; status_text.area_size_x = Form.cwidth - status_text.start_x -3; DrawBar(status_text.start_x, status_text.start_y, status_text.area_size_x, 9, col_bg); status_text.text_pointer = links[active].link; @@ -92,7 +92,7 @@ void LinksArray::Hover(dword mx, my, link_col_in, link_col_a, bg_col) if (active!=-1) { CursorPointer.Restore(); - if (links[active].underline) DrawBar(links[active].x,links[active].y+10,links[active].w,1, link_col_in); + if (links[active].underline) DrawBar(links[active].x, WB1.list.line_h - WB1.DrawBuf.zoomf * WB1.DrawBuf.zoomf + links[active].y,links[active].w, WB1.DrawBuf.zoomf, link_col_in); DrawBar(status_text.start_x, status_text.start_y, status_text.area_size_x, 9, col_bg); active = -1; } diff --git a/programs/cmm/browser/History.txt b/programs/cmm/browser/History.txt deleted file mode 100644 index 49905cee71..0000000000 --- a/programs/cmm/browser/History.txt +++ /dev/null @@ -1,449 +0,0 @@ -20.11.2013 - 0.99.6 -- переделаны ссылки, курсор превращается в руку при наведении - -29.12.2013 - 0.99.5 -- Condition Script - -27.12.2013 - 0.99.4 -- отделение TWB компонента от браузера - -15.10.13 - 0.99.1 -- поддержка тегов
, и параметра align="center/right" для тегов h1..h4 -- улучшенное меню -- мультиязычность - -08.10.13 - 0.99.04 -- поддержка относительных путей -- исправления для скроллбара -- итальянская версия -- автодобавление http:// и ручном вводе адреса -- страница по умолчанию существует - -12.04.13 - 0.99.01 -- исправлено падение при очистке кэша изображений -- исправлена работа пункта меню "включить разрывы строк" -- ускорение при прокрутке страницы -- ускорение обработки quotted printable - -12.04.13 - 0.99 -- отрисовка в буфер; -- исправление ошибок и обновление кода. - -20.11.12 - 0.98 -- интелектуальная система кеширования изображений. - -18.11.12 - 0.97.7 -- если изображение не загрузилось, но содержит ссылку отображается - заменяющий его текст; -- полностью исправлены переносы ссылках в тексте; -- отображение в меню текущей кодировки; -- SoUrcerer - Синхронизация программы с новой оптимизированной -версией библитеки TryeType. - - - -10.11.12 - 0.97.6 -- нормальный запуск программы даже без библиотеки lib_img; -- оповещение если box_lib не найдена; -- исправлена ошибка приводящая к торможению при отображении - TrueType шрифтов; -- обновление библиотек. - -05.11.12 - 0.97.5 -Переключалка на шрифты TrueType из меню ПКМ. - -16.07.12 - 0.97 -- небольшие улучшения в обработке ссылок и изображений; -- включение обработки разрывов строк через меню; -- поддержка цветов вида #abc, улучшения в обработке цветов; -- пропадали изображения при начале загрузки страницы; -- исправлен баг 100% загрузки процессора при использовании - скролла (спасибо hidnplayer). - -14.07.12 - 0.96 -- исправлен баг со строкой адреса -- исправлен баг с незакрытыми тегами -- частично исправлен баг с длинными адресами урлов -- меню - новое окно - -22.06.12 - 0.95 - -22.06.12 - 0.94c -- испрвлена регрессия со ссылками; -- исправлена регрессия с ползунком; -- исправлено затирание первой строки. - -19.06.12 - 0.94 -- улучшение кода. - -14.06.12 -- v0.93 -- заработали якоря; -- улучшено меню. - -13.06.12 -- v0.92 -- базовое меню ПКМ; -- убрана постоянная загрузка страницы при перерисовке окна; -- костыли версии 2.0 для работы с downloader'ом; -- разделение кода загрузки и отображения страницы: часть 1. - -04.06.12 -- v0.90 -- новый скроллбар из box_lib (спасибо lev); -- нормальная загрузка страниц без скидывания фокуса с окна; -- гениальный и грязный хак для работы с downloader'ом, который - у меня на машине даёт 99% загрузки страниц вместо 50% ранее; -- масса исправлений в работе с историей посещений и навигацией; -- в теге исправлена регрессия. - - -27.05.12 -- v0.83 -- новая иконка кнопки "домой"; -- оптимизация тега ; -- улучшения при работе с книгами xml-подобного формата fb2. - - -13.04.12 -- v0.80 -- поддержка "bgcolor=" и "text="; -- обработка перехода вверх "../"; -- jpg, gif, png открываются через kiv. -- теперь изображения легко могут быть ссылками; -- 2 небольших фикса для изображений, кнопки BackSpace; -- чуток улучшена обработка урлов, содержащих #; -- заработала кнопка "Вперёд". - - - -29.02.12 -- v0.76 -- 11.3 -- исправлена работа кнопки "Назад"; -- в историю посещённых страниц не может быть добавлено 2 одинаковых адреса подряд; -- исправлено исчезание заголовка страниц; -- исчезала кнопка вверх в прокрутке - исправлено; -- некоторые другие исправления. - - -27.02.12 -- v0.75 -- 11.? Кб -- при закрытии HTMLv, downloader тоже завершается; -- невозможно запустить больше одного downloader'a; -- отображение процесса загрузки страницы из Интернета через кнопочку - "остановить", надпись "Loading...", возможность прервать процесс; -- обновление страницы из Интернета приводит к её повторной загрузке. - - -24.02.12 -- v0.71 -- 11.? Кб -- просто починил эти самые интернеты. - - -26.09.11 -- v0.70с -- 11.4 Кб -- универсальная обработка цветов; -- улучшения в обработке title; -- исправлена обработка станиц в кодировке iso-8859-1. - -22.09.11 -- v0.70 -- 11.3 Кб -- улучшен и оптимизирован код обработки юникодовских тегов (&), исправлен - и дополнен их список; -- устранён вылет программы при нажатии клавиши CapsLock (спасибо Mario); -- заглушка на вылет программы при загрузке страниц из и-нэта (спасибо Mario). - -13.09.11 -- v0.69 -- 11.2 Кб -- нормальная прокрутка изображений; -- работа с файлами любого размера; -- оптимизация процедуры парсинга тега с параметрами. - -05.09.11 -- v0.68 -- 11.2 Кб -- устранён вылет программы при неправильном параметре color тега - алсо - иногда действительно полезно читать маны; -- memory.h-- удалён как старый дубликат, все функции работы с памятью отныне - используют mem.h--, написанный Asper'ом; -- изображения теперь вписываются в окно по ширине; -- устранён частый вылет программы при прокрутке страницы, содержащей изображения. - -20.08.11 -- v0.67 -- 11.1 Кб -- более адекватная прокрутка изображений; -- корректная обработка табов в тексте и с тегом
 (спасибо Nazarus и Jaeger);
-- улучшена отзывчивость программы при прокрутке больших страниц (фикс изначально
-   был написан Gluk'ом для игры Косилка по моей просьбе, сюда перенесен мной);
-- небольшие исправления в реакции ползунка прокрутки;
-- исправлено залезание текста в наклонном шрифте на левый ободок окна;
-- кнопка "Новая вкладка" и комбинации Ctrl+N, Ctrl+T банально создают новое окно;
-- правильное распознание украинской буквы ґ;
-- поддержка кодировки "UTF8" для универсальности (идея фичи Joaquin).
-
-
-
-20.06.11 -- v0.63 -- 11.32 Кб
-lev
-- наклонный шрифт
-- таблица именованных цветов
-
-08.06.10 -- v0.62a -- 9.68 Кб
-- в адресную строку нельзя было нормально ввести цифры 4 и 6 (спасибо Nasarus
-   за найденные баги)
-- поддержка DOS-кодировки страниц (по просьбе Nasarus'a)
-
-
-14.02.10 -- v0.62 -- 9.42 Кб
-- поиск в Интернетах с помощью nigma.ru, поиск только по английским символам,
-   горячая комбинация клавиш Ctrl+Enter;
-- улучшено и оптимизировано определение кодировки;
-- небольшой фикс для работы с XHTML-тегами типа br/;
-- исправлен баг: не работал просмотр (по f3) страниц из интернета;
-- немного улучшено отображение изображений, но, всё равно, ещё очень плохо;
-- поддержка тегов с кавычками ' (как на главной странице kolibrios.org);
-- работа с историей вынесена в отдельный файл;
-- исправлена поломанная в предыдущей версии работа в Интернетах.
-
-
-31.01.10 -- v0.60 -- 8.94 Кб
-- поддержка utf-8 реализованная Asper'ом ещё в ноябре, увы не попавшая в
-   дистр 0.7.7.0. От меня огромное спасибо Asper'у в помощи!
-- исправлена ошибка при открытии страницы с /fd и /cd (спасибо Nasarus и IgorA,
-   которые сообщили мне об ошибке);
-- поддержка шайтанской кодировки mht-страниц, то есть, сохранённых со всем
-   содержимым через ИЕ7 (спасибо за помощь IgorA);
-- улучшено определение кодировки: например, теперь можно нормально читать хабр;
-- небольшое исправление в парсинге параметров тега;
-- увеличена длина URL до 4096 символов.
-
-
-08.11.09 -- v0.57 -- 8.69 Кб
-- Asper реализовал поддержку изображений, которую в HTMLv ещё надо пилить;
-- поддержка .mht, скорее всего старых версий (страница Albom'a), в новых (я
-   сохранил в .mht через ИЕ7) вместо буковок какая-то ересь, очень похожая на
-   hex-коды;
-- исправлено появление кнопки "остановить загрузку" когда не надо;
-- оптимизации поиска и загрузки файла.
-
-
-03.11.09 -- v0.53 -- 7.87 Кб
-- восстановлена совместимость с библиотекой box_lib.obj;
-- исправлена заглушка с адресами страниц, содержащими знак # ;
-- программа больше не вылетает, если несколько раз нажать на локальную ссылку;
-- серьёзное улучшение обработки разных ссылок;
-- исправлено превышение максимальной длины истории ссылок;
-- корректная обработка ссылок, содержащих знак = ;
-- исправлено исчезание ссылок, если тег находится за границей видимой области;
-- во время загрузки страницы, пишет "Loading...";
-- небольшие обновления кода.
-
-
-05.06.09 -- v0.5 -- 7.91 Кб
-- barsuk прикрутил загрузку страниц из Интернета через downloader за что
-   ему огромнейший респект :)
-- исправление падения программы в случае, если страница недокачана -
-   исправлен выход за границы памяти при парсинге тегаов и обработке <-- -->;
-- исправлена передача параметров downloader'y: обрезается / в конце;
-- корректная обработка некоторых символов;
-- некоторые оптимизации.
-
-
-28.01.08 -- v0.48.5 -- 6.95 Кб
-- если присутствует только закрывающий тег , без открывающего, ссылки
-   больше не "съезжают";
-- корректная обработка параметров, не взятых в скобки, пример: href=1.htm ;
-- исправлен баг с цветом ссылок и цветом текста после ссылок;
-- многоуровневые списки;
-- немного улучшен алгоритм парсинга тегов;
-- клавиша BackSpace опять возвращает назад;
-- подчёркивание цветных ссылок теперь цвета самих ссылок;
-- исправлен баг в заглушке с переходом по ссылке внутри страницы #.
-
-
-28.01.08 -- v0.48.2 -- 6.95 Кб
-- устранён вылет программы при прокрутке страницы с большим кол-вом ссылок;
-- устранено "синение" текста в некоторых случаях;
-- исправлен баг в чтении тега с параметрами;
-- автоопределение кодировки KOI8;
-
-
-22.01.08 -- v0.48.1 -- 6,88 Кб
-21.12.08 -- v0.48.0
-- перенос по словам;
-- координаты считаются от конца заголовка;
-- исправлена перерисовка окна, когда страница маленькая;
-- исправил баг в теге 
;
-- исправлен баг перерисовки первой строки;
-
-
-07.12.08 -- v0.47 -- 7,50 Кб
-- добавлен символ "апостроф", украинские буквы для кодировки win1251;
-- инфа внутри  фильтруется;
-- переписана процедура парсинга параметров тега;
-- зачатки вывода изображений (спасибо Nable и Asper за помощь);
-- исправлен баг, из-за которого страницы могли не отображаться;
-- исправлен баг с тегом font, из-за которого весь текст могло плющить;
-- исправлен недочёт в теге 
 (нашёл diamond);
-- немного увеличена скорость обработки страниц;
-- немного улучшена полоса прокрутки, исправлен один мелкий баг;
-
-
-02.12.08 -- v0.45 -- 6,79 Кб
-- поддержка кодировки KOI8-R(U) - активируется нажатием Ctrl+R. Спасибо Velianty
-   за написаный код;
-- вывод какой-то win кодировки, где все символы отображаются, как А и т.д.
-   (заработал файл, присланый Albom'ом);
-- исправлен очень серьёзный баг из-за которого страницы с большим количеством
-   ссылок приводили к вылету программы;
-- кодировка DOS'a (cp866) активируется нажатием Ctrl+D;
-- улучшен скролл;
-- исправлен баг кнопки "Обновить";
-- иконки тулбара выводится одним изображением с палитрой, как результат меньше
-   перерисовка окна и размер программы.
-
-
-20.10.08 -- v0.40 -- 7,36 Кб
-- обработка нескольких параметров тега для ссылки и текста;
-- перечёркивание и подчёркивание отображается тем же цветом что и текст
-- правильная обработка табов;
-- улучшение тега 
  • ; -- корректный переход на страницу, адрес которой содержит знак "#"; -- исправлен баг из-за которого часть текста могла стать невидимой; -- исправлен тег ; -- некоторые спецсимволы заменены своими "аналогами": (с), (r), обычное тире - вместо типографического; -- поддержка тегов и ; -- прочие доработки и хитрожопые оптимизации отображения :) - - -19.10.08 -- v0.38.1 -- 6,85 Кб -- суровые оптимизации и как результат увеличилась скорость загрузки страниц на - 7-10% (было проверено с использованием секундомера); -- правильное отображение файлов с расширением ".txt" в окне программы; - -18.10.08 -- v0.38 -- 6,88 Кб -- для полосы адреса теперь используется отдельная переменная; -- хождение по относительным ссылкам, с косяками, но то фигня. Сделаю; -- улучшения в обработке тегов: корректно обрабатываются таб и переход на - следующую строку в теге. -- немного улучшена обработка тегов вообще, догадываюсь как сделать ваще зашибись; -- добавлена обработка цвета линий (hr). - -17.10.08 -- v0.37 -- 6,82 Кб -- реализовано преобразование тегов вида   в символы (пока только 5 основных); -- немного улучшен скролл, но, всё равно, это не дело; -- F3 - просмотр исходного кода страницы; -- обновлены кнопочки "Вперёд/Назад". -Правка багов: -- исправлена табота со ссылками; -- исправлен баг с тем, что иногда отображалось два пробела в тексте вместо одного; -- исправил баг из-за которого часть текста при прокрутке могла стать синей; -- исправлен баг, связаный с клавишей BackSpace; -Огромное спасибо diamond'y за тестирование. - - -16.10.08 -- v0.35.3 -- 6,74 Кб -- кнопки от ссылок не удалялись в случае, если страница не найдена, fixed; -- улучшены кнопочки тулбара; -- пофиксил последнюю страницу от Albom'a, со скриптом; оказалось просто надо было - обнулить переменную во время её объявления; -- при сворачивании окна в заголовок, его название не исчезает. - - -15.10.08 -- v0.35 -- 6,75 Кб -- исправлен баг - вылет проги из-за переполнения памяти во время создания ссылок - (спасибо Albom'у, который прислал страницу, на которой проявляется баг); -- при перемотке колёсиком теперь проматывается 3 строчки; -- исправлена перемотка PgUp/PgDn; -- исправлена работа программы в случае, если страница не найдена; -- новые фирменные изображения на кнопках; -- исправлен тег для длинных названий; -- теперь переход Домой записывается в хистори; -- программа больше не должна вылетать :) - - -03.10.08 -- v0.30.2 -- 6,56 Кб -- обновление страницы не приводит к записи новой ссылки в историю посещений; -- оптимизация перебора символов; -- больше не появляются белые полосы на ободке нижней части окна; -- установлены минимальные размеры окна, убраны артефакты при сворачивании окна в заголовок. - - -02.08.08 -- v0.30.1 -- 6,48 Кб -- поправил баг с историей посещений страниц; -- устранён баг, когда под самой нижней строкой появлась прозрачная полоса; -- игнорируется текст между <style>; -- немного оптимизирован скролл. - - -29.07.08 -- v0.30 -- 6,46 Кб -- клавиша BackSpace, если полоса адреса не активна, возвращает на предыдущую страницу; -- игнорируется текст после тега <script>; -- сносно работает прокрутка; -- заглушка на PgUp\PgDown, работает End; -- исправлен баг с заголовком окна. - - -28.07.08 -- v0.27 -- 6,21 Кб -- вывод цвета текста, поддержка до 10 вложеных тегов цвета - за всё это спасибо Veliant'y; -- адаптирован код под новую версию библиотеки <Lrz>, отвечающей за строку адреса (box_lib); -- теперь корректно определяется конец файла при обработке (by Veliant); -- теперь текст декодируется win -> dos, исправлено отображение некоторых специальных символов; -- почищен код, оптимизована структура документа; -- опредение длины страницы, заглушки на прокрутку её вверх и вниз; -- сильно уменьшена перерисовка первых двух строк. - - -23.07.08 -- v0.24 -- 6,05 Кб -- полностью исправлена работа ссылок; -- Энтер теперь добавляется как пробел в тексте, в случае если до него не было пробела; -- обработка тега "hr" - рисование линий; -- исправлен баг при деактивации окна. - - -07.07.08 -- v0.23 alpha -- 5.68 Кб -- исправлен баг кнопки "Назад"; -- некоторые ссылки работают :) -- PageUp, PageDown. - - -05.07.08 -- v0.22 -- 5.68 Кб -- исправлен баг, из-за которого строка в конце окна отображалась без "стиля"; -- теперь программа умеет отделять теги от параметров - улучшена совместимость; -- поддержка параметров в режиме тестирования (пока недоступно). - - -04.07.08 -- v0.21 -- 5.58 Кб -- небольшие изминения в интерфейсе; -- рабочая клавиша "Назад". - - -29.06.08 -- v0.2 -- 5.48 Кб -- уменьшена перерисовка при открытии проги, во время перехода по страницам, - во время их прокрутки - текст выводится не побуквенно, а короткими строчками; -- изменения в структуре программы, она стала ещё чуть более гибкой; -- теперь заголовок не перерисовывается постоянно во время перемотки; -- теперь не выводится больше 1 пробела; -- запуск с параметром - открывается страница; -- немного подправлено положение строки адреса при разной высоте заголовков; -- если страница не существует, выводится предупреждение. - - -26.06.08 -- v0.1.3 -- 5.59 Кб -- при прокрутке не перерисовывается заголовок; -- теги обнуляются перед началом перерисовки; -- устранён глюк из-за которого внизу списка мог появляться левый текст; -- поддержка тегов ul, blockquote, q, некоторые другие частично; -- теперь вместе обрабатываются теги с / и без него. - - -24.06.08 -- v0.1.1 -- 5.37 Кб -- исправления и улучшения тега <li>; -- теперь можно прописывать путь к странице не добавляя в конце ".htm", - программа добавит расширение автоматически; -- немного уменьшена перерисовка окна; -- добавлен тег "strike", аналог "s"; -- начальная поддержка некоторых других тегов; -- исправлен баг, из-за которого нельзя было перематывать текст вниз до конца. - - -22.06.08 -- v0.1 -- 5.11 Кб -- более или менее полная поддержка тегов: b, strong, i, u, s, br, pre, title, - li, p. Поддержка закрывающих тегов соответственно; -- поддержка вложеных тегов; -- игнорирование ненужных пробелов в теге (пример: < b >); -- увеличена скорость прокрутки и программы; -- полоса адреса (EditBox) от <Lrz>, спасибо ему огромное; -- остановка рисования после тега </html>. - - -20.06.08 -- v0.000001 -- 7.32 Кб -Типа начало. :) -Переписал браузер Veliant'a под новую библиотеку, немного доделан. diff --git a/programs/cmm/browser/WebView.c b/programs/cmm/browser/WebView.c index f8f2c1b7c3..54af88435e 100644 --- a/programs/cmm/browser/WebView.c +++ b/programs/cmm/browser/WebView.c @@ -32,14 +32,14 @@ char homepage[] = FROM "html\\homepage.htm"; #ifdef LANG_RUS - char version[]=" ’ҐЄбв®ўл© Ўа г§Ґа 1.0"; + char version[]=" ’ҐЄбв®ўл© Ўа г§Ґа 1.1"; ?define IMAGES_CACHE_CLEARED "Љни Є авЁ­®Є ®зЁйҐ­" ?define T_LAST_SLIDE "ќв® Ї®б«Ґ¤­Ё© б« ©¤" char loading[] = "‡ Јаг§Є  бва ­Ёжл...<br>"; char page_not_found[] = FROM "html\page_not_found_ru.htm"; char accept_language[]= "Accept-Language: ru\n"; #else - char version[]=" Text-based Browser 1.0"; + char version[]=" Text-based Browser 1.1"; ?define IMAGES_CACHE_CLEARED "Images cache cleared" ?define T_LAST_SLIDE "This slide is the last" char loading[] = "Loading...<br>"; @@ -48,8 +48,8 @@ char homepage[] = FROM "html\\homepage.htm"; #endif proc_info Form; -#define WIN_W 640 -#define WIN_H 480 +#define WIN_W 799 +#define WIN_H 559 char search_path[]="http://nigma.ru/index.php?s="; char str_location[]="location\0"; @@ -65,12 +65,12 @@ dword http_buffer; dword TAB_H = false; //19; dword TAB_W = 150; dword TOOLBAR_H = 31; //50; -dword STATUSBAR_H =15; +dword STATUSBAR_H = 15; dword col_bg; dword panel_color; dword border_color; -progress_bar progress_bar = {0, 10, 83, 150, 12, 0, 0, 100, 0xeeeEEE, 8072B7EBh, 0x9F9F9F}; +progress_bar wv_progress_bar = {0, 10, 83, 150, 12, 0, 0, 100, 0xeeeEEE, 8072B7EBh, 0x9F9F9F}; byte souce_mode = false; #include "..\TWB\TWB.c" @@ -98,21 +98,21 @@ int SetSkinColors() col_bg = DSDWORD[image_data]; panel_color = DSDWORD[skin.w*4*4 + image_data]; border_color = DSDWORD[skin.w*4*7 + image_data]; - progress_bar.progress_color = DSDWORD[skin.w*4*10 + image_data]; + wv_progress_bar.progress_color = DSDWORD[skin.w*4*10 + image_data]; $and col_bg, 0x00ffffff $and panel_color, 0x00ffffff $and border_color, 0x00ffffff - $and progress_bar.progress_color, 0x00ffffff + $and wv_progress_bar.progress_color, 0x00ffffff } void DrawProgress() { unsigned long btn; - //progressbar_draw stdcall(#progress_bar); - progress_bar.width = progress_bar.left = 0; + //progressbar_draw stdcall(#wv_progress_bar); + wv_progress_bar.width = wv_progress_bar.left = 0; if (http_transfer == 0) return; - if (progress_bar.max) btn = address_box.width*progress_bar.value/progress_bar.max; else btn = 30; - DrawBar(address_box.left-1, address_box.top+14, btn, 2, progress_bar.progress_color); + if (wv_progress_bar.max) btn = address_box.width*wv_progress_bar.value/wv_progress_bar.max; else btn = 30; + DrawBar(address_box.left-1, address_box.top+14, btn, 2, wv_progress_bar.progress_color); } @@ -131,6 +131,7 @@ void main() Libimg_LoadImage(#skin, abspath("wv_skin.png")); SetSkinColors(); + WB1.DrawBuf.zoomf = 1; Form.width=WIN_W; Form.height=WIN_H; SetElementSizes(); @@ -183,6 +184,7 @@ void main() } if (scroll_used) { + m.y = m.y / WB1.DrawBuf.zoomf + 5; half_scroll_size = WB1.list.h - 16 * WB1.list.visible / WB1.list.count - 3 /2; if (half_scroll_size+WB1.list.y>m.y) || (m.y<0) || (m.y>4000) m.y=half_scroll_size+WB1.list.y; btn=WB1.list.first; @@ -200,7 +202,7 @@ void main() key = GetKey(); if (address_box.flags & 0b10) SWITCH(key) - { CASE 52: CASE 53: CASE 54: CASE 180: CASE 181: goto _EDIT_MARK; } + { CASE 52: CASE 53: CASE 54: CASE 180: CASE 181: CASE 122: goto _EDIT_MARK; } Scan(key); @@ -222,10 +224,10 @@ void main() http_process stdcall (http_transfer); $push EAX ESI = http_transfer; - progress_bar.max = ESI.http_msg.content_length; - if (progress_bar.value != ESI.http_msg.content_received) + wv_progress_bar.max = ESI.http_msg.content_length; + if (wv_progress_bar.value != ESI.http_msg.content_received) { - progress_bar.value = ESI.http_msg.content_received; + wv_progress_bar.value = ESI.http_msg.content_received; DrawProgress(); } $pop EAX @@ -288,7 +290,7 @@ void SetElementSizes() { address_box.top = TOOLBAR_H-TAB_H/2-7+TAB_H; address_box.width = Form.cwidth - address_box.left - 25 - 22; - WB1.list.SetSizes(0, TOOLBAR_H, Form.width - 10 - scroll_wv.size_x, Form.cheight - TOOLBAR_H - STATUSBAR_H, 0, 11); + WB1.list.SetSizes(0, TOOLBAR_H, Form.width - 10 - scroll_wv.size_x / WB1.DrawBuf.zoomf, Form.cheight - TOOLBAR_H - STATUSBAR_H / WB1.DrawBuf.zoomf, 0, 11); WB1.list.column_max = WB1.list.w - scroll_wv.size_x / 6; WB1.list.visible = WB1.list.h - 5 / WB1.list.line_h; WB1.DrawBuf.Init(WB1.list.x, WB1.list.y, WB1.list.w, WB1.list.line_h); @@ -329,7 +331,7 @@ void Draw_Window() //status bar DrawBar(0,Form.cheight - STATUSBAR_H, Form.cwidth,STATUSBAR_H, col_bg); DrawBar(0,Form.cheight - STATUSBAR_H, Form.cwidth,1, border_color); - progress_bar.top = Form.cheight - STATUSBAR_H + 4; + wv_progress_bar.top = Form.cheight - STATUSBAR_H + 4; ShowPage(); DrawRectangle(scroll_wv.start_x, scroll_wv.start_y, scroll_wv.size_x, scroll_wv.size_y-1, scroll_wv.bckg_col); DrawProgress(); @@ -380,8 +382,10 @@ void Scan(int id) return; case 006: //download manager - DL_URL[0] = 0; - CreateThread(#Downloader,#downloader_stak+4092); + if (!downloader_opened) { + strcpy(#DL_URL, "http://"); + CreateThread(#Downloader,#downloader_stak+4092); + } return; case BACK: @@ -485,6 +489,10 @@ void Scan(int id) m.y = TOOLBAR_H-6; m.x = Form.cwidth - 167; CreateThread(#menu_rmb,#stak+4092); + return; + case 122: + if (WB1.DrawBuf.zoomf==1) WB1.DrawBuf.zoomf=2; else WB1.DrawBuf.zoomf=1; + Draw_Window(); } } @@ -530,11 +538,11 @@ void ProcessLinks(int id) PageLinks.GetAbsoluteURL(#URL); - if (UrlExtIs(".png")==1) || (UrlExtIs(".gif")==1) || (UrlExtIs(".jpg")==1) || (UrlExtIs(".zip")==1) + if (UrlExtIs(".png")==1) || (UrlExtIs(".gif")==1) || (UrlExtIs(".jpg")==1) || (UrlExtIs(".zip")==1) || (UrlExtIs(".kex")==1) || (UrlExtIs(".7z")==1) || (UrlExtIs("netcfg")==1) { //notify(#URL); - if (strcmpn(#URL,"http://:", 8)==0) + if (strcmpn(#URL,"http://", 7)==0) { strcpy(#DL_URL, #URL); CreateThread(#Downloader,#downloader_stak+4092); @@ -572,7 +580,7 @@ void StopLoading() bufsize = 0; bufpointer = mem_Free(bufpointer); } - progress_bar.value = 0; + wv_progress_bar.value = 0; img_draw stdcall(skin.image, address_box.left+address_box.width+1, address_box.top-2, 17, skin.h, 52, 0); } diff --git a/programs/cmm/browser/downloader.h b/programs/cmm/browser/downloader.h index b94d2b0475..d5d9c52a09 100644 --- a/programs/cmm/browser/downloader.h +++ b/programs/cmm/browser/downloader.h @@ -1,31 +1,38 @@ #ifdef LANG_RUS - #define DL_WINDOW_HEADER "Download Manager" - #define START_DOWNLOADING "Start downloading" - #define STOP_DOWNLOADING "Stop downloading" - #define FILE_SAVED_AS "'Download manager\nFile saved as " - #define DOWNLOADING_COMPLETE "Downloading complete." + #define DL_WINDOW_HEADER "ЊҐ­Ґ¤¦Ґа § Ја㧮Є" + #define START_DOWNLOADING "Ќ з вм § Є зЄг" + #define STOP_DOWNLOADING "Ћбв ­®ўЁвм бЄ зЁў ­ЁҐ" + #define SHOW_IN_FOLDER "Џ®Є § вм ў Ї ЇЄҐ" + #define OPEN_FILE "ЋвЄалвм д ©«" + #define FILE_SAVED_AS "'ЊҐ­Ґ¤¦Ґа § Ја㧮Є\n” ©« б®еа ­Ґ­ Є Є " + #define KB_RECEIVED " Ї®«г祭®" #else #define DL_WINDOW_HEADER "Download Manager" #define START_DOWNLOADING "Start downloading" #define STOP_DOWNLOADING "Stop downloading" + #define SHOW_IN_FOLDER "Show in folder" + #define OPEN_FILE "Open file" #define FILE_SAVED_AS "'Download manager\nFile saved as " - #define DOWNLOADING_COMPLETE "Downloading complete." + #define KB_RECEIVED " received" #endif proc_info DL_Form; system_colors sc; char DL_URL[10000]; -dword DL_bufpointer; -dword DL_bufsize; -dword DL_http_transfer; -dword DL_http_buffer; +dword DL_bufpointer, DL_bufsize, DL_http_transfer, DL_http_buffer; char filepath[4096]; int downloaded_size, full_size; int mouse_twbi; edit_box DL_address_box = {250,20,20,0xffffff,0x94AECE,0xffffff,0xffffff,0,sizeof(DL_URL),#DL_URL,#mouse_twbi,2,19,19}; +progress_bar DL_progress_bar = {0, 170, 51, 225, 12, 0, 0, 100, 0xFFFfff, 0x74DA00, 0x9F9F9F}; char save_to[4096] = "/tmp0/1/Downloads/"; -byte cleft = 10; +byte cleft = 15; + +byte downloader_opened; + +byte download_state; +enum { STATE_NOT_STARTED, STATE_IN_PROGRESS, STATE_COMPLETED }; void Downloader() @@ -41,6 +48,7 @@ void Downloader() DL_address_box.size = DL_address_box.pos = DL_address_box.shift = DL_address_box.shift_old = strlen(#DL_URL); downloaded_size = full_size = 0; + downloader_opened = 1; SetEventMask(0x27); loop() @@ -55,7 +63,6 @@ void Downloader() case evButton: btn=GetButtonID(); - if (btn==1) ExitProcess(); DL_Scan(btn); break; @@ -71,7 +78,7 @@ void Downloader() case evReDraw: sc.get(); - DefineAndDrawWindow(215, 100, 420, 150, 0x74, sc.work, DL_WINDOW_HEADER, 0); + DefineAndDrawWindow(215, 100, 420, 120, 0x74, sc.work, DL_WINDOW_HEADER, 0); GetProcessInfo(#DL_Form, SelfInfo); if (DL_Form.status_window>2) break; if (DL_Form.height<120) MoveSize(OLD,OLD,OLD,120); @@ -80,9 +87,17 @@ void Downloader() break; default: - if (DL_Form.width==0) break; - if (DL_http_transfer <= 0) break; + if (DL_Form.width==0) || (DL_http_transfer <= 0) break; http_process stdcall (DL_http_transfer); + $push EAX + ESI = DL_http_transfer; + DL_progress_bar.max = ESI.http_msg.content_length; + if (DL_progress_bar.value != ESI.http_msg.content_received) + { + DL_progress_bar.value = ESI.http_msg.content_received; + progressbar_draw stdcall(#DL_progress_bar); + } + $pop EAX if (EAX == 0) { ESI = DL_http_transfer; DL_bufpointer = ESI.http_msg.content_ptr; @@ -105,7 +120,9 @@ void Downloader() } notify(#notify_message); DL_address_box.color = DL_address_box.blur_border_color = DL_address_box.focus_border_color = 0xFFFfff; + download_state = STATE_COMPLETED; DL_Draw_Window(); + break; } ESI = DL_http_transfer; downloaded_size = ESI.http_msg.content_received; @@ -115,64 +132,60 @@ void Downloader() } } -void DrawDownloading() -{ - dword tmp; - char bytes_received[70], percent[30]; - percent[0]=0; - - if (DL_http_transfer > 0) - { - strcpy(#bytes_received, "Downloading... "); - tmp = ConvertSizeToKb(downloaded_size); - strcat(#bytes_received, tmp); - strcat(#bytes_received, " received."); - if (full_size>0) - { - tmp = itoa(downloaded_size * 100 / full_size); - strcpy(#percent, tmp); - strcat(#percent, " \x25"); - } - } - else - { - strcpy(#bytes_received, DOWNLOADING_COMPLETE); - } - DrawBar(cleft, 90, DL_Form.cwidth - cleft, 9, sc.work); - WriteText(cleft, 90, 0x80, sc.work_text, #bytes_received); - WriteText(DL_Form.cwidth - 50, 90, 0x80, sc.work_text, #percent); -} void DL_Draw_Window() { - DrawBar(0,0,DL_Form.cwidth,DL_Form.cheight,sc.work); //bg - if (DL_http_transfer <= 0) + DrawBar(0,0, DL_Form.cwidth, DL_Form.cheight, sc.work); + DeleteButton(305); + DeleteButton(306); + if (download_state == STATE_NOT_STARTED) || (download_state == STATE_COMPLETED) { - DrawCaptButton(cleft, 50, 120, 20, 301, sc.work_button, sc.work_button_text, START_DOWNLOADING); + DrawCaptButton(cleft, 50, 130, 27, 301, sc.work_button, sc.work_button_text, START_DOWNLOADING); } - else + if (download_state == STATE_IN_PROGRESS) { - DrawCaptButton(cleft, 50, 120, 20, 302, sc.work_button, sc.work_button_text, STOP_DOWNLOADING); + DrawCaptButton(cleft, 50, 140, 27, 302, sc.work_button, sc.work_button_text, STOP_DOWNLOADING); + DrawDownloading(); } - if (DL_http_transfer <= 0) + if (download_state == STATE_COMPLETED) { - DrawCaptButton(cleft+130, 50, 120, 20, 305, sc.work_button, sc.work_button_text, "Show in folder"); - DrawCaptButton(cleft+260, 50, 120, 20, 306, sc.work_button, sc.work_button_text, "Open file"); + DrawCaptButton(cleft+140, 50, 110, 27, 305, sc.work_button, sc.work_button_text, SHOW_IN_FOLDER); + DrawCaptButton(cleft+260, 50, 120, 27, 306, sc.work_button, sc.work_button_text, OPEN_FILE); } WriteText(cleft, DL_address_box.top + 4, 0x80, sc.work_text, "URL:"); DL_address_box.left = strlen("URL:")*6 + 10 + cleft; DL_address_box.width = DL_Form.cwidth - DL_address_box.left - cleft - 3; DL_address_box.offset=0; edit_box_draw stdcall(#DL_address_box); - DrawRectangle(DL_address_box.left-1, DL_address_box.top-1, DL_address_box.width+2, 16,DL_address_box.color); - DrawRectangle(DL_address_box.left-2, DL_address_box.top-2, DL_address_box.width+4, 18,sc.work_graph); - - DrawDownloading(); + DrawRectangle(DL_address_box.left-1, DL_address_box.top-1, DL_address_box.width+2, 16, DL_address_box.color); + DrawRectangle(DL_address_box.left-2, DL_address_box.top-2, DL_address_box.width+4, 18, border_color); } + +void DrawDownloading() +{ + dword tmp; + char bytes_received[70]; + + tmp = ConvertSizeToKb(downloaded_size); + strcpy(#bytes_received, tmp); + strcat(#bytes_received, KB_RECEIVED); + DrawBar(DL_progress_bar.left, DL_progress_bar.top + 17, DL_Form.cwidth - DL_progress_bar.left, 9, sc.work); + WriteText(DL_progress_bar.left, DL_progress_bar.top + 17, 0x80, sc.work_text, #bytes_received); + progressbar_draw stdcall(#DL_progress_bar); +} + + + + void DL_Scan(int id) { + if (id==001) { + downloader_opened=0; + StopDownloading(); + ExitProcess(); + } if (id==301) && (DL_http_transfer <= 0) StartDownloading(); if (id==302) StopDownloading(); if (id==305) RunProgram("/sys/File managers/Eolite", #save_to); @@ -182,6 +195,7 @@ void DL_Scan(int id) void StopDownloading() { + download_state = STATE_NOT_STARTED; if (DL_http_transfer<>0) { EAX = DL_http_transfer; @@ -204,9 +218,11 @@ void StartDownloading() StopDownloading(); if (strncmp(#DL_URL,"http:",5)==0) { - DL_address_box.color = DL_address_box.blur_border_color = DL_address_box.focus_border_color = 0xededed; + download_state = STATE_IN_PROGRESS; + DL_address_box.color = DL_address_box.blur_border_color = DL_address_box.focus_border_color = 0xdddDDD; http_get stdcall (#DL_URL, #accept_language); DL_http_transfer = EAX; + DL_progress_bar.value = 0; DL_Draw_Window(); if (DL_http_transfer == 0) { diff --git a/programs/cmm/browser/menu_rmb.h b/programs/cmm/browser/menu_rmb.h index 8b86b33d16..3e232cf25b 100644 --- a/programs/cmm/browser/menu_rmb.h +++ b/programs/cmm/browser/menu_rmb.h @@ -6,12 +6,14 @@ char *ITEMS_LIST[]={ "KOI Ctrl+K",11, "UTF Ctrl+U",21, #ifdef LANG_RUS +"Zoom 2x Z",122, "Џ®б¬®ваҐвм Ёб室­ЁЄ F3",52, "ђҐ¤ ЄвЁа®ў вм Ёб室­ЁЄ F4",53, "ЋзЁбвЁвм Єни Є авЁ­®Є" ,02, "€бв®аЁп" ,03, "ЊҐ­Ґ¤¦Ґа § Ја㧮Є" ,06, #else +"Zoom 2x Z",122, "View source F3",52, "Edit source F4",53, "Free image cache" ,09, @@ -78,8 +80,9 @@ void DrawMenuList() WriteText(18,N*menu.line_h+8,0x80,0x000000,ITEMS_LIST[N*2]); } if (cur_encoding!=_DEFAULT) - { - DrawBar(7, cur_encoding*menu.line_h+9, 4, 4, 0x444444); //show current encoding - } - else DrawBar(7, _DOS*menu.line_h+9, 4, 4, 0x444444); //show current encoding + WriteText(5, cur_encoding*menu.line_h+7, 0x80, 0x777777, "\x10"); //show current encoding + else + WriteText(5, _DOS*menu.line_h+7, 0x80, 0x777777, "\x10"); //show current encoding + + if (WB1.DrawBuf.zoomf == 2) DrawBar(6, 4*menu.line_h+8, 6, 6, 0x777777); } diff --git a/programs/cmm/lib/draw_buf.h b/programs/cmm/lib/draw_buf.h index a69050cd93..b023945d69 100644 --- a/programs/cmm/lib/draw_buf.h +++ b/programs/cmm/lib/draw_buf.h @@ -1,8 +1,12 @@ dword buf_data; +dword zbuf_data; + struct DrawBufer { int bufx, bufy, bufw, bufh; + int zbufx, zbufy, zbufw, zbufh; + byte zoomf; void Init(); void Show(); @@ -12,6 +16,7 @@ struct DrawBufer { void PutPixel(); void AlignCenter(); void AlignRight(); + void Zoom2x(); }; void DrawBufer::Init(int i_bufx, i_bufy, i_bufw, i_bufh) @@ -21,14 +26,21 @@ void DrawBufer::Init(int i_bufx, i_bufy, i_bufw, i_bufh) bufw = i_bufw; bufh = i_bufh; free(buf_data); - buf_data = malloc(bufw * bufh * 4 + 8); //+1 for good luck + buf_data = malloc(bufw * bufh * 4 + 8); ESDWORD[buf_data] = bufw; ESDWORD[buf_data+4] = bufh; -} -void DrawBufer::Show() -{ - PutPaletteImage(buf_data+8, bufw, bufh, bufx, bufy, 32,0); + if (zoomf != 1) + { + zbufx = bufx; + zbufy = bufy; + zbufw = bufw * zoomf; + zbufh = bufh * zoomf; + free(zbuf_data); + zbuf_data = malloc(zbufw * zbufh * 4 + 8); + ESDWORD[zbuf_data] = zbufw; + ESDWORD[zbuf_data+4] = zbufh; + } } void DrawBufer::Fill(dword fill_color) @@ -91,4 +103,49 @@ void DrawBufer::AlignCenter(dword x,y,w,h, content_width) } +void DrawBufer::Zoom2x() +{ + int i, s; + dword point_x, max_i, zline_w, s_inc; + point_x = 0; + max_i = bufw * bufh * 4 + buf_data+8; + s_inc = zoomf * 4; + zline_w = zbufw * 4; + + for (i=buf_data+8, s=zbuf_data+8; i<max_i; i+=4, s+= s_inc) { + ESDWORD[s] = ESDWORD[i]; + ESDWORD[s+4] = ESDWORD[i]; + ESDWORD[s+zline_w] = ESDWORD[i]; + ESDWORD[s+zline_w+4] = ESDWORD[i]; + if (zoomf==3) + { + ESDWORD[s+8] = ESDWORD[i]; + ESDWORD[zline_w+s+8] = ESDWORD[i]; + ESDWORD[zline_w*2+s] = ESDWORD[i]; + ESDWORD[zline_w*2+s+4] = ESDWORD[i]; + ESDWORD[zline_w*2+s+8] = ESDWORD[i]; + } + + point_x++; + if (point_x >= bufw) + { + s += zoomf - 1 * zline_w; + point_x = 0; + } + } +} + + +void DrawBufer::Show() +{ + if (zoomf == 1) + { + PutPaletteImage(buf_data+8, bufw, bufh, bufx, bufy, 32, 0); + } + else + { + Zoom2x(); + PutPaletteImage(zbuf_data+8, zbufw, zbufh, zbufx, zbufy, 32, 0); + } +} diff --git a/programs/cmm/lib/gui.h b/programs/cmm/lib/gui.h index d120c34920..ae70eaf36e 100644 --- a/programs/cmm/lib/gui.h +++ b/programs/cmm/lib/gui.h @@ -29,13 +29,13 @@ WriteText(-strlen(text)*6+w/2+x+1,y,0x80,color_t,text); } -:void DrawCircle(int x, y, r) +:void DrawCircle(int x, y, r, color) { int i; float px=0, py=r, ii = r * 3.1415926 * 2; FOR (i = 0; i < ii; i++) { - PutPixel(px + x, y - py, 0); + PutPixel(px + x, y - py, color); px = py / r + px; py = -px / r + py; }