Пример #1
0
        public void DecodeImageScanlines()
        {
            var path        = Path.Combine(PathToImages, "CMYK.jpg");
            var imageHeight = 516;

            var fileData      = File.ReadAllBytes(path);
            var correctBitmap = SKBitmap.Decode(path);

            var stream = new SKFileStream(path);

            using (var codec = SKCodec.Create(stream)) {
                var info = new SKImageInfo(codec.Info.Width, codec.Info.Height);
                using (var scanlineBitmap = new SKBitmap(info)) {
                    scanlineBitmap.Erase(SKColors.Fuchsia);

                    var result = codec.StartScanlineDecode(info);
                    Assert.Equal(SKCodecResult.Success, result);

                    Assert.Equal(SKCodecScanlineOrder.TopDown, codec.ScanlineOrder);
                    Assert.Equal(0, codec.NextScanline);

                    // only decode every second line
                    for (int y = 0; y < info.Height; y += 2)
                    {
                        Assert.Equal(1, codec.GetScanlines(scanlineBitmap.GetAddr(0, y), 1, info.RowBytes));
                        Assert.Equal(y + 1, codec.NextScanline);
                        if (codec.SkipScanlines(1))
                        {
                            Assert.Equal(y + 2, codec.NextScanline);
                        }
                        else
                        {
                            Assert.Equal(imageHeight, codec.NextScanline);                              // reached the end
                        }
                    }

                    Assert.False(codec.SkipScanlines(1));
                    Assert.Equal(imageHeight, codec.NextScanline);

                    for (var x = 0; x < info.Width; x++)
                    {
                        for (var y = 0; y < info.Height; y++)
                        {
                            if (y % 2 == 0)
                            {
                                Assert.Equal(correctBitmap.GetPixel(x, y), scanlineBitmap.GetPixel(x, y));
                            }
                            else
                            {
                                Assert.Equal(SKColors.Fuchsia, scanlineBitmap.GetPixel(x, y));
                            }
                        }
                    }
                }
            }
        }
Пример #2
0
        public MainPage()
        {
            canvasView = new SKCanvasView();
            canvasView.PaintSurface += OnCanvasViewPaintSurface;
            Content = canvasView;

            //1. create bitmap backend for our canvas
            _myCanvasBmp = new SKBitmap(800, 600);
            //2. create agg render surface and painter

            unsafe
            {
                int *ptr = (int *)_myCanvasBmp.GetAddr(0, 0);
                int  w   = _myCanvasBmp.Width;
                int  h   = _myCanvasBmp.Height;

                _actualBmp = new ActualBitmap(w, h, (IntPtr)ptr);
                _painter   = new AggPainter(new AggRenderSurface(_actualBmp));

                _needContentUpdate = true;
            }
        }
Пример #3
0
        private void PrepareDirect()
        {
            GL.ClearColor(0f, 0f, 0f, 1f);
            CheckErrors();
            GL.Enable(EnableCap.Blend);
            CheckErrors();
            GL.BlendFunc(BlendingFactorSrc.SrcAlpha, BlendingFactorDest.OneMinusSrcAlpha);
            CheckErrors();

            GL.Enable(EnableCap.Texture2D);
            CheckErrors();
            GL.EnableClientState(ArrayCap.VertexArray);
            CheckErrors();
            GL.EnableClientState(ArrayCap.TextureCoordArray);
            CheckErrors();
            GL.EnableClientState(ArrayCap.ColorArray);
            CheckErrors();
            GL.Hint(HintTarget.PerspectiveCorrectionHint, HintMode.Nicest);
            CheckErrors();

            textureIdDirect = GL.GenTexture();
            CheckErrors();
            GL.BindTexture(TextureTarget.Texture2D, textureIdDirect);
            CheckErrors();
            GL.TexParameter(TextureTarget.Texture2D, TextureParameterName.TextureMinFilter, (int)TextureMinFilter.Nearest);
            CheckErrors();
            GL.TexParameter(TextureTarget.Texture2D, TextureParameterName.TextureMagFilter, (int)TextureMagFilter.Nearest);
            CheckErrors();
            GL.TexParameter(TextureTarget.Texture2D, TextureParameterName.TextureWrapS, (int)TextureWrapMode.ClampToEdge);
            CheckErrors();
            GL.TexParameter(TextureTarget.Texture2D, TextureParameterName.TextureWrapT, (int)TextureWrapMode.ClampToEdge);
            CheckErrors();

            SKBitmap bitmap = new SKBitmap(100, 100);

            for (int x = 0; x < bitmap.Width; x++)
            {
                for (int y = 0; y < bitmap.Height; y++)
                {
                    bitmap.SetPixel(x, y, SKColors.White);
                }
            }

            bitmap.LockPixels();

            GL.TexImage2D(TextureTarget.Texture2D, 0, PixelInternalFormat.Rgba, bitmap.Width, bitmap.Height,
                          0, OpenTK.Graphics.OpenGL.PixelFormat.Bgra, PixelType.UnsignedByte, bitmap.GetAddr(0, 0));
            CheckErrors();
            bitmap.UnlockPixels();

            shaderProgram = GL.CreateProgram();
            CheckErrors();

            int vertexShader = GL.CreateShader(ShaderType.VertexShader);

            CheckErrors();
            GL.ShaderSource(vertexShader, GetStandardVertexShader());
            CheckErrors();
            GL.CompileShader(vertexShader);
            CheckErrors();
            GL.AttachShader(shaderProgram, vertexShader);
            CheckErrors();
            GL.DeleteShader(vertexShader);
            CheckErrors();

            int fragmentShader = GL.CreateShader(ShaderType.FragmentShader);

            CheckErrors();
            GL.ShaderSource(fragmentShader, GetStandardFragmentShader());
            CheckErrors();
            GL.CompileShader(fragmentShader);
            CheckErrors();
            GL.AttachShader(shaderProgram, fragmentShader);
            CheckErrors();
            GL.DeleteShader(fragmentShader);
            CheckErrors();

            GL.LinkProgram(shaderProgram);
            CheckErrors();

            var buf1 = GL.GenBuffer();

            CheckErrors();
            GL.BindBuffer(BufferTarget.ArrayBuffer, buf1);
            CheckErrors();
            GL.VertexPointer(2, VertexPointerType.Float, GLVertex.Size, 0);
            CheckErrors();
            GL.TexCoordPointer(2, TexCoordPointerType.Float, GLVertex.Size, Vector2.SizeInBytes);
            CheckErrors();
            GL.ColorPointer(4, ColorPointerType.Float, GLVertex.Size, Vector2.SizeInBytes * 2);
            CheckErrors();
            var buf2 = GL.GenBuffer();

            CheckErrors();
            GL.BindBuffer(BufferTarget.ElementArrayBuffer, buf2);
            CheckErrors();
        }