📄 clevels.cpp
字号:
levels2dlg();
setCheck(IDC_CHB_LEVELS_INPUT_AUTO,cfgGet(IDFF_levelsInAuto));
}
void TlevelsPage::levels2dlg(void)
{
setCheck(IDC_CHB_LEVELS_ONLYLUMA,cfgGet(IDFF_levelsOnlyLuma));
int x=cfgGet(IDFF_levelsGamma);
tbrSet(IDC_TBR_LEVELS_GAMMA,x);
char_t pomS[256];
tsprintf(pomS,_l("%s %3.2f"),_(IDC_LBL_LEVELS_GAMMA),float(x/100.0));
if (x==100) strcatf(pomS,_l(" (%s)"),_(IDC_LBL_LEVELS_GAMMA,_l("off")));
setDlgItemText(m_hwnd,IDC_LBL_LEVELS_GAMMA,pomS);
tbrSet(IDC_TBR_LEVELS_POSTERIZE,cfgGet(IDFF_levelsPosterize),IDC_LBL_LEVELS_POSTERIZE);
mode2dlg();
}
void TlevelsPage::mode2dlg(void)
{
int mode=cfgGet(IDFF_levelsMode);
static const int idnCurves[]={IDC_CHB_LEVELS_SHOW_HISTOGRAM,IDC_CHB_LEVELS_SHOW_HISTOGRAM_FULL,IDC_BMP_HISTOGRAM,IDC_LBL_LEVELS_INPUT,IDC_CHB_LEVELS_INPUT_AUTO,IDC_BMP_LEVELS_IN,IDC_LBL_LEVELS_OUTPUT,IDC_BMP_LEVELS_OUT,IDC_LBL_LEVELS_GAMMA,IDC_TBR_LEVELS_GAMMA,IDC_LBL_LEVELS_POSTERIZE,IDC_TBR_LEVELS_POSTERIZE,0};
show(mode!=5,idnCurves);
static const int idCurves[]={IDC_BMP_LEVELS_CURVES,IDC_LBX_LEVELS_CURVES,IDC_BT_LEVELS_CURVES_LOAD,0};
show(mode==5,idCurves);
map2dlg();
}
void TlevelsPage::map2dlg(void)
{
isMap=SUCCEEDED(deciV->getLevelsMap(map));
onFrame();
}
void TlevelsPage::drawTriangle(DRAWITEMSTRUCT *dis,int cl,bool fade)
{
int x=(cl*dis->rcItem.right)/255;
if (fade) cl=127;
HBRUSH br=CreateSolidBrush(RGB(cl,cl,cl));
HPEN pen=CreatePen(PS_SOLID,1,RGB(255-cl,255-cl,255-cl));
HGDIOBJ oldBr=SelectObject(dis->hDC,br);
HGDIOBJ oldPen=SelectObject(dis->hDC,pen);
if (!fade)
{
HGDIOBJ oldFont=SelectObject(dis->hDC,fontGradient);
SetTextAlign(dis->hDC,TA_LEFT|TA_TOP);
char_t pomS[10];_itoa(cl,pomS,10);
SIZE sz;
GetTextExtentPoint32(dis->hDC,pomS,(int)strlen(pomS),&sz);
int tx=x;
if (tx-sz.cx/2<0) tx=0;
else if (tx+sz.cx/2>dis->rcItem.right) tx=dis->rcItem.right-sz.cx;
else tx-=sz.cx/2;
TextOut(dis->hDC,tx,22,pomS,(int)strlen(pomS));
SelectObject(dis->hDC,oldFont);
}
int trsz=fade?6:10;
POINT tri[]={{x,10},{x-trsz/2,10+trsz},{x+trsz/2,10+trsz}};
Polygon(dis->hDC,tri,3);
SelectObject(dis->hDC,oldBr);
SelectObject(dis->hDC,oldPen);
DeleteObject(pen);
DeleteObject(br);
}
INT_PTR TlevelsPage::msgProc(UINT uMsg, WPARAM wParam, LPARAM lParam)
{
switch (uMsg)
{
case WM_DESTROY:
SelectObject(hdcGradient,oldHDCgradient);DeleteDC(hdcGradient);
DeleteBitmap(bmpGradient);
DeleteFont(fontGradient);
SendMessage(GetDlgItem(m_hwnd,IDC_LBX_LEVELS_CURVES),WM_SETFONT,NULL,FALSE);DeleteFont(fontCurier);
break;
case WM_DRAWITEM:
switch (wParam)
{
case IDC_BMP_HISTOGRAM:
{
LPDRAWITEMSTRUCT dis=LPDRAWITEMSTRUCT(lParam);
int full=cfgGet(IDFF_levelsFullY);
StretchDIBits(dis->hDC,0,0,dis->rcItem.right,dis->rcItem.bottom,full?0:16,0,full?256:234-16+1,64,histogramBits,(BITMAPINFO*)&histogramBmp,DIB_RGB_COLORS,SRCCOPY);
wIn->draw(dis);
return TRUE;
}
case IDC_BMP_LEVELS_IN:
{
LPDRAWITEMSTRUCT dis=LPDRAWITEMSTRUCT(lParam);
StretchBlt(dis->hDC,0,0,dis->rcItem.right,10,hdcGradient,0,0,256,1,SRCCOPY);
RECT r=dis->rcItem;r.top=10;
FillRect(dis->hDC,&r,GetSysColorBrush(COLOR_BTNFACE));
if (filter && getCheck(IDC_CHB_LEVELS_INPUT_AUTO))
{
int min,max;
filter->getInAuto(&min,&max);
drawTriangle(dis,min,true);
drawTriangle(dis,max,true);
}
drawTriangle(dis,cfgGet(IDFF_levelsInMin));
drawTriangle(dis,cfgGet(IDFF_levelsInMax));
return TRUE;
}
case IDC_BMP_LEVELS_OUT:
{
LPDRAWITEMSTRUCT dis=LPDRAWITEMSTRUCT(lParam);
StretchBlt(dis->hDC,0,0,dis->rcItem.right,10,hdcGradient,0,0,256,1,SRCCOPY);
RECT r=dis->rcItem;r.top=10;
FillRect(dis->hDC,&r,GetSysColorBrush(COLOR_BTNFACE));
drawTriangle(dis,cfgGet(IDFF_levelsOutMin));
drawTriangle(dis,cfgGet(IDFF_levelsOutMax));
return TRUE;
}
case IDC_BMP_LEVELS_CURVES:
{
LPDRAWITEMSTRUCT dis=LPDRAWITEMSTRUCT(lParam);
StretchDIBits(dis->hDC,0,0,dis->rcItem.right,dis->rcItem.bottom,0,0,256,256,histogramBits,(BITMAPINFO*)&curvesBmp,DIB_RGB_COLORS,SRCCOPY);
wCurves->draw(dis);
return TRUE;
}
}
break;
case WM_SETCURSOR:
if (HWND(wParam)==hcurves)
{
if (wCurves->setCursor())
{
SetCursor(LoadCursor(NULL,IDC_SIZEALL));
setDlgResult(TRUE);
}
return TRUE;
}
break;
}
return TconfPageDecVideo::msgProc(uMsg,wParam,lParam);
}
Twidget* TlevelsPage::createDlgItem(int id,HWND h)
{
if (id==IDC_BMP_LEVELS_IN)
return wIn=new TwidgetLevels(h,this,IDFF_levelsInMin,IDFF_levelsInMax);
else if (id==IDC_BMP_LEVELS_OUT)
return new TwidgetLevels(h,this,IDFF_levelsOutMin,IDFF_levelsOutMax);
else if (id==IDC_BMP_LEVELS_CURVES)
return wCurves=new TwidgetCurves(h,this);
else
return TconfPageDecVideo::createDlgItem(id,h);
}
void TlevelsPage::onFrame(void)
{
if (!startup && !IsWindowVisible(m_hwnd)) return;
startup=false;
int mode=cfgGet(IDFF_levelsMode);
memset(histogramBits,1,sizeof(histogramBits));
if (mode==5)
for (int i=32;i<256;i+=32)
for (int j=0;j<256;j+=2)
{
histogramBits[i*256+j]=2;
histogramBits[j*256+i]=2;
}
repaint(GetDlgItem(m_hwnd,IDC_BMP_HISTOGRAM));
unsigned int histogram[256];
int isHist=getCheck(IDC_CHB_LEVELS_SHOW_HISTOGRAM);
if (isHist && filter)
filter->getHistogram(histogram);
else
memset(histogram,0,sizeof(histogram));
unsigned int min,max;
if (mode==5 || cfgGet(IDFF_levelsFullY))
{
min=0;max=255;
}
else
{
min=16;max=234;
}
unsigned int histogramMax=0;
histogramMax=*std::max_element(histogram+min,histogram+max+1);
int dy=mode==5?256:64;
if (histogramMax>1 || isMap || !isHist || mode==5)
{
for (unsigned int x=min;x<=max;x++)
{
if (histogramMax>0)
{
unsigned int y=histogram[x]*dy/histogramMax;
for (unsigned char *dst=histogramBits+x,*dstEnd=dst+y*256;dst<dstEnd;dst+=256)
*dst=2;
}
if (isMap)
histogramBits[x+256*(map[x]/(256/dy))]=0;
}
repaint(mode==5?hcurves:GetDlgItem(m_hwnd,IDC_BMP_HISTOGRAM));
}
repaint(GetDlgItem(m_hwnd,IDC_BMP_LEVELS_IN));
}
void TlevelsPage::onCurveLoad(void)
{
if (dlgGetFile(false,m_hwnd,_(-IDD_LEVELS,_l("Select curve file")),_l("Adobe Photoshop Curves (*.acv)\0*.acv\0All files (*.*)\0*.*\0"),_l("acv"),curvesflnm,_l("."),0))
{
FILE *f=fopen(curvesflnm,_l("rb"));if (!f) return;
int16_t w;
if (fread(&w,1,2,f)==2 && be2me_16(w)==4)
if (fread(&w,1,2,f)==2 && be2me_16(w)==5)
{
int16_t cnt;
if (fread(&cnt,1,2,f)==2 && (cnt=be2me_16(cnt))>0)
{
cnt=std::min(cnt,int16_t(10));
cfgSet(IDFF_levelsNumPoints,cnt);
std::pair<uint8_t,uint8_t> pts[10];
int numpoints=0;
for (int i=0;i<cnt;i++)
{
int16_t x,y;
if (fread(&y,1,2,f)!=2 || fread(&x,1,2,f)!=2)
break;
pts[numpoints].first=limit_uint8(be2me_16(x));
pts[numpoints].second=limit_uint8(be2me_16(y));
numpoints++;
}
std::sort(pts,pts+numpoints);
for (int i=0;i<numpoints;i++)
{
cfgSet(TwidgetCurves::idffs[2*i+0],pts[i].first);
cfgSet(TwidgetCurves::idffs[2*i+1],pts[i].second);
}
wCurves->reset();
map2dlg();
}
}
fclose(f);
}
}
bool TlevelsPage::reset(bool testonly)
{
if (!testonly)
{
repaint(GetDlgItem(m_hwnd,IDC_BMP_LEVELS_IN));
repaint(GetDlgItem(m_hwnd,IDC_BMP_LEVELS_OUT));
wCurves->reset();
}
return true;
}
void TlevelsPage::translate(void)
{
TconfPageDecVideo::translate();
cbxTranslate(IDC_CBX_LEVELS_MODE,TlevelsSettings::modes);
}
TlevelsPage::TlevelsPage(TffdshowPageDec *Iparent,const TfilterIDFF *idff):TconfPageDecVideo(Iparent,idff),filter(NULL)
{
resInter=IDC_CHB_LEVELS;
helpURL=_l("levels.html");
curvesflnm[0]='\0';
static const TbindCheckbox<TlevelsPage> chb[]=
{
IDC_CHB_LEVELS_ONLYLUMA,IDFF_levelsOnlyLuma,&TlevelsPage::levels2dlg,
IDC_CHB_LEVELS_SHOW_HISTOGRAM,IDFF_buildHistogram,NULL,
IDC_CHB_LEVELS_SHOW_HISTOGRAM_FULL,IDFF_levelsFullY,&TlevelsPage::map2dlg,
IDC_CHB_LEVELS_INPUT_AUTO,IDFF_levelsInAuto,NULL,
0,NULL,NULL
};
bindCheckboxes(chb);
static const TbindTrackbar<TlevelsPage> htbr[]=
{
IDC_TBR_LEVELS_GAMMA,IDFF_levelsGamma,&TlevelsPage::levels2dlg,
IDC_TBR_LEVELS_POSTERIZE,IDFF_levelsPosterize,&TlevelsPage::levels2dlg,
0,0,NULL
};
bindHtracks(htbr);
static const TbindCombobox<TlevelsPage> cbx[]=
{
IDC_CBX_LEVELS_MODE,IDFF_levelsMode,BINDCBX_SEL,&TlevelsPage::mode2dlg,
0
};
bindComboboxes(cbx);
static const TbindButton<TlevelsPage> bt[]=
{
IDC_BT_LEVELS_CURVES_LOAD,&TlevelsPage::onCurveLoad,
0,NULL
};
bindButtons(bt);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -