Beispiel #1
0
        unsafe void generate_alpha_mask(int cx, int cy)
        {
            alphaByteArray = new byte[cx * cy];
            {
#if USE_CLIPPING_ALPHA_MASK
                alphaMaskImageBuffer.AttachBuffer(alphaByteArray, 20 * cx + 20, cx - 40, cy - 40, cx, 8, 1);
#else
                alphaMaskImageBuffer.attach(alphaByteArray, (int)cx, (int)cy, cx, 1);
#endif

                ImageBuffer image = new ImageBuffer();
                image.Attach(alphaMaskImageBuffer, new blender_gray(1), 1, 0, 8);
                ImageClippingProxy clippingProxy = new ImageClippingProxy(image);
                ScanlineCachePacked8 sl = new ScanlineCachePacked8();

                clippingProxy.clear(new RGBA_Floats(0));

                VertexSource.Ellipse ellipseForMask = new MatterHackers.Agg.VertexSource.Ellipse();

                System.Random randGenerator = new Random(1432);

                ScanlineRenderer scanlineRenderer = new ScanlineRenderer();
                int i;
                int num = (int)numMasksSlider.Value;
                for (i = 0; i < num; i++)
                {
                    if (i == num - 1)
                    {
                        ellipseForMask.init(Width / 2, Height / 2, 110, 110, 100);
                        rasterizer.add_path(ellipseForMask);
                        scanlineRenderer.render_scanlines_aa_solid(clippingProxy, rasterizer, sl, new RGBA_Bytes(0, 0, 0, 255));

                        ellipseForMask.init(ellipseForMask.originX, ellipseForMask.originY, ellipseForMask.radiusX - 10, ellipseForMask.radiusY - 10, 100);
                        rasterizer.add_path(ellipseForMask);
                        scanlineRenderer.render_scanlines_aa_solid(clippingProxy, rasterizer, sl, new RGBA_Bytes(255, 0, 0, 255));
                    }
                    else
                    {
                        ellipseForMask.init(randGenerator.Next() % cx,
                                 randGenerator.Next() % cy,
                                 randGenerator.Next() % 100 + 20,
                                 randGenerator.Next() % 100 + 20,
                                 100);
                        // set the color to draw into the alpha channel.
                        // there is not very much reason to set the alpha as you will get the amount of 
                        // transparency based on the color you draw.  (you might want some type of different edeg effect but it will be minor).
                        rasterizer.add_path(ellipseForMask);
                        scanlineRenderer.render_scanlines_aa_solid(clippingProxy, rasterizer, sl, new RGBA_Bytes((int)((float)i / (float)num * 255), 0, 0, 255));
                    }

                }
                
                alphaMaskImageBuffer.DettachBuffer();
            }
        }
Beispiel #2
0
        unsafe void generate_alpha_mask(int cx, int cy)
        {
            alphaByteArray = new byte[cx * cy];
            {
#if USE_CLIPPING_ALPHA_MASK
                alphaMaskImageBuffer.AttachBuffer(alphaByteArray, 20 * cx + 20, cx - 40, cy - 40, cx, 8, 1);
#else
                alphaMaskImageBuffer.attach(alphaByteArray, (int)cx, (int)cy, cx, 1);
#endif

                ImageBuffer image = new ImageBuffer();
                image.Attach(alphaMaskImageBuffer, new blender_gray(1), 1, 0, 8);
                ImageClippingProxy   clippingProxy = new ImageClippingProxy(image);
                ScanlineCachePacked8 sl            = new ScanlineCachePacked8();

                clippingProxy.clear(new RGBA_Floats(0));

                VertexSource.Ellipse ellipseForMask = new MatterHackers.Agg.VertexSource.Ellipse();

                System.Random randGenerator = new Random(1432);

                ScanlineRenderer scanlineRenderer = new ScanlineRenderer();
                int i;
                int num = (int)numMasksSlider.Value;
                for (i = 0; i < num; i++)
                {
                    if (i == num - 1)
                    {
                        ellipseForMask.init(Width / 2, Height / 2, 110, 110, 100);
                        rasterizer.add_path(ellipseForMask);
                        scanlineRenderer.render_scanlines_aa_solid(clippingProxy, rasterizer, sl, new RGBA_Bytes(0, 0, 0, 255));

                        ellipseForMask.init(ellipseForMask.originX, ellipseForMask.originY, ellipseForMask.radiusX - 10, ellipseForMask.radiusY - 10, 100);
                        rasterizer.add_path(ellipseForMask);
                        scanlineRenderer.render_scanlines_aa_solid(clippingProxy, rasterizer, sl, new RGBA_Bytes(255, 0, 0, 255));
                    }
                    else
                    {
                        ellipseForMask.init(randGenerator.Next() % cx,
                                            randGenerator.Next() % cy,
                                            randGenerator.Next() % 100 + 20,
                                            randGenerator.Next() % 100 + 20,
                                            100);
                        // set the color to draw into the alpha channel.
                        // there is not very much reason to set the alpha as you will get the amount of
                        // transparency based on the color you draw.  (you might want some type of different edeg effect but it will be minor).
                        rasterizer.add_path(ellipseForMask);
                        scanlineRenderer.render_scanlines_aa_solid(clippingProxy, rasterizer, sl, new RGBA_Bytes((int)((float)i / (float)num * 255), 0, 0, 255));
                    }
                }

                alphaMaskImageBuffer.DettachBuffer();
            }
        }
Beispiel #3
0
        public override void OnDraw(Graphics2D graphics2D)
        {
            ImageBuffer widgetsSubImage = ImageBuffer.NewSubImageReference(graphics2D.DestImage, graphics2D.GetClippingRect());

#if SourceDepthFloat
            ImageClippingProxyFloat clippingProxy = new ImageClippingProxyFloat(graphics2D.DestImageFloat);

            clippingProxy.clear(new RGBA_Floats(1.0, 1.0, 1.0));
            clippingProxy.CopyFrom(m_TempDestImage, new rect_i(0, 0, (int)Width, (int)Height), 110, 35);
#else
            ImageClippingProxy clippingProxy = new ImageClippingProxy(widgetsSubImage);

            clippingProxy.clear(new RGBA_Floats(1.0, 1.0, 1.0));
            clippingProxy.CopyFrom(m_TempDestImage, new RectangleInt(0, 0, (int)Width, (int)Height), 110, 35);
#endif

            string   buf = string.Format("NSteps={0:F0}", m_num_steps);
            gsv_text t   = new gsv_text();
            t.start_point(10.0, 295.0);
            t.SetFontSize(10.0);
            t.text(buf);

            Stroke pt = new Stroke(t);
            pt.width(1.5);

            m_Rasterizer.add_path(pt);
#if SourceDepthFloat
            RGBA_Floats colorBlack = new RGBA_Floats(0, 0, 0);
#else
            RGBA_Bytes colorBlack = new RGBA_Bytes(0, 0, 0);
#endif
            ScanlineRenderer scanlineRenderer = new ScanlineRenderer();
            scanlineRenderer.render_scanlines_aa_solid(clippingProxy, m_Rasterizer, m_ScanlinePacked, colorBlack);

            if (m_time1 != m_time2 && m_num_pix > 0.0)
            {
                buf = string.Format("{0:F2} Kpix/sec", m_num_pix / (m_time2 - m_time1));
                t.start_point(10.0, 310.0);
                t.text(buf);
                m_Rasterizer.add_path(pt);
                scanlineRenderer.render_scanlines_aa_solid(clippingProxy, m_Rasterizer, m_ScanlinePacked, colorBlack);
            }

            if (filterSelectionButtons.SelectedIndex >= 14)
            {
                m_radius.Visible = true;
            }
            else
            {
                m_radius.Visible = true;
            }

            base.OnDraw(graphics2D);
        }
Beispiel #4
0
        public override void OnDraw(Graphics2D graphics2D)
        {
            ImageBuffer widgetsSubImage = ImageBuffer.NewSubImageReference(graphics2D.DestImage, graphics2D.GetClippingRect());

            GammaLookUpTable gamma = new GammaLookUpTable(gammaSlider.Value);
            IRecieveBlenderByte NormalBlender = new BlenderBGRA();
            IRecieveBlenderByte GammaBlender = new BlenderGammaBGRA(gamma);
            ImageBuffer rasterGamma = new ImageBuffer();
            rasterGamma.Attach(widgetsSubImage, GammaBlender);
            ImageClippingProxy clippingProxyNormal = new ImageClippingProxy(widgetsSubImage);
            ImageClippingProxy clippingProxyGamma = new ImageClippingProxy(rasterGamma);

            clippingProxyNormal.clear(new RGBA_Floats(1, 1, 1));

            ScanlineRasterizer rasterizer = new ScanlineRasterizer();
            scanline_unpacked_8 sl = new scanline_unpacked_8();

            int size_mul = (int)pixelSizeSlider.Value;

            renderer_enlarged ren_en = new renderer_enlarged(size_mul);

            rasterizer.reset();
            rasterizer.move_to_d(m_x[0] / size_mul, m_y[0] / size_mul);
            rasterizer.line_to_d(m_x[1] / size_mul, m_y[1] / size_mul);
            rasterizer.line_to_d(m_x[2] / size_mul, m_y[2] / size_mul);
            ren_en.render_scanlines_aa_solid(clippingProxyGamma, rasterizer, sl, RGBA_Bytes.Black);

            ScanlineRenderer scanlineRenderer = new ScanlineRenderer();
            scanlineRenderer.render_scanlines_aa_solid(clippingProxyGamma, rasterizer, sl, RGBA_Bytes.Black);

            rasterizer.gamma(new gamma_none());

            PathStorage ps = new PathStorage();
            Stroke pg = new Stroke(ps);
            pg.width(2);

            ps.remove_all();
            ps.MoveTo(m_x[0], m_y[0]);
            ps.LineTo(m_x[1], m_y[1]);
            ps.LineTo(m_x[2], m_y[2]);
            ps.LineTo(m_x[0], m_y[0]);
            rasterizer.add_path(pg);
            scanlineRenderer.render_scanlines_aa_solid(clippingProxyNormal, rasterizer, sl, new RGBA_Bytes(0, 150, 160, 200));

            base.OnDraw(graphics2D);
        }
Beispiel #5
0
 public void draw(ScanlineRasterizer ras, IScanlineCache sl, IImageByte destImage, RGBA_Bytes color,
           double x, double y)
 {
     ras.reset();
     ras.move_to_d(x * m_size, y * m_size);
     ras.line_to_d(x * m_size + m_size, y * m_size);
     ras.line_to_d(x * m_size + m_size, y * m_size + m_size);
     ras.line_to_d(x * m_size, y * m_size + m_size);
     ScanlineRenderer scanlineRenderer = new ScanlineRenderer();
     scanlineRenderer.render_scanlines_aa_solid(destImage, ras, sl, color);
 }
Beispiel #6
0
        private void DrawBigA(Graphics2D graphics2D)
        {
            ScanlineRasterizer m_ras = new ScanlineRasterizer();

            m_ras.SetVectorClipBox(0, 0, Width, Height);
            TypeFacePrinter            bigAPrinter       = new TypeFacePrinter("a", 150);
            FlattenCurves              flattenedBigA     = new FlattenCurves(bigAPrinter);
            VertexSourceApplyTransform scaleAndTranslate = new VertexSourceApplyTransform(flattenedBigA, Affine.NewTranslation(155, 55));
            ScanlineCachePacked8       m_sl             = new ScanlineCachePacked8();
            ScanlineRenderer           scanlineRenderer = new ScanlineRenderer();

#if false
            ImageProxySubpxelLcd24     clippingProxy = new ImageProxySubpxelLcd24(graphics2D.DestImage, new lcd_distribution_lut());
            VertexSourceApplyTransform scaledWide    = new VertexSourceApplyTransform(scaleAndTranslate, Affine.NewScaling(3, 1));
            m_ras.add_path(scaledWide);
            scanlineRenderer.render_scanlines_aa_solid(clippingProxy, m_ras, m_sl, RGBA_Bytes.Black);
#else
            m_ras.add_path(scaleAndTranslate);
            ImageClippingProxy clippingProxy = new ImageClippingProxy(graphics2D.DestImage);
            scanlineRenderer.render_scanlines_aa_solid(clippingProxy, m_ras, m_sl, RGBA_Bytes.Black);
#endif
        }
Beispiel #7
0
        public override void OnDraw(Graphics2D graphics2D)
        {
            GammaLookUpTable    gamma         = new GammaLookUpTable(gammaSlider.Value);
            IRecieveBlenderByte NormalBlender = new BlenderBGR();
            IRecieveBlenderByte GammaBlender  = new BlenderGammaBGR(gamma);
            ImageBuffer         rasterNormal  = new ImageBuffer();

            rasterNormal.Attach(graphics2D.DestImage, NormalBlender);
            ImageBuffer rasterGamma = new ImageBuffer();

            rasterGamma.Attach(graphics2D.DestImage, GammaBlender);
            ImageClippingProxy clippingProxyNormal = new ImageClippingProxy(rasterNormal);
            ImageClippingProxy clippingProxyGamma  = new ImageClippingProxy(rasterGamma);

            clippingProxyNormal.clear(new RGBA_Floats(1, 1, 1));

            ScanlineRasterizer  ras = new ScanlineRasterizer();
            scanline_unpacked_8 sl  = new scanline_unpacked_8();

            int size_mul = (int)pixelSizeSlider.Value;

            renderer_enlarged ren_en = new renderer_enlarged(size_mul);

            StyledTypeFace type      = new StyledTypeFace(LiberationSansFont.Instance, 12);
            IVertexSource  character = type.GetGlyphForCharacter('E');

            character.rewind(0);
            ras.reset();
            ras.add_path(character);
            ren_en.render_scanlines_aa_solid(clippingProxyGamma, ras, sl, RGBA_Bytes.Black);

            ScanlineRenderer scanlineRenderer = new ScanlineRenderer();

            scanlineRenderer.render_scanlines_aa_solid(clippingProxyGamma, ras, sl, RGBA_Bytes.Black);

            ras.gamma(new gamma_none());

            PathStorage ps = new PathStorage();
            Stroke      pg = new Stroke(ps);

            pg.width(2);

            DrawBigA(graphics2D);

            base.OnDraw(graphics2D);
        }
