📄 ptctrl_fill.cpp
字号:
else if(!gFill_Bits[gFill_Loc + gDir_Loc_Beyond[2]])
{
gDir_Turn = 0;
gDirFun_Next = gDirFun_Table[2];
}
else
gDirFun_Next = NULL;
}
else
{
if(!gFill_Bits[gFill_Loc + gDir_Loc_Beyond[2]])
gDirFun_Next = gDirFun_Table[2];
else if(!gFill_Bits[gFill_Loc + gDir_Loc_Beyond[0]])
{
gDir_Turn = 1;
gDirFun_Next = gDirFun_Table[0];
}
else
gDirFun_Next = NULL;
}
//TRACE("Fill_By_Dir_d end x = %d ,y = %d , idx= %d\n", gFill_Loc%gFill_Wid ,gFill_Loc/gFill_Wid , gFill_Bits[gFill_Loc]);
}
VOID Fill_By_Dir_l()
{
//TRACE("Fill_By_Dir_l start x = %d ,y = %d \n", gFill_Loc%gFill_Wid ,gFill_Loc/gFill_Wid);
INT step = -1;
INT loc = gFill_Loc - 1;
while(1)
{
gFill_Bits[gFill_Loc] = 0x06; //0000 01 10 B
if(gFill_Bits[loc])
break;
gFill_Loc = loc;
loc += step;
}
if(gFill_Stack[gFill_Stack_Count-1] != gFill_Loc)
{
gFill_Stack[gFill_Stack_Count] = gFill_Loc;
gFill_Stack_Count ++;
}
if(gDir_Turn)
{
if(!gFill_Bits[gFill_Loc + gDir_Loc_Beyond[1]])
gDirFun_Next = gDirFun_Table[1];
else if(!gFill_Bits[gFill_Loc + gDir_Loc_Beyond[3]])
{
gDir_Turn = 0;
gDirFun_Next = gDirFun_Table[3];
}
else
gDirFun_Next = NULL;
}
else
{
if(!gFill_Bits[gFill_Loc + gDir_Loc_Beyond[3]])
gDirFun_Next = gDirFun_Table[3];
else if(!gFill_Bits[gFill_Loc + gDir_Loc_Beyond[1]])
{
gDir_Turn = 1;
gDirFun_Next = gDirFun_Table[1];
}
else
gDirFun_Next = NULL;
}
//TRACE("Fill_By_Dir_l end x = %d ,y = %d , idx= %d\n", gFill_Loc%gFill_Wid ,gFill_Loc/gFill_Wid , gFill_Bits[gFill_Loc]);
}
VOID Fill_By_Dir_u()
{
//TRACE("Fill_By_Dir_u start x = %d ,y = %d \n", gFill_Loc%gFill_Wid ,gFill_Loc/gFill_Wid);
INT step = - gFill_Wid;
INT loc = gFill_Loc - gFill_Wid;
while(1)
{
gFill_Bits[gFill_Loc] = 0x07; //0000 01 11 B
if(gFill_Bits[loc])
break;
gFill_Loc = loc;
loc += step;
}
if(gFill_Stack[gFill_Stack_Count-1] != gFill_Loc)
{
gFill_Stack[gFill_Stack_Count] = gFill_Loc;
gFill_Stack_Count ++;
}
if(gDir_Turn)
{
if(!gFill_Bits[gFill_Loc + gDir_Loc_Beyond[2]])
gDirFun_Next = gDirFun_Table[2];
else if(!gFill_Bits[gFill_Loc + gDir_Loc_Beyond[0]])
{
gDir_Turn = 0;
gDirFun_Next = gDirFun_Table[0];
}
else
gDirFun_Next = NULL;
}
else
{
if(!gFill_Bits[gFill_Loc + gDir_Loc_Beyond[0]])
gDirFun_Next = gDirFun_Table[0];
else if(!gFill_Bits[gFill_Loc + gDir_Loc_Beyond[2]])
{
gDir_Turn = 1;
gDirFun_Next = gDirFun_Table[2];
}
else
gDirFun_Next = NULL;
}
//TRACE("Fill_By_Dir_u end x = %d ,y = %d , idx= %d\n", gFill_Loc%gFill_Wid ,gFill_Loc/gFill_Wid , gFill_Bits[gFill_Loc]);
}
VOID Move_Prev()
{
//TRACE("Move_Prev Start x = %d ,y = %d \n", gFill_Loc%gFill_Wid ,gFill_Loc/gFill_Wid);
static int cnt;
INT step;
INT dir;
INT count;
INT loc;
INT loop;
cnt = 0;
while(gFill_Stack_Count > 1)
{
// if(cnt++ > 1)
// break;
count = gFill_Stack[gFill_Stack_Count-2];
dir = gFill_Bits[count] & 0x03;
//TRACE("Move_Prev dir = %d\n", dir);
step = gDir_Loc_Prev[dir];
loc = gFill_Stack[gFill_Stack_Count-1];// + step;
while(loc != count)
{
//TRACE("Move_Prev loc x = %d ,y = %d , idx= %d\n", loc%gFill_Wid ,loc/gFill_Wid , gFill_Bits[loc]);
for(loop = 1; loop < 4; loop ++)
{
if(!gFill_Bits[loc + gDir_Loc_Beyond[loop + dir]])
break;
}
if(loop < 4)
break;
loc += step;
}
//TRACE("Move_Prev loop = %d ,count = %d\n",loop,count);
if(loc == count)
{
//TRACE("Move_Prev pop stack %d\n",gFill_Stack_Count);
gFill_Stack_Count --;
}
else
{
//TRACE("Move_Prev push stack %d\n",loc);
gFill_Stack[gFill_Stack_Count-1] = loc;
break;
}
cnt++;
}
gFill_Loc = gFill_Stack[gFill_Stack_Count-1];
if(gFill_Stack_Count > 1)
{
gDirFun_Next = gDirFun_Table[(dir + loop)%4];
if(loop < 4)
gDirFun_Next = gDirFun_Table[(dir + loop)%4];
else
gDirFun_Next = NULL;
}
else
{
dir = gFill_Bits[gFill_Stack[0]] & 0x03;
loc = gFill_Stack[0];
for(loop = 1; loop < 4; loop ++)
{
if(!gFill_Bits[loc + gDir_Loc_Beyond[loop + dir]])
break;
}
if(loop < 4)
gDirFun_Next = gDirFun_Table[(dir + loop)%4];
else
gDirFun_Next = NULL;
}
//TRACE("Move_Prev end cnt = %d, x = %d ,y = %d , idx= %d\n", cnt, gFill_Loc%gFill_Wid ,gFill_Loc/gFill_Wid , gFill_Bits[gFill_Loc]);
}
INT PtCtrl_Fill_OnFill(PtCtrlBase* pPtCtrl, INT tx /* = -1 */, INT ty /* = -1 */)
{
PtCtrl_Fill *pPtCtrl_Fill = (PtCtrl_Fill*)pPtCtrl;
INT32 color;
BYTE * pc = NULL;
if(!pPtCtrl_Fill->m_init_draw_flag)
{
pPtCtrl_Fill->m_buf_dc = CreateCompatibleDC(m_pt_app_info.m_pt_backup_hdc);
pPtCtrl_Fill->m_buf_bitmap = CreateDIBSection(pPtCtrl_Fill->m_buf_dc,
&m_pt_app_info.m_bmp_file_info,
DIB_RGB_COLORS,
(void**)&pPtCtrl_Fill->m_bit_ptr,
NULL,0);
SelectObject(pPtCtrl_Fill->m_buf_dc,pPtCtrl_Fill->m_buf_bitmap);
pPtCtrl_Fill->m_init_draw_flag = TRUE;
}
BitBlt(pPtCtrl_Fill->m_buf_dc,
0,0,
m_pt_app_info.m_bmp_file_info.bmiHeader.biWidth,m_pt_app_info.m_bmp_file_info.bmiHeader.biHeight,
m_pt_app_info.m_pt_backup_hdc,
0,0,
SRCCOPY);
pc = pPtCtrl_Fill->m_bit_ptr;
// INT ret = GetDIBits(m_pt_app_info.m_pt_backup_hdc,
// m_pt_app_info.m_pt_backup_hbmp,
// 0,m_pt_app_info.m_bmp_file_info.bmiHeader.biHeight,
// gBmp_Bits,
// &m_pt_app_info.m_bmp_file_info,
// DIB_RGB_COLORS);
//memcpy(gBmp_Bits,pc,m_pt_app_info.m_bmp_file_info.bmiHeader.biSizeImage);
memset(gFill_Bits,0x80,sizeof(gFill_Bits));
color = GetPixel(m_pt_app_info.m_pt_backup_hdc,pPtCtrl_Fill->cx,pPtCtrl_Fill->cy);
color = ((color >> 16) & 0x00ffffff) | (color & 0x0000ff00) | ((color << 16) & 0x00ffffff);
gFill_Wid = m_pt_app_info.m_bmp_file_info.bmiHeader.biWidth + 2;
gFill_Hei = m_pt_app_info.m_bmp_file_info.bmiHeader.biHeight + 2;
INT idx = 0;
INT loc = gFill_Wid;
//BYTE * pc = gBmp_Bits;
for(INT i = 0 ; i < m_pt_app_info.m_bmp_file_info.bmiHeader.biHeight; i++)
{
loc ++;
for(INT j = 0; j < m_pt_app_info.m_bmp_file_info.bmiHeader.biWidth; j++)
{
if( color == (*(INT32*)pc & 0x00ffffff))
gFill_Bits[loc] = 0x00;
pc += 3;
loc ++;
}
loc ++;
}
//////////////////////////////////////////////////////////////////////////
TRACE(L"Mouse %d %d\n",pPtCtrl_Fill->cx,pPtCtrl_Fill->cy);
gFill_Loc = pPtCtrl_Fill->cx + 1 + gFill_Wid * (gFill_Hei - pPtCtrl_Fill->cy - 2);
gFill_Stack[0] = gFill_Loc;
gFill_Stack_Count = 1;
gDirFun_Next = gDirFun_Table[0];
INT cnt1 = 0;
INT cnt2 = 0;
gDir_Turn = 0;
gDir_Loc_Beyond[1] = gFill_Wid;
gDir_Loc_Beyond[3] = -gFill_Wid;
gDir_Loc_Beyond[5] = gFill_Wid;
gDir_Loc_Beyond[7] = -gFill_Wid;
gDir_Loc_Prev[1] = -gFill_Wid;
gDir_Loc_Prev[3] = gFill_Wid;
do
{
while(gDirFun_Next != NULL)
{
cnt1++;
gDirFun_Next();
}
Move_Prev();
cnt2++;
}while(gDirFun_Next != NULL);
TRACE(L"stack over cnt1 = %d , cnt2 = %d, x = %d, y = %d\n",cnt1,cnt2,gFill_Loc % gFill_Wid , gFill_Loc / gFill_Wid );
//////////////////////////////////////////////////////////////////////////
loc = gFill_Wid;
//pc = gBmp_Bits;
pc = pPtCtrl_Fill->m_bit_ptr;
if(pPtCtrl_Fill->m_opt_flag == PtCtrl_Fill_SetPixel)
color = (m_pt_app_info.m_color_cur >> 16) | (m_pt_app_info.m_color_cur &0x00ff00) | (m_pt_app_info.m_color_cur << 16);
else
color = (m_pt_app_info.m_color_bk_cur >> 16) | (m_pt_app_info.m_color_bk_cur &0x00ff00) | (m_pt_app_info.m_color_bk_cur << 16);
cnt1 = 0;
for(i = 0 ; i < m_pt_app_info.m_bmp_file_info.bmiHeader.biHeight ; i++)
{
loc ++;
for(INT j = 0; j < m_pt_app_info.m_bmp_file_info.bmiHeader.biWidth; j++)
{
if(gFill_Bits[loc] & 0x04 ) // 0000 0100
{
*(INT32*)pc &= 0xff000000;
*(INT32*)pc |= color;
cnt1++;
}
pc += 3;
loc ++;
}
loc ++;
}
TRACE(L"fill count = %d\n" , cnt1);
// i = SetDIBitsToDevice(m_pt_app_info.m_pt_backup_hdc,0,0,
// m_pt_app_info.m_bmp_file_info.bmiHeader.biWidth,m_pt_app_info.m_bmp_file_info.bmiHeader.biHeight,
// 0,0,
// 0,m_pt_app_info.m_bmp_file_info.bmiHeader.biHeight,
// gBmp_Bits,&m_pt_app_info.m_bmp_file_info,
// DIB_RGB_COLORS);
BitBlt(m_pt_app_info.m_pt_backup_hdc,
0,0,
m_pt_app_info.m_bmp_file_info.bmiHeader.biWidth,m_pt_app_info.m_bmp_file_info.bmiHeader.biHeight,
pPtCtrl_Fill->m_buf_dc,
0,0,
SRCCOPY);
return 0;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -