func convertSurface(xn *xmlx.Node) { var ( imgNode, imgCreateNode, imgCreateFormatNode, rn, sn, tn *xmlx.Node ensureCreateNode = func() *xmlx.Node { if imgCreateNode == nil { if rn = subNode(imgNode, "init_from"); rn != nil { imgNode.RemoveChild(rn) } imgCreateNode = ensureChild(imgNode, "create_"+strings.ToLower(attVal(xn, "type"))) if rn != nil { imgCreateNode.AddChild(rn) } } return imgCreateNode } ensureCreateFormatNode = func(exact, hint bool) *xmlx.Node { imgCreateFormatNode = ensureChild(ensureCreateNode(), "format") if hint { ensureChild(imgCreateFormatNode, "hint") } if exact { ensureChild(imgCreateFormatNode, "exact") } return imgCreateFormatNode } ) surfaceNodes = append(surfaceNodes, xn) myID, imgID, initNode := attVal(xn.Parent, "sid"), "", subNode(xn, "init_as_target") if len(myID) == 0 { myID = attVal(xn.Parent, "ref") } if myID = ustr.StripPrefix(myID, "#"); len(myID) > 0 { if initNode != nil { imgID = fmt.Sprintf("img_target_%v", time.Now().UnixNano()) imgNode, rn = xmlx.NewNode(xn.Type), xmlx.NewNode(xn.Type) imgNode.Name.Local, rn.Name.Local = "image", "renderable" setAttr(imgNode, "id", imgID, false) setAttr(rn, "share", "true", false) imgNode.AddChild(rn) moveNode(imgNode, nil, "library_images") } else if initNode = subNode(xn, "init_from"); initNode != nil { imgID = initNode.Value } else { for _, sn = range xn.Children { if strings.HasPrefix(sn.Name.Local, "init_") { initNode = sn break } } if initNode != nil { for _, sn = range initNode.Children { if imgID = attVal(sn, "ref"); len(imgID) > 0 { break } } } } if imgID = ustr.StripPrefix(imgID, "#"); len(imgID) > 0 { surfaceImages[myID] = imgID if imgNode == nil { for _, sn = range subNode(srcDoc.Root.Children[0], "library_images").Children { if attVal(sn, "id") == imgID { imgNode = sn break } } } } if imgNode != nil { if tn = subNode(xn, "format"); tn != nil { subNode(ensureCreateFormatNode(true, false), "exact").Value = tn.Value } if tn = subNode(xn, "format_hint"); tn != nil { rn = subNode(ensureCreateFormatNode(false, true), "hint") if sn = subNode(tn, "channels"); sn != nil { setAttr(rn, "channels", sn.Value, false) } if sn = subNode(tn, "range"); sn != nil { setAttr(rn, "range", sn.Value, false) } if sn = subNode(tn, "precision"); sn != nil { setAttr(rn, "precision", sn.Value, false) } if sn = subNode(tn, "option"); sn != nil { setAttr(rn, "space", sn.Value, false) } } if tn = subNode(xn, "size"); tn != nil { vals := ustr.Split(tn.Value, " ") rn = ensureChild(ensureCreateNode(), "size_exact") if len(vals) > 0 { setAttr(rn, "width", vals[0], false) } if len(vals) > 1 { setAttr(rn, "height", vals[1], false) } if len(vals) > 2 { setAttr(rn, "depth", vals[2], false) } } if tn = subNode(xn, "viewport_ratio"); tn != nil { vals := ustr.Split(tn.Value, " ") rn = ensureChild(ensureCreateNode(), "size_ratio") setAttr(rn, "width", vals[0], false) setAttr(rn, "height", vals[1], false) } if tn = subNode(xn, "mip_levels"); tn != nil { setAttr(ensureChild(ensureCreateNode(), "mips"), "levels", tn.Value, false) } if tn = subNode(xn, "mipmap_generate"); tn != nil { setAttr(ensureChild(ensureCreateNode(), "mips"), "auto_generate", tn.Value, false) } } } }