Beispiel #8
0
        public override void OnDraw(Graphics2D graphics2D)
        {
            GammaLookUpTable gamma = new GammaLookUpTable(gammaSlider.Value);
            IRecieveBlenderByte NormalBlender = new BlenderBGR();
            IRecieveBlenderByte GammaBlender = new BlenderGammaBGR(gamma);
            ImageBuffer rasterNormal = new ImageBuffer();
            rasterNormal.Attach(graphics2D.DestImage, NormalBlender);
            ImageBuffer rasterGamma = new ImageBuffer();
            rasterGamma.Attach(graphics2D.DestImage, GammaBlender);
            ImageClippingProxy clippingProxyNormal = new ImageClippingProxy(rasterNormal);
            ImageClippingProxy clippingProxyGamma = new ImageClippingProxy(rasterGamma);

            clippingProxyNormal.clear(new RGBA_Floats(1, 1, 1));

            ScanlineRasterizer ras = new ScanlineRasterizer();
            scanline_unpacked_8 sl = new scanline_unpacked_8();

            int size_mul = (int)pixelSizeSlider.Value;

            renderer_enlarged ren_en = new renderer_enlarged(size_mul);

            StyledTypeFace type = new StyledTypeFace(LiberationSansFont.Instance, 12);
            IVertexSource character = type.GetGlyphForCharacter('E');
            character.rewind(0);
            ras.reset();
            ras.add_path(character);
            ren_en.render_scanlines_aa_solid(clippingProxyGamma, ras, sl, RGBA_Bytes.Black);

            ScanlineRenderer scanlineRenderer = new ScanlineRenderer();
            scanlineRenderer.render_scanlines_aa_solid(clippingProxyGamma, ras, sl, RGBA_Bytes.Black);

            ras.gamma(new gamma_none());

            PathStorage ps = new PathStorage();
            Stroke pg = new Stroke(ps);
            pg.width(2);

            DrawBigA(graphics2D);

            base.OnDraw(graphics2D);
        }
Beispiel #9
0
        public override void Render(IVertexSource vertexSource, int pathIndexToRender, RGBA_Bytes colorBytes)
        {
            rasterizer.reset();
            Affine transform = GetTransform();

            if (!transform.is_identity())
            {
                vertexSource = new VertexSourceApplyTransform(vertexSource, transform);
            }
            rasterizer.add_path(vertexSource, pathIndexToRender);
            if (destImageByte != null)
            {
                scanlineRenderer.render_scanlines_aa_solid(destImageByte, rasterizer, m_ScanlineCache, colorBytes);
                DestImage.MarkImageChanged();
            }
            else
            {
                scanlineRenderer.RenderSolid(destImageFloat, rasterizer, m_ScanlineCache, colorBytes.GetAsRGBA_Floats());
                destImageFloat.MarkImageChanged();
            }
        }
Beispiel #10
0
 public void draw(ScanlineRasterizer ras, IScanlineCache sl, IImageByte destImage, RGBA_Bytes color,
           double x, double y)
 {
     ras.reset();
     ras.move_to_d(x * m_size, y * m_size);
     ras.line_to_d(x * m_size + m_size, y * m_size);
     ras.line_to_d(x * m_size + m_size, y * m_size + m_size);
     ras.line_to_d(x * m_size, y * m_size + m_size);
     ScanlineRenderer scanlineRenderer = new ScanlineRenderer();
     scanlineRenderer.render_scanlines_aa_solid(destImage, ras, sl, color);
 }
Beispiel #11
0
        public override void OnDraw(Graphics2D graphics2D)
        {
            ImageBuffer widgetsSubImage = ImageBuffer.NewSubImageReference(graphics2D.DestImage, graphics2D.GetClippingRect());

            ScanlineRasterizer  ras = new ScanlineRasterizer();
            scanline_unpacked_8 sl  = new scanline_unpacked_8();

            ImageClippingProxy clippingProxy = new ImageClippingProxy(widgetsSubImage);

            clippingProxy.clear(new RGBA_Floats(0, 0, 0));

            m_profile.text_size(8.0);

            // draw a background to show how the alpha is working
            int RectWidth = 32;
            int xoffset   = 238;
            int yoffset   = 171;
            ScanlineRenderer scanlineRenderer = new ScanlineRenderer();

            for (int i = 0; i < 7; i++)
            {
                for (int j = 0; j < 7; j++)
                {
                    if ((i + j) % 2 != 0)
                    {
                        VertexSource.RoundedRect rect = new VertexSource.RoundedRect(i * RectWidth + xoffset, j * RectWidth + yoffset,
                                                                                     (i + 1) * RectWidth + xoffset, (j + 1) * RectWidth + yoffset, 2);
                        rect.normalize_radius();

                        ras.add_path(rect);
                        scanlineRenderer.render_scanlines_aa_solid(clippingProxy, ras, sl, new RGBA_Bytes(.9, .9, .9));
                    }
                }
            }

            double ini_scale = 1.0;

            Transform.Affine mtx1 = Affine.NewIdentity();
            mtx1 *= Affine.NewScaling(ini_scale, ini_scale);
            mtx1 *= Affine.NewTranslation(center_x, center_y);

            VertexSource.Ellipse e1 = new MatterHackers.Agg.VertexSource.Ellipse();
            e1.init(0.0, 0.0, 110.0, 110.0, 64);

            Transform.Affine mtx_g1 = Affine.NewIdentity();
            mtx_g1 *= Affine.NewScaling(ini_scale, ini_scale);
            mtx_g1 *= Affine.NewScaling(m_SaveData.m_scale, m_SaveData.m_scale);
            mtx_g1 *= Affine.NewScaling(m_scale_x, m_scale_y);
            mtx_g1 *= Affine.NewRotation(m_SaveData.m_angle);
            mtx_g1 *= Affine.NewTranslation(m_SaveData.m_center_x, m_SaveData.m_center_y);
            mtx_g1.invert();


            RGBA_Bytes[] color_profile = new RGBA_Bytes[256]; // color_type is defined in pixel_formats.h
            for (int i = 0; i < 256; i++)
            {
                color_profile[i] = new RGBA_Bytes(m_spline_r.spline()[i],
                                                  m_spline_g.spline()[i],
                                                  m_spline_b.spline()[i],
                                                  m_spline_a.spline()[i]);
            }

            VertexSourceApplyTransform t1 = new VertexSourceApplyTransform(e1, mtx1);

            IGradient innerGradient = null;

            switch (m_GradTypeRBox.SelectedIndex)
            {
            case 0:
                innerGradient = new gradient_radial();
                break;

            case 1:
                innerGradient = new gradient_diamond();
                break;

            case 2:
                innerGradient = new gradient_x();
                break;

            case 3:
                innerGradient = new gradient_xy();
                break;

            case 4:
                innerGradient = new gradient_sqrt_xy();
                break;

            case 5:
                innerGradient = new gradient_conic();
                break;
            }

            IGradient outerGradient = null;

            switch (m_GradWrapRBox.SelectedIndex)
            {
            case 0:
                outerGradient = new gradient_reflect_adaptor(innerGradient);
                break;

            case 1:
                outerGradient = new gradient_repeat_adaptor(innerGradient);
                break;

            case 2:
                outerGradient = new gradient_clamp_adaptor(innerGradient);
                break;
            }

            span_allocator           span_alloc = new span_allocator();
            color_function_profile   colors     = new color_function_profile(color_profile, m_profile.gamma());
            span_interpolator_linear inter      = new span_interpolator_linear(mtx_g1);
            span_gradient            span_gen   = new span_gradient(inter, outerGradient, colors, 0, 150);

            ras.add_path(t1);
            scanlineRenderer.GenerateAndRender(ras, sl, clippingProxy, span_alloc, span_gen);
            base.OnDraw(graphics2D);
        }
Beispiel #12
0
        public override void OnDraw(Graphics2D graphics2D)
        {
            ImageBuffer widgetsSubImage = ImageBuffer.NewSubImageReference(graphics2D.DestImage, graphics2D.GetClippingRect());

            IImageByte backBuffer = widgetsSubImage;
            
            GammaLookUpTable gamma = new GammaLookUpTable(m_gamma.Value);
            IRecieveBlenderByte NormalBlender = new BlenderBGRA();
            IRecieveBlenderByte GammaBlender = new BlenderGammaBGRA(gamma);
            ImageBuffer rasterNormal = new ImageBuffer();
            rasterNormal.Attach(backBuffer, NormalBlender);
            ImageBuffer rasterGamma = new ImageBuffer();
            rasterGamma.Attach(backBuffer, GammaBlender);
            ImageClippingProxy clippingProxyNormal = new ImageClippingProxy(rasterNormal);
            ImageClippingProxy clippingProxyGamma = new ImageClippingProxy(rasterGamma);

            clippingProxyNormal.clear(m_white_on_black.Checked ? new RGBA_Floats(0, 0, 0) : new RGBA_Floats(1, 1, 1));

            ScanlineRasterizer ras = new ScanlineRasterizer();
            ScanlineCachePacked8 sl = new ScanlineCachePacked8();

            VertexSource.Ellipse e = new VertexSource.Ellipse();

            // TODO: If you drag the control circles below the bottom of the window we get an exception.  This does not happen in AGG.
            // It needs to be debugged.  Turning on clipping fixes it.  But standard agg works without clipping.  Could be a bigger problem than this.
            //ras.clip_box(0, 0, width(), height());

            // Render two "control" circles
            e.init(m_x[0], m_y[0], 3, 3, 16);
            ras.add_path(e);
            ScanlineRenderer scanlineRenderer = new ScanlineRenderer();
            scanlineRenderer.render_scanlines_aa_solid(clippingProxyNormal, ras, sl, new RGBA_Bytes(127, 127, 127));
            e.init(m_x[1], m_y[1], 3, 3, 16);
            ras.add_path(e);
            scanlineRenderer.render_scanlines_aa_solid(clippingProxyNormal, ras, sl, new RGBA_Bytes(127, 127, 127));

            double d = m_offset.Value;

            // Creating a rounded rectangle
            VertexSource.RoundedRect r = new VertexSource.RoundedRect(m_x[0] + d, m_y[0] + d, m_x[1] + d, m_y[1] + d, m_radius.Value);
            r.normalize_radius();

            // Drawing as an outline
            if (!m_DrawAsOutlineCheckBox.Checked)
            {
                Stroke p = new Stroke(r);
                p.width(1.0);
                ras.add_path(p);
            }
            else
            {
                ras.add_path(r);
            }

            scanlineRenderer.render_scanlines_aa_solid(clippingProxyGamma, ras, sl, m_white_on_black.Checked ? new RGBA_Bytes(255, 255, 255) : new RGBA_Bytes(0, 0, 0));

            base.OnDraw(graphics2D);
        }
Beispiel #13
0
        public override void OnDraw(Graphics2D graphics2D)
        {
            ImageBuffer widgetsSubImage = ImageBuffer.NewSubImageReference(graphics2D.DestImage, graphics2D.GetClippingRect());

            IImageByte backBuffer = widgetsSubImage;

            IImageByte         destImage     = backBuffer;
            ImageClippingProxy clippingProxy = new ImageClippingProxy(destImage);

            clippingProxy.clear(new RGBA_Floats(0, 0, 0));

            ScanlineRasterizer  ras    = new ScanlineRasterizer();
            scanline_unpacked_8 sl     = new scanline_unpacked_8();
            scanline_bin        sl_bin = new scanline_bin();

            rasterizer_compound_aa rasc  = new rasterizer_compound_aa();
            span_allocator         alloc = new span_allocator();

            int            i;
            styles_gouraud styles = new styles_gouraud(m_mesh, m_gamma);

            stopwatch.Restart();
            rasc.reset();
            //rasc.clip_box(40, 40, width() - 40, height() - 40);
            for (i = 0; i < m_mesh.num_edges(); i++)
            {
                mesh_edge  e  = m_mesh.edge(i);
                mesh_point p1 = m_mesh.vertex(e.p1);
                mesh_point p2 = m_mesh.vertex(e.p2);
                rasc.styles(e.tl, e.tr);
                rasc.move_to_d(p1.x, p1.y);
                rasc.line_to_d(p2.x, p2.y);
            }

            ScanlineRenderer scanlineRenderer = new ScanlineRenderer();

            scanlineRenderer.RenderCompound(rasc, sl, sl_bin, clippingProxy, alloc, styles);
            double tm = stopwatch.ElapsedMilliseconds;

            gsv_text t = new gsv_text();

            t.SetFontSize(10.0);

            Stroke pt = new Stroke(t);

            pt.width(1.5);
            pt.line_cap(LineCap.Round);
            pt.line_join(LineJoin.Round);

            string buf = string.Format("{0:F2} ms, {1} triangles, {2:F0} tri/sec",
                                       tm,
                                       m_mesh.num_triangles(),
                                       m_mesh.num_triangles() / tm * 1000.0);

            t.start_point(10.0, 10.0);
            t.text(buf);

            ras.add_path(pt);
            scanlineRenderer.render_scanlines_aa_solid(clippingProxy, ras, sl, new RGBA_Bytes(255, 255, 255));


            if (m_gamma.GetGamma() != 1.0)
            {
                ((ImageBuffer)destImage).apply_gamma_inv(m_gamma);
            }

            base.OnDraw(graphics2D);
        }
