Ejemplo n.º 1
0
std::shared_ptr<Bitmap> VersionTwo::Render()
{
    AddPixel(m_Width / 2, m_Height / 2, Colour(0x01, 0x01, 0x01));

    int iter = 0, plotted= 0;

    int lastPc = 0;
    while (!m_Queue.empty())
    {
        auto pc = (int) ((plotted * 100.f) / (m_Width * m_Height));
        if (pc > lastPc)
        {
            std::cout << pc << std::endl;
            lastPc = pc;
        }

        auto coord = m_Queue.front();
        m_Queue.pop_front();
        auto x = coord.first, y = coord.second;

        if (m_Image->Point(x, y) != Colour(0, 0, 0))
            continue;

        unsigned r = 0, g = 0, b = 0, count = 0;
        for (auto dx : { x - 1, x, x + 1 } )
        {
            if (dx < 0 || dx > m_Width - 1) continue;
            for (auto dy : { y - 1, y, y + 1 })
            {
                if (dy<0 || dy > m_Height - 1) continue;

                auto col = m_Image->Point(dx, dy);
                if (col != Colour(0, 0, 0))
                {
                    r += R(col); g += G(col); b += B(col); count++;
                }
            }
        }
        if (count > 0)
        {
            r /= count; g /= count; b /= count;
            auto c = m_Picker.PickNearestTo(Colour(r, g, b));
            AddPixel(x, y, c);
            plotted++;
        }
    }

    return m_Image;
}
Ejemplo n.º 2
0
int VideoBuffer::AddCharacter(int x, int y, int c, int r, int g, int b, int a)
{
	int i, j, w, bn = 0, ba = 0;
	char *rp = font_data + font_ptrs[c];
	w = *(rp++);
	for (j=0; j<FONT_H; j++)
		for (i=0; i<w; i++)
		{
			if (!bn)
			{
				ba = *(rp++);
				bn = 8;
			}
			AddPixel(x+i, y+j, r, g, b, ((ba&3)*a)/3);
			ba >>= 2;
			bn -= 2;
		}
	return x + w;
}
Ejemplo n.º 3
0
int Lee (StisInfo6 *sts, RowContents *row_cont) {

/* arguments:
StisInfo6 *sts         i:  calibration switches and info
RowContents *row_cont  i:  output row arrays
*/
	short	mask;
	int	ipix, npix, lfilt;
	double	sum, sum2, *hold;

	mask = sts->sdqflags & DETECTORPROB;

	lfilt = sts->lfilter / 2;

	/* Alloc holding buffer. */
	if ((hold = (double *) calloc (row_cont->npts, sizeof (double))) == 
            NULL)
	    return (OUT_OF_MEMORY);

	/* Initialize sums. */
	sum  = 0.0;
	sum2 = 0.0;
	npix = 0;
	for (ipix = 0; ipix <= lfilt; ipix++)
	    AddPixel (ipix, row_cont, mask, &sum, &sum2, &npix);

	/* Compute first filtered value. */
	hold[0] = LSF (sum, sum2, row_cont->back[0], row_cont->error[ipix],
                       npix);

	/* Compute filtered values at first edge. */
	for (ipix = 1; ipix <= lfilt; ipix++) {
	    AddPixel (ipix + lfilt, row_cont, mask, &sum, &sum2, &npix);
	    hold[ipix] = LSF (sum, sum2, row_cont->back[ipix], 
                              row_cont->error[ipix], npix);
	}

	/* Compute filtered values at "internal" region. */
	for (ipix = lfilt+1; ipix <= row_cont->npts-1-lfilt; ipix++) {
	    AddPixel    (ipix + lfilt,     row_cont, mask, &sum, &sum2, &npix);
	    RemovePixel (ipix - lfilt - 1, row_cont, mask, &sum, &sum2, &npix);
	    hold[ipix] = LSF (sum, sum2, row_cont->back[ipix], 
                              row_cont->error[ipix], npix);
	}

	/* Compute filtered values at second edge. */
	for (ipix = row_cont->npts-lfilt; ipix <row_cont->npts; ipix++) {
	    RemovePixel (ipix - lfilt - 1, row_cont, mask, &sum, &sum2, &npix);
	    hold[ipix] = LSF (sum, sum2, row_cont->back[ipix], 
                              row_cont->error[ipix], npix);
	}

	/* Recompute background and net arrays. */
	for (ipix = 0; ipix < row_cont->npts; ipix++) {
	    row_cont->back[ipix] = hold[ipix];
	    row_cont->net[ipix] = row_cont->gross[ipix] - row_cont->back[ipix];
	}

	free (hold);

	return (0);
}
Ejemplo n.º 4
0
void DrawLineAA(PixBufT *canvas, float x0, float y0, float x1, float y1) {
  bool steep = fabsf(y1 - y0) > fabsf(x1 - x0);
  float dx, dy;
  float gradient, intery;
  float xend, yend, xgap, yend_i, yend_f;
  int xpxl1, ypxl1, xpxl2, ypxl2, x;
 
  if (steep) {
    swapf(x0, y0);
    swapf(x1, y1);
  }

  if (x0 > x1) {
    swapf(x0, x1);
    swapf(y0, y1);
  }
 
  dx = x1 - x0;
  dy = y1 - y0;
  gradient = dy / dx;

  if (dx == 0.0f)
    return;

  /* Handle first endpoint. */
  xend = truncf(x0 + 0.5f);
  yend = y0 + gradient * (xend - x0);
  xgap = 1.0f - modff(x0 + 0.5f, NULL);
  xgap *= 128.0f;

  /* This will be used in the main loop. */
  yend_f = modff(yend, &yend_i);
  xpxl1 = (int)xend;
  ypxl1 = (int)truncf(yend);

  /* Draw first endpoint. */
  if (steep) {
    AddPixel(canvas, ypxl1, xpxl1, (1.0f - yend_f) * xgap);
    AddPixel(canvas, ypxl1 + 1, xpxl1, yend_f * xgap);
  } else {
    AddPixel(canvas, xpxl1, ypxl1, (1.0f - yend_f) * xgap);
    AddPixel(canvas, xpxl1, ypxl1 + 1, yend_f * xgap);
  }

  /* First y-intersection for the main loop. */
  intery = yend + gradient;

  /* Handle second endpoint. */
  xend = truncf(x1 + 0.5f);
  yend = y1 + gradient * (xend - x1);
  xgap = modff(x1 + 0.5f, NULL);
  xgap *= 128.0f;

  /* This will be used in the main loop. */
  yend_f = modff(yend, &yend_i);
  xpxl2 = (int)xend;
  ypxl2 = (int)yend_i;

  if (steep) {
    /* Draw second endpoint. */
    AddPixel(canvas, ypxl2, xpxl2, (1.0f - yend_f) * xgap);
    AddPixel(canvas, ypxl2 + 1, xpxl2, yend_f * xgap);

    /* Inner part of line. */
    for (x = xpxl1 + 1; x < xpxl2; x++, intery += gradient) {
      float i, f;
      f = modff(intery, &i) * 128.0f;
      AddPixel(canvas, i, x, 128.0f - f);
      AddPixel(canvas, i + 1, x, f);
    }
  } else {
    /* Draw second endpoint. */
    AddPixel(canvas, xpxl2, ypxl2, (1.0f - yend_f) * xgap);
    AddPixel(canvas, xpxl2, ypxl2 + 1, yend_f * xgap);

    /* Inner part of line. */
    for (x = xpxl1 + 1; x < xpxl2; x++, intery += gradient) {
      float i, f;
      f = modff(intery, &i) * 128.0f;
      AddPixel(canvas, x, i, 128.0f - f);
      AddPixel(canvas, x, i + 1, f);
    }
  }
}