mirror of
https://github.com/n5ac/mmsstv.git
synced 2025-12-06 04:12:03 +01:00
668 lines
16 KiB
C++
668 lines
16 KiB
C++
|
|
//Copyright+LGPL
|
|||
|
|
|
|||
|
|
//-----------------------------------------------------------------------------------------------------------------------------------------------
|
|||
|
|
// Copyright 2000-2013 Makoto Mori, Nobuyuki Oba
|
|||
|
|
//-----------------------------------------------------------------------------------------------------------------------------------------------
|
|||
|
|
// This file is part of MMSSTV.
|
|||
|
|
|
|||
|
|
// MMSSTV is free software: you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License
|
|||
|
|
// as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version.
|
|||
|
|
|
|||
|
|
// MMSSTV is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|||
|
|
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details.
|
|||
|
|
|
|||
|
|
// You should have received a copy of the GNU Lesser General Public License along with MMTTY. If not, see
|
|||
|
|
// <http://www.gnu.org/licenses/>.
|
|||
|
|
//-----------------------------------------------------------------------------------------------------------------------------------------------
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
//---------------------------------------------------------------------
|
|||
|
|
#include <vcl.h>
|
|||
|
|
#pragma hdrstop
|
|||
|
|
|
|||
|
|
#include "Main.h"
|
|||
|
|
#include "ComLIb.h"
|
|||
|
|
#include "PicFilte.h"
|
|||
|
|
#include "math.h"
|
|||
|
|
#ifndef PI
|
|||
|
|
#define PI 3.1415926535897932384626433832795
|
|||
|
|
#endif
|
|||
|
|
#ifndef PI2
|
|||
|
|
#define PI2 (PI*2)
|
|||
|
|
#endif
|
|||
|
|
//---------------------------------------------------------------------
|
|||
|
|
#pragma resource "*.dfm"
|
|||
|
|
//---------------------------------------------------------------------
|
|||
|
|
__fastcall TPicFilterDlg::TPicFilterDlg(TComponent* AOwner)
|
|||
|
|
: TForm(AOwner)
|
|||
|
|
{
|
|||
|
|
m_DisEvent = 1;
|
|||
|
|
FormStyle = ((TForm *)AOwner)->FormStyle;
|
|||
|
|
Font->Name = ((TForm *)AOwner)->Font->Name;
|
|||
|
|
Font->Charset = ((TForm *)AOwner)->Font->Charset;
|
|||
|
|
if( MsgEng ){
|
|||
|
|
CancelBtn->Caption = "Cancel";
|
|||
|
|
L1->Caption = "Brightness";
|
|||
|
|
L2->Caption = "Contrast";
|
|||
|
|
L3->Caption = "Sharpness";
|
|||
|
|
L4->Caption = "Hue";
|
|||
|
|
L5->Caption = "Saturation";
|
|||
|
|
GBFilt->Caption = "Noise filter";
|
|||
|
|
SBST->Caption = "Stretch";
|
|||
|
|
AutoBtn->Caption = "Auto";
|
|||
|
|
ResBtn->Caption = "Reset";
|
|||
|
|
SBEdit->Caption = "Edit";
|
|||
|
|
SBBRR->Hint = "Reset";
|
|||
|
|
SBCTR->Hint = "Reset";
|
|||
|
|
SBSPR->Hint = "Reset";
|
|||
|
|
SBCPR->Hint = "Reset";
|
|||
|
|
SBCOR->Hint = "Reset";
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
SBBRR->Hint = "<EFBFBD><EFBFBD><EFBFBD><EFBFBD>";
|
|||
|
|
SBCTR->Hint = "<EFBFBD><EFBFBD><EFBFBD><EFBFBD>";
|
|||
|
|
SBSPR->Hint = "<EFBFBD><EFBFBD><EFBFBD><EFBFBD>";
|
|||
|
|
SBCPR->Hint = "<EFBFBD><EFBFBD><EFBFBD><EFBFBD>";
|
|||
|
|
SBCOR->Hint = "<EFBFBD><EFBFBD><EFBFBD><EFBFBD>";
|
|||
|
|
}
|
|||
|
|
m_XW = 320;
|
|||
|
|
m_YW = 256;
|
|||
|
|
MultProc();
|
|||
|
|
pBitmap = new Graphics::TBitmap();
|
|||
|
|
pBitmap->PixelFormat = pf24bit;
|
|||
|
|
pBitmap->Width = 320;
|
|||
|
|
pBitmap->Height = 256;
|
|||
|
|
|
|||
|
|
pBitmapS = new Graphics::TBitmap();
|
|||
|
|
pBitmapS->PixelFormat = pf24bit;
|
|||
|
|
pBitmapS->Width = 320;
|
|||
|
|
pBitmapS->Height = 256;
|
|||
|
|
pBitmapD = new Graphics::TBitmap();
|
|||
|
|
pBitmapD->PixelFormat = pf24bit;
|
|||
|
|
pBitmapD->Width = 320;
|
|||
|
|
pBitmapD->Height = 256;
|
|||
|
|
|
|||
|
|
pH = NULL;
|
|||
|
|
pS = NULL;
|
|||
|
|
m_Make = 0;
|
|||
|
|
m_Sync = 0;
|
|||
|
|
MultProc();
|
|||
|
|
}
|
|||
|
|
//---------------------------------------------------------------------
|
|||
|
|
__fastcall TPicFilterDlg::~TPicFilterDlg()
|
|||
|
|
{
|
|||
|
|
delete pBitmap;
|
|||
|
|
delete pBitmapD;
|
|||
|
|
delete pBitmapS;
|
|||
|
|
if( pS != NULL ){
|
|||
|
|
delete pS;
|
|||
|
|
delete pH;
|
|||
|
|
pS = NULL;
|
|||
|
|
pH = NULL;
|
|||
|
|
}
|
|||
|
|
MultProc();
|
|||
|
|
g_ExecPB.Cancel();
|
|||
|
|
}
|
|||
|
|
//---------------------------------------------------------------------
|
|||
|
|
void __fastcall TPicFilterDlg::UpdateBtn(void)
|
|||
|
|
{
|
|||
|
|
SBBRR->Enabled = (TBBright->Position != 10) ? TRUE : FALSE;
|
|||
|
|
SBCTR->Enabled = (TBCont->Position != 10) ? TRUE : FALSE;
|
|||
|
|
SBSPR->Enabled = (TBShape->Position != 10) ? TRUE : FALSE;
|
|||
|
|
SBCPR->Enabled = (TBH->Position != 10) ? TRUE : FALSE;
|
|||
|
|
SBCOR->Enabled = (TBS->Position != 10) ? TRUE : FALSE;
|
|||
|
|
ResBtn->Enabled = SBBRR->Enabled || SBCTR->Enabled || SBSPR->Enabled || SBCPR->Enabled || SBCOR->Enabled || !SBFN->Down;
|
|||
|
|
if( !OKBtn->Enabled ){
|
|||
|
|
Timer->Interval = ResBtn->Enabled ? 5000 : 1500;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
//---------------------------------------------------------------------
|
|||
|
|
int __fastcall TPicFilterDlg::Execute(Graphics::TBitmap *pBmp)
|
|||
|
|
{
|
|||
|
|
CWaitCursor w;
|
|||
|
|
MultProc();
|
|||
|
|
m_XW = pBmp->Width;
|
|||
|
|
m_YW = pBmp->Height;
|
|||
|
|
char bf[128];
|
|||
|
|
sprintf(bf, "%s - Source:%ux%u", MsgEng ? "Image adjustment" : "<EFBFBD>摜<EFBFBD><EFBFBD><EFBFBD><EFBFBD>", m_XW, m_YW);
|
|||
|
|
Caption = bf;
|
|||
|
|
pBitmap->Width = m_XW;
|
|||
|
|
pBitmap->Height = m_YW;
|
|||
|
|
pBitmapS->Width = m_XW;
|
|||
|
|
pBitmapS->Height = m_YW;
|
|||
|
|
pBitmapD->Width = m_XW;
|
|||
|
|
pBitmapD->Height = m_YW;
|
|||
|
|
pBitmap->Canvas->Draw(0, 0, pBmp);
|
|||
|
|
pBitmapS->Canvas->Draw(0, 0, pBmp);
|
|||
|
|
pBitmapD->Canvas->Draw(0, 0, pBmp);
|
|||
|
|
CB2D->Checked = sys.m_Sharp2D;
|
|||
|
|
if( (m_XW <= 320) && (m_YW <= 256) ){
|
|||
|
|
SBST->Visible = FALSE;
|
|||
|
|
}
|
|||
|
|
UpdateBtn();
|
|||
|
|
w.Delete();
|
|||
|
|
m_DisEvent = 0;
|
|||
|
|
MultProc();
|
|||
|
|
int r = ShowModal();
|
|||
|
|
MultProc();
|
|||
|
|
sys.m_Sharp2D = CB2D->Checked;
|
|||
|
|
if( r == IDOK ){
|
|||
|
|
pBmp->Canvas->Draw(0, 0, pBitmapD);
|
|||
|
|
return TRUE;
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
return FALSE;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
//---------------------------------------------------------------------
|
|||
|
|
void __fastcall TPicFilterDlg::PBoxPaint(TObject *Sender)
|
|||
|
|
{
|
|||
|
|
if( ((m_XW <= 320) && (m_YW <= 256)) ){
|
|||
|
|
PBox->Canvas->Draw(0, 0, pBitmapD);
|
|||
|
|
}
|
|||
|
|
else if( SBST->Down ){
|
|||
|
|
TRect tc;
|
|||
|
|
tc.Left = 0; tc.Top = 0;
|
|||
|
|
double sx = m_XW / 320.0;
|
|||
|
|
double sy = m_YW / 256.0;
|
|||
|
|
if( sx > sy ){
|
|||
|
|
tc.Right = 320;
|
|||
|
|
tc.Bottom = m_YW / sx;
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
tc.Bottom = 256;
|
|||
|
|
tc.Right = m_XW / sy;
|
|||
|
|
}
|
|||
|
|
::SetStretchBltMode(PBox->Canvas->Handle, HALFTONE);
|
|||
|
|
PBox->Canvas->StretchDraw(tc, pBitmapD);
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
int x = (320 - m_XW) / 2;
|
|||
|
|
int y = (256 - m_YW) / 2;
|
|||
|
|
PBox->Canvas->Draw(x, y, pBitmapD);
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
//---------------------------------------------------------------------
|
|||
|
|
void __fastcall TPicFilterDlg::Filt(int sw)
|
|||
|
|
{
|
|||
|
|
MFilter(pBitmapS, pBitmap, sw);
|
|||
|
|
}
|
|||
|
|
//---------------------------------------------------------------------
|
|||
|
|
void __fastcall TPicFilterDlg::AdjustColor(int x, int y, double &RY, double &BY)
|
|||
|
|
{
|
|||
|
|
double H, S;
|
|||
|
|
|
|||
|
|
if( pS == NULL ){
|
|||
|
|
pS = new double[(m_XW + 1) * (m_YW + 1)];
|
|||
|
|
pH = new double[(m_XW + 1) * (m_YW + 1)];
|
|||
|
|
m_Make = 1;
|
|||
|
|
}
|
|||
|
|
if( (RY != 0.0) || (BY != 0.0) ){
|
|||
|
|
if( TBS->Position ){
|
|||
|
|
if( m_Make ){
|
|||
|
|
S = sqrt(RY*RY + BY*BY);
|
|||
|
|
H = atan2(RY, BY);
|
|||
|
|
pS[y*m_XW+x] = S;
|
|||
|
|
pH[y*m_XW+x] = H;
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
S = pS[y*m_XW+x];
|
|||
|
|
H = pH[y*m_XW+x];
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
H += (TBH->Position - 10) * PI2 * 0.01;
|
|||
|
|
S *= 1.0 + (TBS->Position - 10) * 0.1;
|
|||
|
|
|
|||
|
|
RY = S * sin(H);
|
|||
|
|
BY = S * cos(H);
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
RY = BY = 0;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
pS[y*m_XW+x] = 0;
|
|||
|
|
pH[y*m_XW+x] = 0;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
//---------------------------------------------------------------------
|
|||
|
|
void __fastcall TPicFilterDlg::Bright(void)
|
|||
|
|
{
|
|||
|
|
MultProc();
|
|||
|
|
|
|||
|
|
int y, x;
|
|||
|
|
double B, G, R, Y, RY, BY;
|
|||
|
|
double k1, k2;
|
|||
|
|
if( TBCont->Position > 10 ){
|
|||
|
|
k1 = double(1.0 + (TBCont->Position - 10)*0.1);
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
k1 = double(1.0 + (TBCont->Position - 10)*0.05);
|
|||
|
|
}
|
|||
|
|
if( TBBright->Position > 10 ){
|
|||
|
|
k2 = double((TBBright->Position - 10) * 6.0);
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
k2 = double((TBBright->Position - 10) * 2.0);
|
|||
|
|
}
|
|||
|
|
BYTE *sp;
|
|||
|
|
BYTE *tp;
|
|||
|
|
if( TBShape->Position == 10 ){
|
|||
|
|
for( y = 0; y < m_YW; y++ ){
|
|||
|
|
sp = (BYTE*)pBitmapS->ScanLine[y];
|
|||
|
|
tp = (BYTE*)pBitmapD->ScanLine[y];
|
|||
|
|
for( x = 0; x < m_XW; x++ ){
|
|||
|
|
B = *sp++;
|
|||
|
|
G = *sp++;
|
|||
|
|
R = *sp++;
|
|||
|
|
Y = 0.3 * R + 0.59 * G + 0.11 * B;
|
|||
|
|
RY = 0.7 * R - 0.59 * G - 0.11 * B;
|
|||
|
|
BY = -0.3 * R - 0.59 * G + 0.89 * B;
|
|||
|
|
|
|||
|
|
if( (TBH->Position != 10) || (TBS->Position != 10) ){
|
|||
|
|
AdjustColor(x, y, RY, BY);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
Y = ((Y - 128) * k1) + 128;
|
|||
|
|
Y += k2;
|
|||
|
|
|
|||
|
|
R = Y + RY;
|
|||
|
|
G = Y - 0.3 * RY / 0.59 - 0.11 * BY / 0.59;
|
|||
|
|
B = Y + BY;
|
|||
|
|
if( R > 255 ) R = 255;
|
|||
|
|
if( R < 0 ) R = 0;
|
|||
|
|
if( G > 255 ) G = 255;
|
|||
|
|
if( G < 0 ) G = 0;
|
|||
|
|
if( B > 255 ) B = 255;
|
|||
|
|
if( B < 0 ) B = 0;
|
|||
|
|
*tp++ = B;
|
|||
|
|
*tp++ = G;
|
|||
|
|
*tp++ = R;
|
|||
|
|
}
|
|||
|
|
MultProcA();
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
double a, d;
|
|||
|
|
double Z1, Z2, Z3;
|
|||
|
|
if( CB2D->Checked ){
|
|||
|
|
a = TBShape->Position - 10;
|
|||
|
|
if( a > 0 ){
|
|||
|
|
a *= 0.2;
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
a *= 0.1;
|
|||
|
|
}
|
|||
|
|
double *ZV0 = new double[m_XW+1];
|
|||
|
|
double *ZV1 = new double[m_XW+1];
|
|||
|
|
double *ZV2 = new double[m_XW+1];
|
|||
|
|
memset(ZV0, 0, sizeof(double) * (m_XW+1));
|
|||
|
|
memset(ZV1, 0, sizeof(double) * (m_XW+1));
|
|||
|
|
memset(ZV2, 0, sizeof(double) * (m_XW+1));
|
|||
|
|
for( y = 0; y < (m_YW+1); y++ ){
|
|||
|
|
sp = (BYTE*)pBitmapS->ScanLine[y < m_YW ? y : y - 1];
|
|||
|
|
tp = (BYTE*)pBitmapD->ScanLine[y ? y - 1 : y];
|
|||
|
|
Z1 = Z2 = Z3 = 0;
|
|||
|
|
for( x = 0; x < (m_XW+1); x++ ){
|
|||
|
|
if( x < m_XW ){
|
|||
|
|
B = *sp++;
|
|||
|
|
G = *sp++;
|
|||
|
|
R = *sp++;
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
sp -= 3;
|
|||
|
|
B = *sp++;
|
|||
|
|
G = *sp++;
|
|||
|
|
R = *sp++;
|
|||
|
|
}
|
|||
|
|
Y = 0.3 * R + 0.59 * G + 0.11 * B;
|
|||
|
|
RY = 0.7 * R - 0.59 * G - 0.11 * B;
|
|||
|
|
BY = -0.3 * R - 0.59 * G + 0.89 * B;
|
|||
|
|
|
|||
|
|
if( (TBH->Position != 10) || (TBS->Position != 10) ){
|
|||
|
|
AdjustColor(x, y, RY, BY);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
Y = ((Y - 128) * k1) + 128;
|
|||
|
|
Y += k2;
|
|||
|
|
|
|||
|
|
d = Z3 + ((Y * -0.5 + Z1 + Z2 * -0.5) * a);
|
|||
|
|
Z2 = Z1;
|
|||
|
|
Z3 = Z1 = Y;
|
|||
|
|
Y = d;
|
|||
|
|
|
|||
|
|
d = ZV2[x] + ((Y * -0.5 + ZV0[x] + ZV1[x] * -0.5) * a);
|
|||
|
|
ZV1[x] = ZV0[x];
|
|||
|
|
ZV2[x] = ZV0[x] = Y;
|
|||
|
|
Y = d;
|
|||
|
|
|
|||
|
|
R = Y + RY;
|
|||
|
|
G = Y - 0.3 * RY / 0.59 - 0.11 * BY / 0.59;
|
|||
|
|
B = Y + BY;
|
|||
|
|
if( R > 255 ) R = 255;
|
|||
|
|
if( R < 0 ) R = 0;
|
|||
|
|
if( G > 255 ) G = 255;
|
|||
|
|
if( G < 0 ) G = 0;
|
|||
|
|
if( B > 255 ) B = 255;
|
|||
|
|
if( B < 0 ) B = 0;
|
|||
|
|
if( (x > 0) && (y > 0) ){
|
|||
|
|
*tp++ = B;
|
|||
|
|
*tp++ = G;
|
|||
|
|
*tp++ = R;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
MultProcA();
|
|||
|
|
}
|
|||
|
|
delete ZV0;
|
|||
|
|
delete ZV1;
|
|||
|
|
delete ZV2;
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
a = TBShape->Position - 10;
|
|||
|
|
if( a > 0 ){
|
|||
|
|
a *= 0.3;
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
a *= 0.1;
|
|||
|
|
}
|
|||
|
|
for( y = 0; y < m_YW; y++ ){
|
|||
|
|
sp = (BYTE*)pBitmapS->ScanLine[y];
|
|||
|
|
tp = (BYTE*)pBitmapD->ScanLine[y];
|
|||
|
|
Z1 = Z2 = Z3 = 0;
|
|||
|
|
for( x = 0; x < (m_XW+1); x++ ){
|
|||
|
|
if( x < m_XW ){
|
|||
|
|
B = *sp++;
|
|||
|
|
G = *sp++;
|
|||
|
|
R = *sp++;
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
sp -= 3;
|
|||
|
|
B = *sp++;
|
|||
|
|
G = *sp++;
|
|||
|
|
R = *sp++;
|
|||
|
|
}
|
|||
|
|
Y = 0.3 * R + 0.59 * G + 0.11 * B;
|
|||
|
|
RY = 0.7 * R - 0.59 * G - 0.11 * B;
|
|||
|
|
BY = -0.3 * R - 0.59 * G + 0.89 * B;
|
|||
|
|
|
|||
|
|
if( (TBH->Position != 10) || (TBS->Position != 10) ){
|
|||
|
|
AdjustColor(x, y, RY, BY);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
Y = ((Y - 128) * k1) + 128;
|
|||
|
|
Y += k2;
|
|||
|
|
|
|||
|
|
d = Z3 + ((Y * -0.5 + Z1 + Z2 * -0.5) * a);
|
|||
|
|
Z2 = Z1;
|
|||
|
|
Z3 = Z1 = Y;
|
|||
|
|
Y = d;
|
|||
|
|
|
|||
|
|
R = Y + RY;
|
|||
|
|
G = Y - 0.3 * RY / 0.59 - 0.11 * BY / 0.59;
|
|||
|
|
B = Y + BY;
|
|||
|
|
if( R > 255 ) R = 255;
|
|||
|
|
if( R < 0 ) R = 0;
|
|||
|
|
if( G > 255 ) G = 255;
|
|||
|
|
if( G < 0 ) G = 0;
|
|||
|
|
if( B > 255 ) B = 255;
|
|||
|
|
if( B < 0 ) B = 0;
|
|||
|
|
if( x > 0 ){
|
|||
|
|
*tp++ = B;
|
|||
|
|
*tp++ = G;
|
|||
|
|
*tp++ = R;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
MultProcA();
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
m_Make = 0;
|
|||
|
|
}
|
|||
|
|
//---------------------------------------------------------------------------
|
|||
|
|
void __fastcall TPicFilterDlg::TBBrightChange(TObject *Sender)
|
|||
|
|
{
|
|||
|
|
if( m_DisEvent ) return;
|
|||
|
|
|
|||
|
|
Bright();
|
|||
|
|
PBoxPaint(NULL);
|
|||
|
|
UpdateBtn();
|
|||
|
|
}
|
|||
|
|
//---------------------------------------------------------------------------
|
|||
|
|
void __fastcall TPicFilterDlg::SBFNClick(TObject *Sender)
|
|||
|
|
{
|
|||
|
|
MultProc();
|
|||
|
|
CWaitCursor w;
|
|||
|
|
|
|||
|
|
pBitmapS->Canvas->Draw(0, 0, pBitmap);
|
|||
|
|
if( SBFA->Down ){
|
|||
|
|
Filt(0);
|
|||
|
|
}
|
|||
|
|
else if( SBFB->Down ){
|
|||
|
|
Filt(1);
|
|||
|
|
}
|
|||
|
|
if( pS != NULL ){
|
|||
|
|
delete pS;
|
|||
|
|
delete pH;
|
|||
|
|
pS = NULL;
|
|||
|
|
pH = NULL;
|
|||
|
|
}
|
|||
|
|
TBBrightChange(NULL);
|
|||
|
|
UpdateBtn();
|
|||
|
|
}
|
|||
|
|
//---------------------------------------------------------------------------
|
|||
|
|
void __fastcall TPicFilterDlg::ResBtnClick(TObject *Sender)
|
|||
|
|
{
|
|||
|
|
m_DisEvent++;
|
|||
|
|
TBBright->Position = 10;
|
|||
|
|
TBCont->Position = 10;
|
|||
|
|
TBShape->Position = 10;
|
|||
|
|
TBH->Position = 10;
|
|||
|
|
TBS->Position = 10;
|
|||
|
|
SBFN->Down = TRUE;
|
|||
|
|
if( pS != NULL ){
|
|||
|
|
delete pS;
|
|||
|
|
delete pH;
|
|||
|
|
pS = NULL;
|
|||
|
|
pH = NULL;
|
|||
|
|
}
|
|||
|
|
m_DisEvent--;
|
|||
|
|
if( !OKBtn->Enabled ) ::CopyBitmap(pBitmap, Mmsstv->pBitmapRX);
|
|||
|
|
pBitmapS->Canvas->Draw(0, 0, pBitmap);
|
|||
|
|
pBitmapD->Canvas->Draw(0, 0, pBitmap);
|
|||
|
|
PBox->Invalidate();
|
|||
|
|
UpdateBtn();
|
|||
|
|
}
|
|||
|
|
//---------------------------------------------------------------------------
|
|||
|
|
void __fastcall TPicFilterDlg::SBBRRClick(TObject *Sender)
|
|||
|
|
{
|
|||
|
|
if( TBBright->Position != 10 ){
|
|||
|
|
m_DisEvent++;
|
|||
|
|
TBBright->Position = 10;
|
|||
|
|
Bright();
|
|||
|
|
PBox->Invalidate();
|
|||
|
|
UpdateBtn();
|
|||
|
|
m_DisEvent--;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
//---------------------------------------------------------------------------
|
|||
|
|
void __fastcall TPicFilterDlg::SBCTRClick(TObject *Sender)
|
|||
|
|
{
|
|||
|
|
if( TBCont->Position != 10 ){
|
|||
|
|
m_DisEvent++;
|
|||
|
|
TBCont->Position = 10;
|
|||
|
|
Bright();
|
|||
|
|
PBox->Invalidate();
|
|||
|
|
UpdateBtn();
|
|||
|
|
m_DisEvent--;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
//---------------------------------------------------------------------------
|
|||
|
|
void __fastcall TPicFilterDlg::SBSPRClick(TObject *Sender)
|
|||
|
|
{
|
|||
|
|
if( TBShape->Position != 10 ){
|
|||
|
|
m_DisEvent++;
|
|||
|
|
TBShape->Position = 10;
|
|||
|
|
Bright();
|
|||
|
|
PBox->Invalidate();
|
|||
|
|
UpdateBtn();
|
|||
|
|
m_DisEvent--;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
//---------------------------------------------------------------------------
|
|||
|
|
void __fastcall TPicFilterDlg::SBCPRClick(TObject *Sender)
|
|||
|
|
{
|
|||
|
|
if( TBH->Position != 10 ){
|
|||
|
|
m_DisEvent++;
|
|||
|
|
TBH->Position = 10;
|
|||
|
|
Bright();
|
|||
|
|
PBox->Invalidate();
|
|||
|
|
UpdateBtn();
|
|||
|
|
m_DisEvent--;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
//---------------------------------------------------------------------------
|
|||
|
|
void __fastcall TPicFilterDlg::SBCORClick(TObject *Sender)
|
|||
|
|
{
|
|||
|
|
if( TBS->Position != 10 ){
|
|||
|
|
m_DisEvent++;
|
|||
|
|
TBS->Position = 10;
|
|||
|
|
Bright();
|
|||
|
|
PBox->Invalidate();
|
|||
|
|
UpdateBtn();
|
|||
|
|
m_DisEvent--;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
//---------------------------------------------------------------------------
|
|||
|
|
void __fastcall TPicFilterDlg::SBSTClick(TObject *Sender)
|
|||
|
|
{
|
|||
|
|
PBox->Invalidate();
|
|||
|
|
}
|
|||
|
|
//---------------------------------------------------------------------------#if 0
|
|||
|
|
void __fastcall TPicFilterDlg::AutoBtnClick(TObject *Sender)
|
|||
|
|
{
|
|||
|
|
MultProc();
|
|||
|
|
CWaitCursor w;
|
|||
|
|
|
|||
|
|
int B, G, R, Y, BY, RY;
|
|||
|
|
int x, y;
|
|||
|
|
BYTE *sp;
|
|||
|
|
|
|||
|
|
int Hind[256];
|
|||
|
|
memset(Hind, 0, sizeof(Hind));
|
|||
|
|
int S = 0;
|
|||
|
|
for( y = 0; y < m_YW; y++ ){
|
|||
|
|
sp = (BYTE*)pBitmapS->ScanLine[y];
|
|||
|
|
for( x = 0; x < m_XW; x++ ){
|
|||
|
|
B = *sp++;
|
|||
|
|
G = *sp++;
|
|||
|
|
R = *sp++;
|
|||
|
|
Y = Limit256(0.3 * R + 0.59 * G + 0.11 * B);
|
|||
|
|
Hind[Y]++;
|
|||
|
|
RY = 0.7 * R - 0.59 * G - 0.11 * B;
|
|||
|
|
BY = -0.3 * R - 0.59 * G + 0.89 * B;
|
|||
|
|
Y = sqrt(RY*RY + BY*BY);
|
|||
|
|
if( Y > S ) S = Y;
|
|||
|
|
}
|
|||
|
|
MultProcA();
|
|||
|
|
}
|
|||
|
|
#if 0
|
|||
|
|
int max = 0;
|
|||
|
|
for( x = 0; x < 256; x++ ){
|
|||
|
|
if( max < Hind[x] ){
|
|||
|
|
max = Hind[x];
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
FILE *fp = fopen("F:\\TEST.TXT", "wt");
|
|||
|
|
for( x = 0; x < 256; x++ ){
|
|||
|
|
int e = Hind[x] * 65 / max;
|
|||
|
|
for( int j = 0; j < e; j++ ) fprintf(fp, "*");
|
|||
|
|
fprintf(fp, "(%d)\n", Hind[x]);
|
|||
|
|
}
|
|||
|
|
fclose(fp);
|
|||
|
|
#endif
|
|||
|
|
int lmt = m_XW * m_YW / 2560;
|
|||
|
|
int ml = 256;
|
|||
|
|
int mh = 0;
|
|||
|
|
for( x = 0; x < 256; x++ ){
|
|||
|
|
if( Hind[x] > lmt ){
|
|||
|
|
ml = x;
|
|||
|
|
break;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
for( x = 255; x >= 0; x-- ){
|
|||
|
|
if( Hind[x] > lmt ){
|
|||
|
|
mh = x;
|
|||
|
|
break;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
if( mh > ml ){
|
|||
|
|
m_DisEvent++;
|
|||
|
|
int b = 128 - (mh + ml)/2;
|
|||
|
|
double c = 230.4 / (mh - ml);
|
|||
|
|
if( c < 1.0 ) c = 1.0;
|
|||
|
|
// c = c - 1.0 - (b / 128.0);
|
|||
|
|
c = c - 1.0;
|
|||
|
|
c = c * (c > 1.0 ? 10 : 20);
|
|||
|
|
b = b / (b > 0 ? 6 : 2);
|
|||
|
|
TBBright->Position = b + 10;
|
|||
|
|
TBCont->Position = c + 10;
|
|||
|
|
TBShape->Position = 10;
|
|||
|
|
if( S ){
|
|||
|
|
S = (((256.0 / double(S)) - 1.0) * 2.0) + 10;
|
|||
|
|
}
|
|||
|
|
if( S < 10 ) S = 10;
|
|||
|
|
TBS->Position = S;
|
|||
|
|
TBH->Position = 10;
|
|||
|
|
m_DisEvent--;
|
|||
|
|
TBBrightChange(NULL);
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
//---------------------------------------------------------------------------
|
|||
|
|
void __fastcall TPicFilterDlg::TimerTimer(TObject *Sender)
|
|||
|
|
{
|
|||
|
|
if( !OKBtn->Enabled && (m_Sync || Mmsstv->pDem->m_Sync) ){
|
|||
|
|
if( Mmsstv->pSound->IsBusy() ) return;
|
|||
|
|
m_Sync = Mmsstv->pDem->m_Sync;
|
|||
|
|
|
|||
|
|
if( pS != NULL ){
|
|||
|
|
delete pS;
|
|||
|
|
delete pH;
|
|||
|
|
pS = NULL;
|
|||
|
|
pH = NULL;
|
|||
|
|
}
|
|||
|
|
::CopyBitmap(pBitmap, Mmsstv->pBitmapRX);
|
|||
|
|
MultProcA();
|
|||
|
|
if( ResBtn->Enabled ){
|
|||
|
|
CWaitCursor w;
|
|||
|
|
if( !SBFN->Down ){
|
|||
|
|
SBFNClick(NULL);
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
pBitmapS->Canvas->Draw(0, 0, pBitmap);
|
|||
|
|
TBBrightChange(NULL);
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
pBitmapS->Canvas->Draw(0, 0, pBitmap);
|
|||
|
|
pBitmapD->Canvas->Draw(0, 0, pBitmap);
|
|||
|
|
PBoxPaint(NULL);
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
//---------------------------------------------------------------------------
|
|||
|
|
void __fastcall TPicFilterDlg::SBEditClick(TObject *Sender)
|
|||
|
|
{
|
|||
|
|
g_ExecPB.Exec(pBitmapD, (HWND)Handle, CM_EDITEXIT, 0);
|
|||
|
|
}
|
|||
|
|
//---------------------------------------------------------------------------
|
|||
|
|
void __fastcall TPicFilterDlg::OnEditExit(TMessage Message)
|
|||
|
|
{
|
|||
|
|
if( Message.LParam ) return;
|
|||
|
|
|
|||
|
|
if( g_ExecPB.LoadBitmap(pBitmap, FALSE) ){
|
|||
|
|
ResBtnClick(NULL);
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
//---------------------------------------------------------------------------
|