Beispiel #14
0
        public override void OnDraw(Graphics2D graphics2D)
        {
            ImageBuffer widgetsSubImage = ImageBuffer.NewSubImageReference(graphics2D.DestImage, graphics2D.GetClippingRect());
            ImageClippingProxy clippingProxy = new ImageClippingProxy(widgetsSubImage);
            clippingProxy.clear(new RGBA_Floats(1, 1, 1));
            m_ras.SetVectorClipBox(0, 0, Width, Height);

            Affine move = Affine.NewTranslation(10, 10);

            Perspective shadow_persp = new Perspective(m_shape_bounds.Left, m_shape_bounds.Bottom,
                                                m_shape_bounds.Right, m_shape_bounds.Top,
                                                m_shadow_ctrl.polygon());

            IVertexSource shadow_trans;
            if (m_FlattenCurves.Checked)
            {
                shadow_trans = new VertexSourceApplyTransform(m_shape, shadow_persp);
            }
            else
            {
                shadow_trans = new VertexSourceApplyTransform(m_path, shadow_persp);
                // this will make it very smooth after the transform
                //shadow_trans = new conv_curve(shadow_trans);
            }


            // Render shadow
            m_ras.add_path(shadow_trans);
            ScanlineRenderer scanlineRenderer = new ScanlineRenderer();
            scanlineRenderer.render_scanlines_aa_solid(clippingProxy, m_ras, m_sl, new RGBA_Floats(0.2, 0.3, 0).GetAsRGBA_Bytes());

            // Calculate the bounding box and extend it by the blur radius
            RectangleDouble bbox = new RectangleDouble();
            bounding_rect.bounding_rect_single(shadow_trans, 0, ref bbox);

            bbox.Left -= m_radius.Value;
            bbox.Bottom -= m_radius.Value;
            bbox.Right += m_radius.Value;
            bbox.Top += m_radius.Value;

            if (m_method.SelectedIndex == 1)
            {
                // The recursive blur method represents the true Gaussian Blur,
                // with theoretically infinite kernel. The restricted window size
                // results in extra influence of edge pixels. It's impossible to
                // solve correctly, but extending the right and top areas to another
                // radius value produces fair result.
                //------------------
                bbox.Right += m_radius.Value;
                bbox.Top += m_radius.Value;
            }

            stopwatch.Restart();

            if (m_method.SelectedIndex != 2)
            {
                // Create a new pixel renderer and attach it to the main one as a child image. 
                // It returns true if the attachment succeeded. It fails if the rectangle 
                // (bbox) is fully clipped.
                //------------------
#if SourceDepth24
                ImageBuffer image2 = new ImageBuffer(new BlenderBGR());
#else
                ImageBuffer image2 = new ImageBuffer(new BlenderBGRA());
#endif
                if (image2.Attach(widgetsSubImage, (int)bbox.Left, (int)bbox.Bottom, (int)bbox.Right, (int)bbox.Top))
                {
                    // Blur it
                    if (m_method.SelectedIndex == 0)
                    {
                        // More general method, but 30-40% slower.
                        //------------------
                        //m_stack_blur.blur(pixf2, agg::uround(m_radius.Value));

                        // Faster, but bore specific. 
                        // Works only for 8 bits per channel and only with radii <= 254.
                        //------------------
                        stack_blur test = new stack_blur();
                        test.Blur(image2, agg_basics.uround(m_radius.Value), agg_basics.uround(m_radius.Value));
                    }
                    else
                    {
                        // True Gaussian Blur, 3-5 times slower than Stack Blur,
                        // but still constant time of radius. Very sensitive
                        // to precision, doubles are must here.
                        //------------------
                        m_recursive_blur.blur(image2, m_radius.Value);
                    }
                }
            }
            else
            {
                /*
                // Blur separate channels
                //------------------
                if(m_channel_r.Checked)
                {
                    typedef agg::pixfmt_alpha_blend_gray<
                        agg::blender_gray8, 
                        agg::rendering_buffer,
                        3, 2> pixfmt_gray8r;

                    pixfmt_gray8r pixf2r(m_rbuf2);
                    if(pixf2r.attach(pixf, int(bbox.x1), int(bbox.y1), int(bbox.x2), int(bbox.y2)))
                    {
                        agg::stack_blur_gray8(pixf2r, agg::uround(m_radius.Value), 
                                                      agg::uround(m_radius.Value));
                    }
                }

                if(m_channel_g.Checked)
                {
                    typedef agg::pixfmt_alpha_blend_gray<
                        agg::blender_gray8, 
                        agg::rendering_buffer,
                        3, 1> pixfmt_gray8g;

                    pixfmt_gray8g pixf2g(m_rbuf2);
                    if(pixf2g.attach(pixf, int(bbox.x1), int(bbox.y1), int(bbox.x2), int(bbox.y2)))
                    {
                        agg::stack_blur_gray8(pixf2g, agg::uround(m_radius.Value), 
                                                      agg::uround(m_radius.Value));
                    }
                }

                if(m_channel_b.Checked)
                {
                    typedef agg::pixfmt_alpha_blend_gray<
                        agg::blender_gray8, 
                        agg::rendering_buffer,
                        3, 0> pixfmt_gray8b;

                    pixfmt_gray8b pixf2b(m_rbuf2);
                    if(pixf2b.attach(pixf, int(bbox.x1), int(bbox.y1), int(bbox.x2), int(bbox.y2)))
                    {
                        agg::stack_blur_gray8(pixf2b, agg::uround(m_radius.Value), 
                                                      agg::uround(m_radius.Value));
                    }
                }
                 */
            }

            double tm = stopwatch.ElapsedMilliseconds;

            // Render the shape itself
            //------------------
            if (m_FlattenCurves.Checked)
            {
                m_ras.add_path(m_shape);
            }
            else
            {
                m_ras.add_path(m_path);
            }

            scanlineRenderer.render_scanlines_aa_solid(clippingProxy, m_ras, m_sl, new RGBA_Floats(0.6, 0.9, 0.7, 0.8).GetAsRGBA_Bytes());

            graphics2D.DrawString(string.Format("{0:F2} ms", tm), 140, 30);
            base.OnDraw(graphics2D);
        }
Beispiel #15
0
        public override void OnDraw(Graphics2D graphics2D)
        {
            ImageBuffer widgetsSubImage = ImageBuffer.NewSubImageReference(graphics2D.DestImage, graphics2D.GetClippingRect());

            IImageByte backBuffer = widgetsSubImage;

            IImageByte destImage = backBuffer;
            ImageClippingProxy clippingProxy = new ImageClippingProxy(destImage);
            clippingProxy.clear(new RGBA_Floats(0, 0, 0));

            ScanlineRasterizer ras = new ScanlineRasterizer();
            scanline_unpacked_8 sl = new scanline_unpacked_8();
            scanline_bin sl_bin = new scanline_bin();

            rasterizer_compound_aa rasc = new rasterizer_compound_aa();
            span_allocator alloc = new span_allocator();

            int i;
            styles_gouraud styles = new styles_gouraud(m_mesh, m_gamma);
            stopwatch.Restart();
            rasc.reset();
            //rasc.clip_box(40, 40, width() - 40, height() - 40);
            for (i = 0; i < m_mesh.num_edges(); i++)
            {
                mesh_edge e = m_mesh.edge(i);
                mesh_point p1 = m_mesh.vertex(e.p1);
                mesh_point p2 = m_mesh.vertex(e.p2);
                rasc.styles(e.tl, e.tr);
                rasc.move_to_d(p1.x, p1.y);
                rasc.line_to_d(p2.x, p2.y);
            }

            ScanlineRenderer scanlineRenderer = new ScanlineRenderer();
            scanlineRenderer.RenderCompound(rasc, sl, sl_bin, clippingProxy, alloc, styles);
            double tm = stopwatch.ElapsedMilliseconds;

            gsv_text t = new gsv_text();
            t.SetFontSize(10.0);

            Stroke pt = new Stroke(t);
            pt.width(1.5);
            pt.line_cap(LineCap.Round);
            pt.line_join(LineJoin.Round);

            string buf = string.Format("{0:F2} ms, {1} triangles, {2:F0} tri/sec",
                tm,
                m_mesh.num_triangles(),
                m_mesh.num_triangles() / tm * 1000.0);
            t.start_point(10.0, 10.0);
            t.text(buf);

            ras.add_path(pt);
            scanlineRenderer.render_scanlines_aa_solid(clippingProxy, ras, sl, new RGBA_Bytes(255, 255, 255));


            if (m_gamma.GetGamma() != 1.0)
            {
                ((ImageBuffer)destImage).apply_gamma_inv(m_gamma);
            }

            base.OnDraw(graphics2D);
        }
Beispiel #16
0
        public override void OnDraw(Graphics2D graphics2D)
        {
            ImageBuffer widgetsSubImage = ImageBuffer.NewSubImageReference(graphics2D.DestImage, graphics2D.GetClippingRect());

            int width  = (int)widgetsSubImage.Width;
            int height = (int)widgetsSubImage.Height;

            if (numMasksSlider.Value != sliderValue)
            {
                generate_alpha_mask(width, height);
                sliderValue = numMasksSlider.Value;
            }

            rasterizer.SetVectorClipBox(0, 0, width, height);

            unsafe
            {
                alphaMaskImageBuffer.AttachBuffer(alphaByteArray, 0, width, height, width, 8, 1);

                MatterHackers.Agg.Image.AlphaMaskAdaptor imageAlphaMaskAdaptor = new MatterHackers.Agg.Image.AlphaMaskAdaptor(widgetsSubImage, alphaMask);
                ImageClippingProxy alphaMaskClippingProxy = new ImageClippingProxy(imageAlphaMaskAdaptor);
                ImageClippingProxy clippingProxy          = new ImageClippingProxy(widgetsSubImage);

                Affine transform = Affine.NewIdentity();
                transform *= Affine.NewTranslation(-lionShape.Center.x, -lionShape.Center.y);
                transform *= Affine.NewScaling(lionScale, lionScale);
                transform *= Affine.NewRotation(angle + Math.PI);
                transform *= Affine.NewSkewing(skewX / 1000.0, skewY / 1000.0);
                transform *= Affine.NewTranslation(Width / 2, Height / 2);

                clippingProxy.clear(new RGBA_Floats(1, 1, 1));

                ScanlineRenderer scanlineRenderer = new ScanlineRenderer();
                // draw a background to show how the mask is working better
                int RectWidth = 30;
                for (int i = 0; i < 40; i++)
                {
                    for (int j = 0; j < 40; j++)
                    {
                        if ((i + j) % 2 != 0)
                        {
                            VertexSource.RoundedRect rect = new VertexSource.RoundedRect(i * RectWidth, j * RectWidth, (i + 1) * RectWidth, (j + 1) * RectWidth, 0);
                            rect.normalize_radius();

                            // Drawing as an outline
                            rasterizer.add_path(rect);
                            scanlineRenderer.render_scanlines_aa_solid(clippingProxy, rasterizer, scanlineCache, new RGBA_Bytes(.9, .9, .9));
                        }
                    }
                }

                //int x, y;

                // Render the lion
                VertexSourceApplyTransform trans = new VertexSourceApplyTransform(lionShape.Path, transform);
                scanlineRenderer.RenderSolidAllPaths(alphaMaskClippingProxy, rasterizer, scanlineCache, trans, lionShape.Colors, lionShape.PathIndex, lionShape.NumPaths);

                /*
                 * // Render random Bresenham lines and markers
                 * agg::renderer_markers<amask_ren_type> m(r);
                 * for(i = 0; i < 50; i++)
                 * {
                 *  m.line_color(agg::rgba8(randGenerator.Next() & 0x7F,
                 *                          randGenerator.Next() & 0x7F,
                 *                          randGenerator.Next() & 0x7F,
                 *                          (randGenerator.Next() & 0x7F) + 0x7F));
                 *  m.fill_color(agg::rgba8(randGenerator.Next() & 0x7F,
                 *                          randGenerator.Next() & 0x7F,
                 *                          randGenerator.Next() & 0x7F,
                 *                          (randGenerator.Next() & 0x7F) + 0x7F));
                 *
                 *  m.line(m.coord(randGenerator.Next() % width), m.coord(randGenerator.Next() % height),
                 *         m.coord(randGenerator.Next() % width), m.coord(randGenerator.Next() % height));
                 *
                 *  m.marker(randGenerator.Next() % width, randGenerator.Next() % height, randGenerator.Next() % 10 + 5,
                 *           agg::marker_e(randGenerator.Next() % agg::end_of_markers));
                 * }
                 *
                 *
                 * // Render random anti-aliased lines
                 * double w = 5.0;
                 * agg::line_profile_aa profile;
                 * profile.width(w);
                 *
                 * typedef agg::renderer_outline_aa<amask_ren_type> renderer_type;
                 * renderer_type ren(r, profile);
                 *
                 * typedef agg::rasterizer_outline_aa<renderer_type> rasterizer_type;
                 * rasterizer_type ras(ren);
                 * ras.round_cap(true);
                 *
                 * for(i = 0; i < 50; i++)
                 * {
                 *  ren.Color = agg::rgba8(randGenerator.Next() & 0x7F,
                 *                       randGenerator.Next() & 0x7F,
                 *                       randGenerator.Next() & 0x7F,
                 *                       //255));
                 *                       (randGenerator.Next() & 0x7F) + 0x7F);
                 *  ras.move_to_d(randGenerator.Next() % width, randGenerator.Next() % height);
                 *  ras.line_to_d(randGenerator.Next() % width, randGenerator.Next() % height);
                 *  ras.render(false);
                 * }
                 *
                 *
                 * // Render random circles with gradient
                 * typedef agg::gradient_linear_color<color_type> grad_color;
                 * typedef agg::gradient_circle grad_func;
                 * typedef agg::span_interpolator_linear<> interpolator_type;
                 * typedef agg::span_gradient<color_type,
                 *                        interpolator_type,
                 *                        grad_func,
                 *                        grad_color> span_grad_type;
                 *
                 * agg::trans_affine grm;
                 * grad_func grf;
                 * grad_color grc(agg::rgba8(0,0,0), agg::rgba8(0,0,0));
                 * agg::ellipse ell;
                 * agg::span_allocator<color_type> sa;
                 * interpolator_type inter(grm);
                 * span_grad_type sg(inter, grf, grc, 0, 10);
                 * agg::renderer_scanline_aa<amask_ren_type,
                 *                        agg::span_allocator<color_type>,
                 *                        span_grad_type> rg(r, sa, sg);
                 * for(i = 0; i < 50; i++)
                 * {
                 *  x = randGenerator.Next() % width;
                 *  y = randGenerator.Next() % height;
                 *  double r = randGenerator.Next() % 10 + 5;
                 *  grm.reset();
                 *  grm *= agg::trans_affine_scaling(r / 10.0);
                 *  grm *= agg::trans_affine_translation(x, y);
                 *  grm.invert();
                 *  grc.colors(agg::rgba8(255, 255, 255, 0),
                 *             agg::rgba8(randGenerator.Next() & 0x7F,
                 *                        randGenerator.Next() & 0x7F,
                 *                        randGenerator.Next() & 0x7F,
                 *                        255));
                 *  sg.color_function(grc);
                 *  ell.init(x, y, r, r, 32);
                 *  g_rasterizer.add_path(ell);
                 *  agg::render_scanlines(g_rasterizer, g_scanline, rg);
                 * }
                 */

                //m_num_cb.Render(g_rasterizer, g_scanline, clippingProxy);
            }
            alphaMaskImageBuffer.DettachBuffer();
            base.OnDraw(graphics2D);
        }
