Exemple #1
0
        public void SameHandleReturnsSameReferenceAndReleasesObject()
        {
            VerifyImmediateFinalizers();

            var handle = (IntPtr)234;

            TestConstruction(handle);

            CollectGarbage();

            Assert.False(SKObject.GetInstance <LifecycleObject>(handle, out var inst));
            Assert.Null(inst);

            void TestConstruction(IntPtr h)
            {
                LifecycleObject i = null;

                Assert.False(SKObject.GetInstance(h, out i));
                Assert.Null(i);

                var first = SKObject.GetObject <LifecycleObject>(h);

                Assert.True(SKObject.GetInstance(h, out i));
                Assert.NotNull(i);

                Assert.Same(first, i);

                var second = SKObject.GetObject <LifecycleObject>(h);

                Assert.Same(first, second);
            }
        }
Exemple #2
0
        public void StreamIsNotCollectedPrematurely()
        {
            DoWork(out var handle);

            CollectGarbage();

            Assert.False(SKObject.GetInstance <SKDynamicMemoryWStream>(handle, out _));
Exemple #3
0
        public void DuplicateStreamIsCollected()
        {
            VerifySupportsExceptionsInDelegates();

            var handle = DoWork();

            CollectGarbage();

            Assert.False(SKObject.GetInstance <SKManagedStream>(handle, out _));

            IntPtr DoWork()
            {
                var dotnet = new MemoryStream(new byte[] { 1, 2, 3, 4, 5 });
                var stream = new SKManagedStream(dotnet, true);

                Assert.Equal(1, stream.ReadByte());
                Assert.Equal(2, stream.ReadByte());

                var dupe1 = stream.Duplicate();

                Assert.Equal(1, dupe1.ReadByte());
                Assert.Equal(2, dupe1.ReadByte());

                Assert.Throws <InvalidOperationException>(() => stream.Duplicate());

                stream.Dispose();

                var dupe2 = dupe1.Duplicate();

                Assert.Equal(1, dupe2.ReadByte());
                Assert.Equal(2, dupe2.ReadByte());

                return(dupe2.Handle);
            }
        }
Exemple #4
0
        public void ObjectsWithTheSameHandleButDoNotOwnTheirHandlesAreCreatedAndDisposedCorrectly()
        {
            var handle = (IntPtr)567;

            var inst = Construct();

            CollectGarbage();

            Assert.True(SKObject.GetInstance <LifecycleObject>(handle, out var obj));
            Assert.Equal(2, obj.Value);
            Assert.Same(inst, obj);

            LifecycleObject Construct()
            {
                var inst1 = new LifecycleObject(handle, false)
                {
                    Value = 1
                };
                var inst2 = new LifecycleObject(handle, false)
                {
                    Value = 2
                };

                Assert.NotSame(inst1, inst2);

                return(inst2);
            }
        }
Exemple #5
0
        public unsafe void StreamLosesOwnershipAndCanBeDisposedButIsNotActually()
        {
            var path   = Path.Combine(PathToImages, "color-wheel.png");
            var stream = new SKMemoryStream(File.ReadAllBytes(path));
            var handle = stream.Handle;

            Assert.True(stream.OwnsHandle);
            Assert.False(stream.IgnorePublicDispose);
            Assert.True(SKObject.GetInstance <SKMemoryStream>(handle, out _));

            var codec = SKCodec.Create(stream);

            Assert.False(stream.OwnsHandle);
            Assert.True(stream.IgnorePublicDispose);

            stream.Dispose();
            Assert.True(SKObject.GetInstance <SKMemoryStream>(handle, out var inst));
            Assert.Same(stream, inst);

            Assert.Equal(SKCodecResult.Success, codec.GetPixels(out var pixels));
            Assert.NotEmpty(pixels);

            codec.Dispose();
            Assert.False(SKObject.GetInstance <SKMemoryStream>(handle, out _));
        }
Exemple #6
0
        public void StreamIsAccessableFromNativeType()
        {
            VerifyImmediateFinalizers();

            var paint = CreatePaint(out var typefaceHandle);

            CollectGarbage();

            Assert.False(SKObject.GetInstance <SKTypeface>(typefaceHandle, out _));

            var tf = paint.Typeface;

            Assert.Equal("Roboto2", tf.FamilyName);
            Assert.True(tf.TryGetTableTags(out var tags));
            Assert.NotEmpty(tags);

            SKPaint CreatePaint(out IntPtr handle)
            {
                var bytes  = File.ReadAllBytes(Path.Combine(PathToFonts, "Roboto2-Regular_NoEmbed.ttf"));
                var dotnet = new MemoryStream(bytes);
                var stream = new SKManagedStream(dotnet, true);

                var typeface = SKTypeface.FromStream(stream);

                handle = typeface.Handle;

                return(new SKPaint
                {
                    Typeface = typeface
                });
            }
        }
Exemple #7
0
        public void ConstructorsAreCached()
        {
            var handle = (IntPtr)123;

            SKObject.GetObject <LifecycleObject>(handle);

            Assert.True(SKObject.constructors.ContainsKey(typeof(LifecycleObject)));
        }
Exemple #8
0
        public void CanInstantiateAbstractClassesWithImplementation()
        {
            var handle = GetNextPtr();

            var obj = SKObject.GetOrAddObject <AbstractObject>(handle, (h, o) => new ConcreteObject(h, o));

            Assert.NotNull(obj);
            Assert.IsType <ConcreteObject>(obj);
        }
Exemple #9
0
        public void EmptyDataIsNotDisposed()
        {
            var empty = SKData.Empty;

            Assert.True(SKObject.GetInstance <SKData>(empty.Handle, out _));

            empty.Dispose();
            Assert.True(SKObject.GetInstance <SKData>(empty.Handle, out _));
        }
        public void StreamIsCollectedEvenWhenNotProperlyDisposed()
        {
            VerifyImmediateFinalizers();

            var handle = DoWork();

            CollectGarbage();

            var exists = SKObject.GetInstance <SKManagedWStream>(handle, out _);

            Assert.False(exists);
        public unsafe void StreamIsNotDisposedWhenReferencedIsDisposed()
        {
            var stream = new SKManagedWStream(new MemoryStream(), true);
            var handle = stream.Handle;

            var document = SKDocument.CreatePdf(stream);

            document.Dispose();

            Assert.True(SKObject.GetInstance <SKManagedWStream>(handle, out _));
        }
Exemple #12
0
        public void CanInstantiateAbstractClassesWithImplementation()
        {
            var handle = (IntPtr)444;

            Assert.Throws <MemberAccessException>(() => SKObject.GetObject <AbstractObject>(handle));

            var obj = SKObject.GetObject <AbstractObject, ConcreteObject>(handle);

            Assert.NotNull(obj);
            Assert.IsType <ConcreteObject>(obj);
        }
Exemple #13
0
        public unsafe void GCStillCollectsTypeface()
        {
            if (!IsWindows)
            {
                throw new SkipException("Test designed for Windows.");
            }

            var handle = DoWork();

            CollectGarbage();

            Assert.False(SKObject.GetInstance <SKTypeface>(handle, out _));
Exemple #14
0
        public void DisposeDoesNotInvalidateObjectIfItIsNotOwned()
        {
            var handle = (IntPtr)345;

            var obj = SKObject.GetObject <LifecycleObject>(handle, false);

            Assert.False(obj.DestroyedNative);

            obj.Dispose();

            Assert.False(obj.DestroyedNative);
        }
Exemple #15
0
        public void SameHandleReturnsSameReferenceAndReleasesObject()
        {
            VerifyImmediateFinalizers();

            var handle = GetNextPtr();

            TestConstruction(handle);

            CollectGarbage();

            // there should be nothing if the GC ran
            Assert.False(SKObject.GetInstance <LifecycleObject>(handle, out var inst));
            Assert.Null(inst);
Exemple #16
0
        public void DisposeInvalidatesObject()
        {
            var handle = (IntPtr)345;

            var obj = SKObject.GetObject <LifecycleObject>(handle);

            Assert.Equal(handle, obj.Handle);
            Assert.False(obj.DestroyedNative);

            obj.Dispose();

            Assert.Equal(IntPtr.Zero, obj.Handle);
            Assert.True(obj.DestroyedNative);
        }
Exemple #17
0
        public unsafe void ManagedStreamIsCollectedWhenTypefaceIsDisposed()
        {
            var bytes  = File.ReadAllBytes(Path.Combine(PathToFonts, "Distortable.ttf"));
            var dotnet = new MemoryStream(bytes);
            var stream = new SKManagedStream(dotnet, true);
            var handle = stream.Handle;

            var typeface = SKTypeface.FromStream(stream);

            typeface.Dispose();

            Assert.False(SKObject.GetInstance <SKManagedStream>(handle, out _));
            Assert.Throws <ObjectDisposedException>(() => dotnet.Position);
        }
Exemple #18
0
        public void StaticSrgbIsReturnedAsTheStaticInstance()
        {
            var handle = SkiaApi.sk_colorspace_new_srgb();

            try
            {
                var cs = SKObject.GetObject <SKColorSpace>(handle, unrefExisting: false);
                Assert.Equal("SKColorSpaceStatic", cs.GetType().Name);
            }
            finally
            {
                SkiaApi.sk_refcnt_safe_unref(handle);
            }
        }
Exemple #19
0
        public unsafe void InvalidStreamIsDisposedImmediately()
        {
            var stream = CreateTestSKStream();
            var handle = stream.Handle;

            Assert.True(stream.OwnsHandle);
            Assert.False(stream.IgnorePublicDispose);
            Assert.True(SKObject.GetInstance <SKStream>(handle, out _));

            Assert.Null(SKTypeface.FromStream(stream));

            Assert.False(stream.OwnsHandle);
            Assert.True(stream.IgnorePublicDispose);
            Assert.False(SKObject.GetInstance <SKStream>(handle, out _));
        }
Exemple #20
0
        public void ManagedStreamIsNotCollectedPrematurely()
        {
            using (var document = CreateDocument(out var handle))
            {
                var paintList = new List <SKPaint>();

                for (var index = 0; index < 10; index++)
                {
                    var fontStream = File.OpenRead(Path.Combine(PathToFonts, "Roboto2-Regular_NoEmbed.ttf"));
                    var typeface   = SKTypeface.FromStream(fontStream);

                    var paint = new SKPaint
                    {
                        Typeface = typeface
                    };
                    paintList.Add(paint);
                }

                using (var pageCanvas = document.BeginPage(792, 842))
                {
                    foreach (var paint in paintList)
                    {
                        for (var i = 0; i < 100; i++)
                        {
                            pageCanvas.DrawText("Text", 0, 5 * i, paint);
                        }
                    }

                    document.EndPage();
                }

                CollectGarbage();

                Assert.True(SKObject.GetInstance <SKDynamicMemoryWStream>(handle, out _));

                document.Close();
            }

            SKDocument CreateDocument(out IntPtr streamHandle)
            {
                var stream = new SKDynamicMemoryWStream();

                streamHandle = stream.Handle;

                return(SKDocument.CreatePdf(stream, new SKDocumentPdfMetadata()));
            }
        }
Exemple #21
0
        public unsafe void StreamThatHasLostOwnershipIsDisposed()
        {
            var bytes  = File.ReadAllBytes(Path.Combine(PathToImages, "color-wheel.png"));
            var dotnet = new MemoryStream(bytes);
            var stream = new SKManagedStream(dotnet, true);
            var handle = stream.Handle;

            Assert.True(stream.OwnsHandle);
            Assert.True(SKObject.GetInstance <SKManagedStream>(handle, out _));

            var codec = SKCodec.Create(stream);

            Assert.False(stream.OwnsHandle);

            codec.Dispose();
            Assert.False(SKObject.GetInstance <SKManagedStream>(handle, out _));
        }
Exemple #22
0
            static void DoWork(out IntPtr streamHandle)
            {
                using (var document = CreateDocument(out streamHandle))
                {
                    using (var pageCanvas = document.BeginPage(792, 842))
                    {
                        document.EndPage();
                    }

                    CollectGarbage();

                    Assert.True(SKObject.GetInstance <SKDynamicMemoryWStream>(streamHandle, out _));

                    document.Close();
                }

                Assert.True(SKObject.GetInstance <SKDynamicMemoryWStream>(streamHandle, out _));
            }
Exemple #23
0
        public unsafe void StreamLosesOwnershipToCodecButIsNotForgotten()
        {
            var bytes  = File.ReadAllBytes(Path.Combine(PathToImages, "color-wheel.png"));
            var stream = new SKMemoryStream(bytes);
            var handle = stream.Handle;

            Assert.True(stream.OwnsHandle);
            Assert.True(SKObject.GetInstance <SKMemoryStream>(handle, out _));

            var codec = SKCodec.Create(stream);

            Assert.False(stream.OwnsHandle);

            stream.Dispose();
            Assert.True(SKObject.GetInstance <SKMemoryStream>(handle, out _));

            Assert.Equal(SKCodecResult.Success, codec.GetPixels(out var pixels));
            Assert.NotEmpty(pixels);
        }
Exemple #24
0
        public unsafe void StreamLosesOwnershipAndCanBeGarbageCollected()
        {
            VerifyImmediateFinalizers();

            var bytes = File.ReadAllBytes(Path.Combine(PathToImages, "color-wheel.png"));

            DoWork(out var codecH, out var streamH);

            CollectGarbage();

            Assert.False(SKObject.GetInstance <SKMemoryStream>(streamH, out _));
            Assert.False(SKObject.GetInstance <SKCodec>(codecH, out _));

            void DoWork(out IntPtr codecHandle, out IntPtr streamHandle)
            {
                var codec = CreateCodec(out streamHandle);

                codecHandle = codec.Handle;

                CollectGarbage();

                Assert.Equal(SKCodecResult.Success, codec.GetPixels(out var pixels));
                Assert.NotEmpty(pixels);

                Assert.True(SKObject.GetInstance <SKMemoryStream>(streamHandle, out var stream));
                Assert.False(stream.OwnsHandle);
                Assert.True(stream.IgnorePublicDispose);
            }

            SKCodec CreateCodec(out IntPtr streamHandle)
            {
                var stream = new SKMemoryStream(bytes);

                streamHandle = stream.Handle;

                Assert.True(stream.OwnsHandle);
                Assert.False(stream.IgnorePublicDispose);
                Assert.True(SKObject.GetInstance <SKMemoryStream>(streamHandle, out _));

                return(SKCodec.Create(stream));
            }
        }
Exemple #25
0
        public void EnsureConcurrencyResultsInCorrectDeregistration()
        {
            var handle = (IntPtr)446;

            var obj = new ImmediateRecreationObject(handle, true);

            Assert.Null(obj.NewInstance);
            Assert.Equal(obj, SKObject.instances[handle]?.Target);

            obj.Dispose();
            Assert.True(SKObject.GetInstance <ImmediateRecreationObject>(handle, out _));

            var newObj = obj.NewInstance;

            Assert.NotEqual(obj, SKObject.instances[handle]?.Target);
            Assert.Equal(newObj, SKObject.instances[handle]?.Target);

            newObj.Dispose();
            Assert.False(SKObject.GetInstance <ImmediateRecreationObject>(handle, out _));
        }
Exemple #26
0
        public void ObjectsWithTheSameHandleButDoNotOwnTheirHandlesAreCreatedAndCollectedCorrectly()
        {
            VerifyImmediateFinalizers();

            var handle = (IntPtr)566;

            Construct();

            CollectGarbage();

            Assert.False(SKObject.GetInstance <LifecycleObject>(handle, out _));

            void Construct()
            {
                var inst1 = new LifecycleObject(handle, false);
                var inst2 = new LifecycleObject(handle, false);

                Assert.NotSame(inst1, inst2);
            }
        }
Exemple #27
0
        public void StreamIsCollectedEvenWhenNotProperlyDisposed()
        {
            VerifyImmediateFinalizers();

            var handle = DoWork();

            CollectGarbage();

            var exists = SKObject.GetInstance <SKManagedStream>(handle, out _);

            Assert.False(exists);

            IntPtr DoWork()
            {
                var dotnet = CreateTestStream();
                var stream = new SKManagedStream(dotnet, true);

                return(stream.Handle);
            }
        }
Exemple #28
0
        public unsafe void StreamLosesOwnershipAndCanBeGarbageCollected()
        {
            VerifyImmediateFinalizers();

            var bytes = File.ReadAllBytes(Path.Combine(PathToFonts, "Distortable.ttf"));

            DoWork(out var typefaceH, out var streamH);

            CollectGarbage();

            Assert.False(SKObject.GetInstance <SKMemoryStream>(streamH, out _));
            Assert.False(SKObject.GetInstance <SKTypeface>(typefaceH, out _));

            void DoWork(out IntPtr typefaceHandle, out IntPtr streamHandle)
            {
                var typeface = CreateTypeface(out streamHandle);

                typefaceHandle = typeface.Handle;

                CollectGarbage();

                Assert.NotEmpty(typeface.GetTableTags());

                Assert.True(SKObject.GetInstance <SKMemoryStream>(streamHandle, out var stream));
                Assert.False(stream.OwnsHandle);
                Assert.True(stream.IgnorePublicDispose);
            }

            SKTypeface CreateTypeface(out IntPtr streamHandle)
            {
                var stream = new SKMemoryStream(bytes);

                streamHandle = stream.Handle;

                Assert.True(stream.OwnsHandle);
                Assert.False(stream.IgnorePublicDispose);
                Assert.True(SKObject.GetInstance <SKMemoryStream>(streamHandle, out _));

                return(SKTypeface.FromStream(stream));
            }
        }
Exemple #29
0
        public void DataCreatedByImageExpiresAfterFinalizers()
        {
            var bitmap = CreateTestBitmap();
            var image  = SKImage.FromBitmap(bitmap);

            var handle = DoEncode();

            CollectGarbage();

            Assert.False(SKObject.GetInstance <SKData>(handle, out _));

            IntPtr DoEncode()
            {
                var result = image.Encode();

                Assert.NotNull(result);
                Assert.Equal(1, result.GetReferenceCount());

                return(result.Handle);
            }
        }
Exemple #30
0
            static void TestConstruction(IntPtr h)
            {
                // make sure there is nothing
                Assert.False(SKObject.GetInstance(h, out LifecycleObject i));
                Assert.Null(i);

                // get/create the object
                var first = LifecycleObject.GetObject(h);

                // get the same one
                Assert.True(SKObject.GetInstance(h, out i));
                Assert.NotNull(i);

                // compare
                Assert.Same(first, i);

                // get/create the object
                var second = LifecycleObject.GetObject(h);

                // compare
                Assert.Same(first, second);
            }