Exemplo n.º 1
0
            internal void AddDiff(RenderTreeDiff diff)
            {
                var componentId = diff.ComponentId;

                if (!DiffsByComponentId.ContainsKey(componentId))
                {
                    DiffsByComponentId.Add(componentId, new List <RenderTreeDiff>());
                }
                DiffsByComponentId[componentId].Add(diff);
            }
Exemplo n.º 2
0
            internal void AddDiff(RenderTreeDiff diff)
            {
                var componentId = diff.ComponentId;

                if (!DiffsByComponentId.ContainsKey(componentId))
                {
                    DiffsByComponentId.Add(componentId, new List <RenderTreeDiff>());
                }

                // Clone the diff, because its underlying storage will get reused in subsequent batches
                DiffsByComponentId[componentId].Add(new RenderTreeDiff(
                                                        diff.ComponentId,
                                                        new ArraySegment <RenderTreeEdit>(diff.Edits.ToArray())));
            }
Exemplo n.º 3
0
        internal void AddDiff(RenderTreeDiff diff)
        {
            var componentId = diff.ComponentId;

            if (!DiffsByComponentId.ContainsKey(componentId))
            {
                DiffsByComponentId.Add(componentId, new List <CapturedRenderTreeDiff>());
            }

            var renderTreeEdits  = diff.Edits.ToArray();
            var capturedTreeDiff = new CapturedRenderTreeDiff(diff.ComponentId, renderTreeEdits);

            DiffsByComponentId[componentId].Add(capturedTreeDiff);
            DiffsInOrder.Add(capturedTreeDiff);
        }
Exemplo n.º 4
0
    public static RenderTreeDiff ComputeDiff(
        Renderer renderer,
        RenderBatchBuilder batchBuilder,
        int componentId,
        ArrayRange <RenderTreeFrame> oldTree,
        ArrayRange <RenderTreeFrame> newTree)
    {
        var editsBuffer            = batchBuilder.EditsBuffer;
        var editsBufferStartLength = editsBuffer.Count;

        var diffContext = new DiffContext(renderer, batchBuilder, componentId, oldTree.Array, newTree.Array);

        AppendDiffEntriesForRange(ref diffContext, 0, oldTree.Count, 0, newTree.Count);

        var editsSegment = editsBuffer.ToSegment(editsBufferStartLength, editsBuffer.Count);
        var result       = new RenderTreeDiff(componentId, editsSegment);

        return(result);
    }
Exemplo n.º 5
0
    internal void AddDiff(RenderTreeDiff diff)
    {
        var componentId = diff.ComponentId;

        if (!DiffsByComponentId.ContainsKey(componentId))
        {
            DiffsByComponentId.Add(componentId, new List <RenderTreeDiff>());
        }

        // Clone the diff, because its underlying storage will get reused in subsequent batches
        var cloneBuilder = new ArrayBuilder <RenderTreeEdit>();

        cloneBuilder.Append(diff.Edits.ToArray(), 0, diff.Edits.Count);
        var diffClone = new RenderTreeDiff(
            diff.ComponentId,
            cloneBuilder.ToSegment(0, diff.Edits.Count));

        DiffsByComponentId[componentId].Add(diffClone);
        DiffsInOrder.Add(diffClone);
    }