Beispiel #17
0
        public override void OnDraw(Graphics2D graphics2D)
        {
            ImageBuffer widgetsSubImage = ImageBuffer.NewSubImageReference(graphics2D.DestImage, graphics2D.GetClippingRect());

            IImageByte backBuffer = widgetsSubImage;

            GammaLookUpTable    gamma         = new GammaLookUpTable(m_gamma.Value);
            IRecieveBlenderByte NormalBlender = new BlenderBGRA();
            IRecieveBlenderByte GammaBlender  = new BlenderGammaBGRA(gamma);
            ImageBuffer         rasterNormal  = new ImageBuffer();

            rasterNormal.Attach(backBuffer, NormalBlender);
            ImageBuffer rasterGamma = new ImageBuffer();

            rasterGamma.Attach(backBuffer, GammaBlender);
            ImageClippingProxy clippingProxyNormal = new ImageClippingProxy(rasterNormal);
            ImageClippingProxy clippingProxyGamma  = new ImageClippingProxy(rasterGamma);

            clippingProxyNormal.clear(m_white_on_black.Checked ? new RGBA_Floats(0, 0, 0) : new RGBA_Floats(1, 1, 1));

            ScanlineRasterizer   ras = new ScanlineRasterizer();
            ScanlineCachePacked8 sl  = new ScanlineCachePacked8();

            VertexSource.Ellipse e = new VertexSource.Ellipse();

            // TODO: If you drag the control circles below the bottom of the window we get an exception.  This does not happen in AGG.
            // It needs to be debugged.  Turning on clipping fixes it.  But standard agg works without clipping.  Could be a bigger problem than this.
            //ras.clip_box(0, 0, width(), height());

            // Render two "control" circles
            e.init(m_x[0], m_y[0], 3, 3, 16);
            ras.add_path(e);
            ScanlineRenderer scanlineRenderer = new ScanlineRenderer();

            scanlineRenderer.render_scanlines_aa_solid(clippingProxyNormal, ras, sl, new RGBA_Bytes(127, 127, 127));
            e.init(m_x[1], m_y[1], 3, 3, 16);
            ras.add_path(e);
            scanlineRenderer.render_scanlines_aa_solid(clippingProxyNormal, ras, sl, new RGBA_Bytes(127, 127, 127));

            double d = m_offset.Value;

            // Creating a rounded rectangle
            VertexSource.RoundedRect r = new VertexSource.RoundedRect(m_x[0] + d, m_y[0] + d, m_x[1] + d, m_y[1] + d, m_radius.Value);
            r.normalize_radius();

            // Drawing as an outline
            if (!m_DrawAsOutlineCheckBox.Checked)
            {
                Stroke p = new Stroke(r);
                p.width(1.0);
                ras.add_path(p);
            }
            else
            {
                ras.add_path(r);
            }

            scanlineRenderer.render_scanlines_aa_solid(clippingProxyGamma, ras, sl, m_white_on_black.Checked ? new RGBA_Bytes(255, 255, 255) : new RGBA_Bytes(0, 0, 0));

            base.OnDraw(graphics2D);
        }
Beispiel #18
0
        public override void OnDraw(Graphics2D graphics2D)
        {
            ImageBuffer widgetsSubImage = ImageBuffer.NewSubImageReference(graphics2D.DestImage, graphics2D.GetClippingRect());

            int width = (int)widgetsSubImage.Width;
            int height = (int)widgetsSubImage.Height;

            if (numMasksSlider.Value != sliderValue)
            {
                generate_alpha_mask(width, height);
                sliderValue = numMasksSlider.Value;
            }

            rasterizer.SetVectorClipBox(0, 0, width, height);

            unsafe
            {
                alphaMaskImageBuffer.AttachBuffer(alphaByteArray, 0, width, height, width, 8, 1);

                MatterHackers.Agg.Image.AlphaMaskAdaptor imageAlphaMaskAdaptor = new MatterHackers.Agg.Image.AlphaMaskAdaptor(widgetsSubImage, alphaMask);
                ImageClippingProxy alphaMaskClippingProxy = new ImageClippingProxy(imageAlphaMaskAdaptor);
                ImageClippingProxy clippingProxy = new ImageClippingProxy(widgetsSubImage);

                Affine transform = Affine.NewIdentity();
                transform *= Affine.NewTranslation(-lionShape.Center.x, -lionShape.Center.y);
                transform *= Affine.NewScaling(lionScale, lionScale);
                transform *= Affine.NewRotation(angle + Math.PI);
                transform *= Affine.NewSkewing(skewX / 1000.0, skewY / 1000.0);
                transform *= Affine.NewTranslation(Width / 2, Height / 2);

                clippingProxy.clear(new RGBA_Floats(1, 1, 1));

                ScanlineRenderer scanlineRenderer = new ScanlineRenderer();
                // draw a background to show how the mask is working better
                int RectWidth = 30;
                for (int i = 0; i < 40; i++)
                {
                    for (int j = 0; j < 40; j++)
                    {
                        if ((i + j) % 2 != 0)
                        {
                            VertexSource.RoundedRect rect = new VertexSource.RoundedRect(i * RectWidth, j * RectWidth, (i + 1) * RectWidth, (j + 1) * RectWidth, 0);
                            rect.normalize_radius();

                            // Drawing as an outline
                            rasterizer.add_path(rect);
                            scanlineRenderer.render_scanlines_aa_solid(clippingProxy, rasterizer, scanlineCache, new RGBA_Bytes(.9, .9, .9));
                        }
                    }
                }

                //int x, y;

                // Render the lion
                VertexSourceApplyTransform trans = new VertexSourceApplyTransform(lionShape.Path, transform);
                scanlineRenderer.RenderSolidAllPaths(alphaMaskClippingProxy, rasterizer, scanlineCache, trans, lionShape.Colors, lionShape.PathIndex, lionShape.NumPaths);

                /*
                // Render random Bresenham lines and markers
                agg::renderer_markers<amask_ren_type> m(r);
                for(i = 0; i < 50; i++)
                {
                    m.line_color(agg::rgba8(randGenerator.Next() & 0x7F, 
                                            randGenerator.Next() & 0x7F, 
                                            randGenerator.Next() & 0x7F, 
                                            (randGenerator.Next() & 0x7F) + 0x7F)); 
                    m.fill_color(agg::rgba8(randGenerator.Next() & 0x7F, 
                                            randGenerator.Next() & 0x7F, 
                                            randGenerator.Next() & 0x7F, 
                                            (randGenerator.Next() & 0x7F) + 0x7F));

                    m.line(m.coord(randGenerator.Next() % width), m.coord(randGenerator.Next() % height), 
                           m.coord(randGenerator.Next() % width), m.coord(randGenerator.Next() % height));

                    m.marker(randGenerator.Next() % width, randGenerator.Next() % height, randGenerator.Next() % 10 + 5,
                             agg::marker_e(randGenerator.Next() % agg::end_of_markers));
                }


                // Render random anti-aliased lines
                double w = 5.0;
                agg::line_profile_aa profile;
                profile.width(w);

                typedef agg::renderer_outline_aa<amask_ren_type> renderer_type;
                renderer_type ren(r, profile);

                typedef agg::rasterizer_outline_aa<renderer_type> rasterizer_type;
                rasterizer_type ras(ren);
                ras.round_cap(true);

                for(i = 0; i < 50; i++)
                {
                    ren.Color = agg::rgba8(randGenerator.Next() & 0x7F, 
                                         randGenerator.Next() & 0x7F, 
                                         randGenerator.Next() & 0x7F, 
                                         //255));
                                         (randGenerator.Next() & 0x7F) + 0x7F); 
                    ras.move_to_d(randGenerator.Next() % width, randGenerator.Next() % height);
                    ras.line_to_d(randGenerator.Next() % width, randGenerator.Next() % height);
                    ras.render(false);
                }


                // Render random circles with gradient
                typedef agg::gradient_linear_color<color_type> grad_color;
                typedef agg::gradient_circle grad_func;
                typedef agg::span_interpolator_linear<> interpolator_type;
                typedef agg::span_gradient<color_type, 
                                          interpolator_type, 
                                          grad_func, 
                                          grad_color> span_grad_type;

                agg::trans_affine grm;
                grad_func grf;
                grad_color grc(agg::rgba8(0,0,0), agg::rgba8(0,0,0));
                agg::ellipse ell;
                agg::span_allocator<color_type> sa;
                interpolator_type inter(grm);
                span_grad_type sg(inter, grf, grc, 0, 10);
                agg::renderer_scanline_aa<amask_ren_type, 
                                          agg::span_allocator<color_type>,
                                          span_grad_type> rg(r, sa, sg);
                for(i = 0; i < 50; i++)
                {
                    x = randGenerator.Next() % width;
                    y = randGenerator.Next() % height;
                    double r = randGenerator.Next() % 10 + 5;
                    grm.reset();
                    grm *= agg::trans_affine_scaling(r / 10.0);
                    grm *= agg::trans_affine_translation(x, y);
                    grm.invert();
                    grc.colors(agg::rgba8(255, 255, 255, 0),
                               agg::rgba8(randGenerator.Next() & 0x7F, 
                                          randGenerator.Next() & 0x7F, 
                                          randGenerator.Next() & 0x7F, 
                                          255));
                    sg.color_function(grc);
                    ell.init(x, y, r, r, 32);
                    g_rasterizer.add_path(ell);
                    agg::render_scanlines(g_rasterizer, g_scanline, rg);
                }
                 */

                //m_num_cb.Render(g_rasterizer, g_scanline, clippingProxy);
            }
            alphaMaskImageBuffer.DettachBuffer();
            base.OnDraw(graphics2D);
        }
