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)); } } } } } }
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; } }
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(); }