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 }