Beispiel #19
0
        public override void OnDraw(Graphics2D graphics2D)
        {
            GammaLookUpTable gamma = new GammaLookUpTable(m_gamma.Value);
            IRecieveBlenderByte NormalBlender = new BlenderBGRA();
            IRecieveBlenderByte GammaBlender = new BlenderGammaBGRA(gamma);
            ImageBuffer rasterNormal = new ImageBuffer(NewGraphics2D().DestImage, NormalBlender);
            ImageBuffer rasterGamma = new ImageBuffer(NewGraphics2D().DestImage, GammaBlender);
            ImageClippingProxy clippingProxyNormal = new ImageClippingProxy(rasterNormal);
            ImageClippingProxy clippingProxyGamma = new ImageClippingProxy(rasterGamma);

            clippingProxyNormal.clear(new RGBA_Floats(0, 0, 0));

            ScanlineRasterizer ras = new ScanlineRasterizer();
            ScanlineCachePacked8 sl = new ScanlineCachePacked8();

            VertexSource.Ellipse e = new VertexSource.Ellipse();

            // TODO: If you drag the control circles below the bottom of the window we get an exception.  This does not happen in AGG.
            // It needs to be debugged.  Turning on clipping fixes it.  But standard agg works without clipping.  Could be a bigger problem than this.
            //ras.clip_box(0, 0, width(), height());

            // Render two "control" circles
            e.init(m_x[0], m_y[0], 3, 3, 16);
            ras.add_path(e);
            ScanlineRenderer scanlineRenderer = new ScanlineRenderer();
            scanlineRenderer.render_scanlines_aa_solid(clippingProxyNormal, ras, sl, new RGBA_Bytes(127, 127, 127));
            e.init(m_x[1], m_y[1], 3, 3, 16);
            ras.add_path(e);
            scanlineRenderer.render_scanlines_aa_solid(clippingProxyNormal, ras, sl, new RGBA_Bytes(127, 127, 127));

            // Creating a rounded rectangle
            VertexSource.RoundedRect r = new VertexSource.RoundedRect(m_x[0], m_y[0], m_x[1], m_y[1], 10);
            r.normalize_radius();

            // Drawing as an outline
                Stroke p = new Stroke(r);
                p.width(1.0);
                ras.add_path(p);

                //Renderer.RenderSolid(clippingProxyGamma, ras, sl, new RGBA_Bytes(0, 0, 0));
                scanlineRenderer.render_scanlines_aa_solid(clippingProxyGamma, ras, sl, new RGBA_Bytes(255, 1, 1));








            /*            
                    int i;

                    // radial line test
                    //-------------------------
                    dashed_line<rasterizer_type, 
                                renderer_scanline_type, 
                                scanline_type> dash(ras, ren_sl, sl);

                    double cx = width() / 2.0;
                    double cy = height() / 2.0;

                    ren_sl.color(agg::rgba(1.0, 1.0, 1.0, 0.2));
                    for(i = 180; i > 0; i--) 
                    {
                        double n = 2.0 * agg::pi * i / 180.0;
                        dash.draw(cx + min(cx, cy) * sin(n), cy + min(cx, cy) * cos(n),
                                  cx, cy, 
                                  1.0, (i < 90) ? i : 0.0);
                    }


                    typedef agg::gradient_x gradient_func_type;
                    typedef agg::span_interpolator_linear<> interpolator_type;
                    typedef agg::span_allocator<color_type> span_allocator_type;
                    typedef agg::pod_auto_array<color_type, 256> color_array_type;
                    typedef agg::span_gradient<color_type, 
                                               interpolator_type, 
                                               gradient_func_type, 
                                               color_array_type> span_gradient_type;

                    typedef agg::renderer_scanline_aa<renderer_base_type, 
                                                      span_allocator_type,
                                                      span_gradient_type> renderer_gradient_type;

                    gradient_func_type  gradient_func;                   // The gradient function
                    agg::trans_affine   gradient_mtx;                    // Affine transformer
                    interpolator_type   span_interpolator(gradient_mtx); // Span interpolator
                    span_allocator_type span_allocator;                  // Span Allocator
                    color_array_type    gradient_colors;                 // The gradient colors
                    span_gradient_type  span_gradient(span_interpolator, 
                                                      gradient_func, 
                                                      gradient_colors, 
                                                      0, 100);

                    renderer_gradient_type ren_gradient(ren_base, span_allocator, span_gradient);

                    dashed_line<rasterizer_type, 
                                renderer_gradient_type, 
                                scanline_type> dash_gradient(ras, ren_gradient, sl);

                    double x1, y1, x2, y2;

                    for(i = 1; i <= 20; i++)
                    {
                        ren_sl.color(agg::rgba(1,1,1));

                        // integral point sizes 1..20
                        //----------------
                        agg::ellipse ell;
            
                        ell.init(20 + i * (i + 1) + 0.5, 
                                 20.5, 
                                 i / 2.0, 
                                 i / 2.0, 
                                 8 + i);
                        ras.reset();
                        ras.add_path(ell);
                        agg::render_scanlines(ras, sl, ren_sl);
            

                        // fractional point sizes 0..2
                        //----------------
                        ell.init(18 + i * 4 + 0.5, 33 + 0.5, 
                                 i/20.0, i/20.0, 
                                 8);
                        ras.reset();
                        ras.add_path(ell);
                        agg::render_scanlines(ras, sl, ren_sl);


                        // fractional point positioning
                        //---------------
                        ell.init(18 + i * 4 + (i-1) / 10.0 + 0.5, 
                                 27 + (i - 1) / 10.0 + 0.5, 
                                 0.5, 0.5, 8);
                        ras.reset();
                        ras.add_path(ell);
                        agg::render_scanlines(ras, sl, ren_sl);


                        // integral line widths 1..20
                        //----------------
                        fill_color_array(gradient_colors, 
                                         agg::rgba(1,1,1), 
                                         agg::rgba(i % 2, (i % 3) * 0.5, (i % 5) * 0.25));

                        x1 = 20 + i* (i + 1);
                        y1 = 40.5;
                        x2 = 20 + i * (i + 1) + (i - 1) * 4;
                        y2 = 100.5;
                        calc_linear_gradient_transform(x1, y1, x2, y2, gradient_mtx);
                        dash_gradient.draw(x1, y1, x2, y2, i, 0);


                        fill_color_array(gradient_colors, 
                                         agg::rgba(1,0,0), 
                                         agg::rgba(0,0,1));

                        // fractional line lengths H (red/blue)
                        //----------------
                        x1 = 17.5 + i * 4;
                        y1 = 107;
                        x2 = 17.5 + i * 4 + i/6.66666667;
                        y2 = 107;
                        calc_linear_gradient_transform(x1, y1, x2, y2, gradient_mtx);
                        dash_gradient.draw(x1, y1, x2, y2, 1.0, 0);


                        // fractional line lengths V (red/blue)
                        //---------------
                        x1 = 18 + i * 4;
                        y1 = 112.5;
                        x2 = 18 + i * 4;
                        y2 = 112.5 + i / 6.66666667;
                        calc_linear_gradient_transform(x1, y1, x2, y2, gradient_mtx);
                        dash_gradient.draw(x1, y1, x2, y2, 1.0, 0);

                        // fractional line positioning (red)
                        //---------------
                        fill_color_array(gradient_colors, 
                                         agg::rgba(1,0,0), 
                                         agg::rgba(1,1,1));
                        x1 = 21.5;
                        y1 = 120 + (i - 1) * 3.1;
                        x2 = 52.5;
                        y2 = 120 + (i - 1) * 3.1;
                        calc_linear_gradient_transform(x1, y1, x2, y2, gradient_mtx);
                        dash_gradient.draw(x1, y1, x2, y2, 1.0, 0);


                        // fractional line width 2..0 (green)
                        fill_color_array(gradient_colors, 
                                         agg::rgba(0,1,0), 
                                         agg::rgba(1,1,1));
                        x1 = 52.5;
                        y1 = 118 + i * 3;
                        x2 = 83.5;
                        y2 = 118 + i * 3;
                        calc_linear_gradient_transform(x1, y1, x2, y2, gradient_mtx);
                        dash_gradient.draw(x1, y1, x2, y2, 2.0 - (i - 1) / 10.0, 0);

                        // stippled fractional width 2..0 (blue)
                        fill_color_array(gradient_colors, 
                                         agg::rgba(0,0,1), 
                                         agg::rgba(1,1,1));
                        x1 = 83.5;
                        y1 = 119 + i * 3;
                        x2 = 114.5;
                        y2 = 119 + i * 3;
                        calc_linear_gradient_transform(x1, y1, x2, y2, gradient_mtx);
                        dash_gradient.draw(x1, y1, x2, y2, 2.0 - (i - 1) / 10.0, 3.0);


                        ren_sl.color(agg::rgba(1,1,1));
                        if(i <= 10)
                        {
                            // integral line width, horz aligned (mipmap test)
                            //-------------------
                            dash.draw(125.5, 119.5 + (i + 2) * (i / 2.0),
                                      135.5, 119.5 + (i + 2) * (i / 2.0),
                                      i, 0.0);
                        }

                        // fractional line width 0..2, 1 px H
                        //-----------------
                        dash.draw(17.5 + i * 4, 192, 18.5 + i * 4, 192, i / 10.0, 0);

                        // fractional line positioning, 1 px H
                        //-----------------
                        dash.draw(17.5 + i * 4 + (i - 1) / 10.0, 186, 
                                  18.5 + i * 4 + (i - 1) / 10.0, 186,
                                  1.0, 0);
                    }


                    // Triangles
                    //---------------
                    for (int i = 1; i <= 13; i++) 
                    {
                        fill_color_array(gradient_colors, 
                                         agg::rgba(1,1,1), 
                                         agg::rgba(i % 2, (i % 3) * 0.5, (i % 5) * 0.25));
                        calc_linear_gradient_transform(width()  - 150, 
                                                       height() - 20 - i * (i + 1.5),
                                                       width()  - 20,  
                                                       height() - 20 - i * (i + 1),
                                                       gradient_mtx);
                        ras.reset();
                        ras.move_to_d(width() - 150, height() - 20 - i * (i + 1.5));
                        ras.line_to_d(width() - 20,  height() - 20 - i * (i + 1));
                        ras.line_to_d(width() - 20,  height() - 20 - i * (i + 2));
                        agg::render_scanlines(ras, sl, ren_gradient);
                    }
             */










            base.OnDraw(graphics2D);
        }
Beispiel #20
0
        public override void OnDraw(Graphics2D graphics2D)
        {
            GammaLookUpTable    gamma               = new GammaLookUpTable(m_gamma.Value);
            IRecieveBlenderByte NormalBlender       = new BlenderBGRA();
            IRecieveBlenderByte GammaBlender        = new BlenderGammaBGRA(gamma);
            ImageBuffer         rasterNormal        = new ImageBuffer(NewGraphics2D().DestImage, NormalBlender);
            ImageBuffer         rasterGamma         = new ImageBuffer(NewGraphics2D().DestImage, GammaBlender);
            ImageClippingProxy  clippingProxyNormal = new ImageClippingProxy(rasterNormal);
            ImageClippingProxy  clippingProxyGamma  = new ImageClippingProxy(rasterGamma);

            clippingProxyNormal.clear(new RGBA_Floats(0, 0, 0));

            ScanlineRasterizer   ras = new ScanlineRasterizer();
            ScanlineCachePacked8 sl  = new ScanlineCachePacked8();

            VertexSource.Ellipse e = new VertexSource.Ellipse();

            // TODO: If you drag the control circles below the bottom of the window we get an exception.  This does not happen in AGG.
            // It needs to be debugged.  Turning on clipping fixes it.  But standard agg works without clipping.  Could be a bigger problem than this.
            //ras.clip_box(0, 0, width(), height());

            // Render two "control" circles
            e.init(m_x[0], m_y[0], 3, 3, 16);
            ras.add_path(e);
            ScanlineRenderer scanlineRenderer = new ScanlineRenderer();

            scanlineRenderer.render_scanlines_aa_solid(clippingProxyNormal, ras, sl, new RGBA_Bytes(127, 127, 127));
            e.init(m_x[1], m_y[1], 3, 3, 16);
            ras.add_path(e);
            scanlineRenderer.render_scanlines_aa_solid(clippingProxyNormal, ras, sl, new RGBA_Bytes(127, 127, 127));

            // Creating a rounded rectangle
            VertexSource.RoundedRect r = new VertexSource.RoundedRect(m_x[0], m_y[0], m_x[1], m_y[1], 10);
            r.normalize_radius();

            // Drawing as an outline
            Stroke p = new Stroke(r);

            p.width(1.0);
            ras.add_path(p);

            //Renderer.RenderSolid(clippingProxyGamma, ras, sl, new RGBA_Bytes(0, 0, 0));
            scanlineRenderer.render_scanlines_aa_solid(clippingProxyGamma, ras, sl, new RGBA_Bytes(255, 1, 1));



            /*
             *      int i;
             *
             *      // radial line test
             *      //-------------------------
             *      dashed_line<rasterizer_type,
             *                  renderer_scanline_type,
             *                  scanline_type> dash(ras, ren_sl, sl);
             *
             *      double cx = width() / 2.0;
             *      double cy = height() / 2.0;
             *
             *      ren_sl.color(agg::rgba(1.0, 1.0, 1.0, 0.2));
             *      for(i = 180; i > 0; i--)
             *      {
             *          double n = 2.0 * agg::pi * i / 180.0;
             *          dash.draw(cx + min(cx, cy) * sin(n), cy + min(cx, cy) * cos(n),
             *                    cx, cy,
             *                    1.0, (i < 90) ? i : 0.0);
             *      }
             *
             *
             *      typedef agg::gradient_x gradient_func_type;
             *      typedef agg::span_interpolator_linear<> interpolator_type;
             *      typedef agg::span_allocator<color_type> span_allocator_type;
             *      typedef agg::pod_auto_array<color_type, 256> color_array_type;
             *      typedef agg::span_gradient<color_type,
             *                                 interpolator_type,
             *                                 gradient_func_type,
             *                                 color_array_type> span_gradient_type;
             *
             *      typedef agg::renderer_scanline_aa<renderer_base_type,
             *                                        span_allocator_type,
             *                                        span_gradient_type> renderer_gradient_type;
             *
             *      gradient_func_type  gradient_func;                   // The gradient function
             *      agg::trans_affine   gradient_mtx;                    // Affine transformer
             *      interpolator_type   span_interpolator(gradient_mtx); // Span interpolator
             *      span_allocator_type span_allocator;                  // Span Allocator
             *      color_array_type    gradient_colors;                 // The gradient colors
             *      span_gradient_type  span_gradient(span_interpolator,
             *                                        gradient_func,
             *                                        gradient_colors,
             *                                        0, 100);
             *
             *      renderer_gradient_type ren_gradient(ren_base, span_allocator, span_gradient);
             *
             *      dashed_line<rasterizer_type,
             *                  renderer_gradient_type,
             *                  scanline_type> dash_gradient(ras, ren_gradient, sl);
             *
             *      double x1, y1, x2, y2;
             *
             *      for(i = 1; i <= 20; i++)
             *      {
             *          ren_sl.color(agg::rgba(1,1,1));
             *
             *          // integral point sizes 1..20
             *          //----------------
             *          agg::ellipse ell;
             *
             *          ell.init(20 + i * (i + 1) + 0.5,
             *                   20.5,
             *                   i / 2.0,
             *                   i / 2.0,
             *                   8 + i);
             *          ras.reset();
             *          ras.add_path(ell);
             *          agg::render_scanlines(ras, sl, ren_sl);
             *
             *
             *          // fractional point sizes 0..2
             *          //----------------
             *          ell.init(18 + i * 4 + 0.5, 33 + 0.5,
             *                   i/20.0, i/20.0,
             *                   8);
             *          ras.reset();
             *          ras.add_path(ell);
             *          agg::render_scanlines(ras, sl, ren_sl);
             *
             *
             *          // fractional point positioning
             *          //---------------
             *          ell.init(18 + i * 4 + (i-1) / 10.0 + 0.5,
             *                   27 + (i - 1) / 10.0 + 0.5,
             *                   0.5, 0.5, 8);
             *          ras.reset();
             *          ras.add_path(ell);
             *          agg::render_scanlines(ras, sl, ren_sl);
             *
             *
             *          // integral line widths 1..20
             *          //----------------
             *          fill_color_array(gradient_colors,
             *                           agg::rgba(1,1,1),
             *                           agg::rgba(i % 2, (i % 3) * 0.5, (i % 5) * 0.25));
             *
             *          x1 = 20 + i* (i + 1);
             *          y1 = 40.5;
             *          x2 = 20 + i * (i + 1) + (i - 1) * 4;
             *          y2 = 100.5;
             *          calc_linear_gradient_transform(x1, y1, x2, y2, gradient_mtx);
             *          dash_gradient.draw(x1, y1, x2, y2, i, 0);
             *
             *
             *          fill_color_array(gradient_colors,
             *                           agg::rgba(1,0,0),
             *                           agg::rgba(0,0,1));
             *
             *          // fractional line lengths H (red/blue)
             *          //----------------
             *          x1 = 17.5 + i * 4;
             *          y1 = 107;
             *          x2 = 17.5 + i * 4 + i/6.66666667;
             *          y2 = 107;
             *          calc_linear_gradient_transform(x1, y1, x2, y2, gradient_mtx);
             *          dash_gradient.draw(x1, y1, x2, y2, 1.0, 0);
             *
             *
             *          // fractional line lengths V (red/blue)
             *          //---------------
             *          x1 = 18 + i * 4;
             *          y1 = 112.5;
             *          x2 = 18 + i * 4;
             *          y2 = 112.5 + i / 6.66666667;
             *          calc_linear_gradient_transform(x1, y1, x2, y2, gradient_mtx);
             *          dash_gradient.draw(x1, y1, x2, y2, 1.0, 0);
             *
             *          // fractional line positioning (red)
             *          //---------------
             *          fill_color_array(gradient_colors,
             *                           agg::rgba(1,0,0),
             *                           agg::rgba(1,1,1));
             *          x1 = 21.5;
             *          y1 = 120 + (i - 1) * 3.1;
             *          x2 = 52.5;
             *          y2 = 120 + (i - 1) * 3.1;
             *          calc_linear_gradient_transform(x1, y1, x2, y2, gradient_mtx);
             *          dash_gradient.draw(x1, y1, x2, y2, 1.0, 0);
             *
             *
             *          // fractional line width 2..0 (green)
             *          fill_color_array(gradient_colors,
             *                           agg::rgba(0,1,0),
             *                           agg::rgba(1,1,1));
             *          x1 = 52.5;
             *          y1 = 118 + i * 3;
             *          x2 = 83.5;
             *          y2 = 118 + i * 3;
             *          calc_linear_gradient_transform(x1, y1, x2, y2, gradient_mtx);
             *          dash_gradient.draw(x1, y1, x2, y2, 2.0 - (i - 1) / 10.0, 0);
             *
             *          // stippled fractional width 2..0 (blue)
             *          fill_color_array(gradient_colors,
             *                           agg::rgba(0,0,1),
             *                           agg::rgba(1,1,1));
             *          x1 = 83.5;
             *          y1 = 119 + i * 3;
             *          x2 = 114.5;
             *          y2 = 119 + i * 3;
             *          calc_linear_gradient_transform(x1, y1, x2, y2, gradient_mtx);
             *          dash_gradient.draw(x1, y1, x2, y2, 2.0 - (i - 1) / 10.0, 3.0);
             *
             *
             *          ren_sl.color(agg::rgba(1,1,1));
             *          if(i <= 10)
             *          {
             *              // integral line width, horz aligned (mipmap test)
             *              //-------------------
             *              dash.draw(125.5, 119.5 + (i + 2) * (i / 2.0),
             *                        135.5, 119.5 + (i + 2) * (i / 2.0),
             *                        i, 0.0);
             *          }
             *
             *          // fractional line width 0..2, 1 px H
             *          //-----------------
             *          dash.draw(17.5 + i * 4, 192, 18.5 + i * 4, 192, i / 10.0, 0);
             *
             *          // fractional line positioning, 1 px H
             *          //-----------------
             *          dash.draw(17.5 + i * 4 + (i - 1) / 10.0, 186,
             *                    18.5 + i * 4 + (i - 1) / 10.0, 186,
             *                    1.0, 0);
             *      }
             *
             *
             *      // Triangles
             *      //---------------
             *      for (int i = 1; i <= 13; i++)
             *      {
             *          fill_color_array(gradient_colors,
             *                           agg::rgba(1,1,1),
             *                           agg::rgba(i % 2, (i % 3) * 0.5, (i % 5) * 0.25));
             *          calc_linear_gradient_transform(width()  - 150,
             *                                         height() - 20 - i * (i + 1.5),
             *                                         width()  - 20,
             *                                         height() - 20 - i * (i + 1),
             *                                         gradient_mtx);
             *          ras.reset();
             *          ras.move_to_d(width() - 150, height() - 20 - i * (i + 1.5));
             *          ras.line_to_d(width() - 20,  height() - 20 - i * (i + 1));
             *          ras.line_to_d(width() - 20,  height() - 20 - i * (i + 2));
             *          agg::render_scanlines(ras, sl, ren_gradient);
             *      }
             */



            base.OnDraw(graphics2D);
        }
