protected override void CustomRenderSingleScanLine(IImageReaderWriter destImage, Scanline scanline, Color color) { int y = scanline.Y; int num_spans = scanline.SpanCount; byte[] covers = scanline.GetCovers(); int spanCount = scanline.SpanCount; var ras = gfx.ScanlineRasterizer; var rasToBmp = gfx.ScanlineRasToDestBitmap; for (int i = 1; i <= num_spans; ++i) { var span2 = scanline.GetSpan(i); int x = span2.x; int num_pix = span2.len; int coverIndex = span2.cover_index; do { int a = (covers[coverIndex++] * color.Alpha0To255) >> 8; m_square.Draw(rasToBmp, ras, m_sl, destImage, Color.FromArgb(a, color), x, y); ++x; }while (--num_pix > 0); } }
void SubPixRender(IImageReaderWriter destImage, Scanline scanline, ColorRGBA color) { int y = scanline.Y; int num_spans = scanline.SpanCount; byte[] covers = scanline.GetCovers(); ScanlineRasterizer ras = gfx.ScanlineRasterizer; var rasToBmp = gfx.ScanlineRasToDestBitmap; ColorRGBA prevColor = ColorRGBA.White; for (int i = 0; i <= num_spans; ++i) { //render span by span ScanlineSpan span = scanline.GetSpan(i); int x = span.x; int num_pix = span.len; int coverIndex = span.cover_index; //test subpixel rendering concept //---------------------------------------------------- int prev_cover = 0; while (num_pix > 0) { int coverageValue = covers[coverIndex++]; if (coverageValue >= 255) { //100% cover ColorRGBA newc = new ColorRGBA(color.red, color.green, color.blue); prevColor = newc; int a = (coverageValue * color.Alpha0To255) >> 8; m_square.Draw(rasToBmp, ras, m_sl, destImage, new ColorRGBA(newc, a), x, y); prev_cover = 255;//full } else { //check direction : bool isLeftToRight = coverageValue >= prev_cover; prev_cover = coverageValue; byte c_r, c_g, c_b; float subpix_percent = ((float)(coverageValue) / 256f); if (coverageValue < cover_1_3) { if (isLeftToRight) { c_r = 255; c_g = 255; c_b = (byte)(255 - (255f * (subpix_percent))); } else { c_r = (byte)(255 - (255f * (subpix_percent))); c_g = 255; c_b = 255; } ColorRGBA newc = prevColor = new ColorRGBA(c_r, c_g, c_b); int a = (coverageValue * color.Alpha0To255) >> 8; m_square.Draw(rasToBmp, ras, m_sl, destImage, new ColorRGBA(newc, a), x, y); } else if (coverageValue < cover_2_3) { if (isLeftToRight) { c_r = prevColor.blue; c_g = (byte)(255 - (255f * (subpix_percent))); c_b = color.blue;// (byte)(255 - (255f * (subpix_percent)));// color.blue; } else { c_r = color.blue;// (byte)(255 - (255f * (subpix_percent))); //color.blue; c_g = (byte)(255 - (255f * (subpix_percent))); c_b = 255; } ColorRGBA newc = prevColor = new ColorRGBA(c_r, c_g, c_b); int a = (coverageValue * color.Alpha0To255) >> 8; m_square.Draw(rasToBmp, ras, m_sl, destImage, new ColorRGBA(newc, a), x, y); } else { //cover > 2/3 but not full if (isLeftToRight) { c_r = (byte)(255 - (255f * (subpix_percent))); c_g = color.green; c_b = color.blue; } else { c_r = prevColor.green; c_g = prevColor.blue; c_b = (byte)(255 - (255f * (subpix_percent))); } ColorRGBA newc = prevColor = new ColorRGBA(c_r, c_g, c_b); int a = (coverageValue * color.Alpha0To255) >> 8; m_square.Draw(rasToBmp, ras, m_sl, destImage, new ColorRGBA(newc, a), x, y); } } ++x; --num_pix; } } }
void SubPixRender(IImageReaderWriter destImage, Scanline scanline, Color color) { int y = scanline.Y; int num_spans = scanline.SpanCount; byte[] covers = scanline.GetCovers(); ScanlineRasterizer ras = gfx.ScanlineRasterizer; var rasToBmp = gfx.ScanlineRasToDestBitmap; //------------------------------------------ Color bgColor = Color.White; float cb_R = bgColor.R / 255f; float cb_G = bgColor.G / 255f; float cb_B = bgColor.B / 255f; float cf_R = color.R / 255f; float cf_G = color.G / 255f; float cf_B = color.B / 255f; //------------------------------------------ for (int i = 0; i <= num_spans; ++i) { //render span by span ScanlineSpan span = scanline.GetSpan(i); int x = span.x; int num_pix = span.len; int coverIndex = span.cover_index; //test subpixel rendering concept //---------------------------------------------------- int prev_cover = 0; while (num_pix > 0) { byte coverageValue = covers[coverIndex++]; if (coverageValue >= 255) { //100% cover int a = (coverageValue * color.Alpha0To255) >> 8; m_square.Draw(rasToBmp, ras, m_sl, destImage, Color.FromArgb(a, Color.FromArgb(color.red, color.green, color.blue)), x, y); prev_cover = 255;//full } else { //check direction : bool isUpHill = (coverageValue % 2) > 0; //-------------------------------------------------------------------- //TODO: review here //in somecase, demo3, isUpHill2 != isUpHill //but we skip it, because we don't want context color around the point //so when we use in fragment shader we can pick up a single color //and determine what color it should be bool isUpHill2 = coverageValue > prev_cover; if (isUpHill != isUpHill2) { } //-------------------------------------------------------------------- prev_cover = coverageValue; byte c_r, c_g, c_b; float subpix_percent = ((float)(coverageValue) / 256f); if (coverageValue < cover_1_3) { //assume LCD color arrangement is RGB if (isUpHill) { c_r = bgColor.R; c_g = bgColor.G; c_b = (byte)(mix(cb_B, cf_B, subpix_percent) * 255); } else { c_r = (byte)(mix(cb_R, cf_R, subpix_percent) * 255); c_g = bgColor.G; c_b = bgColor.B; } int a = (coverageValue * color.Alpha0To255) >> 8; m_square.Draw(rasToBmp, ras, m_sl, destImage, Color.FromArgb(a, Color.FromArgb(c_r, c_g, c_b)), x, y); } else if (coverageValue < cover_2_3) { if (isUpHill) { c_r = bgColor.R; c_g = (byte)(mix(cb_G, cf_G, subpix_percent) * 255); c_b = (byte)(mix(cb_B, cf_B, 1) * 255); } else { c_r = (byte)(mix(cb_R, cf_R, 1) * 255); c_g = (byte)(mix(cb_G, cf_G, subpix_percent) * 255); c_b = bgColor.B; } int a = (coverageValue * color.Alpha0To255) >> 8; m_square.Draw(rasToBmp, ras, m_sl, destImage, Color.FromArgb(a, Color.FromArgb(c_r, c_g, c_b)), x, y); } else { //cover > 2/3 but not full if (isUpHill) { c_r = (byte)(mix(cb_R, cf_R, subpix_percent) * 255); c_g = (byte)(mix(cb_G, cf_G, 1) * 255); c_b = (byte)(mix(cb_B, cf_B, 1) * 255); } else { c_r = (byte)(mix(cb_R, cf_R, 1) * 255); c_g = (byte)(mix(cb_G, cf_G, 1) * 255); c_b = (byte)(mix(cb_B, cf_B, subpix_percent) * 255); } int a = (coverageValue * color.Alpha0To255) >> 8; m_square.Draw(rasToBmp, ras, m_sl, destImage, Color.FromArgb(a, Color.FromArgb(c_r, c_g, c_b)), x, y); } } ++x; --num_pix; } } }