forked from KolibriOS/kolibrios
WebView: refactoring
git-svn-id: svn://kolibrios.org@8439 a494cfbc-eb01-0410-851d-a64ba20cac60
This commit is contained in:
parent
9220a9a313
commit
64a81df7e7
@ -11,10 +11,10 @@ dword link_color_active;
|
|||||||
#define BODY_MARGIN 6
|
#define BODY_MARGIN 6
|
||||||
#define BASIC_LINE_H 18
|
#define BASIC_LINE_H 18
|
||||||
|
|
||||||
DrawBufer DrawBuf;
|
CANVAS canvas;
|
||||||
char line[500];
|
char line[500];
|
||||||
|
|
||||||
struct _style {
|
struct STYLE {
|
||||||
bool
|
bool
|
||||||
b, u, s, h,
|
b, u, s, h,
|
||||||
font,
|
font,
|
||||||
@ -24,12 +24,20 @@ struct _style {
|
|||||||
image;
|
image;
|
||||||
dword bg_color;
|
dword bg_color;
|
||||||
LIST tag_list;
|
LIST tag_list;
|
||||||
dword tag_title;
|
dword title;
|
||||||
|
void reset();
|
||||||
};
|
};
|
||||||
|
|
||||||
|
void STYLE::reset()
|
||||||
|
{
|
||||||
|
b = u = s = h = blq = pre = title = false;
|
||||||
|
font = false;
|
||||||
|
tag_list.reset();
|
||||||
|
}
|
||||||
|
|
||||||
struct TWebBrowser {
|
struct TWebBrowser {
|
||||||
llist list;
|
llist list;
|
||||||
_style style;
|
STYLE style;
|
||||||
dword draw_y, stolbec;
|
dword draw_y, stolbec;
|
||||||
int zoom;
|
int zoom;
|
||||||
dword o_bufpointer;
|
dword o_bufpointer;
|
||||||
@ -39,6 +47,8 @@ struct TWebBrowser {
|
|||||||
dword bufsize;
|
dword bufsize;
|
||||||
dword is_html;
|
dword is_html;
|
||||||
collection img_url;
|
collection img_url;
|
||||||
|
char header[150];
|
||||||
|
char redirect[URL_SIZE];
|
||||||
|
|
||||||
void Paint();
|
void Paint();
|
||||||
void SetPageDefaults();
|
void SetPageDefaults();
|
||||||
@ -47,14 +57,27 @@ struct TWebBrowser {
|
|||||||
void SetStyle();
|
void SetStyle();
|
||||||
bool CheckForLineBreak();
|
bool CheckForLineBreak();
|
||||||
void NewLine();
|
void NewLine();
|
||||||
void DrawScroller();
|
|
||||||
void ChangeEncoding();
|
void ChangeEncoding();
|
||||||
void DrawPage();
|
void DrawPage();
|
||||||
char header[150];
|
|
||||||
char redirect[URL_SIZE];
|
void tag_a();
|
||||||
|
void tag_p();
|
||||||
|
void tag_img();
|
||||||
|
void tag_div();
|
||||||
|
void tag_h1234_caption();
|
||||||
|
void tag_ol_ul_dt();
|
||||||
|
void tag_li();
|
||||||
|
void tag_q();
|
||||||
|
void tag_hr();
|
||||||
|
void tag_code();
|
||||||
|
void tag_meta_xml();
|
||||||
|
void tag_body();
|
||||||
|
void tag_iframe();
|
||||||
|
void tag_title();
|
||||||
|
void tag_font();
|
||||||
};
|
};
|
||||||
|
|
||||||
scroll_bar scroll_wv = { 15,NULL,NULL,NULL,0,2,NULL,0,0,0xeeeeee,0xBBBbbb,0xeeeeee};
|
#include "TWB\set_style.h"
|
||||||
|
|
||||||
//============================================================================================
|
//============================================================================================
|
||||||
void TWebBrowser::Paint()
|
void TWebBrowser::Paint()
|
||||||
@ -62,7 +85,7 @@ void TWebBrowser::Paint()
|
|||||||
dword start_x, line_length, stolbec_len;
|
dword start_x, line_length, stolbec_len;
|
||||||
dword text_color__;
|
dword text_color__;
|
||||||
|
|
||||||
if (style.tag_title)
|
if (style.title)
|
||||||
{
|
{
|
||||||
strncpy(#header, #line, sizeof(TWebBrowser.header)-1);
|
strncpy(#header, #line, sizeof(TWebBrowser.header)-1);
|
||||||
strncat(#header, " - ", sizeof(TWebBrowser.header)-1);
|
strncat(#header, " - ", sizeof(TWebBrowser.header)-1);
|
||||||
@ -81,51 +104,46 @@ void TWebBrowser::Paint()
|
|||||||
stolbec_len = strlen(#line) * zoom;
|
stolbec_len = strlen(#line) * zoom;
|
||||||
line_length = stolbec_len * list.font_w;
|
line_length = stolbec_len * list.font_w;
|
||||||
|
|
||||||
if (debug_mode) {
|
|
||||||
DrawBuf.DrawBar(start_x, draw_y, line_length, list.item_h, 0xDDDddd);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (style.bg_color!=page_bg) {
|
if (style.bg_color!=page_bg) {
|
||||||
DrawBuf.DrawBar(start_x, draw_y, line_length, list.item_h, style.bg_color);
|
canvas.DrawBar(start_x, draw_y, line_length, list.item_h, style.bg_color);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (style.image) {
|
if (style.image) {
|
||||||
DrawBuf.DrawBar(start_x, draw_y, line_length, list.item_h-1, 0xF9DBCB);
|
canvas.DrawBar(start_x, draw_y, line_length, list.item_h-1, 0xF9DBCB);
|
||||||
}
|
}
|
||||||
if (style.button) {
|
if (style.button) {
|
||||||
DrawBuf.DrawBar(start_x, draw_y, line_length, list.item_h - calc(zoom*2), 0xCCCccc);
|
canvas.DrawBar(start_x, draw_y, line_length, list.item_h - calc(zoom*2), 0xCCCccc);
|
||||||
DrawBuf.DrawBar(start_x, draw_y + list.item_h - calc(zoom*2), line_length, zoom, 0x999999);
|
canvas.DrawBar(start_x, draw_y + list.item_h - calc(zoom*2), line_length, zoom, 0x999999);
|
||||||
}
|
}
|
||||||
|
|
||||||
text_color__ = text_colors.get_last();
|
text_color__ = text_colors.get_last();
|
||||||
if (link) && (text_color__ == text_colors.get(0)) text_color__ = link_color_default;
|
if (link) && (text_color__ == text_colors.get(0)) text_color__ = link_color_default;
|
||||||
|
|
||||||
DrawBuf.WriteText(start_x, draw_y, list.font_type, text_color__, #line, NULL);
|
canvas.WriteText(start_x, draw_y, list.font_type, text_color__, #line, NULL);
|
||||||
if (style.b) DrawBuf.WriteText(start_x+1, draw_y, list.font_type, text_color__, #line, NULL);
|
if (style.b) canvas.WriteText(start_x+1, draw_y, list.font_type, text_color__, #line, NULL);
|
||||||
if (style.s) DrawBuf.DrawBar(start_x, list.item_h / 2 - zoom + draw_y, line_length, zoom, text_color__);
|
if (style.s) canvas.DrawBar(start_x, list.item_h / 2 - zoom + draw_y, line_length, zoom, text_color__);
|
||||||
if (style.u) DrawBuf.DrawBar(start_x, list.item_h - zoom - zoom + draw_y, line_length, zoom, text_color__);
|
if (style.u) canvas.DrawBar(start_x, list.item_h - zoom - zoom + draw_y, line_length, zoom, text_color__);
|
||||||
if (link) {
|
if (link) {
|
||||||
if (line[0]==' ') && (line[1]==NULL) {} else {
|
if (line[0]==' ') && (line[1]==NULL) {} else {
|
||||||
DrawBuf.DrawBar(start_x, draw_y + list.item_h - calc(zoom*2)-1, line_length, zoom, link_color_default);
|
canvas.DrawBar(start_x, draw_y + list.item_h - calc(zoom*2)-1, line_length, zoom, link_color_default);
|
||||||
links.add_text(start_x, draw_y + list.y, line_length, list.item_h - calc(zoom*2)-1, zoom);
|
links.add_text(start_x, draw_y + list.y, line_length, list.item_h - calc(zoom*2)-1, zoom);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
stolbec += stolbec_len;
|
stolbec += stolbec_len;
|
||||||
if (debug_mode) debug(#line);
|
if (debug_mode) debugln(#line);
|
||||||
line = NULL;
|
line = NULL;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
//============================================================================================
|
//============================================================================================
|
||||||
void TWebBrowser::SetPageDefaults()
|
void TWebBrowser::SetPageDefaults()
|
||||||
{
|
{
|
||||||
style.b = style.u = style.s = style.h = style.blq = t_html = t_body = style.pre =
|
t_html = t_body = link = false;
|
||||||
link = style.tag_title = style.font = false;
|
style.reset();
|
||||||
style.tag_list.reset();
|
|
||||||
link_color_default = 0x0000FF;
|
link_color_default = 0x0000FF;
|
||||||
link_color_active = 0xFF0000;
|
link_color_active = 0xFF0000;
|
||||||
page_bg = 0xffEBE8E9; //E0E3E3 EBE8E9
|
page_bg = 0xffEBE8E9; //E0E3E3 EBE8E9
|
||||||
style.bg_color = page_bg;
|
style.bg_color = page_bg;
|
||||||
DrawBuf.Fill(0, page_bg);
|
canvas.Fill(0, page_bg);
|
||||||
links.clear();
|
links.clear();
|
||||||
anchors.clear();
|
anchors.clear();
|
||||||
img_url.drop();
|
img_url.drop();
|
||||||
@ -164,14 +182,12 @@ void TWebBrowser::AddCharToTheLine(unsigned char _char)
|
|||||||
}
|
}
|
||||||
//============================================================================================
|
//============================================================================================
|
||||||
void TWebBrowser::ParseHtml(dword _bufpointer, _bufsize){
|
void TWebBrowser::ParseHtml(dword _bufpointer, _bufsize){
|
||||||
word bukva[2];
|
|
||||||
char unicode_symbol[10];
|
char unicode_symbol[10];
|
||||||
dword unicode_symbol_result;
|
|
||||||
dword j;
|
dword j;
|
||||||
bool ignor_param=false;
|
|
||||||
int tab_len;
|
int tab_len;
|
||||||
dword bufpos;
|
dword bufpos;
|
||||||
bufsize = _bufsize;
|
bufsize = _bufsize;
|
||||||
|
|
||||||
if (bufpointer != _bufpointer) {
|
if (bufpointer != _bufpointer) {
|
||||||
bufpointer = malloc(bufsize);
|
bufpointer = malloc(bufsize);
|
||||||
memmov(bufpointer, _bufpointer, bufsize);
|
memmov(bufpointer, _bufpointer, bufsize);
|
||||||
@ -224,77 +240,27 @@ void TWebBrowser::ParseHtml(dword _bufpointer, _bufsize){
|
|||||||
if (!is_html) goto _DEFAULT;
|
if (!is_html) goto _DEFAULT;
|
||||||
bufpos++;
|
bufpos++;
|
||||||
switch (ESBYTE[bufpos]) {
|
switch (ESBYTE[bufpos]) {
|
||||||
case '!':
|
case '!': case '/': case '?':
|
||||||
case '/':
|
case 'a'...'z': case 'A'...'Z':
|
||||||
case '?':
|
|
||||||
case 'a'...'z':
|
|
||||||
case 'A'...'Z':
|
|
||||||
goto _TAG;
|
goto _TAG;
|
||||||
default:
|
default:
|
||||||
goto _DEFAULT;
|
goto _DEFAULT;
|
||||||
}
|
}
|
||||||
_TAG:
|
_TAG:
|
||||||
if (!strncmp(bufpos,"!--",3))
|
if (tag.parse_tag(#bufpos, bufpointer + bufsize)) {
|
||||||
{
|
|
||||||
bufpos+=3;
|
|
||||||
//STRSTR
|
|
||||||
while (strncmp(bufpos,"-->",3)!=0) && (bufpos < bufpointer + bufsize)
|
|
||||||
{
|
|
||||||
bufpos++;
|
|
||||||
}
|
|
||||||
bufpos+=2;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
tag.reset();
|
|
||||||
if (ESBYTE[bufpos] == '/') {
|
|
||||||
tag.opened = false;
|
|
||||||
bufpos++;
|
|
||||||
}
|
|
||||||
|
|
||||||
ignor_param=false;
|
|
||||||
while (ESBYTE[bufpos] !='>') && (bufpos < bufpointer + bufsize) //ïîëó÷àåì òåã è åãî ïàðàìåòðû
|
|
||||||
//&& (!chrnum(#tag.params,'\"') % 2) //<a title="<small>ATI</small><br>9800xt" href="vgamuseum.ru/9800xt">
|
|
||||||
{
|
|
||||||
bukva = ESBYTE[bufpos];
|
|
||||||
if (__isWhite(bukva)) bukva = ' ';
|
|
||||||
if (!ignor_param) && (bukva!=' ') {
|
|
||||||
if (strlen(#tag.name)+1<sizeof(tag.name)) chrcat(#tag.name, bukva);
|
|
||||||
} else {
|
|
||||||
ignor_param = true;
|
|
||||||
if (strlen(#tag.params)+1<sizeof(tag.params)) strcat(#tag.params, #bukva);
|
|
||||||
//chrncat(#tag.params, bukva, sizeof(tag.params)-1);
|
|
||||||
}
|
|
||||||
bufpos++;
|
|
||||||
}
|
|
||||||
strlwr(#tag.name);
|
|
||||||
|
|
||||||
// ignore text inside the next tags
|
|
||||||
if (tag.is("script")) || (tag.is("style")) || (tag.is("binary")) || (tag.is("select")) {
|
|
||||||
sprintf(#tag.params, "</%s>", #tag.name);
|
|
||||||
if (j = strstri(bufpos, #tag.params)) bufpos = j-1;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (tag.name[strlen(#tag.name)-1]=='/') tag.name[strlen(#tag.name)-1]=NULL; //for br/ !!!!!!!!
|
|
||||||
if (tag.params) tag.parse_params();
|
|
||||||
|
|
||||||
if (tag.name) {
|
|
||||||
CheckForLineBreak();
|
CheckForLineBreak();
|
||||||
Paint();
|
Paint();
|
||||||
if (tag.name) {
|
$push cur_encoding
|
||||||
EAX = cur_encoding;
|
|
||||||
$push eax
|
|
||||||
SetStyle();
|
SetStyle();
|
||||||
$pop eax
|
$pop eax
|
||||||
// The thing is that UTF if longer than other encodings.
|
// The thing is that UTF if longer than other encodings.
|
||||||
// So if encoding was changed to UTF than $bufpos position is wrong now,
|
// So if encoding was changed from UTF to DOS than $bufpos position got wrong,
|
||||||
// and we have to start parse from the very beginning
|
// and we have to start parse from the very beginning
|
||||||
if (EAX != cur_encoding) && (cur_encoding == CH_UTF8) {
|
if (EAX != cur_encoding) && (cur_encoding == CH_UTF8) {
|
||||||
ParseHtml(bufpointer, bufsize);
|
ParseHtml(bufpointer, bufsize);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
_DEFAULT:
|
_DEFAULT:
|
||||||
@ -305,9 +271,8 @@ void TWebBrowser::ParseHtml(dword _bufpointer, _bufsize){
|
|||||||
NewLine();
|
NewLine();
|
||||||
list.count = draw_y;
|
list.count = draw_y;
|
||||||
|
|
||||||
DrawBuf.bufh = math.max(list.visible, draw_y);
|
canvas.bufh = math.max(list.visible, draw_y);
|
||||||
debugval("DrawBuf.bufh", DrawBuf.bufh);
|
buf_data = realloc(buf_data, canvas.bufh * canvas.bufw * 4 + 8);
|
||||||
buf_data = realloc(buf_data, DrawBuf.bufh * DrawBuf.bufw * 4 + 8);
|
|
||||||
|
|
||||||
list.CheckDoesValuesOkey();
|
list.CheckDoesValuesOkey();
|
||||||
anchors.current = NULL;
|
anchors.current = NULL;
|
||||||
@ -346,330 +311,6 @@ bool TWebBrowser::CheckForLineBreak()
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
//============================================================================================
|
//============================================================================================
|
||||||
void TWebBrowser::SetStyle() {
|
|
||||||
char img_path[4096]=0;
|
|
||||||
dword imgbuf[44];
|
|
||||||
dword cur_img;
|
|
||||||
int img_x, img_y, img_w, img_h;
|
|
||||||
|
|
||||||
dword value;
|
|
||||||
|
|
||||||
if (value = tag.get_value_of("name=")) || (value = tag.get_value_of("id=")) {
|
|
||||||
anchors.add(value, draw_y);
|
|
||||||
if (anchors.current) && (streq(value, #anchors.current+1)) {
|
|
||||||
list.first = draw_y;
|
|
||||||
anchors.current = NULL;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (tag.is("html")) {
|
|
||||||
t_html = tag.opened;
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
if (tag.is("title")) {
|
|
||||||
style.tag_title = tag.opened;
|
|
||||||
if (!tag.opened) DrawTitle(#header);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
if (tag.is("body")) {
|
|
||||||
t_body = tag.opened;
|
|
||||||
if (value = tag.get_value_of("link=")) link_color_default = GetColor(value);
|
|
||||||
if (value = tag.get_value_of("alink=")) link_color_active = GetColor(value);
|
|
||||||
if (value = tag.get_value_of("text=")) text_colors.set(0, GetColor(value));
|
|
||||||
if (value = tag.get_value_of("bgcolor=")) {
|
|
||||||
style.bg_color = page_bg = GetColor(value);
|
|
||||||
DrawBuf.Fill(0, page_bg);
|
|
||||||
}
|
|
||||||
// Autodetecting encoding if no encoding was set
|
|
||||||
if (tag.opened) && (custom_encoding==-1) && (cur_encoding == CH_CP866) {
|
|
||||||
if (strstr(bufpointer, "\208\190")) ChangeEncoding(CH_UTF8);
|
|
||||||
else if (chrnum(bufpointer, '\246')>5) ChangeEncoding(CH_CP1251);
|
|
||||||
}
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
if (tag.is("br")) { NewLine(); return; }
|
|
||||||
if (tag.is("b")) || (tag.is("strong")) || (tag.is("big")) || (tag.is("w:b")) {
|
|
||||||
style.b = tag.opened;
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
if (tag.is("w:r")) && (!tag.opened) { style.b = false; return; }
|
|
||||||
if (tag.is("a")) {
|
|
||||||
if (tag.opened)
|
|
||||||
{
|
|
||||||
if (value = tag.get_value_of("href=")) && (!strstr(value,"javascript:"))
|
|
||||||
{
|
|
||||||
link = true;
|
|
||||||
links.add_link(value);
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
link = false;
|
|
||||||
style.bg_color = page_bg;
|
|
||||||
}
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
if (tag.is("iframe")) && (value = tag.get_value_of("src=")) {
|
|
||||||
NewLine();
|
|
||||||
strcpy(#line, "IFRAME: ");
|
|
||||||
Paint();
|
|
||||||
link=true;
|
|
||||||
links.add_link(value);
|
|
||||||
strncpy(#line, value, sizeof(line)-1);
|
|
||||||
while (CheckForLineBreak()) {};
|
|
||||||
Paint();
|
|
||||||
link=false;
|
|
||||||
NewLine();
|
|
||||||
}
|
|
||||||
if (tag.is("font")) {
|
|
||||||
style.font = tag.opened;
|
|
||||||
style.bg_color = page_bg;
|
|
||||||
if (tag.opened)
|
|
||||||
{
|
|
||||||
if (value = tag.get_value_of("bg=")) style.bg_color = GetColor(value);
|
|
||||||
if (value = tag.get_value_of("color=")) {
|
|
||||||
text_colors.add(GetColor(value));
|
|
||||||
} else {
|
|
||||||
text_colors.add(text_colors.get_last());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else text_colors.pop();
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
if (tag.is("div")) {
|
|
||||||
if (streq(#tag.prior,"div")) && (tag.opened) return;
|
|
||||||
if (!tag.opened) && (style.font) text_colors.pop();
|
|
||||||
NewLine();
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
if (tag.is("header")) || (tag.is("article")) || (tag.is("footer")) || (tag.is("figure")) {
|
|
||||||
NewLine();
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
if (tag.is("p")) || (tag.is("w:p")) {
|
|
||||||
IF (tag.prior[0] == 'h') || (streq(#tag.prior,"td")) || (streq(#tag.prior,"p")) return;
|
|
||||||
NewLine();
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
if (tag.is("pre")) { style.pre = tag.opened; return; }
|
|
||||||
if (tag.is("td")) { if (tag.opened) AddCharToTheLine(' '); return; }
|
|
||||||
if (tag.is("tr")) { if (tag.opened) NewLine(); return; }
|
|
||||||
if (tag.is("button")) { style.button = tag.opened; stolbec++; return; }
|
|
||||||
if (tag.is("u")) || (tag.is("ins")) { style.u=tag.opened; return;}
|
|
||||||
if (tag.is("s")) || (tag.is("strike")) || (tag.is("del")) { style.s=tag.opened; return; }
|
|
||||||
if (tag.is("dl")) {
|
|
||||||
if (tag.opened) NewLine();
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
if (tag.is("dd")) {
|
|
||||||
//NewLine();
|
|
||||||
//if (tag.opened) stolbec += 5; //stolbec overflow!
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
if (tag.is("blockquote")) { style.blq = tag.opened; return; }
|
|
||||||
if (tag.is("code")) {
|
|
||||||
if (tag.opened) style.bg_color = 0xe4ffcb; else style.bg_color = page_bg;
|
|
||||||
style.pre = tag.opened; return;
|
|
||||||
}
|
|
||||||
if (tag.is("img")) {
|
|
||||||
value = tag.get_value_of("src=");
|
|
||||||
if (!value) goto NOIMG;
|
|
||||||
|
|
||||||
if (!strcmp(value + strrchr(value, '.'), "svg")) goto NOIMG;
|
|
||||||
|
|
||||||
if (streqrp(value, "data:")) {
|
|
||||||
if (!strstr(value, "base64,")) goto NOIMG;
|
|
||||||
value = EAX+7;
|
|
||||||
if (ESBYTE[value]==' ') value++;
|
|
||||||
cur_img = malloc(strlen(value));
|
|
||||||
base64_decode stdcall (value, cur_img, strlen(value));
|
|
||||||
img_decode stdcall (cur_img, EAX, 0);
|
|
||||||
$push eax
|
|
||||||
free(cur_img);
|
|
||||||
$pop eax
|
|
||||||
if (EAX) goto IMGOK; else goto NOIMG;
|
|
||||||
}
|
|
||||||
|
|
||||||
strlcpy(#img_path, value, sizeof(img_path)-1);
|
|
||||||
get_absolute_url(#img_path, history.current());
|
|
||||||
|
|
||||||
if (check_is_the_adress_local(#img_path)) {
|
|
||||||
img_from_file stdcall(#img_path);
|
|
||||||
if (EAX) goto IMGOK; else goto NOIMG;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (cache.has(#img_path)) && (cache.current_size)
|
|
||||||
{
|
|
||||||
img_decode stdcall (cache.current_buf, cache.current_size, 0);
|
|
||||||
if (!EAX) goto NOIMG;
|
|
||||||
IMGOK:
|
|
||||||
|
|
||||||
cur_img = EAX;
|
|
||||||
img_h = ESDWORD[cur_img+8];
|
|
||||||
img_w = ESDWORD[cur_img+4];
|
|
||||||
|
|
||||||
if (img_w / 6 + stolbec > list.column_max) {
|
|
||||||
NewLine();
|
|
||||||
}
|
|
||||||
img_x = stolbec*list.font_w+3;
|
|
||||||
img_y = draw_y;
|
|
||||||
|
|
||||||
img_w = math.min(img_w, DrawBuf.bufw - img_x);
|
|
||||||
|
|
||||||
stolbec += img_w / 6;
|
|
||||||
if (stolbec > list.column_max) NewLine();
|
|
||||||
|
|
||||||
if (img_h > list.item_h + 5) {
|
|
||||||
draw_y += img_h - list.item_h;
|
|
||||||
NewLine();
|
|
||||||
}
|
|
||||||
|
|
||||||
if (link) links.add_text(img_x + list.x, img_y + list.y, img_w, img_h, 0);
|
|
||||||
|
|
||||||
if (img_y + img_h >= DrawBuf.bufh) DrawBuf.IncreaseBufSize();
|
|
||||||
|
|
||||||
if (ESDWORD[cur_img+20] != IMAGE_BPP32) {
|
|
||||||
img_convert stdcall(cur_img, 0, IMAGE_BPP32, 0, 0);
|
|
||||||
$push eax
|
|
||||||
img_destroy stdcall(cur_img);
|
|
||||||
$pop eax
|
|
||||||
cur_img = EAX;
|
|
||||||
if (!EAX) goto NOIMG;
|
|
||||||
}
|
|
||||||
imgbuf[04] = DrawBuf.bufw;
|
|
||||||
imgbuf[08] = DrawBuf.bufh;
|
|
||||||
imgbuf[20] = IMAGE_BPP32;
|
|
||||||
imgbuf[24] = buf_data+8;
|
|
||||||
img_blend stdcall(#imgbuf, cur_img, img_x, img_y, 0, 0, img_w, img_h);
|
|
||||||
img_destroy stdcall(cur_img);
|
|
||||||
return;
|
|
||||||
} else {
|
|
||||||
img_url.add(#img_path);
|
|
||||||
}
|
|
||||||
NOIMG:
|
|
||||||
|
|
||||||
if (value = tag.get_value_of("title=")) && (strlen(value)<sizeof(line)-3) && (value) sprintf(#line, "[%s]", value);
|
|
||||||
if (value = tag.get_value_of("alt=")) && (strlen(value)<sizeof(line)-3) && (value) sprintf(#line, "[%s]", value);
|
|
||||||
if (!line) {
|
|
||||||
if (!strncmp(#img_path, "data:", 5)) img_path=0;
|
|
||||||
replace_char(#img_path, '?', NULL, strlen(#img_path));
|
|
||||||
img_path[sizeof(line)-3] = '\0'; //prevent overflow in sprintf
|
|
||||||
sprintf(#line, "[%s]", #img_path+strrchr(#img_path, '/'));
|
|
||||||
line[50]= NULL;
|
|
||||||
}
|
|
||||||
while (CheckForLineBreak()) {};
|
|
||||||
|
|
||||||
text_colors.add(0x9A6F29);
|
|
||||||
style.image = true;
|
|
||||||
Paint();
|
|
||||||
style.image = false;
|
|
||||||
text_colors.pop();
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
if (tag.is("h4")) {
|
|
||||||
NewLine();
|
|
||||||
NewLine();
|
|
||||||
style.h = tag.opened;
|
|
||||||
style.b = tag.opened;
|
|
||||||
}
|
|
||||||
if (tag.is("h1")) || (tag.is("h2")) || (tag.is("h3")) || (tag.is("caption")) {
|
|
||||||
style.h = tag.opened;
|
|
||||||
if (tag.opened) {
|
|
||||||
if (!style.pre) NewLine();
|
|
||||||
draw_y += 10;
|
|
||||||
zoom=2;
|
|
||||||
list.font_type |= 10011001b;
|
|
||||||
list.item_h = BASIC_LINE_H * 2 - 2;
|
|
||||||
if (tag.is("h1")) style.b = true;
|
|
||||||
} else {
|
|
||||||
if (tag.is("h1")) style.b = false;
|
|
||||||
NewLine();
|
|
||||||
zoom=1;
|
|
||||||
list.font_type = 10011000b;
|
|
||||||
list.item_h = BASIC_LINE_H;
|
|
||||||
}
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
if (tag.is("dt")) {
|
|
||||||
style.tag_list.upd_level(tag.opened, DT);
|
|
||||||
if (tag.opened) NewLine();
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
if (tag.is("ul")) {
|
|
||||||
style.tag_list.upd_level(tag.opened, UL);
|
|
||||||
if (!tag.opened) && (!style.pre) NewLine();
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
if (tag.is("ol")) {
|
|
||||||
style.tag_list.upd_level(tag.opened, OL);
|
|
||||||
if (!tag.opened) && (!style.pre) NewLine();
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
if (tag.is("li")) && (tag.opened)
|
|
||||||
{
|
|
||||||
if (!style.tag_list.level) style.tag_list.upd_level(1, UL);
|
|
||||||
if (!style.pre) NewLine();
|
|
||||||
if (style.tag_list.get_order_type() == UL) {
|
|
||||||
strcpy(#line, "\31 ");
|
|
||||||
stolbec = style.tag_list.level * 5 - 2;
|
|
||||||
}
|
|
||||||
if (style.tag_list.get_order_type() == OL) {
|
|
||||||
sprintf(#line, "%i. ", style.tag_list.inc_counter());
|
|
||||||
stolbec = style.tag_list.level * 5 - strlen(#line);
|
|
||||||
}
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
if (tag.is("q"))
|
|
||||||
{
|
|
||||||
if (tag.opened) {
|
|
||||||
EAX = strlen(#line);
|
|
||||||
if (line[EAX-1] != ' ') chrcat(#line, ' ');
|
|
||||||
chrcat(#line, '\"');
|
|
||||||
}
|
|
||||||
if (!tag.opened) strcat(#line, "\" ");
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
if (tag.is("hr")) {
|
|
||||||
if (value = tag.get_value_of("color=")) EDI = GetColor(value); else EDI = 0x999999;
|
|
||||||
$push edi;
|
|
||||||
NewLine();
|
|
||||||
$pop edi;
|
|
||||||
draw_y += 10;
|
|
||||||
DrawBuf.DrawBar(5, draw_y - 1, list.w-10, 1, EDI);
|
|
||||||
NewLine();
|
|
||||||
draw_y += 10;
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
if (tag.is("meta")) {
|
|
||||||
if (streq(tag.get_value_of("http-equiv="), "refresh")) && (value = tag.get_value_of("content=")) {
|
|
||||||
if (value = strstri(value, "url=")) strcpy(#redirect, value);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (custom_encoding == -1) && (tag.is("meta")) || (tag.is("?xml")) {
|
|
||||||
if (value = tag.get_value_of("charset=")) || (value = tag.get_value_of("content=")) || (value = tag.get_value_of("encoding="))
|
|
||||||
{
|
|
||||||
value += strrchr(value, '='); //search in content=
|
|
||||||
if (ESBYTE[value] == '"') value++;
|
|
||||||
strlwr(value);
|
|
||||||
if (streqrp(value,"utf-8")) || (streqrp(value,"utf8")) ChangeEncoding(CH_UTF8);
|
|
||||||
else if (streqrp(value,"windows-1251")) || (streqrp(value,"windows1251")) ChangeEncoding(CH_CP1251);
|
|
||||||
else if (streqrp(value,"dos")) || (streqrp(value,"cp-866")) ChangeEncoding(CH_CP866);
|
|
||||||
else if (streqrp(value,"iso-8859-5")) || (streqrp(value,"iso8859-5")) ChangeEncoding(CH_ISO8859_5);
|
|
||||||
else if (streqrp(value,"koi8-r")) || (streqrp(value,"koi8-u")) ChangeEncoding(CH_KOI8);
|
|
||||||
}
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
//============================================================================================
|
|
||||||
void TWebBrowser::DrawScroller()
|
|
||||||
{
|
|
||||||
scroll_wv.max_area = list.count;
|
|
||||||
scroll_wv.cur_area = list.visible;
|
|
||||||
scroll_wv.position = list.first;
|
|
||||||
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;
|
|
||||||
scrollbar_v_draw(#scroll_wv);
|
|
||||||
}
|
|
||||||
//============================================================================================
|
|
||||||
void TWebBrowser::ChangeEncoding(int _new_encoding)
|
void TWebBrowser::ChangeEncoding(int _new_encoding)
|
||||||
{
|
{
|
||||||
if (cur_encoding == _new_encoding) return;
|
if (cur_encoding == _new_encoding) return;
|
||||||
@ -683,7 +324,6 @@ void TWebBrowser::ChangeEncoding(int _new_encoding)
|
|||||||
//============================================================================================
|
//============================================================================================
|
||||||
void TWebBrowser::NewLine()
|
void TWebBrowser::NewLine()
|
||||||
{
|
{
|
||||||
dword onleft, ontop;
|
|
||||||
static int empty_line=0;
|
static int empty_line=0;
|
||||||
|
|
||||||
if (!stolbec) && (draw_y==BODY_MARGIN) return;
|
if (!stolbec) && (draw_y==BODY_MARGIN) return;
|
||||||
@ -698,17 +338,26 @@ void TWebBrowser::NewLine()
|
|||||||
empty_line=0;
|
empty_line=0;
|
||||||
}
|
}
|
||||||
|
|
||||||
onleft = list.x + BODY_MARGIN;
|
|
||||||
ontop = draw_y + list.y;
|
|
||||||
if (t_html) && (!t_body) return;
|
if (t_html) && (!t_body) return;
|
||||||
draw_y += list.item_h;
|
draw_y += list.item_h;
|
||||||
if (style.blq) stolbec = 6; else stolbec = 0;
|
if (style.blq) stolbec = 6; else stolbec = 0;
|
||||||
stolbec += style.tag_list.level * 5;
|
stolbec += style.tag_list.level * 5;
|
||||||
if (debug_mode) debugln(NULL);
|
|
||||||
}
|
}
|
||||||
//============================================================================================
|
//============================================================================================
|
||||||
|
scroll_bar scroll_wv =
|
||||||
|
{ 15,NULL,NULL,NULL,0,2,NULL,
|
||||||
|
0,0,0xeeeeee,0xBBBbbb,0xeeeeee};
|
||||||
|
|
||||||
void TWebBrowser::DrawPage()
|
void TWebBrowser::DrawPage()
|
||||||
{
|
{
|
||||||
DrawBuf.Show(list.first, list.h);
|
scroll_wv.max_area = list.count;
|
||||||
DrawScroller();
|
scroll_wv.cur_area = list.visible;
|
||||||
|
scroll_wv.position = list.first;
|
||||||
|
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;
|
||||||
|
scrollbar_v_draw(#scroll_wv);
|
||||||
|
|
||||||
|
canvas.Show(list.first, list.h);
|
||||||
}
|
}
|
@ -1,195 +1,78 @@
|
|||||||
//Íàäî áóäåò ïåðåäåëàòü íà "äåðåâî ïîèñêà" èëè, ÷òî-òî ïîäîáíîå
|
collection_int text_colors;
|
||||||
//áóäåò íå÷èòàáåëüíî, çàòî ìåíüøå è áûñòåå
|
|
||||||
|
|
||||||
struct color_spec {
|
struct color_spec {
|
||||||
char *name;
|
char *name;
|
||||||
int rgb;
|
int rgb;
|
||||||
};
|
};
|
||||||
|
|
||||||
collection_int text_colors;
|
|
||||||
|
|
||||||
struct color_spec color_specs[] = {
|
struct color_spec color_specs[] = {
|
||||||
"aliceblue", 0xF0F8FF,
|
"aliceblue", 0xF0F8FF, "antiquewhite", 0xFAEBD7, "aqua", 0x00FFFF, "aquamarine", 0x7FFFD4,
|
||||||
"antiquewhite", 0xFAEBD7,
|
"azure", 0xF0FFFF, "beige", 0xF5F5DC, "bisque", 0xFFE4C4, "black", 0x000000,
|
||||||
"aqua", 0x00FFFF,
|
"blanchedalmond", 0xFFEBCD, "blue", 0x0000FF, "blueviolet", 0x8A2BE2, "brown", 0xA52A2A,
|
||||||
"aquamarine", 0x7FFFD4,
|
"burlywood", 0xDEB887, "cadetblue", 0x5F9EA0, "chartreuse", 0x7FFF00, "chocolate", 0xD2691E,
|
||||||
"azure", 0xF0FFFF,
|
"coral", 0xFF7F50, "cornflowerblue", 0x6495ED, "cornsilk", 0xFFF8DC, "crimson", 0xDC143C,
|
||||||
"beige", 0xF5F5DC,
|
"cyan", 0x00FFFF, "darkblue", 0x00008B, "darkcyan", 0x008B8B, "darkgoldenrod", 0xB8860B,
|
||||||
"bisque", 0xFFE4C4,
|
"darkgray", 0xA9A9A9, "darkgreen", 0x006400, "darkkhaki", 0xBDB76B, "darkmagenta", 0x8B008B,
|
||||||
"black", 0x000000,
|
"darkolivegreen", 0x556B2F, "darkorange", 0xFF8C00, "darkorchid", 0x9932CC, "darkred", 0x8B0000,
|
||||||
"blanchedalmond", 0xFFEBCD,
|
"darksalmon", 0xE9967A, "darkseagreen", 0x8FBC8F, "darkslateblue", 0x483D8B, "darkslategray", 0x2F4F4F,
|
||||||
"blue", 0x0000FF,
|
"darkturquoise", 0x00CED1, "darkviolet", 0x9400D3, "deeppink", 0xFF1493, "deepskyblue", 0x00BFFF,
|
||||||
"blueviolet", 0x8A2BE2,
|
"dimgray", 0x696969, "dodgerblue", 0x1E90FF, "firebrick", 0xB22222, "floralwhite", 0xFFFAF0,
|
||||||
"brown", 0xA52A2A,
|
"forestgreen", 0x228B22, "fuchsia", 0xFF00FF, "gainsboro", 0xDCDCDC, "ghostwhite", 0xF8F8FF,
|
||||||
"burlywood", 0xDEB887,
|
"gold", 0xFFD700, "goldenrod", 0xDAA520, "gray", 0x808080, "green", 0x008000,
|
||||||
"cadetblue", 0x5F9EA0,
|
"greenyellow", 0xADFF2F, "honeydew", 0xF0FFF0, "hotpink", 0xFF69B4, "indianred", 0xCD5C5C,
|
||||||
"chartreuse", 0x7FFF00,
|
"indigo", 0x4B0082, "ivory", 0xFFFFF0, "khaki", 0xF0E68C, "lavender", 0xE6E6FA,
|
||||||
"chocolate", 0xD2691E,
|
"lavenderblush", 0xFFF0F5, "lawngreen", 0x7CFC00, "lemonchiffon", 0xFFFACD, "lightblue", 0xADD8E6,
|
||||||
"coral", 0xFF7F50,
|
"lightcoral", 0xF08080, "lightcyan", 0xE0FFFF, "lightgreen", 0x90EE90, "lightgrey", 0xD3D3D3,
|
||||||
"cornflowerblue", 0x6495ED,
|
"lightpink", 0xFFB6C1, "lightsalmon", 0xFFA07A, "lightseagreen", 0x20B2AA, "lightskyblue", 0x87CEFA,
|
||||||
"cornsilk", 0xFFF8DC,
|
"lightslategray", 0x778899, "lightsteelblue", 0xB0C4DE, "lightyellow", 0xFFFFE0, "lime", 0x00FF00,
|
||||||
"crimson", 0xDC143C,
|
"limegreen", 0x32CD32, "linen", 0xFAF0E6, "magenta", 0xFF00FF, "maroon", 0x800000,
|
||||||
"cyan", 0x00FFFF,
|
"mediumaquamarine", 0x66CDAA, "mediumblue", 0x0000CD, "mediumorchid", 0xBA55D3, "mediumpurple", 0x9370DB,
|
||||||
"darkblue", 0x00008B,
|
"mediumseagreen", 0x3CB371, "mediumslateblue", 0x7B68EE, "mediumspringgreen",0x00FA9A, "mediumturquoise", 0x48D1CC,
|
||||||
"darkcyan", 0x008B8B,
|
"mediumvioletred", 0xC71585, "midnightblue", 0x191970, "mintcream", 0xF5FFFA, "mistyrose", 0xFFE4E1,
|
||||||
"darkgoldenrod", 0xB8860B,
|
"moccasin", 0xFFE4B5, "navajowhite", 0xFFDEAD, "navy", 0x000080, "oldlace", 0xFDF5E6,
|
||||||
"darkgray", 0xA9A9A9,
|
"olive", 0x808000, "olivedrab", 0x6B8E23, "orange", 0xFFA500, "orangered", 0xFF4500,
|
||||||
"darkgreen", 0x006400,
|
"orchid", 0xDA70D6, "palegoldenrod", 0xEEE8AA, "palegreen", 0x98FB98, "paleturquoise", 0xAFEEEE,
|
||||||
"darkkhaki", 0xBDB76B,
|
"palevioletred", 0xDB7093, "papayawhip", 0xFFEFD5, "peachpuff", 0xFFDAB9, "peru", 0xCD853F,
|
||||||
"darkmagenta", 0x8B008B,
|
"pink", 0xFFC0CB, "plum", 0xDDA0DD, "powderblue", 0xB0E0E6, "purple", 0x800080,
|
||||||
"darkolivegreen", 0x556B2F,
|
"red", 0xFF0000, "rosybrown", 0xBC8F8F, "royalblue", 0x4169E1, "saddlebrown", 0x8B4513,
|
||||||
"darkorange", 0xFF8C00,
|
"salmon", 0xFA8072, "sandybrown", 0xF4A460, "seagreen", 0x2E8B57, "seashell", 0xFFF5EE,
|
||||||
"darkorchid", 0x9932CC,
|
"sienna", 0xA0522D, "silver", 0xC0C0C0, "skyblue", 0x87CEEB, "slateblue", 0x6A5ACD,
|
||||||
"darkred", 0x8B0000,
|
"slategray", 0x708090, "snow", 0xFFFAFA, "springgreen", 0x00FF7F, "steelblue", 0x4682B4,
|
||||||
"darksalmon", 0xE9967A,
|
"tan", 0xD2B48C, "teal", 0x008080, "thistle", 0xD8BFD8, "tomato", 0xFF6347,
|
||||||
"darkseagreen", 0x8FBC8F,
|
"turquoise", 0x40E0D0, "violet", 0xEE82EE, "wheat", 0xF5DEB3, "white", 0xFFFFFF,
|
||||||
"darkslateblue", 0x483D8B,
|
"whitesmoke", 0xF5F5F5, "yellow", 0xFFFF00, "yellowgreen", 0x9ACD32, 0};
|
||||||
"darkslategray", 0x2F4F4F,
|
|
||||||
"darkturquoise", 0x00CED1,
|
|
||||||
"darkviolet", 0x9400D3,
|
|
||||||
"deeppink", 0xFF1493,
|
|
||||||
"deepskyblue", 0x00BFFF,
|
|
||||||
"dimgray", 0x696969,
|
|
||||||
"dodgerblue", 0x1E90FF,
|
|
||||||
"firebrick", 0xB22222,
|
|
||||||
"floralwhite", 0xFFFAF0,
|
|
||||||
"forestgreen", 0x228B22,
|
|
||||||
"fuchsia", 0xFF00FF,
|
|
||||||
"gainsboro", 0xDCDCDC,
|
|
||||||
"ghostwhite", 0xF8F8FF,
|
|
||||||
"gold", 0xFFD700,
|
|
||||||
"goldenrod", 0xDAA520,
|
|
||||||
"gray", 0x808080,
|
|
||||||
"green", 0x008000,
|
|
||||||
"greenyellow", 0xADFF2F,
|
|
||||||
"honeydew", 0xF0FFF0,
|
|
||||||
"hotpink", 0xFF69B4,
|
|
||||||
"indianred", 0xCD5C5C,
|
|
||||||
"indigo", 0x4B0082,
|
|
||||||
"ivory", 0xFFFFF0,
|
|
||||||
"khaki", 0xF0E68C,
|
|
||||||
"lavender", 0xE6E6FA,
|
|
||||||
"lavenderblush", 0xFFF0F5,
|
|
||||||
"lawngreen", 0x7CFC00,
|
|
||||||
"lemonchiffon", 0xFFFACD,
|
|
||||||
"lightblue", 0xADD8E6,
|
|
||||||
"lightcoral", 0xF08080,
|
|
||||||
"lightcyan", 0xE0FFFF,
|
|
||||||
"lightgoldenrodyellow", 0xFAFAD2,
|
|
||||||
"lightgreen", 0x90EE90,
|
|
||||||
"lightgrey", 0xD3D3D3,
|
|
||||||
"lightpink", 0xFFB6C1,
|
|
||||||
"lightsalmon", 0xFFA07A,
|
|
||||||
"lightseagreen", 0x20B2AA,
|
|
||||||
"lightskyblue", 0x87CEFA,
|
|
||||||
"lightslategray", 0x778899,
|
|
||||||
"lightsteelblue", 0xB0C4DE,
|
|
||||||
"lightyellow", 0xFFFFE0,
|
|
||||||
"lime", 0x00FF00,
|
|
||||||
"limegreen", 0x32CD32,
|
|
||||||
"linen", 0xFAF0E6,
|
|
||||||
"magenta", 0xFF00FF,
|
|
||||||
"maroon", 0x800000,
|
|
||||||
"mediumaquamarine", 0x66CDAA,
|
|
||||||
"mediumblue", 0x0000CD,
|
|
||||||
"mediumorchid", 0xBA55D3,
|
|
||||||
"mediumpurple", 0x9370DB,
|
|
||||||
"mediumseagreen", 0x3CB371,
|
|
||||||
"mediumslateblue", 0x7B68EE,
|
|
||||||
"mediumspringgreen",0x00FA9A,
|
|
||||||
"mediumturquoise",0x48D1CC,
|
|
||||||
"mediumvioletred",0xC71585,
|
|
||||||
"midnightblue", 0x191970,
|
|
||||||
"mintcream", 0xF5FFFA,
|
|
||||||
"mistyrose", 0xFFE4E1,
|
|
||||||
"moccasin", 0xFFE4B5,
|
|
||||||
"navajowhite", 0xFFDEAD,
|
|
||||||
"navy", 0x000080,
|
|
||||||
"oldlace", 0xFDF5E6,
|
|
||||||
"olive", 0x808000,
|
|
||||||
"olivedrab", 0x6B8E23,
|
|
||||||
"orange", 0xFFA500,
|
|
||||||
"orangered", 0xFF4500,
|
|
||||||
"orchid", 0xDA70D6,
|
|
||||||
"palegoldenrod", 0xEEE8AA,
|
|
||||||
"palegreen", 0x98FB98,
|
|
||||||
"paleturquoise", 0xAFEEEE,
|
|
||||||
"palevioletred", 0xDB7093,
|
|
||||||
"papayawhip", 0xFFEFD5,
|
|
||||||
"peachpuff", 0xFFDAB9,
|
|
||||||
"peru", 0xCD853F,
|
|
||||||
"pink", 0xFFC0CB,
|
|
||||||
"plum", 0xDDA0DD,
|
|
||||||
"powderblue", 0xB0E0E6,
|
|
||||||
"purple", 0x800080,
|
|
||||||
"red", 0xFF0000,
|
|
||||||
"rosybrown", 0xBC8F8F,
|
|
||||||
"royalblue", 0x4169E1,
|
|
||||||
"saddlebrown", 0x8B4513,
|
|
||||||
"salmon", 0xFA8072,
|
|
||||||
"sandybrown", 0xF4A460,
|
|
||||||
"seagreen", 0x2E8B57,
|
|
||||||
"seashell", 0xFFF5EE,
|
|
||||||
"sienna", 0xA0522D,
|
|
||||||
"silver", 0xC0C0C0,
|
|
||||||
"skyblue", 0x87CEEB,
|
|
||||||
"slateblue", 0x6A5ACD,
|
|
||||||
"slategray", 0x708090,
|
|
||||||
"snow", 0xFFFAFA,
|
|
||||||
"springgreen", 0x00FF7F,
|
|
||||||
"steelblue", 0x4682B4,
|
|
||||||
"tan", 0xD2B48C,
|
|
||||||
"teal", 0x008080,
|
|
||||||
"thistle", 0xD8BFD8,
|
|
||||||
"tomato", 0xFF6347,
|
|
||||||
"turquoise", 0x40E0D0,
|
|
||||||
"violet", 0xEE82EE,
|
|
||||||
"wheat", 0xF5DEB3,
|
|
||||||
"white", 0xFFFFFF,
|
|
||||||
"whitesmoke", 0xF5F5F5,
|
|
||||||
"yellow", 0xFFFF00,
|
|
||||||
"yellowgreen", 0x9ACD32,
|
|
||||||
0};
|
|
||||||
|
|
||||||
dword StrToCol(char* htmlcolor)
|
|
||||||
{
|
|
||||||
dword j=1,
|
|
||||||
color=0,
|
|
||||||
textlen=0;
|
|
||||||
char ch=0x00;
|
|
||||||
|
|
||||||
if (ESBYTE[htmlcolor]<>'#') return text_colors.get(0);
|
|
||||||
|
|
||||||
textlen = strlen(htmlcolor);
|
|
||||||
|
|
||||||
if (textlen==7) || (textlen==4)
|
|
||||||
{
|
|
||||||
FOR (; j<textlen; j++)
|
|
||||||
{
|
|
||||||
ch=ESBYTE[htmlcolor+j];
|
|
||||||
IF ((ch>='0') && (ch<='9')) ch -= '0';
|
|
||||||
IF ((ch>='A') && (ch<='F')) ch -= 'A'-10;
|
|
||||||
IF ((ch>='a') && (ch<='f')) ch -= 'a'-10;
|
|
||||||
color = color*0x10 + ch;
|
|
||||||
if (textlen==4) color = color*0x10 + ch; //#abc ->> #aabbcc (ñëàâà âèêèïåäèè!!1)
|
|
||||||
}
|
|
||||||
return color;
|
|
||||||
}
|
|
||||||
|
|
||||||
return text_colors.get(0);
|
|
||||||
}
|
|
||||||
|
|
||||||
dword GetColor(char* color_str)
|
dword GetColor(char* color_str)
|
||||||
{
|
{
|
||||||
int ii;
|
int ii;
|
||||||
|
dword textlen=0;
|
||||||
|
dword color=0;
|
||||||
|
|
||||||
|
strlwr(color_str);
|
||||||
if (ESBYTE[color_str] == '#')
|
if (ESBYTE[color_str] == '#')
|
||||||
return StrToCol(color_str);
|
{
|
||||||
|
textlen = strlen(color_str);
|
||||||
|
if (textlen==7) || (textlen==4)
|
||||||
|
{
|
||||||
|
FOR (ii=1; ii<textlen; ii++)
|
||||||
|
{
|
||||||
|
BL = ESBYTE[color_str+ii];
|
||||||
|
IF ((BL>='0') && (BL<='9')) BL -= '0';
|
||||||
|
//IF ((BL>='A') && (BL<='F')) BL -= 'A'-10;
|
||||||
|
IF ((BL>='a') && (BL<='f')) BL -= 'a'-10;
|
||||||
|
color = color*0x10 + BL;
|
||||||
|
if (textlen==4) color = color*0x10 + BL; //#abc ->> #aabbcc
|
||||||
|
}
|
||||||
|
return color;
|
||||||
|
}
|
||||||
|
}
|
||||||
else
|
else
|
||||||
|
{
|
||||||
for (ii=0; color_specs[ii].name!=0; ii++)
|
for (ii=0; color_specs[ii].name!=0; ii++)
|
||||||
{
|
{
|
||||||
if (!strcmpi(color_str, color_specs[ii].name)) return color_specs[ii].rgb;
|
if (streq(color_str, color_specs[ii].name))
|
||||||
|
return color_specs[ii].rgb;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return text_colors.get(0);
|
return text_colors.get(0);
|
||||||
}
|
}
|
||||||
|
@ -7,51 +7,108 @@ struct _tag
|
|||||||
bool opened;
|
bool opened;
|
||||||
collection attributes;
|
collection attributes;
|
||||||
collection values;
|
collection values;
|
||||||
|
dword value;
|
||||||
bool is();
|
bool is();
|
||||||
bool reset();
|
bool parse_tag();
|
||||||
bool parse_params();
|
void debug_tag();
|
||||||
bool get_next_param();
|
bool get_next_param();
|
||||||
dword get_value_of();
|
dword get_value_of();
|
||||||
} tag=0;
|
} tag=0;
|
||||||
|
|
||||||
bool _tag::is(dword _text)
|
bool _tag::is(dword _text)
|
||||||
{
|
{
|
||||||
if ( !strcmp(#tag.name, _text) ) {
|
if ( !strcmp(#name, _text) ) {
|
||||||
return true;
|
return true;
|
||||||
} else {
|
} else {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
bool _tag::reset()
|
bool _tag::parse_tag(dword _bufpos, bufend)
|
||||||
{
|
{
|
||||||
if (!name) return false;
|
bool retok = true;
|
||||||
strcpy(#prior, #name);
|
dword bufpos = ESDWORD[_bufpos];
|
||||||
name = NULL;
|
|
||||||
opened = true;
|
dword closepos;
|
||||||
|
dword whitepos;
|
||||||
|
|
||||||
|
if (name) strcpy(#prior, #name); else prior = '\0';
|
||||||
|
name = '\0';
|
||||||
|
params = '\0';
|
||||||
attributes.drop();
|
attributes.drop();
|
||||||
values.drop();
|
values.drop();
|
||||||
return true;
|
|
||||||
|
if (!strncmp(bufpos,"!--",3))
|
||||||
|
{
|
||||||
|
bufpos+=3;
|
||||||
|
//STRSTR
|
||||||
|
while (strncmp(bufpos,"-->",3)!=0) && (bufpos < bufend)
|
||||||
|
{
|
||||||
|
bufpos++;
|
||||||
|
}
|
||||||
|
bufpos+=2;
|
||||||
|
goto _RET;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool _tag::parse_params()
|
if (ESBYTE[bufpos] == '/') {
|
||||||
|
opened = false;
|
||||||
|
bufpos++;
|
||||||
|
} else {
|
||||||
|
opened = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
closepos = strchr(bufpos, '>');
|
||||||
|
whitepos = strchrw(bufpos, bufend-bufpos);
|
||||||
|
if (whitepos > closepos) {
|
||||||
|
//no param
|
||||||
|
strncpy(#name, bufpos, math.min(closepos - bufpos, sizeof(tag.name)));
|
||||||
|
debug_tag();
|
||||||
|
params = '\0';
|
||||||
|
bufpos = closepos;
|
||||||
|
} else {
|
||||||
|
//we have param
|
||||||
|
strncpy(#name, bufpos, math.min(whitepos - bufpos, sizeof(tag.name)));
|
||||||
|
strncpy(#params, whitepos, math.min(closepos - whitepos, sizeof(tag.params)));
|
||||||
|
debug_tag();
|
||||||
|
bufpos = closepos;
|
||||||
|
while (get_next_param());
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!name) {
|
||||||
|
retok = false;
|
||||||
|
goto _RET;
|
||||||
|
}
|
||||||
|
|
||||||
|
strlwr(#name);
|
||||||
|
|
||||||
|
// ignore text inside the next tags
|
||||||
|
if (is("script")) || (is("style")) || (is("binary")) || (is("select")) {
|
||||||
|
strcpy(#prior, #name);
|
||||||
|
sprintf(#name, "</%s>", #prior);
|
||||||
|
if (strstri(bufpos, #name)) bufpos = EAX-1;
|
||||||
|
retok = false;
|
||||||
|
goto _RET;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (name[strlen(#name)-1]=='/') name[strlen(#name)-1]=NULL; //for <br/>
|
||||||
|
|
||||||
|
_RET:
|
||||||
|
ESDWORD[_bufpos] = bufpos;
|
||||||
|
return retok;
|
||||||
|
}
|
||||||
|
|
||||||
|
void _tag::debug_tag()
|
||||||
{
|
{
|
||||||
bool result = false;
|
|
||||||
if (!name) return false;
|
|
||||||
if (debug_mode) {
|
if (debug_mode) {
|
||||||
debug("\n\ntag: "); debugln(#name);
|
debugch('<');
|
||||||
debug("params: "); debugln(#params);
|
if (!opened) debugch('/');
|
||||||
debugln(" ");
|
debug(#name);
|
||||||
|
debugln(">");
|
||||||
|
if (params) {
|
||||||
|
debug("params: ");
|
||||||
|
debugln(#params+1);
|
||||||
}
|
}
|
||||||
while (get_next_param()) {
|
|
||||||
result = true;
|
|
||||||
if (debug_mode) {
|
|
||||||
debug("attribute: "); debugln(attributes.get(attributes.count-1));
|
|
||||||
debug("value: "); debugln(values.get(values.count-1));
|
|
||||||
debugln(" ");
|
|
||||||
}
|
}
|
||||||
};
|
|
||||||
return result;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
bool _tag::get_next_param()
|
bool _tag::get_next_param()
|
||||||
@ -111,6 +168,12 @@ bool _tag::get_next_param()
|
|||||||
attributes.add(#attr);
|
attributes.add(#attr);
|
||||||
values.add(#val);
|
values.add(#val);
|
||||||
|
|
||||||
|
if (debug_mode) {
|
||||||
|
debug("atr: "); debugln(#attr);
|
||||||
|
debug("val: "); debugln(#val);
|
||||||
|
debugch('\n');
|
||||||
|
}
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -118,8 +181,9 @@ dword _tag::get_value_of(dword _attr_name)
|
|||||||
{
|
{
|
||||||
int pos = attributes.get_pos_by_name(_attr_name);
|
int pos = attributes.get_pos_by_name(_attr_name);
|
||||||
if (pos == -1) {
|
if (pos == -1) {
|
||||||
return 0;
|
value = 0;
|
||||||
} else {
|
} else {
|
||||||
return values.get(pos);
|
value = values.get(pos);
|
||||||
}
|
}
|
||||||
|
return value;
|
||||||
}
|
}
|
||||||
|
353
programs/cmm/browser/TWB/set_style.h
Normal file
353
programs/cmm/browser/TWB/set_style.h
Normal file
@ -0,0 +1,353 @@
|
|||||||
|
void TWebBrowser::SetStyle()
|
||||||
|
{
|
||||||
|
if (tag.get_value_of("name=")) || (tag.get_value_of("id=")) {
|
||||||
|
anchors.add(tag.value, draw_y);
|
||||||
|
if (anchors.current) && (streq(tag.value, #anchors.current+1)) {
|
||||||
|
list.first = draw_y;
|
||||||
|
anchors.current = NULL;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (tag.is("a")) { tag_a(); return; }
|
||||||
|
if (tag.is("p")) { tag_p(); return; }
|
||||||
|
if (tag.is("img")) { tag_img(); return; }
|
||||||
|
if (tag.is("div")) { tag_div(); return; }
|
||||||
|
if (tag.is("br")) { NewLine(); return; }
|
||||||
|
if (tag.is("header")) { NewLine(); return; }
|
||||||
|
if (tag.is("article")) { NewLine(); return; }
|
||||||
|
if (tag.is("footer")) { NewLine(); return; }
|
||||||
|
if (tag.is("figure")) { NewLine(); return; }
|
||||||
|
if (tag.is("w:p")) { NewLine(); return; }
|
||||||
|
if (tag.is("b")) { style.b = tag.opened; return; }
|
||||||
|
if (tag.is("strong")) { style.b = tag.opened; return; }
|
||||||
|
if (tag.is("big")) { style.b = tag.opened; return; }
|
||||||
|
if (tag.is("w:b")) { style.b = tag.opened; return; }
|
||||||
|
if (tag.is("u")) { style.u = tag.opened; return; }
|
||||||
|
if (tag.is("ins")) { style.u = tag.opened; return; }
|
||||||
|
if (tag.is("s")) { style.s = tag.opened; return; }
|
||||||
|
if (tag.is("strike")) { style.s = tag.opened; return; }
|
||||||
|
if (tag.is("del")) { style.s = tag.opened; return; }
|
||||||
|
if (tag.is("pre")) { style.pre = tag.opened; return; }
|
||||||
|
if (tag.is("blockquote")) { style.blq = tag.opened; return; }
|
||||||
|
if (tag.is("dl")) { if (tag.opened) NewLine(); return; }
|
||||||
|
if (tag.is("tr")) { if (tag.opened) NewLine(); return; }
|
||||||
|
if (tag.is("td")) { if (tag.opened) AddCharToTheLine(' '); return; }
|
||||||
|
if (tag.is("button")) { style.button = tag.opened; stolbec++; return; }
|
||||||
|
if (tag.is("w:r")) { if (!tag.opened) style.b = false; return; }
|
||||||
|
if (tag.is("h1")) { tag_h1234_caption(); return; }
|
||||||
|
if (tag.is("h2")) { tag_h1234_caption(); return; }
|
||||||
|
if (tag.is("h3")) { tag_h1234_caption(); return; }
|
||||||
|
if (tag.is("h4")) { tag_h1234_caption(); return; }
|
||||||
|
if (tag.is("font")) { tag_font(); return; }
|
||||||
|
if (tag.is("dt")) { tag_ol_ul_dt(); return; }
|
||||||
|
if (tag.is("ul")) { tag_ol_ul_dt(); return; }
|
||||||
|
if (tag.is("ol")) { tag_ol_ul_dt(); return; }
|
||||||
|
if (tag.is("li")) { tag_li(); return; }
|
||||||
|
if (tag.is("q")) { tag_q(); return; }
|
||||||
|
if (tag.is("hr")) { tag_hr(); return; }
|
||||||
|
if (tag.is("meta")) { tag_meta_xml(); return; }
|
||||||
|
if (tag.is("?xml")) { tag_meta_xml(); return; }
|
||||||
|
if (tag.is("code")) { tag_code(); return; }
|
||||||
|
if (tag.is("iframe")) { tag_iframe(); return; }
|
||||||
|
if (tag.is("caption")) { tag_h1234_caption(); return; }
|
||||||
|
if (tag.is("title")) { tag_title(); return; }
|
||||||
|
if (tag.is("body")) { tag_body(); return; }
|
||||||
|
if (tag.is("html")) { t_html = tag.opened; return; }
|
||||||
|
if (tag.is("dd")) {
|
||||||
|
//NewLine();
|
||||||
|
//if (tag.opened) stolbec += 5; //stolbec overflow!
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void TWebBrowser::tag_p()
|
||||||
|
{
|
||||||
|
IF (tag.prior[0] == 'h') || (streq(#tag.prior,"td")) || (streq(#tag.prior,"p")) return;
|
||||||
|
NewLine();
|
||||||
|
}
|
||||||
|
|
||||||
|
void TWebBrowser::tag_title()
|
||||||
|
{
|
||||||
|
style.title = tag.opened;
|
||||||
|
if (!tag.opened) DrawTitle(#header);
|
||||||
|
}
|
||||||
|
|
||||||
|
void TWebBrowser::tag_font()
|
||||||
|
{
|
||||||
|
style.font = tag.opened;
|
||||||
|
style.bg_color = page_bg;
|
||||||
|
if (tag.opened)
|
||||||
|
{
|
||||||
|
if (tag.get_value_of("bg=")) style.bg_color = GetColor(tag.value);
|
||||||
|
if (tag.get_value_of("color=")) {
|
||||||
|
text_colors.add(GetColor(tag.value));
|
||||||
|
} else {
|
||||||
|
text_colors.add(text_colors.get_last());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else text_colors.pop();
|
||||||
|
}
|
||||||
|
|
||||||
|
void TWebBrowser::tag_div()
|
||||||
|
{
|
||||||
|
if (streq(#tag.prior,"div")) && (tag.opened) return;
|
||||||
|
if (!tag.opened) && (style.font) text_colors.pop();
|
||||||
|
NewLine();
|
||||||
|
}
|
||||||
|
|
||||||
|
void TWebBrowser::tag_iframe()
|
||||||
|
{
|
||||||
|
if (tag.get_value_of("src=")) {
|
||||||
|
NewLine();
|
||||||
|
strcpy(#line, "IFRAME: ");
|
||||||
|
Paint();
|
||||||
|
link=true;
|
||||||
|
links.add_link(tag.value);
|
||||||
|
strncpy(#line, tag.value, sizeof(line)-1);
|
||||||
|
while (CheckForLineBreak()) {};
|
||||||
|
Paint();
|
||||||
|
link=false;
|
||||||
|
NewLine();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void TWebBrowser::tag_a()
|
||||||
|
{
|
||||||
|
if (tag.opened)
|
||||||
|
{
|
||||||
|
if (tag.get_value_of("href=")) && (!strstr(tag.value,"javascript:"))
|
||||||
|
{
|
||||||
|
link = true;
|
||||||
|
links.add_link(tag.value);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
link = false;
|
||||||
|
style.bg_color = page_bg;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void TWebBrowser::tag_meta_xml()
|
||||||
|
{
|
||||||
|
if (custom_encoding == -1) if (tag.get_value_of("charset="))
|
||||||
|
|| (tag.get_value_of("content=")) || (tag.get_value_of("encoding="))
|
||||||
|
{
|
||||||
|
EDX = strrchr(tag.value, '=') + tag.value; //search in content=
|
||||||
|
if (ESBYTE[EDX] == '"') EDX++;
|
||||||
|
strlwr(EDX);
|
||||||
|
if (streqrp(EDX,"utf-8")) || (streqrp(EDX,"utf8")) ChangeEncoding(CH_UTF8);
|
||||||
|
else if (streqrp(EDX,"windows-1251")) || (streqrp(EDX,"windows1251")) ChangeEncoding(CH_CP1251);
|
||||||
|
else if (streqrp(EDX,"dos")) || (streqrp(EDX,"cp-866")) ChangeEncoding(CH_CP866);
|
||||||
|
else if (streqrp(EDX,"iso-8859-5")) || (streqrp(EDX,"iso8859-5")) ChangeEncoding(CH_ISO8859_5);
|
||||||
|
else if (streqrp(EDX,"koi8-r")) || (streqrp(EDX,"koi8-u")) ChangeEncoding(CH_KOI8);
|
||||||
|
}
|
||||||
|
if (streq(tag.get_value_of("http-equiv="), "refresh")) && (tag.get_value_of("content=")) {
|
||||||
|
if (tag.value = strstri(tag.value, "url=")) strcpy(#redirect, tag.value);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void TWebBrowser::tag_code()
|
||||||
|
{
|
||||||
|
if (style.pre = tag.opened) {
|
||||||
|
style.bg_color = 0xe4ffcb;
|
||||||
|
} else {
|
||||||
|
style.bg_color = page_bg;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void TWebBrowser::tag_ol_ul_dt()
|
||||||
|
{
|
||||||
|
char type = ESBYTE[#tag.name];
|
||||||
|
style.tag_list.upd_level(tag.opened, type);
|
||||||
|
switch(type)
|
||||||
|
{
|
||||||
|
case 'd':
|
||||||
|
if (tag.opened) NewLine();
|
||||||
|
break;
|
||||||
|
case 'u':
|
||||||
|
case 'o':
|
||||||
|
if (!tag.opened) && (!style.pre) NewLine();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void TWebBrowser::tag_li()
|
||||||
|
{
|
||||||
|
if (tag.opened) {
|
||||||
|
if (!style.tag_list.level) style.tag_list.upd_level(1, 'u');
|
||||||
|
if (!style.pre) NewLine();
|
||||||
|
if (style.tag_list.order_type() == 'u') {
|
||||||
|
strcpy(#line, "\31 ");
|
||||||
|
stolbec = style.tag_list.level * 5 - 2;
|
||||||
|
}
|
||||||
|
if (style.tag_list.order_type() == 'o') {
|
||||||
|
sprintf(#line, "%i. ", style.tag_list.inc_counter());
|
||||||
|
stolbec = style.tag_list.level * 5 - strlen(#line);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void TWebBrowser::tag_hr()
|
||||||
|
{
|
||||||
|
EAX = 0x999999;
|
||||||
|
if (tag.get_value_of("color=")) GetColor(tag.value);
|
||||||
|
$push eax;
|
||||||
|
NewLine();
|
||||||
|
$pop edi;
|
||||||
|
draw_y += 10;
|
||||||
|
canvas.DrawBar(5, draw_y - 1, list.w-10, 1, EDI);
|
||||||
|
NewLine();
|
||||||
|
draw_y += 10;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
void TWebBrowser::tag_body()
|
||||||
|
{
|
||||||
|
t_body = tag.opened;
|
||||||
|
if (tag.get_value_of("link=")) link_color_default = GetColor(tag.value);
|
||||||
|
if (tag.get_value_of("alink=")) link_color_active = GetColor(tag.value);
|
||||||
|
if (tag.get_value_of("text=")) text_colors.set(0, GetColor(tag.value));
|
||||||
|
if (tag.get_value_of("bgcolor=")) {
|
||||||
|
style.bg_color = page_bg = GetColor(tag.value);
|
||||||
|
canvas.Fill(0, page_bg);
|
||||||
|
}
|
||||||
|
// Autodetecting encoding if no encoding was set
|
||||||
|
if (tag.opened) && (custom_encoding==-1) && (cur_encoding == CH_CP866) {
|
||||||
|
if (strstr(bufpointer, "\208\190")) ChangeEncoding(CH_UTF8);
|
||||||
|
else if (chrnum(bufpointer, '\246')>5) ChangeEncoding(CH_CP1251);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void TWebBrowser::tag_q()
|
||||||
|
{
|
||||||
|
if (tag.opened) {
|
||||||
|
AddCharToTheLine(' ');
|
||||||
|
AddCharToTheLine('\"');
|
||||||
|
} else {
|
||||||
|
AddCharToTheLine('\"');
|
||||||
|
AddCharToTheLine(' ');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void TWebBrowser::tag_h1234_caption()
|
||||||
|
{
|
||||||
|
if (ESBYTE[#tag.name+1]=='4') {
|
||||||
|
NewLine();
|
||||||
|
NewLine();
|
||||||
|
style.h = tag.opened;
|
||||||
|
style.b = tag.opened;
|
||||||
|
} else {
|
||||||
|
style.h = tag.opened;
|
||||||
|
if (tag.opened) {
|
||||||
|
if (!style.pre) NewLine();
|
||||||
|
draw_y += 10;
|
||||||
|
zoom=2;
|
||||||
|
list.font_type |= 10011001b;
|
||||||
|
list.item_h = BASIC_LINE_H * 2 - 2;
|
||||||
|
if (tag.is("h1")) style.b = true;
|
||||||
|
} else {
|
||||||
|
if (tag.is("h1")) style.b = false;
|
||||||
|
NewLine();
|
||||||
|
zoom=1;
|
||||||
|
list.font_type = 10011000b;
|
||||||
|
list.item_h = BASIC_LINE_H;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void TWebBrowser::tag_img()
|
||||||
|
{
|
||||||
|
char img_path[4096]=0;
|
||||||
|
dword imgbuf[44];
|
||||||
|
dword cur_img;
|
||||||
|
int img_x, img_y, img_w, img_h;
|
||||||
|
|
||||||
|
if (!tag.get_value_of("src=")) goto NOIMG;
|
||||||
|
|
||||||
|
if (streqrp(tag.value, "data:")) {
|
||||||
|
if (!strstr(tag.value, "base64,")) goto NOIMG;
|
||||||
|
EDX = EAX+7;
|
||||||
|
if (ESBYTE[EDX]==' ') EDX++;
|
||||||
|
cur_img = malloc(strlen(EDX));
|
||||||
|
base64_decode stdcall (EDX, cur_img, strlen(EDX));
|
||||||
|
img_decode stdcall (cur_img, EAX, 0);
|
||||||
|
$push eax
|
||||||
|
free(cur_img);
|
||||||
|
$pop eax
|
||||||
|
if (EAX) goto IMGOK; else goto NOIMG;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!strcmp(tag.value + strrchr(tag.value, '.'), "svg")) goto NOIMG;
|
||||||
|
strlcpy(#img_path, tag.value, sizeof(img_path)-1);
|
||||||
|
get_absolute_url(#img_path, history.current());
|
||||||
|
|
||||||
|
if (check_is_the_adress_local(#img_path)) {
|
||||||
|
img_from_file stdcall(#img_path);
|
||||||
|
if (EAX) goto IMGOK; else goto NOIMG;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (cache.has(#img_path)) {
|
||||||
|
img_decode stdcall (cache.current_buf, cache.current_size, 0);
|
||||||
|
if (EAX) goto IMGOK; else goto NOIMG;
|
||||||
|
} else {
|
||||||
|
img_url.add(#img_path);
|
||||||
|
goto NOIMG;
|
||||||
|
}
|
||||||
|
|
||||||
|
IMGOK:
|
||||||
|
cur_img = EAX;
|
||||||
|
img_h = ESDWORD[cur_img+8];
|
||||||
|
img_w = ESDWORD[cur_img+4];
|
||||||
|
|
||||||
|
if (img_w / 6 + stolbec > list.column_max) {
|
||||||
|
NewLine();
|
||||||
|
}
|
||||||
|
img_x = stolbec*list.font_w+3;
|
||||||
|
img_y = draw_y;
|
||||||
|
|
||||||
|
img_w = math.min(img_w, canvas.bufw - img_x);
|
||||||
|
|
||||||
|
stolbec += img_w / 6;
|
||||||
|
if (stolbec > list.column_max) NewLine();
|
||||||
|
|
||||||
|
if (img_h > list.item_h + 5) {
|
||||||
|
draw_y += img_h - list.item_h;
|
||||||
|
NewLine();
|
||||||
|
}
|
||||||
|
|
||||||
|
if (link) links.add_text(img_x + list.x, img_y + list.y, img_w, img_h, 0);
|
||||||
|
|
||||||
|
if (img_y + img_h >= canvas.bufh) canvas.IncreaseBufSize();
|
||||||
|
|
||||||
|
if (ESDWORD[cur_img+20] != IMAGE_BPP32) {
|
||||||
|
img_convert stdcall(cur_img, 0, IMAGE_BPP32, 0, 0);
|
||||||
|
$push eax
|
||||||
|
img_destroy stdcall(cur_img);
|
||||||
|
$pop eax
|
||||||
|
cur_img = EAX;
|
||||||
|
if (!EAX) goto NOIMG;
|
||||||
|
}
|
||||||
|
imgbuf[04] = canvas.bufw;
|
||||||
|
imgbuf[08] = canvas.bufh;
|
||||||
|
imgbuf[20] = IMAGE_BPP32;
|
||||||
|
imgbuf[24] = buf_data+8;
|
||||||
|
img_blend stdcall(#imgbuf, cur_img, img_x, img_y, 0, 0, img_w, img_h);
|
||||||
|
img_destroy stdcall(cur_img);
|
||||||
|
return;
|
||||||
|
|
||||||
|
NOIMG:
|
||||||
|
if (tag.get_value_of("title=")) || (tag.get_value_of("alt=")) {
|
||||||
|
strncpy(#img_path, tag.value, sizeof(line)-3);
|
||||||
|
sprintf(#line, "[%s]", #img_path);
|
||||||
|
} else {
|
||||||
|
if (streqrp(#img_path, "data:")) img_path=0;
|
||||||
|
replace_char(#img_path, '?', NULL, strlen(#img_path));
|
||||||
|
img_path[sizeof(line)-3] = '\0'; //prevent overflow in sprintf
|
||||||
|
sprintf(#line, "[%s]", #img_path+strrchr(#img_path, '/'));
|
||||||
|
line[50]= NULL;
|
||||||
|
}
|
||||||
|
while (CheckForLineBreak()) {};
|
||||||
|
text_colors.add(0x9A6F29);
|
||||||
|
style.image = true;
|
||||||
|
Paint();
|
||||||
|
style.image = false;
|
||||||
|
text_colors.pop();
|
||||||
|
}
|
@ -6,7 +6,7 @@ char *unicode_symbols[]={
|
|||||||
"#183","\31", "middot", "\31",
|
"#183","\31", "middot", "\31",
|
||||||
"#149","-",
|
"#149","-",
|
||||||
"#151","-",
|
"#151","-",
|
||||||
"#160"," ", "nbsp", " ",
|
"#160"," ", "nbsp", " ", "emsp", " ",
|
||||||
"#169","(c)", "copy", "(c)",
|
"#169","(c)", "copy", "(c)",
|
||||||
"#171","<<", "laquo","<<",
|
"#171","<<", "laquo","<<",
|
||||||
"#174","(r)", "reg", "(r)",
|
"#174","(r)", "reg", "(r)",
|
||||||
@ -44,6 +44,8 @@ char *unicode_symbols[]={
|
|||||||
"#9642", "-", //square in the middle of the line
|
"#9642", "-", //square in the middle of the line
|
||||||
"#9658", ">",
|
"#9658", ">",
|
||||||
"#9660", "v",
|
"#9660", "v",
|
||||||
|
"#10094", "<",
|
||||||
|
"#10095", ">",
|
||||||
"#65122", "+",
|
"#65122", "+",
|
||||||
|
|
||||||
"#8594", "->",
|
"#8594", "->",
|
||||||
|
@ -1,13 +1,12 @@
|
|||||||
enum {DT=1, OL, UL};
|
|
||||||
struct LIST
|
struct LIST
|
||||||
{
|
{
|
||||||
int level;
|
int level;
|
||||||
int ordered[5];
|
char ordered[5];
|
||||||
int counter[5];
|
int counter[5];
|
||||||
void reset();
|
void reset();
|
||||||
void upd_level();
|
void upd_level();
|
||||||
int inc_counter();
|
int inc_counter();
|
||||||
int get_order_type();
|
char order_type();
|
||||||
};
|
};
|
||||||
|
|
||||||
void LIST::reset()
|
void LIST::reset()
|
||||||
@ -15,7 +14,7 @@ void LIST::reset()
|
|||||||
level = 0;
|
level = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
void LIST::upd_level(int direction, type)
|
void LIST::upd_level(int direction, char type)
|
||||||
{
|
{
|
||||||
if (direction == 1) && (level<5) {
|
if (direction == 1) && (level<5) {
|
||||||
level++;
|
level++;
|
||||||
@ -33,7 +32,7 @@ int LIST::inc_counter()
|
|||||||
return counter[level];
|
return counter[level];
|
||||||
}
|
}
|
||||||
|
|
||||||
int LIST::get_order_type()
|
char LIST::order_type()
|
||||||
{
|
{
|
||||||
return ordered[level];
|
return ordered[level];
|
||||||
}
|
}
|
||||||
|
@ -41,7 +41,7 @@
|
|||||||
// DATA //
|
// DATA //
|
||||||
// //
|
// //
|
||||||
//===================================================//
|
//===================================================//
|
||||||
char version[]="WebView 3.06";
|
char version[]="WebView 3.1";
|
||||||
|
|
||||||
#define DEFAULT_URL URL_SERVICE_HOMEPAGE
|
#define DEFAULT_URL URL_SERVICE_HOMEPAGE
|
||||||
|
|
||||||
@ -372,8 +372,8 @@ void draw_window()
|
|||||||
bool BrowserWidthChanged()
|
bool BrowserWidthChanged()
|
||||||
{
|
{
|
||||||
dword source_mode_holder;
|
dword source_mode_holder;
|
||||||
if (WB1.list.w!=DrawBuf.bufw) {
|
if (WB1.list.w!=canvas.bufw) {
|
||||||
DrawBuf.Init(WB1.list.x, WB1.list.y, WB1.list.w, 400*20);
|
canvas.Init(WB1.list.x, WB1.list.y, WB1.list.w, 400*20);
|
||||||
if (!strncmp(history.current(),"http",4)) {
|
if (!strncmp(history.current(),"http",4)) {
|
||||||
//nihuya ne izyashnoe reshenie, no pust' poka butet tak
|
//nihuya ne izyashnoe reshenie, no pust' poka butet tak
|
||||||
source_mode_holder = source_mode;
|
source_mode_holder = source_mode;
|
||||||
|
@ -9,7 +9,7 @@
|
|||||||
dword buf_data=0;
|
dword buf_data=0;
|
||||||
|
|
||||||
|
|
||||||
struct DrawBufer {
|
struct CANVAS {
|
||||||
dword bufx, bufy, bufw, bufh;
|
dword bufx, bufy, bufw, bufh;
|
||||||
dword fill_color;
|
dword fill_color;
|
||||||
|
|
||||||
@ -25,10 +25,10 @@ struct DrawBufer {
|
|||||||
};
|
};
|
||||||
|
|
||||||
char draw_buf_not_enaught_ram[] =
|
char draw_buf_not_enaught_ram[] =
|
||||||
"'DrawBufer requested %i MB more memory than the system has.
|
"'CANVAS requested %i MB more memory than the system has.
|
||||||
Application could be unstable.' -E";
|
Application could be unstable.' -E";
|
||||||
|
|
||||||
bool DrawBufer::Init(dword i_bufx, i_bufy, i_bufw, i_bufh)
|
bool CANVAS::Init(dword i_bufx, i_bufy, i_bufw, i_bufh)
|
||||||
{
|
{
|
||||||
bufx = i_bufx;
|
bufx = i_bufx;
|
||||||
bufy = i_bufy;
|
bufy = i_bufy;
|
||||||
@ -42,14 +42,14 @@ bool DrawBufer::Init(dword i_bufx, i_bufy, i_bufw, i_bufh)
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
void DrawBufer::Fill(dword start_pointer, i_fill_color)
|
void CANVAS::Fill(dword start_pointer, i_fill_color)
|
||||||
{
|
{
|
||||||
dword max_i = bufw * bufh * 4 - start_pointer/4;
|
dword max_i = bufw * bufh * 4 - start_pointer/4;
|
||||||
fill_color = i_fill_color;
|
fill_color = i_fill_color;
|
||||||
@MEMSETD(buf_data+start_pointer+8, max_i, fill_color);
|
@MEMSETD(buf_data+start_pointer+8, max_i, fill_color);
|
||||||
}
|
}
|
||||||
|
|
||||||
void DrawBufer::DrawBar(dword x, y, w, h, color)
|
void CANVAS::DrawBar(dword x, y, w, h, color)
|
||||||
{
|
{
|
||||||
dword i, j;
|
dword i, j;
|
||||||
if (y + h >= bufh) IncreaseBufSize();
|
if (y + h >= bufh) IncreaseBufSize();
|
||||||
@ -60,7 +60,7 @@ void DrawBufer::DrawBar(dword x, y, w, h, color)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void DrawBufer::WriteText(dword x, y, byte fontType, dword color, str_offset, strlen)
|
void CANVAS::WriteText(dword x, y, byte fontType, dword color, str_offset, strlen)
|
||||||
{
|
{
|
||||||
#define BUGFIX_32000 32000
|
#define BUGFIX_32000 32000
|
||||||
dword ydiv=0;
|
dword ydiv=0;
|
||||||
@ -89,13 +89,13 @@ void DrawBufer::WriteText(dword x, y, byte fontType, dword color, str_offset, st
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void DrawBufer::PutPixel(dword x, y, color)
|
void CANVAS::PutPixel(dword x, y, color)
|
||||||
{
|
{
|
||||||
dword pos = y*bufw+x*4+8+buf_data;
|
dword pos = y*bufw+x*4+8+buf_data;
|
||||||
ESDWORD[pos] = color;
|
ESDWORD[pos] = color;
|
||||||
}
|
}
|
||||||
|
|
||||||
void DrawBufer::AlignRight(dword x,y,w,h, content_width)
|
void CANVAS::AlignRight(dword x,y,w,h, content_width)
|
||||||
{
|
{
|
||||||
dword i, j, l;
|
dword i, j, l;
|
||||||
dword content_left = w - content_width / 2;
|
dword content_left = w - content_width / 2;
|
||||||
@ -108,7 +108,7 @@ void DrawBufer::AlignRight(dword x,y,w,h, content_width)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void DrawBufer::AlignCenter(dword x,y,w,h, content_width)
|
void CANVAS::AlignCenter(dword x,y,w,h, content_width)
|
||||||
{
|
{
|
||||||
dword i, j, l;
|
dword i, j, l;
|
||||||
dword content_left = w - content_width / 2;
|
dword content_left = w - content_width / 2;
|
||||||
@ -121,12 +121,12 @@ void DrawBufer::AlignCenter(dword x,y,w,h, content_width)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void DrawBufer::Show(dword _y_offset, _h)
|
void CANVAS::Show(dword _y_offset, _h)
|
||||||
{
|
{
|
||||||
PutPaletteImage(_y_offset * bufw * 4 + buf_data+8, bufw, _h, bufx, bufy, 32, 0);
|
PutPaletteImage(_y_offset * bufw * 4 + buf_data+8, bufw, _h, bufx, bufy, 32, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
void DrawBufer::IncreaseBufSize()
|
void CANVAS::IncreaseBufSize()
|
||||||
{
|
{
|
||||||
static dword bufh_initial;
|
static dword bufh_initial;
|
||||||
dword alloc_size;
|
dword alloc_size;
|
||||||
|
@ -407,6 +407,39 @@ inline fastcall void strcat( EDI, ESI)
|
|||||||
ESBYTE[dst] = 0;
|
ESBYTE[dst] = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
inline fastcall void chrcat(ESI, DI)
|
||||||
|
{
|
||||||
|
while (ESBYTE[ESI]) ESI++;
|
||||||
|
ESBYTE[ESI] = DI;
|
||||||
|
ESI++;
|
||||||
|
ESBYTE[ESI] = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
inline fastcall void chrncat(EDI, AL, EDX)
|
||||||
|
{
|
||||||
|
while (ESBYTE[EDI]) && (EDX) {
|
||||||
|
EDI++;
|
||||||
|
EDX--;
|
||||||
|
}
|
||||||
|
ESBYTE[EDI] = AL;
|
||||||
|
EDI++;
|
||||||
|
ESBYTE[EDI] = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
inline dword strchr(ESI, BL)
|
||||||
|
{
|
||||||
|
loop()
|
||||||
|
{
|
||||||
|
AL = DSBYTE[ESI];
|
||||||
|
if(!AL)return 0;
|
||||||
|
if(AL==BL)return ESI;
|
||||||
|
ESI++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*
|
||||||
:void chrncat(dword dst, unsigned char s, dword len)
|
:void chrncat(dword dst, unsigned char s, dword len)
|
||||||
{
|
{
|
||||||
while (ESBYTE[dst]) && (len) {
|
while (ESBYTE[dst]) && (len) {
|
||||||
@ -418,14 +451,7 @@ inline fastcall void strcat( EDI, ESI)
|
|||||||
ESBYTE[dst+1] = 0;
|
ESBYTE[dst+1] = 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
*/
|
||||||
inline fastcall void chrcat(ESI, DI)
|
|
||||||
{
|
|
||||||
while (ESBYTE[ESI]) ESI++;
|
|
||||||
ESBYTE[ESI] = DI;
|
|
||||||
ESI++;
|
|
||||||
ESBYTE[ESI] = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
inline dword strchr(dword shb;char s)
|
inline dword strchr(dword shb;char s)
|
||||||
{
|
{
|
||||||
@ -439,6 +465,18 @@ inline dword strchr(dword shb;char s)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
inline dword strchrw(dword str, len)
|
||||||
|
{
|
||||||
|
len += str;
|
||||||
|
loop()
|
||||||
|
{
|
||||||
|
if(!DSBYTE[str])return 0;
|
||||||
|
if (__isWhite(DSBYTE[str])) return str;
|
||||||
|
str++;
|
||||||
|
if (str >= len) return 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
inline fastcall signed int strrchr( ESI,BL)
|
inline fastcall signed int strrchr( ESI,BL)
|
||||||
{
|
{
|
||||||
int jj=0, last=0;
|
int jj=0, last=0;
|
||||||
|
@ -106,7 +106,7 @@ struct THEME
|
|||||||
char default_dir[] = "/rd/1";
|
char default_dir[] = "/rd/1";
|
||||||
od_filter filter2 = { 33, "TXT\0ASM\0HTM\0HTML\0C\0H\0C--\0H--\0CPP\0\0" };
|
od_filter filter2 = { 33, "TXT\0ASM\0HTM\0HTML\0C\0H\0C--\0H--\0CPP\0\0" };
|
||||||
|
|
||||||
DrawBufer DrawBuf;
|
CANVAS canvas;
|
||||||
|
|
||||||
dword cursor_pos=0;
|
dword cursor_pos=0;
|
||||||
|
|
||||||
|
@ -7,7 +7,7 @@ void ParseAndPaint()
|
|||||||
Parse();
|
Parse();
|
||||||
|
|
||||||
list.visible = list.h / list.item_h;
|
list.visible = list.h / list.item_h;
|
||||||
DrawBuf.Init(list.x, list.y, list.w, list.visible+1*list.item_h);
|
canvas.Init(list.x, list.y, list.w, list.visible+1*list.item_h);
|
||||||
DrawPage();
|
DrawPage();
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -64,7 +64,7 @@ void PaintVisible()
|
|||||||
line_bg = theme.bg;
|
line_bg = theme.bg;
|
||||||
|
|
||||||
if (selection.start_y < absolute_y) && (selection.end_y > absolute_y) line_bg = selection.color;
|
if (selection.start_y < absolute_y) && (selection.end_y > absolute_y) line_bg = selection.color;
|
||||||
DrawBuf.DrawBar(0, ydraw, list.w, list.item_h, line_bg);
|
canvas.DrawBar(0, ydraw, list.w, list.item_h, line_bg);
|
||||||
|
|
||||||
selection.draw(absolute_y);
|
selection.draw(absolute_y);
|
||||||
|
|
||||||
@ -75,17 +75,17 @@ void PaintVisible()
|
|||||||
if (s2 > 0) break;
|
if (s2 > 0) break;
|
||||||
|
|
||||||
if (s1 > 0) && (s2 < 0) {
|
if (s1 > 0) && (s2 < 0) {
|
||||||
DrawBuf.DrawBar(search.found.get(ff) - lines.get(absolute_y) * list.font_w + 3,
|
canvas.DrawBar(search.found.get(ff) - lines.get(absolute_y) * list.font_w + 3,
|
||||||
ydraw, strlen(#found_text) * list.font_w, list.item_h, theme.found);
|
ydraw, strlen(#found_text) * list.font_w, list.item_h, theme.found);
|
||||||
search_next = false;
|
search_next = false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (absolute_y<list.count) DrawBuf.WriteText(3, ydraw+3, list.font_type, theme.text,
|
if (absolute_y<list.count) canvas.WriteText(3, ydraw+3, list.font_type, theme.text,
|
||||||
lines.get(absolute_y), lines.len(absolute_y));
|
lines.get(absolute_y), lines.len(absolute_y));
|
||||||
}
|
}
|
||||||
|
|
||||||
PutPaletteImage(buf_data+8, DrawBuf.bufw, list.h, list.x, list.y, 32, 0);
|
PutPaletteImage(buf_data+8, canvas.bufw, list.h, list.x, list.y, 32, 0);
|
||||||
|
|
||||||
if (swapped_selection) selection.swap_start_end();
|
if (swapped_selection) selection.swap_start_end();
|
||||||
}
|
}
|
||||||
|
@ -25,7 +25,7 @@ bool SELECTION::is_active()
|
|||||||
|
|
||||||
void SELECTION::draw_line(dword x,y,w)
|
void SELECTION::draw_line(dword x,y,w)
|
||||||
{
|
{
|
||||||
DrawBuf.DrawBar(x, y - list.first * list.item_h, w, list.item_h, color);
|
canvas.DrawBar(x, y - list.first * list.item_h, w, list.item_h, color);
|
||||||
}
|
}
|
||||||
|
|
||||||
void SELECTION::draw(int i)
|
void SELECTION::draw(int i)
|
||||||
@ -35,12 +35,12 @@ void SELECTION::draw(int i)
|
|||||||
else if (start_y == i) draw_line(start_x * list.font_w+2, start_y, list.w -2- calc(start_x * list.font_w));
|
else if (start_y == i) draw_line(start_x * list.font_w+2, start_y, list.w -2- calc(start_x * list.font_w));
|
||||||
else if (end_y == i) draw_line(0, end_y, end_x * list.font_w+2);
|
else if (end_y == i) draw_line(0, end_y, end_x * list.font_w+2);
|
||||||
//only for debug:
|
//only for debug:
|
||||||
//DrawBuf.DrawBar(start_x * list.font_w + 2, start_y * list.item_h, 2, list.item_h, 0x00FF00);
|
//canvas.DrawBar(start_x * list.font_w + 2, start_y * list.item_h, 2, list.item_h, 0x00FF00);
|
||||||
//DrawBuf.DrawBar(end_x * list.font_w + 0, end_y * list.item_h, 2, list.item_h, 0xFF00FF);
|
//canvas.DrawBar(end_x * list.font_w + 0, end_y * list.item_h, 2, list.item_h, 0xFF00FF);
|
||||||
}
|
}
|
||||||
//DrawCursor
|
//DrawCursor
|
||||||
if (list.cur_y >= list.first) && (list.cur_y <= list.first+list.visible) {
|
if (list.cur_y >= list.first) && (list.cur_y <= list.first+list.visible) {
|
||||||
DrawBuf.DrawBar(list.cur_x * list.font_w + 2, list.cur_y - list.first * list.item_h, 2, list.item_h, theme.cursor);
|
canvas.DrawBar(list.cur_x * list.font_w + 2, list.cur_y - list.first * list.item_h, 2, list.item_h, theme.cursor);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user