Beispiel #21
0
        public override void OnDraw(Graphics2D graphics2D)
        {
            ImageBuffer widgetsSubImage = ImageBuffer.NewSubImageReference(graphics2D.DestImage, graphics2D.GetClippingRect());

            if (!didInit)
            {
                didInit = true;
                OnInitialize();
            }

            if (m_gamma.Value != m_old_gamma)
            {
                m_gamma_lut.SetGamma(m_gamma.Value);
                ImageIO.LoadImageData("spheres.bmp", m_SourceImage);
                //m_SourceImage.apply_gamma_dir(m_gamma_lut);
                m_old_gamma = m_gamma.Value;
            }

            ImageBuffer pixf = new ImageBuffer();

            switch (widgetsSubImage.BitDepth)
            {
            case 24:
                pixf.Attach(widgetsSubImage, new BlenderBGR());
                break;

            case 32:
                pixf.Attach(widgetsSubImage, new BlenderBGRA());
                break;

            default:
                throw new NotImplementedException();
            }

            ImageClippingProxy clippingProxy = new ImageClippingProxy(pixf);

            clippingProxy.clear(new RGBA_Floats(1, 1, 1));

            if (m_trans_type.SelectedIndex < 2)
            {
                // For the affine parallelogram transformations we
                // calculate the 4-th (implicit) point of the parallelogram
                m_quad.SetXN(3, m_quad.GetXN(0) + (m_quad.GetXN(2) - m_quad.GetXN(1)));
                m_quad.SetYN(3, m_quad.GetYN(0) + (m_quad.GetYN(2) - m_quad.GetYN(1)));
            }

            ScanlineRenderer scanlineRenderer = new ScanlineRenderer();
            // draw a background to show how the alpha is working
            int RectWidth = 70;
            int xoffset   = 50;
            int yoffset   = 50;

            for (int i = 0; i < 7; i++)
            {
                for (int j = 0; j < 7; j++)
                {
                    if ((i + j) % 2 != 0)
                    {
                        VertexSource.RoundedRect rect = new VertexSource.RoundedRect(i * RectWidth + xoffset, j * RectWidth + yoffset,
                                                                                     (i + 1) * RectWidth + xoffset, (j + 1) * RectWidth + yoffset, 2);
                        rect.normalize_radius();

                        g_rasterizer.add_path(rect);
                        scanlineRenderer.render_scanlines_aa_solid(clippingProxy, g_rasterizer, g_scanline, new RGBA_Bytes(.2, .2, .2));
                    }
                }
            }

            //--------------------------
            // Render the "quad" tool and controls
            g_rasterizer.add_path(m_quad);
            scanlineRenderer.render_scanlines_aa_solid(clippingProxy, g_rasterizer, g_scanline, new RGBA_Bytes(0, 0.3, 0.5, 0.1));

            // Prepare the polygon to rasterize. Here we need to fill
            // the destination (transformed) polygon.
            g_rasterizer.SetVectorClipBox(0, 0, Width, Height);
            g_rasterizer.reset();
            int b = 0;

            g_rasterizer.move_to_d(m_quad.GetXN(0) - b, m_quad.GetYN(0) - b);
            g_rasterizer.line_to_d(m_quad.GetXN(1) + b, m_quad.GetYN(1) - b);
            g_rasterizer.line_to_d(m_quad.GetXN(2) + b, m_quad.GetYN(2) + b);
            g_rasterizer.line_to_d(m_quad.GetXN(3) - b, m_quad.GetYN(3) + b);

            //typedef agg::span_allocator<color_type> span_alloc_type;
            span_allocator         sa            = new span_allocator();
            image_filter_bilinear  filter_kernel = new image_filter_bilinear();
            ImageFilterLookUpTable filter        = new ImageFilterLookUpTable(filter_kernel, true);

            ImageBufferAccessorClamp source = new ImageBufferAccessorClamp(m_SourceImage);

            stopwatch.Restart();

            switch (m_trans_type.SelectedIndex)
            {
            case 0:
            {
                /*
                 *      agg::trans_affine tr(m_quad.polygon(), g_x1, g_y1, g_x2, g_y2);
                 *
                 *      typedef agg::span_interpolator_linear<agg::trans_affine> interpolator_type;
                 *      interpolator_type interpolator(tr);
                 *
                 *      typedef image_filter_2x2_type<source_type,
                 *                                    interpolator_type> span_gen_type;
                 *      span_gen_type sg(source, interpolator, filter);
                 *      agg::render_scanlines_aa(g_rasterizer, g_scanline, rb_pre, sa, sg);
                 */
                break;
            }

            case 1:
            {
                /*
                 *      agg::trans_affine tr(m_quad.polygon(), g_x1, g_y1, g_x2, g_y2);
                 *
                 *      typedef agg::span_interpolator_linear<agg::trans_affine> interpolator_type;
                 *      typedef image_resample_affine_type<source_type> span_gen_type;
                 *
                 *      interpolator_type interpolator(tr);
                 *      span_gen_type sg(source, interpolator, filter);
                 *      sg.blur(m_blur.Value);
                 *      agg::render_scanlines_aa(g_rasterizer, g_scanline, rb_pre, sa, sg);
                 */
                break;
            }

            case 2:
            {
                /*
                 *      agg::trans_perspective tr(m_quad.polygon(), g_x1, g_y1, g_x2, g_y2);
                 *      if(tr.is_valid())
                 *      {
                 *          typedef agg::span_interpolator_linear_subdiv<agg::trans_perspective> interpolator_type;
                 *          interpolator_type interpolator(tr);
                 *
                 *          typedef image_filter_2x2_type<source_type,
                 *                                        interpolator_type> span_gen_type;
                 *          span_gen_type sg(source, interpolator, filter);
                 *          agg::render_scanlines_aa(g_rasterizer, g_scanline, rb_pre, sa, sg);
                 *      }
                 */
                break;
            }

            case 3:
            {
                /*
                 *      agg::trans_perspective tr(m_quad.polygon(), g_x1, g_y1, g_x2, g_y2);
                 *      if(tr.is_valid())
                 *      {
                 *          typedef agg::span_interpolator_trans<agg::trans_perspective> interpolator_type;
                 *          interpolator_type interpolator(tr);
                 *
                 *          typedef image_filter_2x2_type<source_type,
                 *                                        interpolator_type> span_gen_type;
                 *          span_gen_type sg(source, interpolator, filter);
                 *          agg::render_scanlines_aa(g_rasterizer, g_scanline, rb_pre, sa, sg);
                 *      }
                 */
                break;
            }

            case 4:
            {
                //typedef agg::span_interpolator_persp_lerp<> interpolator_type;
                //typedef agg::span_subdiv_adaptor<interpolator_type> subdiv_adaptor_type;

                span_interpolator_persp_lerp interpolator   = new span_interpolator_persp_lerp(m_quad.polygon(), g_x1, g_y1, g_x2, g_y2);
                span_subdiv_adaptor          subdiv_adaptor = new span_subdiv_adaptor(interpolator);

                span_image_resample sg = null;
                if (interpolator.is_valid())
                {
                    switch (source.SourceImage.BitDepth)
                    {
                    case 24:
                        sg = new span_image_resample_rgb(source, subdiv_adaptor, filter);
                        break;

                    case 32:
                        sg = new span_image_resample_rgba(source, subdiv_adaptor, filter);
                        break;
                    }

                    sg.blur(m_blur.Value);
                    scanlineRenderer.GenerateAndRender(g_rasterizer, g_scanline, clippingProxy, sa, sg);
                }
                break;
            }

            case 5:
            {
                /*
                 *      typedef agg::span_interpolator_persp_exact<> interpolator_type;
                 *      typedef agg::span_subdiv_adaptor<interpolator_type> subdiv_adaptor_type;
                 *
                 *      interpolator_type interpolator(m_quad.polygon(), g_x1, g_y1, g_x2, g_y2);
                 *      subdiv_adaptor_type subdiv_adaptor(interpolator);
                 *
                 *      if(interpolator.is_valid())
                 *      {
                 *          typedef image_resample_type<source_type,
                 *                                      subdiv_adaptor_type> span_gen_type;
                 *          span_gen_type sg(source, subdiv_adaptor, filter);
                 *          sg.blur(m_blur.Value);
                 *          agg::render_scanlines_aa(g_rasterizer, g_scanline, rb_pre, sa, sg);
                 *      }
                 */
                break;
            }
            }

            double tm = stopwatch.ElapsedMilliseconds;
            //pixf.apply_gamma_inv(m_gamma_lut);

            gsv_text t = new gsv_text();

            t.SetFontSize(10.0);

            Stroke pt = new Stroke(t);

            pt.width(1.5);

            string buf = string.Format("{0:F2} ms", tm);

            t.start_point(10.0, 70.0);
            t.text(buf);

            g_rasterizer.add_path(pt);
            scanlineRenderer.render_scanlines_aa_solid(clippingProxy, g_rasterizer, g_scanline, new RGBA_Bytes(0, 0, 0));

            //--------------------------
            //m_trans_type.Render(g_rasterizer, g_scanline, clippingProxy);
            //m_gamma.Render(g_rasterizer, g_scanline, clippingProxy);
            //m_blur.Render(g_rasterizer, g_scanline, clippingProxy);
            base.OnDraw(graphics2D);
        }
Beispiel #22
0
		private void DrawBigA(Graphics2D graphics2D)
		{
			ScanlineRasterizer m_ras = new ScanlineRasterizer();
			m_ras.SetVectorClipBox(0, 0, Width, Height);
			TypeFacePrinter bigAPrinter = new TypeFacePrinter("a", 150);
			FlattenCurves flattenedBigA = new FlattenCurves(bigAPrinter);
			VertexSourceApplyTransform scaleAndTranslate = new VertexSourceApplyTransform(flattenedBigA, Affine.NewTranslation(155, 55));
			ScanlineCachePacked8 m_sl = new ScanlineCachePacked8();
			ScanlineRenderer scanlineRenderer = new ScanlineRenderer();

#if false
            ImageProxySubpxelLcd24 clippingProxy = new ImageProxySubpxelLcd24(graphics2D.DestImage, new lcd_distribution_lut());
            VertexSourceApplyTransform scaledWide = new VertexSourceApplyTransform(scaleAndTranslate, Affine.NewScaling(3, 1));
            m_ras.add_path(scaledWide);
            scanlineRenderer.render_scanlines_aa_solid(clippingProxy, m_ras, m_sl, RGBA_Bytes.Black);
#else
			m_ras.add_path(scaleAndTranslate);
			ImageClippingProxy clippingProxy = new ImageClippingProxy(graphics2D.DestImage);
			scanlineRenderer.RenderSolid(clippingProxy, m_ras, m_sl, RGBA_Bytes.Black);
#endif
		}
