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; }
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; }
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); }
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, ¥d_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, ¥d_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); } } }