LGDrawableReturn ParseBitmap(XElement root)
        {
            String imgPath  = "";
            String tileMode = null;

            //[UIColor colorWithPatternImage: [UIImage imageNamed:@"gingham.png"]];
            foreach (XAttribute node in root.Attributes())
            {
                if (node.Name.LocalName == "src")
                {
                    imgPath = node.Value;
                }
                if (node.Name.LocalName == "tileMode")
                {
                    tileMode = node.Value;
                }
            }

            Color?      color = null;
            ImageSource img   = null;

            if (tileMode != null)
            {
                if (tileMode == "repeat")
                {
                    //color = [UIColor colorWithPatternImage: [UIImage imageNamed:imgPath]];
                    color = Colors.Black; //TODO:Fix
                }
                else
                {
                    img = LGDrawableParser.Instance.ParseDrawable(imgPath).img;
                }
            }
            else
            {
                img = LGDrawableParser.Instance.ParseDrawable(imgPath).img;
            }

            if (img != null || color != null)
            {
                LGDrawableReturn ldr = new LGDrawableReturn();
                ldr.img   = img;
                ldr.color = color;
                return(ldr);
            }
            return(null);
        }
        public LGDrawableReturn ParseDrawable(String drawable)
        {
            String[]    arr    = drawable.Split('/');
            ImageSource retVal = null;

            if (arr[0].Contains("drawable"))
            {
                if (arr.Length > 1)
                {
                    String name = arr[1];
                    foreach (DynamicResource dr in directoryList)
                    {
                        String path = System.IO.Path.Combine(LuaEngine.LUA_RESOURCE_FOLDER, LuaEngine.Instance.GetUIRoot(), (String)dr.data);
                        Stream str  = (Stream)LuaResource.GetResource(path, name + ".png").GetStream();
                        if (str == null)
                        {
                            str = (Stream)LuaResource.GetResource(path, name + ".jpg").GetStream();
                            if (str == null)
                            {
                                str = (Stream)LuaResource.GetResource(path, name + ".gif").GetStream();
                                if (retVal == null)
                                {
                                    retVal = ParseXML(name).img;
                                }
                            }
                        }
                        if (str != null)
                        {
                            retVal = new BitmapImage();
                            ((BitmapImage)retVal).SetSource(str
#if NETFX_CORE
                                                            .AsRandomAccessStream()
#endif
                                                            );
                            break;
                        }
                    }
                }
            }
            LGDrawableReturn ldr = new LGDrawableReturn();
            ldr.img = retVal;
            return(ldr);
        }
        LGDrawableReturn ParseXML(String filename)
        {
            LuaStream dat = LuaResource.GetResource(LuaEngine.LUA_DRAWABLE_FOLDER, filename + ".xml");
            XDocument parse;

            try {
                parse = XDocument.Load((Stream)dat.GetStream());
                String name = parse.Root.Name.LocalName;

                XElement root = parse.Root;
                if (name == "bitmap" ||
                    name == "nine-patch")
                {
                    return(ParseBitmap(root));
                }
                else if (name == "layer-list")
                {
                    return(ParseLayer(root));
                }
                else if (name == "selector")
                {
                    return(ParseStateList(root));
                }
                else if (name == "shape")
                {
                    return(ParseShape(root));
                }
            }
            catch (Exception ex)
            {
                LGDrawableReturn ret = new LGDrawableReturn();
                return(ret);
            }

            return(null);
        }
        LGDrawableReturn ParseStateList(XElement root)
        {
            Dictionary <StateType, ImageSource> stateList = new Dictionary <StateType, ImageSource>();

            foreach (XElement child in root.Elements())
            {
                LGDrawableReturn ldr  = null;
                String           name = child.Name.LocalName;
                if (name == "item")
                {
                    int      childCount = 0;
                    XElement firstChild = null;
                    foreach (XElement x in child.Elements())
                    {
                        if (childCount == 0)
                        {
                            firstChild = x;
                        }
                        childCount++;
                    }
                    if (childCount > 0)
                    {
                        ldr = ParseBitmap(firstChild);
                    }

                    foreach (XAttribute node in child.Attributes())
                    {
                        String attr = node.Name.LocalName;
                        if (attr == "drawable")
                        {
                            ldr = ParseDrawable(node.Value);
                        }
                        else if (attr == "state_pressed")
                        {
                            stateList.Add(StateType.StateSelected, ldr.img);
                        }
                        else if (attr == "state_focused")
                        {
                            stateList.Add(StateType.StateHighlighted, ldr.img);
                        }
                        else if (attr == "state_hovered")
                        {
                            stateList.Add(StateType.StateHighlighted, ldr.img);
                        }
                        else if (attr == "state_selected")
                        {
                            stateList.Add(StateType.StateSelected, ldr.img);
                        }
                        else if (attr == "state_checkable")
                        {
                            stateList.Add(StateType.StateCheckable, ldr.img);
                        }
                        else if (attr == "state_checked")
                        {
                            stateList.Add(StateType.StateChecked, ldr.img);
                        }
                        else if (attr == "state_enabled")
                        {
                            stateList.Add(StateType.StateNormal, ldr.img);
                        }
                        else if (attr == "state_activated")
                        {
                            stateList.Add(StateType.StateActivated, ldr.img);
                        }
                        else if (attr == "state_window_focused")
                        {
                            stateList.Add(StateType.StateWindowFocused, ldr.img);
                        }
                    }
                }
            }

            stateListDictionary.Add(root.Name.LocalName, stateList);

            LGDrawableReturn ret = new LGDrawableReturn();

            ret.img   = null;
            ret.state = root.Name.LocalName;
            return(ret);
        }
        LGDrawableReturn ParseLayer(XElement root)
        {
            Canvas canvas = new Canvas();

            int totalWidth  = 0;
            int totalHeight = 0;

            foreach (XElement child in root.Elements())
            {
                int left = 0, top = 0, right = 0, bottom = 0;
                LGDrawableReturn ldr  = null;
                String           name = child.Name.LocalName;
                if (name == "item")
                {
                    int      childCount = 0;
                    XElement firstChild = null;
                    foreach (XElement x in child.Elements())
                    {
                        if (childCount == 0)
                        {
                            firstChild = x;
                        }
                        childCount++;
                    }
                    if (childCount > 0)
                    {
                        ldr = ParseBitmap(firstChild);
                    }
                    foreach (XAttribute node in child.Attributes())
                    {
                        String attr = node.Name.LocalName;
                        if (attr == "drawable")
                        {
                            ldr = ParseDrawable(node.Value);
                        }
                        else if (attr == "id")
                        {
                        }
                        else if (attr == "top")
                        {
                            top = LGDimensionParser.Instance.GetDimension(node.Value);
                        }
                        else if (attr == "right")
                        {
                            right = LGDimensionParser.Instance.GetDimension(node.Value);
                        }
                        else if (attr == "bottom")
                        {
                            bottom = LGDimensionParser.Instance.GetDimension(node.Value);
                        }
                        else if (attr == "left")
                        {
                            left = LGDimensionParser.Instance.GetDimension(node.Value);
                        }
                    }

                    if (ldr == null)
                    {
                        continue;
                    }
                    BitmapSource bs = (BitmapSource)ldr.img;
                    Image        i  = new Image();
                    i.Source = ldr.img;
                    Canvas.SetLeft(i, left - right);
                    Canvas.SetTop(i, top - bottom);
                    canvas.Children.Add(i);
                    int height = (top - bottom) + bs.PixelHeight;
                    int width  = (left - right) + bs.PixelWidth;

                    if (width > totalWidth)
                    {
                        totalWidth = width;
                    }
                    if (height > totalHeight)
                    {
                        totalHeight = height;
                    }
                }
            }

            canvas.Width  = totalWidth;
            canvas.Height = totalHeight;

#if !NETFX_CORE
            WriteableBitmap wb = BitmapFactory.New(totalWidth, totalHeight);
            wb.Render(canvas, null);
            wb.Invalidate();
            BitmapImage img;
            using (MemoryStream ms = new MemoryStream())
            {
                wb.SaveJpeg(ms, totalWidth, totalHeight, 0, 100);
                img = new BitmapImage();
                img.SetSource(ms);
            }
            LGDrawableReturn ret = new LGDrawableReturn();
            ret.img = img;
            return(ret);
#else
            LGDrawableReturn   ret = new LGDrawableReturn();
            RenderTargetBitmap rtb = new RenderTargetBitmap();
            rtb.RenderAsync(canvas, totalWidth, totalHeight).Completed = (info, status) =>
            {
                ret.img = rtb;
            };
            return(ret);
#endif
        }