Beispiel #23
0
        public override void OnDraw(Graphics2D graphics2D)
        {
            ImageBuffer        widgetsSubImage = ImageBuffer.NewSubImageReference(graphics2D.DestImage, graphics2D.GetClippingRect());
            ImageClippingProxy clippingProxy   = new ImageClippingProxy(widgetsSubImage);

            clippingProxy.clear(new RGBA_Floats(1, 1, 1));
            m_ras.SetVectorClipBox(0, 0, Width, Height);

            Affine move = Affine.NewTranslation(10, 10);

            Perspective shadow_persp = new Perspective(m_shape_bounds.Left, m_shape_bounds.Bottom,
                                                       m_shape_bounds.Right, m_shape_bounds.Top,
                                                       m_shadow_ctrl.polygon());

            IVertexSource shadow_trans;

            if (m_FlattenCurves.Checked)
            {
                shadow_trans = new VertexSourceApplyTransform(m_shape, shadow_persp);
            }
            else
            {
                shadow_trans = new VertexSourceApplyTransform(m_path, shadow_persp);
                // this will make it very smooth after the transform
                //shadow_trans = new conv_curve(shadow_trans);
            }


            // Render shadow
            m_ras.add_path(shadow_trans);
            ScanlineRenderer scanlineRenderer = new ScanlineRenderer();

            scanlineRenderer.render_scanlines_aa_solid(clippingProxy, m_ras, m_sl, new RGBA_Floats(0.2, 0.3, 0).GetAsRGBA_Bytes());

            // Calculate the bounding box and extend it by the blur radius
            RectangleDouble bbox = new RectangleDouble();

            bounding_rect.bounding_rect_single(shadow_trans, 0, ref bbox);

            bbox.Left   -= m_radius.Value;
            bbox.Bottom -= m_radius.Value;
            bbox.Right  += m_radius.Value;
            bbox.Top    += m_radius.Value;

            if (m_method.SelectedIndex == 1)
            {
                // The recursive blur method represents the true Gaussian Blur,
                // with theoretically infinite kernel. The restricted window size
                // results in extra influence of edge pixels. It's impossible to
                // solve correctly, but extending the right and top areas to another
                // radius value produces fair result.
                //------------------
                bbox.Right += m_radius.Value;
                bbox.Top   += m_radius.Value;
            }

            stopwatch.Restart();

            if (m_method.SelectedIndex != 2)
            {
                // Create a new pixel renderer and attach it to the main one as a child image.
                // It returns true if the attachment succeeded. It fails if the rectangle
                // (bbox) is fully clipped.
                //------------------
#if SourceDepth24
                ImageBuffer image2 = new ImageBuffer(new BlenderBGR());
#else
                ImageBuffer image2 = new ImageBuffer(new BlenderBGRA());
#endif
                if (image2.Attach(widgetsSubImage, (int)bbox.Left, (int)bbox.Bottom, (int)bbox.Right, (int)bbox.Top))
                {
                    // Blur it
                    if (m_method.SelectedIndex == 0)
                    {
                        // More general method, but 30-40% slower.
                        //------------------
                        //m_stack_blur.blur(pixf2, agg::uround(m_radius.Value));

                        // Faster, but bore specific.
                        // Works only for 8 bits per channel and only with radii <= 254.
                        //------------------
                        stack_blur test = new stack_blur();
                        test.Blur(image2, agg_basics.uround(m_radius.Value), agg_basics.uround(m_radius.Value));
                    }
                    else
                    {
                        // True Gaussian Blur, 3-5 times slower than Stack Blur,
                        // but still constant time of radius. Very sensitive
                        // to precision, doubles are must here.
                        //------------------
                        m_recursive_blur.blur(image2, m_radius.Value);
                    }
                }
            }
            else
            {
                /*
                 * // Blur separate channels
                 * //------------------
                 * if(m_channel_r.Checked)
                 * {
                 *  typedef agg::pixfmt_alpha_blend_gray<
                 *      agg::blender_gray8,
                 *      agg::rendering_buffer,
                 *      3, 2> pixfmt_gray8r;
                 *
                 *  pixfmt_gray8r pixf2r(m_rbuf2);
                 *  if(pixf2r.attach(pixf, int(bbox.x1), int(bbox.y1), int(bbox.x2), int(bbox.y2)))
                 *  {
                 *      agg::stack_blur_gray8(pixf2r, agg::uround(m_radius.Value),
                 *                                    agg::uround(m_radius.Value));
                 *  }
                 * }
                 *
                 * if(m_channel_g.Checked)
                 * {
                 *  typedef agg::pixfmt_alpha_blend_gray<
                 *      agg::blender_gray8,
                 *      agg::rendering_buffer,
                 *      3, 1> pixfmt_gray8g;
                 *
                 *  pixfmt_gray8g pixf2g(m_rbuf2);
                 *  if(pixf2g.attach(pixf, int(bbox.x1), int(bbox.y1), int(bbox.x2), int(bbox.y2)))
                 *  {
                 *      agg::stack_blur_gray8(pixf2g, agg::uround(m_radius.Value),
                 *                                    agg::uround(m_radius.Value));
                 *  }
                 * }
                 *
                 * if(m_channel_b.Checked)
                 * {
                 *  typedef agg::pixfmt_alpha_blend_gray<
                 *      agg::blender_gray8,
                 *      agg::rendering_buffer,
                 *      3, 0> pixfmt_gray8b;
                 *
                 *  pixfmt_gray8b pixf2b(m_rbuf2);
                 *  if(pixf2b.attach(pixf, int(bbox.x1), int(bbox.y1), int(bbox.x2), int(bbox.y2)))
                 *  {
                 *      agg::stack_blur_gray8(pixf2b, agg::uround(m_radius.Value),
                 *                                    agg::uround(m_radius.Value));
                 *  }
                 * }
                 */
            }

            double tm = stopwatch.ElapsedMilliseconds;

            // Render the shape itself
            //------------------
            if (m_FlattenCurves.Checked)
            {
                m_ras.add_path(m_shape);
            }
            else
            {
                m_ras.add_path(m_path);
            }

            scanlineRenderer.render_scanlines_aa_solid(clippingProxy, m_ras, m_sl, new RGBA_Floats(0.6, 0.9, 0.7, 0.8).GetAsRGBA_Bytes());

            graphics2D.DrawString(string.Format("{0:F2} ms", tm), 140, 30);
            base.OnDraw(graphics2D);
        }
Beispiel #24
0
        public override void OnDraw(Graphics2D graphics2D)
        {
            ImageBuffer widgetsSubImage = ImageBuffer.NewSubImageReference(graphics2D.DestImage, graphics2D.GetClippingRect());

            IImageByte backBuffer = widgetsSubImage;

            if (!didInit)
            {
                didInit = true;
                OnInitialize();
            }
            ImageBuffer image;

            if (backBuffer.BitDepth == 32)
            {
                image = new ImageBuffer();
                image.Attach(backBuffer, new BlenderBGRA());
            }
            else
            {
                if (backBuffer.BitDepth != 24)
                {
                    throw new System.NotSupportedException();
                }
                image = new ImageBuffer();
                image.Attach(backBuffer, new BlenderBGR());
            }
            ImageClippingProxy clippingProxy = new ImageClippingProxy(image);

            clippingProxy.clear(new RGBA_Floats(1, 1, 1));

            g_rasterizer.SetVectorClipBox(0, 0, Width, Height);

            ScanlineRenderer scanlineRenderer = new ScanlineRenderer();

            if (transformationTypeRadioButton.SelectedIndex == 0)
            {
                Bilinear tr = new Bilinear(lionShape.Bounds.Left, lionShape.Bounds.Bottom, lionShape.Bounds.Right, lionShape.Bounds.Top, quadPolygonControl.polygon());
                if (tr.is_valid())
                {
                    //--------------------------
                    // Render transformed lion
                    //
                    VertexSourceApplyTransform trans = new VertexSourceApplyTransform(lionShape.Path, tr);

                    scanlineRenderer.RenderSolidAllPaths(clippingProxy, g_rasterizer, g_scanline, trans, lionShape.Colors, lionShape.PathIndex, lionShape.NumPaths);
                    //--------------------------



                    //--------------------------
                    // Render transformed ellipse
                    //
                    VertexSource.Ellipse ell = new MatterHackers.Agg.VertexSource.Ellipse((lionShape.Bounds.Left + lionShape.Bounds.Right) * 0.5, (lionShape.Bounds.Bottom + lionShape.Bounds.Top) * 0.5,
                                                                                          (lionShape.Bounds.Right - lionShape.Bounds.Left) * 0.5, (lionShape.Bounds.Top - lionShape.Bounds.Bottom) * 0.5,
                                                                                          200);
                    Stroke ell_stroke = new Stroke(ell);
                    ell_stroke.width(3.0);
                    VertexSourceApplyTransform trans_ell = new VertexSourceApplyTransform(ell, tr);

                    VertexSourceApplyTransform trans_ell_stroke = new VertexSourceApplyTransform(ell_stroke, tr);

                    g_rasterizer.add_path(trans_ell);
                    scanlineRenderer.render_scanlines_aa_solid(clippingProxy, g_rasterizer, g_scanline, new RGBA_Bytes(0.5, 0.3, 0.0, 0.3));

                    g_rasterizer.add_path(trans_ell_stroke);
                    scanlineRenderer.render_scanlines_aa_solid(clippingProxy, g_rasterizer, g_scanline, new RGBA_Bytes(0.0, 0.3, 0.2, 1.0));
                }
            }
            else
            {
                Perspective tr = new Perspective(lionShape.Bounds.Left, lionShape.Bounds.Bottom, lionShape.Bounds.Right, lionShape.Bounds.Top, quadPolygonControl.polygon());
                if (tr.is_valid())
                {
                    // Render transformed lion
                    VertexSourceApplyTransform trans = new VertexSourceApplyTransform(lionShape.Path, tr);

                    scanlineRenderer.RenderSolidAllPaths(clippingProxy, g_rasterizer, g_scanline, trans, lionShape.Colors, lionShape.PathIndex, lionShape.NumPaths);

                    // Render transformed ellipse
                    VertexSource.Ellipse FilledEllipse = new MatterHackers.Agg.VertexSource.Ellipse((lionShape.Bounds.Left + lionShape.Bounds.Right) * 0.5, (lionShape.Bounds.Bottom + lionShape.Bounds.Top) * 0.5,
                                                                                                    (lionShape.Bounds.Right - lionShape.Bounds.Left) * 0.5, (lionShape.Bounds.Top - lionShape.Bounds.Bottom) * 0.5,
                                                                                                    200);

                    Stroke EllipseOutline = new Stroke(FilledEllipse);
                    EllipseOutline.width(3.0);
                    VertexSourceApplyTransform TransformedFilledEllipse = new VertexSourceApplyTransform(FilledEllipse, tr);

                    VertexSourceApplyTransform TransformedEllipesOutline = new VertexSourceApplyTransform(EllipseOutline, tr);

                    g_rasterizer.add_path(TransformedFilledEllipse);
                    scanlineRenderer.render_scanlines_aa_solid(clippingProxy, g_rasterizer, g_scanline, new RGBA_Bytes(0.5, 0.3, 0.0, 0.3));

                    g_rasterizer.add_path(TransformedEllipesOutline);
                    scanlineRenderer.render_scanlines_aa_solid(clippingProxy, g_rasterizer, g_scanline, new RGBA_Bytes(0.0, 0.3, 0.2, 1.0));
                }
            }

            //--------------------------
            // Render the "quad" tool and controls
            g_rasterizer.add_path(quadPolygonControl);
            scanlineRenderer.render_scanlines_aa_solid(clippingProxy, g_rasterizer, g_scanline, new RGBA_Bytes(0, 0.3, 0.5, 0.6));
            //m_trans_type.Render(g_rasterizer, g_scanline, clippingProxy);
            base.OnDraw(graphics2D);
        }
        public override void OnDraw(Graphics2D graphics2D)
        {
            if (graphics2D.DestImage != null)
            {
                ImageBuffer widgetsSubImage = ImageBuffer.NewSubImageReference(graphics2D.DestImage, graphics2D.GetClippingRect());

                IImageByte backBuffer = widgetsSubImage;

                int         distBetween    = backBuffer.GetBytesBetweenPixelsInclusive();
                ImageBuffer redImageBuffer = new ImageBuffer();
                redImageBuffer.Attach(backBuffer, new blender_gray(distBetween), distBetween, 2, 8);
                ImageBuffer greenImageBuffer = new ImageBuffer();
                greenImageBuffer.Attach(backBuffer, new blender_gray(distBetween), distBetween, 1, 8);
                ImageBuffer blueImageBuffer = new ImageBuffer();
                blueImageBuffer.Attach(backBuffer, new blender_gray(distBetween), distBetween, 0, 8);

                ImageClippingProxy clippingProxy      = new ImageClippingProxy(backBuffer);
                ImageClippingProxy clippingProxyRed   = new ImageClippingProxy(redImageBuffer);
                ImageClippingProxy clippingProxyGreen = new ImageClippingProxy(greenImageBuffer);
                ImageClippingProxy clippingProxyBlue  = new ImageClippingProxy(blueImageBuffer);

                ScanlineRasterizer   ras = new ScanlineRasterizer();
                ScanlineCachePacked8 sl  = new ScanlineCachePacked8();

                RGBA_Bytes clearColor = useBlackBackgroundCheckbox.Checked ? new RGBA_Bytes(0, 0, 0) : new RGBA_Bytes(255, 255, 255);
                clippingProxy.clear(clearColor);
                alphaSlider.View.BackgroundColor = clearColor;

                RGBA_Bytes FillColor = useBlackBackgroundCheckbox.Checked ? new RGBA_Bytes(255, 255, 255, (int)(alphaSlider.Value)) : new RGBA_Bytes(0, 0, 0, (int)(alphaSlider.Value));

                VertexSource.Ellipse er = new MatterHackers.Agg.VertexSource.Ellipse(Width / 2 - 0.87 * 50, Height / 2 - 0.5 * 50, 100, 100, 100);
                ras.add_path(er);
                ScanlineRenderer scanlineRenderer = new ScanlineRenderer();
                scanlineRenderer.render_scanlines_aa_solid(clippingProxyRed, ras, sl, FillColor);

                VertexSource.Ellipse eg = new MatterHackers.Agg.VertexSource.Ellipse(Width / 2 + 0.87 * 50, Height / 2 - 0.5 * 50, 100, 100, 100);
                ras.add_path(eg);
                scanlineRenderer.render_scanlines_aa_solid(clippingProxyGreen, ras, sl, FillColor);

                VertexSource.Ellipse eb = new MatterHackers.Agg.VertexSource.Ellipse(Width / 2, Height / 2 + 50, 100, 100, 100);
                ras.add_path(eb);
                scanlineRenderer.render_scanlines_aa_solid(clippingProxyBlue, ras, sl, FillColor);
            }
            else if (graphics2D.DestImageFloat != null)
            {
#if false
                IImageFloat backBuffer = graphics2D.DestImageFloat;

                int distBetween = backBuffer.GetFloatsBetweenPixelsInclusive();
                ImageBufferFloat redImageBuffer = new ImageBufferFloat();
                redImageBuffer.Attach(backBuffer, new blender_gray(distBetween), distBetween, 2, 8);
                ImageBufferFloat greenImageBuffer = new ImageBufferFloat();
                greenImageBuffer.Attach(backBuffer, new blender_gray(distBetween), distBetween, 1, 8);
                ImageBufferFloat blueImageBuffer = new ImageBufferFloat();
                blueImageBuffer.Attach(backBuffer, new blender_gray(distBetween), distBetween, 0, 8);

                ImageClippingProxy clippingProxy      = new ImageClippingProxy(backBuffer);
                ImageClippingProxy clippingProxyRed   = new ImageClippingProxy(redImageBuffer);
                ImageClippingProxy clippingProxyGreen = new ImageClippingProxy(greenImageBuffer);
                ImageClippingProxy clippingProxyBlue  = new ImageClippingProxy(blueImageBuffer);

                ScanlineRasterizer   ras = new ScanlineRasterizer();
                ScanlineCachePacked8 sl  = new ScanlineCachePacked8();

                RGBA_Bytes clearColor = useBlackBackgroundCheckbox.Checked ? new RGBA_Bytes(0, 0, 0) : new RGBA_Bytes(255, 255, 255);
                clippingProxy.clear(clearColor);
                alphaSlider.View.BackGroundColor = clearColor;

                RGBA_Bytes FillColor = useBlackBackgroundCheckbox.Checked ? new RGBA_Bytes(255, 255, 255, (int)(alphaSlider.Value)) : new RGBA_Bytes(0, 0, 0, (int)(alphaSlider.Value));

                VertexSource.Ellipse er = new AGG.VertexSource.Ellipse(Width / 2 - 0.87 * 50, Height / 2 - 0.5 * 50, 100, 100, 100);
                ras.add_path(er);
                agg_renderer_scanline.Default.render_scanlines_aa_solid(clippingProxyRed, ras, sl, FillColor);

                VertexSource.Ellipse eg = new AGG.VertexSource.Ellipse(Width / 2 + 0.87 * 50, Height / 2 - 0.5 * 50, 100, 100, 100);
                ras.add_path(eg);
                agg_renderer_scanline.Default.render_scanlines_aa_solid(clippingProxyGreen, ras, sl, FillColor);

                VertexSource.Ellipse eb = new AGG.VertexSource.Ellipse(Width / 2, Height / 2 + 50, 100, 100, 100);
                ras.add_path(eb);
                agg_renderer_scanline.Default.render_scanlines_aa_solid(clippingProxyBlue, ras, sl, FillColor);
#endif
            }

            base.OnDraw(graphics2D);
        }
