private static bool QualifiesForMerge(IReadOnlyList <DeleteIndex> arr, IReadOnlyList <PcsData> pcsList, int mergeCount) { if (Configuration.Settings.SubtitleSettings.BluRaySupForceMergeAll) { return(false); } if (mergeCount < 3) { return(false); } if (arr.Count != 2) { return(true); } var i1 = pcsList[arr[0].Index]; var i2 = pcsList[arr[1].Index]; var dur1 = i1.EndTimeCode.TotalMilliseconds - i1.StartTimeCode.TotalMilliseconds; var dur2 = i2.EndTimeCode.TotalMilliseconds - i2.StartTimeCode.TotalMilliseconds; if (dur1 < 400 || dur2 < 400) { return(true); } if (i1.PaletteInfos.Count > 2 || i2.PaletteInfos.Count > 2) { return(true); } using (var b1 = i1.GetBitmap()) { var n1 = new NikseBitmap(b1); var height = n1.GetNonTransparentHeight(); var width = n1.GetNonTransparentWidth(); if (height > 110 || width > 300) { return(true); } using (var b2 = i2.GetBitmap()) { var n2 = new NikseBitmap(b2); var areEqual = n1.IsEqualTo(n2); return(areEqual); } } }
public List <NikseBitmap> MakeImageList(CdgGraphics cdgGraphics, Subtitle subtitle, CdgToImageSubtitleCallback callback) { subtitle.Paragraphs.Clear(); NikseBitmap lastNBmp = null; int count = 0; var imageList = new List <NikseBitmap>(); Paragraph p = null; int packetNumber = 0; var max = cdgGraphics.NumberOfPackets; while (packetNumber < max) { using (var bmp = cdgGraphics.ToBitmap(packetNumber)) { var nBmp = new NikseBitmap(bmp); var timeMs = packetNumber * CdgGraphics.TimeMsFactor; if (lastNBmp == null) { if (nBmp.Width > 0) { lastNBmp = nBmp; p = new Paragraph(string.Empty, timeMs, timeMs); } } else { if (!nBmp.IsEqualTo(lastNBmp)) { if (lastNBmp.Width > 0) { p.EndTime.TotalMilliseconds = timeMs; subtitle.Paragraphs.Add(p); imageList.Add(lastNBmp); } if (nBmp.Width > 0) { p = new Paragraph(string.Empty, timeMs, timeMs); } } else { p.EndTime.TotalMilliseconds = timeMs; } lastNBmp = nBmp; } } count++; packetNumber += SkipPacketCount; callback?.Invoke(count, imageList.Count); } subtitle.Renumber(); new FixOverlappingDisplayTimes().Fix(subtitle, new EmptyFixCallback()); // fix small gaps for (int i = 0; i < subtitle.Paragraphs.Count - 1; i++) { var current = subtitle.Paragraphs[i]; var next = subtitle.Paragraphs[i + 1]; if (!next.StartTime.IsMaxTime && !current.EndTime.IsMaxTime) { var gap = next.StartTime.TotalMilliseconds - current.EndTime.TotalMilliseconds; if (gap < MergeGapSmallerThanXMilliseconds) { current.EndTime.TotalMilliseconds = next.StartTime.TotalMilliseconds - SmallGapMilliseconds; } } } return(imageList); }
private bool IsImagesTheSame(NikseBitmap a, NikseBitmap b) { return(a.IsEqualTo(b)); }