Exemple #1
0
        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);
            }
        }
Exemple #2
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;
                }
            }
        }
Exemple #3
0
        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;
                }
            }
        }