Beispiel #26
0
        public override void OnDraw(Graphics2D graphics2D)
        {
            ImageBuffer widgetsSubImage = ImageBuffer.NewSubImageReference(graphics2D.DestImage, graphics2D.GetClippingRect());

            if (!didInit)
            {
                didInit = true;
                OnInitialize();
            }

            if (m_gamma.Value != m_old_gamma)
            {
                m_gamma_lut.SetGamma(m_gamma.Value);
                ImageIO.LoadImageData("spheres.bmp", m_SourceImage);
                //m_SourceImage.apply_gamma_dir(m_gamma_lut);
                m_old_gamma = m_gamma.Value;
            }

            ImageBuffer pixf = new ImageBuffer();
            switch (widgetsSubImage.BitDepth)
            {
                case 24:
                    pixf.Attach(widgetsSubImage, new BlenderBGR());
                    break;

                case 32:
                    pixf.Attach(widgetsSubImage, new BlenderBGRA());
                    break;

                default:
                    throw new NotImplementedException();
            }

            ImageClippingProxy clippingProxy = new ImageClippingProxy(pixf);

            clippingProxy.clear(new RGBA_Floats(1, 1, 1));

            if (m_trans_type.SelectedIndex < 2)
            {
                // For the affine parallelogram transformations we
                // calculate the 4-th (implicit) point of the parallelogram
                m_quad.SetXN(3, m_quad.GetXN(0) + (m_quad.GetXN(2) - m_quad.GetXN(1)));
                m_quad.SetYN(3, m_quad.GetYN(0) + (m_quad.GetYN(2) - m_quad.GetYN(1)));
            }

            ScanlineRenderer scanlineRenderer = new ScanlineRenderer();
            // draw a background to show how the alpha is working
            int RectWidth = 70;
            int xoffset = 50;
            int yoffset = 50;
            for (int i = 0; i < 7; i++)
            {
                for (int j = 0; j < 7; j++)
                {
                    if ((i + j) % 2 != 0)
                    {
                        VertexSource.RoundedRect rect = new VertexSource.RoundedRect(i * RectWidth + xoffset, j * RectWidth + yoffset,
                            (i + 1) * RectWidth + xoffset, (j + 1) * RectWidth + yoffset, 2);
                        rect.normalize_radius();

                        g_rasterizer.add_path(rect);
                        scanlineRenderer.render_scanlines_aa_solid(clippingProxy, g_rasterizer, g_scanline, new RGBA_Bytes(.2, .2, .2));
                    }
                }
            }

            //--------------------------
            // Render the "quad" tool and controls
            g_rasterizer.add_path(m_quad);
            scanlineRenderer.render_scanlines_aa_solid(clippingProxy, g_rasterizer, g_scanline, new RGBA_Bytes(0, 0.3, 0.5, 0.1));

            // Prepare the polygon to rasterize. Here we need to fill
            // the destination (transformed) polygon.
            g_rasterizer.SetVectorClipBox(0, 0, Width, Height);
            g_rasterizer.reset();
            int b = 0;
            g_rasterizer.move_to_d(m_quad.GetXN(0) - b, m_quad.GetYN(0) - b);
            g_rasterizer.line_to_d(m_quad.GetXN(1) + b, m_quad.GetYN(1) - b);
            g_rasterizer.line_to_d(m_quad.GetXN(2) + b, m_quad.GetYN(2) + b);
            g_rasterizer.line_to_d(m_quad.GetXN(3) - b, m_quad.GetYN(3) + b);

            //typedef agg::span_allocator<color_type> span_alloc_type;
            span_allocator sa = new span_allocator();
            image_filter_bilinear filter_kernel = new image_filter_bilinear();
            ImageFilterLookUpTable filter = new ImageFilterLookUpTable(filter_kernel, true);

            ImageBufferAccessorClamp source = new ImageBufferAccessorClamp(m_SourceImage);

            stopwatch.Restart();

            switch (m_trans_type.SelectedIndex)
            {
                case 0:
                    {
                        /*
                                agg::trans_affine tr(m_quad.polygon(), g_x1, g_y1, g_x2, g_y2);

                                typedef agg::span_interpolator_linear<agg::trans_affine> interpolator_type;
                                interpolator_type interpolator(tr);

                                typedef image_filter_2x2_type<source_type, 
                                                              interpolator_type> span_gen_type;
                                span_gen_type sg(source, interpolator, filter);
                                agg::render_scanlines_aa(g_rasterizer, g_scanline, rb_pre, sa, sg);
                         */
                        break;
                    }

                case 1:
                    {
                        /*
                                agg::trans_affine tr(m_quad.polygon(), g_x1, g_y1, g_x2, g_y2);

                                typedef agg::span_interpolator_linear<agg::trans_affine> interpolator_type;
                                typedef image_resample_affine_type<source_type> span_gen_type;

                                interpolator_type interpolator(tr);
                                span_gen_type sg(source, interpolator, filter);
                                sg.blur(m_blur.Value);
                                agg::render_scanlines_aa(g_rasterizer, g_scanline, rb_pre, sa, sg);
                         */
                        break;
                    }

                case 2:
                    {
                        /*
                                agg::trans_perspective tr(m_quad.polygon(), g_x1, g_y1, g_x2, g_y2);
                                if(tr.is_valid())
                                {
                                    typedef agg::span_interpolator_linear_subdiv<agg::trans_perspective> interpolator_type;
                                    interpolator_type interpolator(tr);

                                    typedef image_filter_2x2_type<source_type,
                                                                  interpolator_type> span_gen_type;
                                    span_gen_type sg(source, interpolator, filter);
                                    agg::render_scanlines_aa(g_rasterizer, g_scanline, rb_pre, sa, sg);
                                }
                         */
                        break;
                    }

                case 3:
                    {
                        /*
                                agg::trans_perspective tr(m_quad.polygon(), g_x1, g_y1, g_x2, g_y2);
                                if(tr.is_valid())
                                {
                                    typedef agg::span_interpolator_trans<agg::trans_perspective> interpolator_type;
                                    interpolator_type interpolator(tr);

                                    typedef image_filter_2x2_type<source_type, 
                                                                  interpolator_type> span_gen_type;
                                    span_gen_type sg(source, interpolator, filter);
                                    agg::render_scanlines_aa(g_rasterizer, g_scanline, rb_pre, sa, sg);
                                }
                         */
                        break;
                    }

                case 4:
                    {
                        //typedef agg::span_interpolator_persp_lerp<> interpolator_type;
                        //typedef agg::span_subdiv_adaptor<interpolator_type> subdiv_adaptor_type;

                        span_interpolator_persp_lerp interpolator = new span_interpolator_persp_lerp(m_quad.polygon(), g_x1, g_y1, g_x2, g_y2);
                        span_subdiv_adaptor subdiv_adaptor = new span_subdiv_adaptor(interpolator);

                        span_image_resample sg = null;
                        if (interpolator.is_valid())
                        {
                            switch (source.SourceImage.BitDepth)
                            {
                                case 24:
                                    sg = new span_image_resample_rgb(source, subdiv_adaptor, filter);
                                    break;

                                case 32:
                                    sg = new span_image_resample_rgba(source, subdiv_adaptor, filter);
                                    break;
                            }

                            sg.blur(m_blur.Value);
                            scanlineRenderer.GenerateAndRender(g_rasterizer, g_scanline, clippingProxy, sa, sg);
                        }
                        break;
                    }

                case 5:
                    {
                        /*
                                typedef agg::span_interpolator_persp_exact<> interpolator_type;
                                typedef agg::span_subdiv_adaptor<interpolator_type> subdiv_adaptor_type;

                                interpolator_type interpolator(m_quad.polygon(), g_x1, g_y1, g_x2, g_y2);
                                subdiv_adaptor_type subdiv_adaptor(interpolator);

                                if(interpolator.is_valid())
                                {
                                    typedef image_resample_type<source_type, 
                                                                subdiv_adaptor_type> span_gen_type;
                                    span_gen_type sg(source, subdiv_adaptor, filter);
                                    sg.blur(m_blur.Value);
                                    agg::render_scanlines_aa(g_rasterizer, g_scanline, rb_pre, sa, sg);
                                }
                         */
                        break;
                    }
            }

            double tm = stopwatch.ElapsedMilliseconds;
            //pixf.apply_gamma_inv(m_gamma_lut);

            gsv_text t = new gsv_text();
            t.SetFontSize(10.0);

            Stroke pt = new Stroke(t);
            pt.width(1.5);

            string buf = string.Format("{0:F2} ms", tm);
            t.start_point(10.0, 70.0);
            t.text(buf);

            g_rasterizer.add_path(pt);
            scanlineRenderer.render_scanlines_aa_solid(clippingProxy, g_rasterizer, g_scanline, new RGBA_Bytes(0, 0, 0));

            //--------------------------
            //m_trans_type.Render(g_rasterizer, g_scanline, clippingProxy);
            //m_gamma.Render(g_rasterizer, g_scanline, clippingProxy);
            //m_blur.Render(g_rasterizer, g_scanline, clippingProxy);
            base.OnDraw(graphics2D);
        }
Beispiel #27
0
        private void _InternalRender(IVertexSource vertexSource, RGBA_Bytes color)
        {
            if (_clipBuffer != null) {
                // DEBUG_saveImageBuffer(_clipBuffer);
                // DEBUG_saveImageBuffer(this.imb);

                IAlphaMask alphaMask = new AlphaMaskByteClipped (_clipBuffer, 1, 0);
                AlphaMaskAdaptor imageAlphaMaskAdaptor = new AlphaMaskAdaptor (aggGc.DestImage, alphaMask);
                ImageClippingProxy alphaMaskClippingProxy = new ImageClippingProxy (imageAlphaMaskAdaptor);

                var scanlineRenderer = new ScanlineRenderer ();
                var rasterizer = new ScanlineRasterizer ();
                var scanlineCache = new ScanlineCachePacked8();

                VertexSourceApplyTransform trans = new VertexSourceApplyTransform(vertexSource, aggGc.GetTransform());
                rasterizer.add_path(trans);

                scanlineRenderer.render_scanlines_aa_solid(alphaMaskClippingProxy,rasterizer,scanlineCache,color);
                aggGc.DestImage.MarkImageChanged();
            } else {
                aggGc.Render (vertexSource, color);
            }
        }