void AddDepth(int d)
        {
            if (d <= 0)
            {
                return;
            }
            if (root == null)
            {
                root = new ScalablePixelTreeNode();
                totalDepth++;
            }
            else
            {
                void Assign(ScalablePixelTreeNode target, ScalablePixelTreeNode pre, int prePos)
                {
                    if (pre == null)
                    {
                        target.tl = new ScalablePixelTreeNode()
                        {
                            parent = target
                        };
                        target.tr = new ScalablePixelTreeNode()
                        {
                            parent = target
                        };
                        target.bl = new ScalablePixelTreeNode()
                        {
                            parent = target
                        };
                        target.br = new ScalablePixelTreeNode()
                        {
                            parent = target
                        };
                    }
                    else
                    {
                        switch (prePos)
                        {
                        case 0:
                        {
                            target.tl = pre;
                            target.tr = new ScalablePixelTreeNode()
                            {
                                parent = target
                            };
                            target.bl = new ScalablePixelTreeNode()
                            {
                                parent = target
                            };
                            target.br = new ScalablePixelTreeNode()
                            {
                                parent = target
                            };
                        }
                        break;

                        case 1:
                        {
                            target.tl = new ScalablePixelTreeNode()
                            {
                                parent = target
                            };
                            target.tr = pre;
                            target.bl = new ScalablePixelTreeNode()
                            {
                                parent = target
                            };
                            target.br = new ScalablePixelTreeNode()
                            {
                                parent = target
                            };
                        }
                        break;

                        case 2:
                        {
                            target.tl = new ScalablePixelTreeNode()
                            {
                                parent = target
                            };
                            target.tr = new ScalablePixelTreeNode()
                            {
                                parent = target
                            };
                            target.bl = pre;
                            target.br = new ScalablePixelTreeNode()
                            {
                                parent = target
                            };
                        }
                        break;

                        case 3:
                        {
                            target.tl = new ScalablePixelTreeNode()
                            {
                                parent = target
                            };
                            target.tr = new ScalablePixelTreeNode()
                            {
                                parent = target
                            };
                            target.bl = new ScalablePixelTreeNode()
                            {
                                parent = target
                            };
                            target.br = pre;
                        }
                        break;
                        }
                        pre.parent = target;
                    }
                }

                ScalablePixelTreeNode n = new ScalablePixelTreeNode();
                Assign(n, null, 0);
                if (root.tl == null)
                {
                    //No depth
                    if (root._pixels != null)
                    {
                        //need slicing

                        //Create new chunks
                        SKColor[][] dst = new SKColor[4][];
                        dst[0] = new SKColor[TreeDefs.ChunkWidth * TreeDefs.ChunkHeight];
                        dst[1] = new SKColor[TreeDefs.ChunkWidth * TreeDefs.ChunkHeight];
                        dst[2] = new SKColor[TreeDefs.ChunkWidth * TreeDefs.ChunkHeight];
                        dst[3] = new SKColor[TreeDefs.ChunkWidth * TreeDefs.ChunkHeight];

                        //Slice this node
                        Utilities.ParallelJobManager.Get().DoJob((int index, int num) => { Slice(index, num, dst); });
                        n.tl._pixels = dst[0]; n.tr._pixels = dst[1];
                        n.bl._pixels = dst[2]; n.br._pixels = dst[3];
                    }
                }
                else
                {
                    //There is depth
                    //n.tl.br = root.tl;
                    Assign(n.tl, root.tl, 3);
                    //n.tr.bl = root.tr;
                    Assign(n.tr, root.tr, 2);
                    //n.bl.tr = root.bl;
                    Assign(n.bl, root.bl, 1);
                    //n.br.tl = root.br;
                    Assign(n.br, root.br, 0);
                }
                root = n;
                totalDepth++;
            }
            if (d > 1)
            {
                AddDepth(d - 1);
            }
        }
        internal void _setPixel(int x, int y, int depth, SKColor color)
        {
            if (depth == 1)
            {
                if (_pixels == null)
                {
                    if (tl != null)
                    {
                        //There is a deeper layer
                        //Find out which sector to draw on
                        ScalablePixelTreeNode n;
                        int xcoord, ycoord;
                        if (x >= 0)
                        {
                            xcoord = x * 2 - TreeDefs.ChunkWidth / 2;
                            if (y >= 0)
                            {
                                n = tr; ycoord = y * 2 - TreeDefs.ChunkHeight / 2;
                            }
                            else
                            {
                                n = br; ycoord = y * 2 + TreeDefs.ChunkHeight / 2;
                            }
                        }
                        else
                        {
                            xcoord = x * 2 + TreeDefs.ChunkWidth / 2;
                            if (y >= 0)
                            {
                                n = tl; ycoord = y * 2 - TreeDefs.ChunkHeight / 2;
                            }
                            else
                            {
                                n = bl; ycoord = y * 2 + TreeDefs.ChunkHeight / 2;
                            }
                        }
                        n._setPixel(xcoord, ycoord, 1, color);
                        n._setPixel(xcoord + 1, ycoord, 1, color);
                        n._setPixel(xcoord, ycoord + 1, 1, color);
                        n._setPixel(xcoord + 1, ycoord + 1, 1, color);
                        return;
                    }
                    else
                    {
                        _pixels = new SKColor[TreeDefs.ChunkWidth * TreeDefs.ChunkHeight];
                    }
                }
                int i = _pixelIndex(x, y);
                if (i >= 0 && i < _pixels.Length)
                {
                    _pixels[i] = color;
                }
                return;
            }
            else if (depth > 1)
            {
                ScalablePixelTreeNode n;
                int  xcoord, ycoord;
                bool t, r;
                if (x >= 0)
                {
                    r      = true;
                    xcoord = x * 2 - TreeDefs.ChunkWidth / 2;
                    if (y >= 0)
                    {
                        t = true; /*tr*/ n = tr; ycoord = y * 2 - TreeDefs.ChunkHeight / 2;
                    }
                    else
                    {
                        t = false; n = br; ycoord = y * 2 + TreeDefs.ChunkHeight / 2;
                    }
                }
                else
                {
                    r      = false;
                    xcoord = x * 2 + TreeDefs.ChunkWidth / 2;
                    if (y >= 0)
                    {
                        t = true; n = tl; ycoord = y * 2 - TreeDefs.ChunkHeight / 2;
                    }
                    else
                    {
                        t = false; n = bl; ycoord = y * 2 + TreeDefs.ChunkHeight / 2;
                    }
                }
                if (n == null)
                {
                    tl = new ScalablePixelTreeNode()
                    {
                        parent = this
                    };
                    tr = new ScalablePixelTreeNode()
                    {
                        parent = this
                    };
                    bl = new ScalablePixelTreeNode()
                    {
                        parent = this
                    };
                    br = new ScalablePixelTreeNode()
                    {
                        parent = this
                    };
                    if (_pixels != null)
                    {
                        //Create new chunks
                        SKColor[][] dst = new SKColor[4][];
                        dst[0] = new SKColor[TreeDefs.ChunkWidth * TreeDefs.ChunkHeight];
                        dst[1] = new SKColor[TreeDefs.ChunkWidth * TreeDefs.ChunkHeight];
                        dst[2] = new SKColor[TreeDefs.ChunkWidth * TreeDefs.ChunkHeight];
                        dst[3] = new SKColor[TreeDefs.ChunkWidth * TreeDefs.ChunkHeight];

                        //Slice this node
                        Utilities.ParallelJobManager.Get().DoJob((int index, int num) => { Slice(index, num, dst); });
                        tl._pixels = dst[0]; tr._pixels = dst[1];
                        bl._pixels = dst[2]; br._pixels = dst[3];
                        _pixels    = null;
                    }
                }
                n._setPixel(xcoord, ycoord, depth - 1, color);
            }
        }