⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 clevels.cpp

📁 从FFMPEG转换而来的H264解码程序,VC下编译..
💻 CPP
📖 第 1 页 / 共 2 页
字号:
 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 + -