public static unsafe DllImports.StoryboardData GetStoryboardData(long position, int tileId) { const float TilePreviewTimeScale = 10.0f / 3.0f; if (!GetInstance().storyboardReaders.ContainsKey(tileId)) { return new DllImports.StoryboardData { isStoryboardReaderReady = 0, isFrameReady = 0, duration = 0 } } ; var subSkBitmap = GetInstance().storyboardReaders[tileId] .GetFrame(TimeSpan.FromMilliseconds(position) * TilePreviewTimeScale); if (subSkBitmap == null) { return new DllImports.StoryboardData { isStoryboardReaderReady = 1, isFrameReady = 0, duration = (long)(GetInstance().storyboardReaders[tileId].Duration().TotalMilliseconds / TilePreviewTimeScale) } } ; return(new DllImports.StoryboardData { isStoryboardReaderReady = 1, isFrameReady = 1, frame = new DllImports.SubBitmap { rectLeft = subSkBitmap.SkRect.Left, rectRight = subSkBitmap.SkRect.Right, rectTop = subSkBitmap.SkRect.Top, rectBottom = subSkBitmap.SkRect.Bottom, bitmapWidth = subSkBitmap.Bitmap.Width, bitmapHeight = subSkBitmap.Bitmap.Height, bitmapInfoColorType = (int)SkiaUtils.ConvertToFormat(subSkBitmap.Bitmap.Info.ColorType), bitmapBytes = (byte *)subSkBitmap.Bitmap.GetPixels(), bitmapHash = subSkBitmap.SkRect.GetHashCode() }, duration = (long)(GetInstance().storyboardReaders[tileId].Duration().TotalMilliseconds / TilePreviewTimeScale) }); } } }
private static unsafe DllImports.SubBitmap GetFrame(SubSkBitmap subSkBitmap) { return(new DllImports.SubBitmap { rectLeft = subSkBitmap.SkRect.Left, rectRight = subSkBitmap.SkRect.Right, rectTop = subSkBitmap.SkRect.Top, rectBottom = subSkBitmap.SkRect.Bottom, bitmapWidth = subSkBitmap.Bitmap.Width, bitmapHeight = subSkBitmap.Bitmap.Height, bitmapInfoColorType = (int)SkiaUtils.ConvertToFormat(subSkBitmap.Bitmap.Info.ColorType), bitmapBytes = (byte *)subSkBitmap.Bitmap.GetPixels(), bitmapHash = subSkBitmap.SkRect.GetHashCode() % (int.MaxValue - 1) + 1 // let 0 be invalid hash value }); }