void CharcoalFilter::filterImage() { if (m_orgImage.isNull()) { qCWarning(DIGIKAM_DIMG_LOG) << "No image data available!"; return; } if (d->pencil <= 0.0) { m_destImage = m_orgImage; return; } // -- Applying Edge effect ----------------------------------------------- register long i = 0; int kernelWidth = getOptimalKernelWidth(d->pencil, d->smooth); if ((int)m_orgImage.width() < kernelWidth) { qCWarning(DIGIKAM_DIMG_LOG) << "Image is smaller than radius!"; return; } QScopedArrayPointer<double> kernel(new double[kernelWidth * kernelWidth]); if (kernel.isNull()) { qCWarning(DIGIKAM_DIMG_LOG) << "Unable to allocate memory!"; return; } for (i = 0 ; i < (kernelWidth * kernelWidth) ; ++i) { kernel[i] = (-1.0); } kernel[i / 2] = kernelWidth * kernelWidth - 1.0; convolveImage(kernelWidth, kernel.data()); // -- Applying Gaussian blur effect --------------------------------------- BlurFilter(this, m_destImage, m_destImage, 80, 85, (int)(d->smooth / 10.0)); if (!runningFlag()) { return; } // -- Applying stretch contrast color effect ------------------------------- StretchFilter stretch(&m_destImage, &m_destImage); stretch.startFilterDirectly(); m_destImage.putImageData(stretch.getTargetImage().bits()); postProgress(90); if (!runningFlag()) { return; } // -- Inverting image color ----------------------------------------------- InvertFilter invert(&m_destImage); invert.startFilterDirectly(); m_destImage.putImageData(invert.getTargetImage().bits()); postProgress(95); if (!runningFlag()) { return; } // -- Convert to neutral black & white ------------------------------------ MixerContainer settings; settings.bMonochrome = true; settings.blackRedGain = 0.3; settings.blackGreenGain = 0.59; settings.blackBlueGain = 0.11; MixerFilter mixer(&m_destImage, 0L, settings); mixer.startFilterDirectly(); m_destImage.putImageData(mixer.getTargetImage().bits()); postProgress(100); if (!runningFlag()) { return; } }
/*virtual*/ void CWndMenuMask::OnMessage(CWnd *pSender, CodeParam code, DataParam data) { if (pSender == NULL && code == WmBroadcast && data == ToWord('d', 'g')) { if (m_btnCollect.m_pszId != m_strStart) { CSettings::Calibrator::FastCalc Ch1fast; Settings.CH1Calib.Prepare(&Settings.CH1, Ch1fast); for (int i = 0; i < CWndGraph::DivsX * CWndGraph::BlkX; i++) { ui8 *bLow = NULL; ui8 *bHigh = NULL; CCoreOscilloscope::GetMaskAt(i, &bLow, &bHigh); BIOS::ADC::SSample Sample; Sample.nValue = BIOS::ADC::GetAt(Settings.Time.Shift + i); si16 ch1 = Sample.CH1; ch1 = Settings.CH1Calib.Correct(Ch1fast, ch1); UTILS.Clamp<si16>(ch1, 0, 255); *bLow = min(*bLow, (ui8)ch1); *bHigh = max(*bHigh, (ui8)ch1); } } if (m_Action != ActionNone || m_Display != DisplayNo) { bool bFailure = false; CSettings::Calibrator::FastCalc Ch1fast; Settings.CH1Calib.Prepare(&Settings.CH1, Ch1fast); for (int i = 0; i < CWndGraph::DivsX * CWndGraph::BlkX; i++) { ui8 *bLow = NULL; ui8 *bHigh = NULL; CCoreOscilloscope::GetMaskAt(i, &bLow, &bHigh); BIOS::ADC::SSample Sample; Sample.nValue = BIOS::ADC::GetAt(Settings.Time.Shift + i); si16 ch1 = Sample.CH1; ch1 = Settings.CH1Calib.Correct(Ch1fast, ch1); UTILS.Clamp<si16>(ch1, 0, 255); if (ch1 < *bLow || ch1 > *bHigh) { bFailure = true; break; } } int *nPass = NULL; int *nFail = NULL; CCoreOscilloscope::GetMaskStats(&nPass, &nFail); if (!bFailure) (*nPass)++; else { (*nFail)++; switch (m_Action) { case ActionNone: break; case ActionBeep: BIOS::SYS::Beep(100); break; case ActionBeepStop: BIOS::SYS::Beep(100); Settings.Trig.State = CSettings::Trigger::_Stop; BIOS::ADC::Enable(false); MainWnd.m_wndMessage.Show(&MainWnd, "Information", "Trigger was paused", RGB565(ffff00)); break; case ActionStop: Settings.Trig.State = CSettings::Trigger::_Stop; BIOS::ADC::Enable(false); MainWnd.m_wndMessage.Show(&MainWnd, "Information", "Trigger was paused", RGB565(ffff00)); break; } } } return; } // LAYOUT ENABLE/DISABLE FROM TOP MENU BAR if (code == ToWord('L', 'D')) { MainWnd.m_wndGraph.ShowWindow(SwHide); MainWnd.m_wndInfoBar.ShowWindow(SwHide); } if (code == ToWord('L', 'E')) { m_Action = ActionNone; MainWnd.m_wndGraph.ShowWindow(SwShow); MainWnd.m_wndInfoBar.ShowWindow(SwShow); for (int i = 0; i < CWndGraph::DivsX * CWndGraph::BlkX; i++) { ui8 *bLow = NULL; ui8 *bHigh = NULL; CCoreOscilloscope::GetMaskAt(i, &bLow, &bHigh); *bLow = 32; *bHigh = 255 - 32; } } if (pSender == &m_btnReset && code == CWnd::WmKey && data == BIOS::KEY::KeyEnter) { CSettings::Calibrator::FastCalc Ch1fast; Settings.CH1Calib.Prepare(&Settings.CH1, Ch1fast); for (int i = 0; i < CWndGraph::DivsX * CWndGraph::BlkX; i++) { ui8 *bLow = NULL; ui8 *bHigh = NULL; CCoreOscilloscope::GetMaskAt(i, &bLow, &bHigh); BIOS::ADC::SSample Sample; Sample.nValue = BIOS::ADC::GetAt(Settings.Time.Shift + i); si16 ch1 = Sample.CH1; ch1 = Settings.CH1Calib.Correct(Ch1fast, ch1); UTILS.Clamp<si16>(ch1, 0, 255); *bLow = (ui8)ch1; *bHigh = (ui8)ch1; } } if (pSender == &m_btnExpand && code == CWnd::WmKey && data == BIOS::KEY::KeyRight) { for (int i = 0; i < CWndGraph::DivsX * CWndGraph::BlkX; i++) { ui8 *bLow = NULL; ui8 *bHigh = NULL; CCoreOscilloscope::GetMaskAt(i, &bLow, &bHigh); if (*bLow > 0) (*bLow)--; if (*bHigh < 255) (*bHigh)++; } } if (pSender == &m_btnExpand && code == CWnd::WmKey && data == BIOS::KEY::KeyLeft) { for (int i = 0; i < CWndGraph::DivsX * CWndGraph::BlkX; i++) { ui8 *bLow = NULL; ui8 *bHigh = NULL; CCoreOscilloscope::GetMaskAt(i, &bLow, &bHigh); if (*bLow < 255 && *bLow < *bHigh) (*bLow)++; if (*bHigh > 0 && *bHigh > *bLow) (*bHigh)--; } } if (pSender == &m_btnCollect && code == CWnd::WmKey && data == BIOS::KEY::KeyEnter) { if (m_btnCollect.m_pszId == m_strStart) { // m_dwFlags |= CWnd::WsListener; m_btnCollect.m_pszId = m_strStop; m_btnCollect.Invalidate(); } else if (m_btnCollect.m_pszId == m_strStop) { // m_dwFlags &= ~CWnd::WsListener; m_btnCollect.m_pszId = m_strStart; m_btnCollect.Invalidate(); } } if (pSender == &m_btnBlur && code == CWnd::WmKey && data == BIOS::KEY::KeyRight) { ui8 arrLow[3] = {0, 0, 0}; ui8 arrHigh[3] = {255, 255, 25}; for (int i = 0; i < CWndGraph::DivsX * CWndGraph::BlkX; i++) { ui8 *bLow = NULL; ui8 *bHigh = NULL; CCoreOscilloscope::GetMaskAt(i, &bLow, &bHigh); arrLow[0] = arrLow[1]; arrLow[1] = arrLow[2]; arrLow[2] = *bLow; arrHigh[0] = arrHigh[1]; arrHigh[1] = arrHigh[2]; arrHigh[2] = *bHigh; if (i >= 2) { CCoreOscilloscope::GetMaskAt(i - 1, &bLow, &bHigh); *bLow = BlurFilter(arrLow[0], arrLow[1], arrLow[2]); *bHigh = BlurFilterInv(arrHigh[0], arrHigh[1], arrHigh[2]); } } } if (pSender == &m_btnBlur && code == CWnd::WmKey && data == BIOS::KEY::KeyLeft) { ui8 arrLow[3] = {0, 0, 0}; ui8 arrHigh[3] = {255, 255, 25}; for (int i = 0; i < CWndGraph::DivsX * CWndGraph::BlkX; i++) { ui8 *bLow = NULL; ui8 *bHigh = NULL; CCoreOscilloscope::GetMaskAt(i, &bLow, &bHigh); arrLow[0] = arrLow[1]; arrLow[1] = arrLow[2]; arrLow[2] = *bLow; arrHigh[0] = arrHigh[1]; arrHigh[1] = arrHigh[2]; arrHigh[2] = *bHigh; if (i >= 2) { CCoreOscilloscope::GetMaskAt(i - 1, &bLow, &bHigh); *bLow = BlurFilterInv(arrLow[0], arrLow[1], arrLow[2]); *bHigh = BlurFilter(arrHigh[0], arrHigh[1], arrHigh[2]); } } } if (pSender == &m_itmDisplay && code == ToWord('l', 'e')) { int *nPass = NULL; int *nFail = NULL; CCoreOscilloscope::GetMaskStats(&nPass, &nFail); *nPass = 0; *nFail = 0; } }