Exemplo n.º 6
0
        private static ArrayRange <RenderTreeDiff> ReadUpdatedComponents(ReadOnlySpan <byte> data, ReadOnlySpan <byte> indexes, string[] strings)
        {
            var result = new RenderTreeDiff[indexes.Length / 4];

            for (var i = 0; i < indexes.Length; i += 4)
            {
                var index = BitConverter.ToInt32(indexes.Slice(i, 4));

                var componentId = BitConverter.ToInt32(data.Slice(index, 4));
                var editCount   = BitConverter.ToInt32(data.Slice(index + 4, 4));

                var editData = data.Slice(index + 8);
                var edits    = new RenderTreeEdit[editCount];
                for (var j = 0; j < editCount; j++)
                {
                    var type         = (RenderTreeEditType)BitConverter.ToInt32(editData.Slice(0, 4));
                    var siblingIndex = BitConverter.ToInt32(editData.Slice(4, 4));

                    // ReferenceFrameIndex and MoveToSiblingIndex share a slot, so this reads
                    // whichever one applies to the edit type
                    var referenceFrameIndex  = BitConverter.ToInt32(editData.Slice(8, 4));
                    var removedAttributeName = ReadString(editData.Slice(12, 4), strings);

                    editData = editData.Slice(16);

                    switch (type)
                    {
                    case RenderTreeEditType.UpdateText:
                        edits[j] = RenderTreeEdit.UpdateText(siblingIndex, referenceFrameIndex);
                        break;

                    case RenderTreeEditType.UpdateMarkup:
                        edits[j] = RenderTreeEdit.UpdateMarkup(siblingIndex, referenceFrameIndex);
                        break;

                    case RenderTreeEditType.SetAttribute:
                        edits[j] = RenderTreeEdit.SetAttribute(siblingIndex, referenceFrameIndex);
                        break;

                    case RenderTreeEditType.RemoveAttribute:
                        edits[j] = RenderTreeEdit.RemoveAttribute(siblingIndex, removedAttributeName);
                        break;

                    case RenderTreeEditType.PrependFrame:
                        edits[j] = RenderTreeEdit.PrependFrame(siblingIndex, referenceFrameIndex);
                        break;

                    case RenderTreeEditType.RemoveFrame:
                        edits[j] = RenderTreeEdit.RemoveFrame(siblingIndex);
                        break;

                    case RenderTreeEditType.StepIn:
                        edits[j] = RenderTreeEdit.StepIn(siblingIndex);
                        break;

                    case RenderTreeEditType.StepOut:
                        edits[j] = RenderTreeEdit.StepOut();
                        break;

                    case RenderTreeEditType.PermutationListEntry:
                        edits[j] = RenderTreeEdit.PermutationListEntry(siblingIndex, referenceFrameIndex);
                        break;

                    case RenderTreeEditType.PermutationListEnd:
                        edits[j] = RenderTreeEdit.PermutationListEnd();
                        break;

                    default:
                        throw new InvalidOperationException("Unknown edit type:" + type);
                    }
                }

                result[i / 4] = new RenderTreeDiff(componentId, ToArrayBuilderSegment(edits));
            }

            return(new ArrayRange <RenderTreeDiff>(result, result.Length));
        }
 public void Apply(RenderTreeDiff tree, RenderBatch batch)
 {
     //List<int> removedIndex = new List<int>();
     //List<View>
     //List<StyleSheet> deferedStyleSheet = new List<StyleSheet>();
     CurrentNode = InitialNode;
     foreach (var edit in tree.Edits)
     {
         var frame = batch.ReferenceFrames.Array[edit.ReferenceFrameIndex];
         ProcessTree(edit, batch, edit.ReferenceFrameIndex, edit.Type == RenderTreeEditType.PrependFrame ? (frame.ElementSubtreeLength == 0 ? 1 : frame.ElementSubtreeLength) :1);
         //ProcessTree(edit, batch, edit.ReferenceFrameIndex, frame.ElementSubtreeLength == 0 ? 1 : frame.ElementSubtreeLength);
         //int subtreeIndex = 0;
         //do
         //{
         //    switch (edit.Type)
         //    {
         //        case RenderTreeEditType.PrependFrame:
         //            {
         //                switch (frame.FrameType)
         //                {
         //                    case RenderTreeFrameType.Component:
         //                        {
         //                            var childRenderer = new ComponentRenderer(frame.Component, WebViewRenderer, this);
         //                            WebViewRenderer.Renderers[frame.ComponentId] = childRenderer;
         //                        }
         //                        break;
         //                    case RenderTreeFrameType.Element:
         //                        {
         //                            WebViewRenderer.DOMManager.CreateElement(Sequences.ToArray(), frame.Sequence, frame.ElementName);
         //                            Sequences.Push(frame.Sequence);
         //                        }
         //                        break;
         //                    case RenderTreeFrameType.Attribute:
         //                        {
         //                            WebViewRenderer.DOMManager.SetAttribute(Sequences.ToArray(), frame.AttributeName, frame.AttributeValue);
         //                        }
         //                        break;
         //                    case RenderTreeFrameType.Text:
         //                        WebViewRenderer.DOMManager.InsertText(Sequences.ToArray(), frame.Sequence, frame.TextContent);
         //                        break;
         //                    case RenderTreeFrameType.Markup:
         //                        WebViewRenderer.DOMManager.InsertMarkup(Sequences.ToArray(), frame.Sequence, frame.MarkupContent);
         //                        break;
         //                    case RenderTreeFrameType.Region:
         //                        Sequences.Push(frame.Sequence);
         //                        int sequenceSubTrees = frame.RegionSubtreeLength;
         //                        break;
         //                    default:
         //                        throw new NotImplementedException($"Invalid Frame type: {frame.FrameType}");
         //                }
         //            }
         //            break;
         //        case RenderTreeEditType.UpdateText:
         //            {
         //                WebViewRenderer.DOMManager.InsertText(Sequences.ToArray(), frame.Sequence, frame.TextContent);
         //            }
         //            break;
         //        case RenderTreeEditType.RemoveFrame:
         //            {
         //                WebViewRenderer.DOMManager.RemoveAt(Sequences.ToArray(), edit.SiblingIndex);
         //            }
         //            break;
         //        case RenderTreeEditType.UpdateMarkup:
         //            {
         //                WebViewRenderer.DOMManager.InsertText(Sequences.ToArray(), frame.Sequence, frame.TextContent);
         //            }
         //            break;
         //        case RenderTreeEditType.SetAttribute:
         //            {
         //                WebViewRenderer.DOMManager.SetAttribute(Sequences.ToArray(), frame.AttributeName, frame.AttributeValue);
         //            }
         //            break;
         //        case RenderTreeEditType.RemoveAttribute:
         //            {
         //                WebViewRenderer.DOMManager.RemoveAttribute(Sequences.ToArray(), frame.AttributeName);
         //            }
         //            break;
         //        case RenderTreeEditType.StepIn:
         //            break;
         //        case RenderTreeEditType.StepOut:
         //            break;
         //        case RenderTreeEditType.PermutationListEntry:
         //        case RenderTreeEditType.PermutationListEnd:
         //        default:
         //            throw new NotImplementedException($"Invalid edit type: {edit.Type}");
         //    }
         //    subtreeIndex++;
         //    if (batch.ReferenceFrames.Array[edit.ReferenceFrameIndex].ElementSubtreeLength > subtreeIndex)
         //        continue;
         //    break;
         //} while (true);
     }
 }