📄 agg_platform_support.cpp
字号:
//------------------------------------------------------------------------
const char* platform_support::full_file_name(const char* file_name)
{
return file_name;
}
//------------------------------------------------------------------------
bool platform_support::load_img(unsigned idx, const char* file)
{
if(idx < max_images)
{
char fn[1024];
strcpy(fn, file);
int len = strlen(fn);
if(len < 4 || _stricmp(fn + len - 4, ".BMP") != 0)
{
strcat(fn, ".bmp");
}
return m_specific->load_pmap(fn, idx, &m_rbuf_img[idx]);
}
return true;
}
//------------------------------------------------------------------------
bool platform_support::save_img(unsigned idx, const char* file)
{
if(idx < max_images)
{
char fn[1024];
strcpy(fn, file);
int len = strlen(fn);
if(len < 4 || _stricmp(fn + len - 4, ".BMP") != 0)
{
strcat(fn, ".bmp");
}
return m_specific->save_pmap(fn, idx, &m_rbuf_img[idx]);
}
return true;
}
//------------------------------------------------------------------------
bool platform_support::create_img(unsigned idx, unsigned width, unsigned height)
{
if(idx < max_images)
{
if(width == 0) width = m_specific->m_pmap_window.width();
if(height == 0) height = m_specific->m_pmap_window.height();
m_specific->m_pmap_img[idx].create(width, height, org_e(m_specific->m_bpp));
m_rbuf_img[idx].attach(m_specific->m_pmap_img[idx].buf(),
m_specific->m_pmap_img[idx].width(),
m_specific->m_pmap_img[idx].height(),
m_flip_y ?
m_specific->m_pmap_img[idx].stride() :
-m_specific->m_pmap_img[idx].stride());
return true;
}
return false;
}
//------------------------------------------------------------------------
void platform_support::force_redraw()
{
m_specific->m_redraw_flag = true;
::InvalidateRect(m_specific->m_hwnd, 0, FALSE);
}
//------------------------------------------------------------------------
void platform_support::update_window()
{
HDC dc = ::GetDC(m_specific->m_hwnd);
m_specific->display_pmap(dc, &m_rbuf_window);
::ReleaseDC(m_specific->m_hwnd, dc);
}
//------------------------------------------------------------------------
void platform_support::on_init() {}
void platform_support::on_resize(int sx, int sy) {}
void platform_support::on_idle() {}
void platform_support::on_mouse_move(int x, int y, unsigned flags) {}
void platform_support::on_mouse_button_down(int x, int y, unsigned flags) {}
void platform_support::on_mouse_button_up(int x, int y, unsigned flags) {}
void platform_support::on_key(int x, int y, unsigned key, unsigned flags) {}
void platform_support::on_ctrl_change() {}
void platform_support::on_draw() {}
void platform_support::on_post_draw(void* raw_handler) {}
}
namespace agg
{
// That's ridiculous. I have to parse the command line by myself
// because Windows doesn't provide a method of getting the command
// line arguments in a form of argc, argv. Of course, there's
// CommandLineToArgv() but first, it returns Unicode that I don't
// need to deal with, but most of all, it's not compatible with Win98.
//-----------------------------------------------------------------------
class tokenizer
{
public:
enum sep_flag
{
single,
multiple,
whole_str
};
struct token
{
const char* ptr;
unsigned len;
};
public:
tokenizer(const char* sep,
const char* trim=0,
const char* quote="\"",
char mask_chr='\\',
sep_flag sf=multiple);
void set_str(const char* str);
token next_token();
private:
int check_chr(const char *str, char chr);
private:
const char* m_src_string;
int m_start;
const char* m_sep;
const char* m_trim;
const char* m_quote;
char m_mask_chr;
unsigned m_sep_len;
sep_flag m_sep_flag;
};
//-----------------------------------------------------------------------
inline void tokenizer::set_str(const char* str)
{
m_src_string = str;
m_start = 0;
}
//-----------------------------------------------------------------------
inline int tokenizer::check_chr(const char *str, char chr)
{
return int(strchr(str, chr));
}
//-----------------------------------------------------------------------
tokenizer::tokenizer(const char* sep,
const char* trim,
const char* quote,
char mask_chr,
sep_flag sf) :
m_src_string(0),
m_start(0),
m_sep(sep),
m_trim(trim),
m_quote(quote),
m_mask_chr(mask_chr),
m_sep_len(sep ? strlen(sep) : 0),
m_sep_flag(sep ? sf : single)
{
}
//-----------------------------------------------------------------------
tokenizer::token tokenizer::next_token()
{
unsigned count = 0;
char quote_chr = 0;
token tok;
tok.ptr = 0;
tok.len = 0;
if(m_src_string == 0 || m_start == -1) return tok;
register const char *pstr = m_src_string + m_start;
if(*pstr == 0)
{
m_start = -1;
return tok;
}
int sep_len = 1;
if(m_sep_flag == whole_str) sep_len = m_sep_len;
if(m_sep_flag == multiple)
{
//Pass all the separator symbols at the begin of the string
while(*pstr && check_chr(m_sep, *pstr))
{
++pstr;
++m_start;
}
}
if(*pstr == 0)
{
m_start = -1;
return tok;
}
for(count = 0;; ++count)
{
char c = *pstr;
int found = 0;
//We are outside of qotation: find one of separator symbols
if(quote_chr == 0)
{
if(sep_len == 1)
{
found = check_chr(m_sep, c);
}
else
{
found = strncmp(m_sep, pstr, m_sep_len) == 0;
}
}
++pstr;
if(c == 0 || found)
{
if(m_trim)
{
while(count &&
check_chr(m_trim, m_src_string[m_start]))
{
++m_start;
--count;
}
while(count &&
check_chr(m_trim, m_src_string[m_start + count - 1]))
{
--count;
}
}
tok.ptr = m_src_string + m_start;
tok.len = count;
//Next time it will be the next separator character
//But we must check, whether it is NOT the end of the string.
m_start += count;
if(c)
{
m_start += sep_len;
if(m_sep_flag == multiple)
{
//Pass all the separator symbols
//after the end of the string
while(check_chr(m_sep, m_src_string[m_start]))
{
++m_start;
}
}
}
break;
}
//Switch quote. If it is not a quote yet, try to check any of
//quote symbols. Otherwise quote must be finished with quote_symb
if(quote_chr == 0)
{
if(check_chr(m_quote, c))
{
quote_chr = c;
continue;
}
}
else
{
//We are inside quote: pass all the mask symbols
if(m_mask_chr && c == m_mask_chr)
{
if(*pstr)
{
++count;
++pstr;
}
continue;
}
if(c == quote_chr)
{
quote_chr = 0;
continue;
}
}
}
return tok;
}
}
//----------------------------------------------------------------------------
int agg_main(int argc, char* argv[]);
//----------------------------------------------------------------------------
int PASCAL WinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPWSTR lpszCmdLine1,
int nCmdShow)
{
char lpszCmdLine[256];
memset(lpszCmdLine,0,256);
WideCharToMultiByte(CP_ACP,0,lpszCmdLine1,255,lpszCmdLine,255,NULL,FALSE);
agg::g_windows_instance = hInstance;
agg::g_windows_cmd_show = nCmdShow;
char* argv_str = new char [strlen(lpszCmdLine) + 3];
char* argv_ptr = argv_str;
char* argv[64];
memset(argv, 0, sizeof(argv));
agg::tokenizer cmd_line(" ", "\"' ", "\"'", '\\', agg::tokenizer::multiple);
cmd_line.set_str(lpszCmdLine);
int argc = 0;
argv[argc++] = argv_ptr;
*argv_ptr++ = 0;
while(argc < 64)
{
agg::tokenizer::token tok = cmd_line.next_token();
if(tok.ptr == 0) break;
if(tok.len)
{
memcpy(argv_ptr, tok.ptr, tok.len);
argv[argc++] = argv_ptr;
argv_ptr += tok.len;
*argv_ptr++ = 0;
}
}
int ret = agg_main(argc, argv);
delete [] argv_str;
return ret;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -