internal void LogInterestingPrimitives(List <PrimitiveInfo> commands, int count, List <Cluster> transparentCluster) { if (Configuration.Verbose >= 1) { // Display only interesting primitives DisplayList.PrintPrimitive(null, -1, false); Rect target = Rect.Empty; int vip = 0; for (int i = 0; i < count; i++) { PrimitiveInfo pi = commands[i]; if ((pi != null) && ((pi.overlapHasTransparency != 0) || !pi.primitive.IsOpaque)) { if (!pi.primitive.IsOpaque) { target.Union(pi.bounds); } DisplayList.PrintPrimitive(commands[i], i, false); vip++; } } Console.WriteLine(); Console.WriteLine("Interesting primitives: {0}", vip); Console.WriteLine("Area with transparency: {0}", DisplayList.LeftPad(target, 0)); Console.WriteLine(); for (int i = 0; i < transparentCluster.Count; i++) { Console.WriteLine( "Cluster {0}: {1} {2} {3}", i + 1, DisplayList.LeftPad(transparentCluster[i].DebugBounds, 0), DisplayList.LeftPad(transparentCluster[i].DebugPrimitives, 0), transparentCluster[i].DebugRasterize); } Console.WriteLine(); } }
/// <summary> /// Resolve object overlapping in a primitive tree. /// Send broken down drawing primitives to _dc. /// </summary> /// <param name="dc"></param> /// <param name="disjoint">True if all output primitives need to be disjoint</param> public void AlphaFlatten(IProxyDrawingContext dc, bool disjoint) { List <PrimitiveInfo> commands = _dl.Commands; if (commands == null) { return; } int count = commands.Count; _dc = dc; bool needFlattening = true; if (Configuration.BlendAlphaWithWhite || Configuration.ForceAlphaOpaque) { needFlattening = false; } else if (!disjoint) { needFlattening = false; for (int i = 0; i < count; i++) { PrimitiveInfo info = commands[i]; if (!info.primitive.IsOpaque) { needFlattening = true; break; } } } if (needFlattening) { #if DEBUG Console.WriteLine(); Console.WriteLine("Stage 2: Calculating intersections using bounding boxes"); Console.WriteLine(); #endif // Still need all the primitive, for removal by opaque covering and white primitive removal _dl.CalculateIntersections(count); } #if DEBUG if (Configuration.Verbose >= 2) { Console.WriteLine(); Console.WriteLine("Original display list"); Console.WriteLine(); DisplayList.PrintPrimitive(null, -1, true); for (int i = 0; i < count; i++) { DisplayList.PrintPrimitive(commands[i], i, true); } Console.WriteLine(); Console.WriteLine("Primitives in display list: {0}", count); Console.WriteLine(); } #endif if (needFlattening) { DisplayListOptimization(commands, count, disjoint); } #if DEBUG for (int i = 0; i < count; i++) { if (commands[i] != null) { commands[i].SetID(i); } } Console.WriteLine(); Console.WriteLine("Stage 4: Alpha flattening"); Console.WriteLine(); #endif for (int i = 0; i < count; i++) { PrimitiveInfo info = commands[i]; if (info == null) { continue; } String desp = null; #if DEBUG if (Configuration.Verbose >= 2) { Console.Write(i); Console.Write(": "); } desp = info.id; #endif if (info.m_cluster != null) { info.m_cluster.Render(commands, dc); } else { AlphaRender(info.primitive, info.overlap, info.overlapHasTransparency, disjoint, desp); } #if DEBUG if (Configuration.Verbose >= 2) { Console.WriteLine(""); } #endif } _dc = null; }