Image * Filter::meanFilter(Image * img,
                           int     kernelSize)
{
    int *** matrixImagenP = static_cast<ImagenPGM *>(img) -> getMatrix();
    int     height        =
        static_cast<ImagenPGM *>(img) ->
             getHeight(), width = static_cast<ImagenPGM *>(img) ->
                  getWidth(), colorDepth = static_cast<ImagenPGM *>(img) -> getColorDepth();
    int ** kernel = new int *[kernelSize];

    for (int i = 0; i < kernelSize; ++i)
    {
        kernel[i] = new int[kernelSize];
    }

    for (int i = 0; i < kernelSize; ++i)
    {
        for (int j = 0; j < kernelSize; ++j)
        {
            kernel[i][j] = 1;
        }
    }

    // return applyKernel(kernel, kernelSize,kernelSize);
    ImagenPGM * imageResult = new ImagenPGM(height, width, colorDepth,
                                  applyKernel(height, width, matrixImagenP, kernel, kernelSize, kernelSize));

    return imageResult;
}
Image * Filter::convolutionFilter(Image * img,
                                  int **  kernel,
                                  int     kernelSize)
{
    int *** matrixImagenP = static_cast<ImagenPGM *>(img) -> getMatrix();
    int     height        =
        static_cast<ImagenPGM *>(img) ->
             getHeight(), width = static_cast<ImagenPGM *>(img) ->
                  getWidth(), colorDepth = static_cast<ImagenPGM *>(img) -> getColorDepth();

    // return applyKernel(kernel,size,size);
    ImagenPGM * imageResult = new ImagenPGM(height, width, colorDepth,
                                  applyKernel(height, width, matrixImagenP, kernel, kernelSize, kernelSize));

    return imageResult;
}
Image * Filter::gaussianaFilter(Image * img,
                                int     kernelSize)
{
    int *** matrixImagenP = static_cast<ImagenPGM *>(img) -> getMatrix();
    int     height        =
        static_cast<ImagenPGM *>(img) ->
             getHeight(), width = static_cast<ImagenPGM *>(img) ->
                  getWidth(), colorDepth = static_cast<ImagenPGM *>(img) -> getColorDepth();
    int * vectorActual, *vectorAux;

    vectorActual = new int[kernelSize];
    vectorAux    = new int[kernelSize];

    for (int i = 0; i < kernelSize; ++i)
    {
        for (int j = 0; j <= i; ++j)
        {
            if (i == j)
            {
                vectorAux[j] = 1;
            }
            else if (j != 0)
            {
                vectorAux[j] += vectorActual[i - j];
            }
        }

        for (int r = 0; r <= i; ++r)
        {
            vectorActual[r] = vectorAux[r];
        }
    }

    delete vectorAux;

    vectorAux = 0;

    // return vectorActual;
    // return applyKernel(createKernelFilter(vectorActual,vectorActual,kernelSize),kernelSize,kernelSize);
    ImagenPGM * imageResult = new ImagenPGM(height, width, colorDepth,
                                  applyKernel(height, width, matrixImagenP,
                                      createKernelFilter(vectorActual, vectorActual, kernelSize), kernelSize,
                                      kernelSize));

    return imageResult;
}
//applies kernel over whole canvas, should just need to define kernel in subclasses
void ConvolutionFilter::applyFilter(PixelBuffer *buf, float amount, int direction)
{
	adjustKernel(amount,direction);
	int i,j,width,height;
	ColorData tempPixel;
	PixelBuffer *tempBuffer;
	width = buf -> getWidth();
	height = buf -> getHeight();
	tempBuffer = new PixelBuffer(width,height,ColorData(0,0,0));
	for (i = 0; i < width; i++)
	{
		for (j = 0; j < height; j++)
		{
			applyKernel(i,j,buf, tempBuffer);
		}
	}
	PixelBuffer::copyPixelBuffer(tempBuffer,buf);
	delete tempBuffer;
}
Exemplo n.º 5
0
void Document::customFilter(uint size, const QString &kernelStr)
{
    QStringList numbers = kernelStr.split(" ", QString::SkipEmptyParts);
    Q_ASSERT(numbers.size() == (size * size));

    QVector< QVector<double> > kernel(size);
    double sum = 0.0;
    for (uint i = 0; i < size; ++i) {
        for (uint j = 0; j < size; ++j) {
            kernel[i].append(numbers[i*size + j].toDouble());
            sum += kernel[i][j];
        }
    }

    qDebug() << "customFilter(" << size << ", " << kernel << ")";

    for (int y = m_selection.top(); y <= m_selection.bottom(); ++y) {
        for (int x = m_selection.left(); x <= m_selection.right(); ++x)
            applyKernel(m_image, x, y, kernel, sum);
    }

    setModified(true);
    emit repaint(m_selection);
}
Exemplo n.º 6
0
void ShaderInterface::drawPostSurface()
{
  // if no fbo selected or no post program active: return
  if(currentFBO == -1 || postProgram == programs.end())
    return;

  // reselect render destination
  FramebufferObject* fbo = fbos[currentFBO];
  if(!fbo->usable())
    return;

  // disable global program
  glUseProgram(0);

  // if a filtered image is requested: do filter post processing
  std::vector<ShaderProgram*> kernels = postProgram->second->getFilters();
  std::vector<ShaderProgram*>::iterator kIter;
  for(kIter = kernels.begin(); kIter != kernels.end(); kIter++)
  {
    fbo->handleTextures(runningProgram->second->getMRTindex());
    applyKernel(*kIter);
  }
  fbo->handleTextures(runningProgram->second->getMRTindex());

  // reset draw and read targets if pixel copy has used them
  if(fbo->getAntialising())
    glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, fbo->getID());

  postProgram->second->activateDrawBuffers(fbo->getColorBuffersExt());

  glClear(GL_COLOR_BUFFER_BIT);
  glColor4f(1.0f, 1.0f, 1.0f, 1.0f);

  // set up textures for post drawing usage
  postProgram->second->bindTextures(fbo);

  // set up render environment
  glEnable(GL_POLYGON_SMOOTH);
  glDisable(GL_DEPTH_TEST);

  glMatrixMode(GL_PROJECTION);
  glLoadIdentity();
	glOrtho(0.0, 1.0, 0.0, 1.0, 0.0, 0.2);
	glMatrixMode(GL_MODELVIEW);
	glLoadIdentity();
  glTranslatef(0.0, 0.0, GLfloat(-0.1));

  // load and run post program
  glUseProgram(postProgram->second->getId());
  handleUniforms(NULL, true);
  
  // render post surface
  glBegin(GL_QUADS);
    glTexCoord2f(0.0f, 0.0f); glVertex2d(0.0, 0.0);
    glTexCoord2f(1.0f, 0.0f); glVertex2d(1.0, 0.0);
    glTexCoord2f(1.0f, 1.0f); glVertex2d(1.0, 1.0);
    glTexCoord2f(0.0f, 1.0f); glVertex2d(0.0, 1.0);
  glEnd();
  
  glDisable(GL_POLYGON_SMOOTH);
  glEnable(GL_DEPTH_TEST);

  // revert texture units
  postProgram->second->unbindTextures(fbo);

  // copy multisample results
  fbo->handleTextures(postProgram->second->getMRTindex());
  if(fbo->getAntialising())
    glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, fbo->getID());

  // reenable global shader
  glUseProgram(runningProgram->second->getId());
}
Exemplo n.º 7
0
void ShaderInterface::drawPostSurface(const bool isObjectWindow)
{
  // disable global program
  glUseProgram(0);

  // if no fbo selected or no post program active: return
  if(currentFBO == -1 || postProgram == programs.end())
    return;

  // reselect render destination
  FramebufferObject* fbo = fbos[currentFBO];
  if(!fbo->usable())
    return;

  // if a filtered image is requested: do filter post processing
  std::vector<ShaderProgram*> kernels = postProgram->second->getFilters();
  std::vector<ShaderProgram*>::iterator kIter;
  for(kIter = kernels.begin(); kIter != kernels.end(); kIter++)
  {
    fbo->handleTextures(runningProgram->second->getMRTindex());
    applyKernel(*kIter);
  }
  fbo->handleTextures(runningProgram->second->getMRTindex());
  
  glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, 0);
  // reset draw and read targets if pixel copy has used them
  if(fbo->getAntialising())
  {
    glReadBuffer(GL_BACK);
    glDrawBuffer(GL_BACK);
  }

  glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
  glColor4f(1.0f, 1.0f, 1.0f, 1.0f);

  // if renderbuffer debug is enabled
  // switch to multiple viewport drawing
  // else resize if oversized fbos are used
  int numTextures = postProgram->second->getNumTextures();
  if(fbo_debug != -2 && numTextures > 1)
  {
    drawDebugPostSurfaces();
    if(fbo_debug > -1)
      return;
  }
  else if(fbo_oversized)
    setOriginalViewport(isObjectWindow);

  // set up textures for post drawing usage
  postProgram->second->bindTextures(fbo);

  // set up render environment
  glEnable(GL_POLYGON_SMOOTH);
  glDisable(GL_DEPTH_TEST);

  glMatrixMode(GL_PROJECTION);
  glLoadIdentity();
	glOrtho(0.0, 1.0, 0.0, 1.0, 0.0, 0.2);
	glMatrixMode(GL_MODELVIEW);
	glLoadIdentity();
  glTranslatef(0.0, 0.0, GLfloat(-0.1));

  // load and run post program
  glUseProgram(postProgram->second->getId());
  handleUniforms(NULL, true);
  
  // render post surface
  if(fbo_oversized)
  {
    // 20% of the rendered image is the oversize part
    // and should not be rendered in the final image
    glBegin(GL_QUADS);
      glTexCoord2f(0.205f, 0.205f); glVertex2d(0.0, 0.0);
      glTexCoord2f(0.795f, 0.205f); glVertex2d(1.0, 0.0);
      glTexCoord2f(0.795f, 0.795f); glVertex2d(1.0, 1.0);
      glTexCoord2f(0.205f, 0.795f); glVertex2d(0.0, 1.0);
    glEnd();
  }
  else
  {
    glBegin(GL_QUADS);
      glTexCoord2f(0.0f, 0.0f); glVertex2d(0.0, 0.0);
      glTexCoord2f(1.0f, 0.0f); glVertex2d(1.0, 0.0);
      glTexCoord2f(1.0f, 1.0f); glVertex2d(1.0, 1.0);
      glTexCoord2f(0.0f, 1.0f); glVertex2d(0.0, 1.0);
    glEnd();
  }

  glUseProgram(0);

  glDisable(GL_POLYGON_SMOOTH);
  glEnable(GL_DEPTH_TEST);

  // revert texture units
  postProgram->second->unbindTextures(fbo);

  // if debugging, pop viewport attrib back again
  if(fbo_debug == -1 && numTextures > 1)
    glPopAttrib();
}