Example #1
0
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;
    }
}
Example #2
0
/*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;
  }
}