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); } }