示例#1
0
        public ControlParser(string srcFileDirPath, PsdLayerExtractor.Layer layer)
        {
            var errorPreMsg     = "Parse error at '" + srcFileDirPath + "/" + layer.name + "'.";
            var name_cmdAndVals = layer.name.Split('@');

            this.srcFileDirPath = srcFileDirPath;
            this.originalName   = layer.name;
            this.name           = name_cmdAndVals[0];
            {
                for (var i = 1; i < name_cmdAndVals.Length; ++i)
                {
                    name_cmdAndVals[i] = name_cmdAndVals[i].Trim().ToLower();
                }
            }

            this.ParseCommandType(name_cmdAndVals, layer, errorPreMsg);
            if (this.type == ControlType.Script)
            {
                this.text = string.IsNullOrEmpty(layer.text) ? "" : layer.text.Trim();
            }
            else
            {
                this.fullName = this.name +
                                (string.IsNullOrEmpty(this.command) ? "" : '@' + this.command);

                var comment = this.ParseComment(name_cmdAndVals);
                if (!string.IsNullOrEmpty(comment))
                {
                    this.name = this.name + "(" + comment + ")";
                }

                this.area = new PsdLayerRect(
                    layer.psdLayer.area.left,
                    layer.psdLayer.area.top,
                    layer.psdLayer.area.width,
                    layer.psdLayer.area.height);

                this.hasBoxCollider = this.ParseCollider(name_cmdAndVals) == "box";
                this.sliceArea      = this.ParseSliceArea(name_cmdAndVals);
                this.color          = this.ParseColor(name_cmdAndVals);
                if (!string.IsNullOrEmpty(layer.text))
                {
                    this.text = layer.text.Trim();
                    var arr = this.text.Split('\n');
                    this.fontSize = Mathf.FloorToInt(this.area.height / arr.Length * 0.92f);
                }
                else
                {
                    this.text = this.ParseText(name_cmdAndVals);
                }

                this.bold   = this.IsBold(name_cmdAndVals);
                this.shadow = this.IsShadow(name_cmdAndVals);
                this.align  = this.ParseAlign(name_cmdAndVals);

                this.fps = this.ParseFps(name_cmdAndVals);
            }
        }
示例#2
0
        private PsdLayerRect ParseSliceArea(string[] name_cmdAndVals)
        {
            var area = this.ParseCommand("slice", name_cmdAndVals);

            if (!string.IsNullOrEmpty(area))
            {
                var values = area.Split('x');
                var rc     = new PsdLayerRect();
                {
                    rc.left   = this.ParseSliceValue(values[0], false);
                    rc.top    = values.Length < 2 ? rc.left : this.ParseSliceValue(values[1], true);
                    rc.right  = values.Length < 3 ? rc.left : this.ParseSliceValue(values[2], false);
                    rc.bottom = values.Length < 4 ? rc.top : this.ParseSliceValue(values[3], true);
                }
                return(rc);
            }
            return(null);
        }
示例#3
0
    private Texture MakeSlicedSprites(ref byte[] data, Layer layer, PsdLayerRect area)
    {
        var channelCount = layer.psdLayer.channels.Length;
        var pitch        = layer.psdLayer.pitch;
        var w            = layer.psdLayer.area.width;
        var h            = layer.psdLayer.area.height;

        var x1 = area.left;
        var y1 = area.top;
        var x2 = area.right;
        var y2 = area.bottom;

        var aaa = 0;
        var rc1 = new Rect(0, 0, x1 + aaa, y1 + aaa);
        var rc2 = new Rect(w - x2, 0, x2, y1 + aaa);
        var rc3 = new Rect(0, h - y2, x1 + aaa, y2);
        var rc4 = new Rect(w - x2, h - y2, x2, y2);
        var ww  = (int)(rc1.width + rc2.width);
        var hh  = (int)(rc1.height + rc3.height);

        var format  = channelCount == 3 ? TextureFormat.RGB24 : TextureFormat.ARGB32;
        var tex     = new Texture2D(ww, hh, format, false);
        var opacity = (byte)Mathf.RoundToInt(layer.psdLayer.opacity * 255f);
        var colors  = new Color32[ww * hh];
        var k       = 0;

        for (var y = h - 1; y >= 0; --y)
        {
            var yy = h - 1 - y;
            var xx = 0;

            for (var x = 0; x < pitch; x += channelCount)
            {
                var n = x + y * pitch;
                var c = new Color32(1, 1, 1, 1);
                if (channelCount == 3)
                {
                    c.b = data[n++];
                    c.g = data[n++];
                    c.r = data[n++];
                    c.a = opacity;
                }
                else
                {
                    c.b = data[n++];
                    c.g = data[n++];
                    c.r = data[n++];
                    c.a = (byte)Mathf.RoundToInt(data[n++] / 255f * opacity);
                }

                var pt = new Vector2(xx++, yy);
                if (rc1.Contains(pt) || rc2.Contains(pt) || rc3.Contains(pt) || rc4.Contains(pt))
                {
                    colors[k++] = c;
                }
            }
        }
        tex.filterMode = FilterMode.Point;
        tex.SetPixels32(colors);
        tex.Apply();
        data = tex.EncodeToPNG();
        return(tex);
    }
		private PsdLayerRect ParseSliceArea(string[] name_cmdAndVals)
		{
			var area = this.ParseCommand("slice", name_cmdAndVals);
			if (!string.IsNullOrEmpty(area))
			{
				var values = area.Split('x');
				var rc = new PsdLayerRect();
				{
					rc.left = this.ParseSliceValue(values[0], false);
					rc.top = values.Length < 2 ? rc.left : this.ParseSliceValue(values[1], true);
					rc.right = values.Length < 3 ? rc.left : this.ParseSliceValue(values[2], false);
					rc.bottom = values.Length < 4 ? rc.top : this.ParseSliceValue(values[3], true);
				}
				return rc;
			}
			return null;
		}
		public ControlParser(string srcFileDirPath, PsdLayerExtractor.Layer layer)
		{
			var errorPreMsg = "Parse error at '" +srcFileDirPath+ "/" +layer.name+ "'.";
			var name_cmdAndVals = layer.name.Split('@');
			
			this.srcFileDirPath = srcFileDirPath;
			this.originalName = layer.name;
			this.name = name_cmdAndVals[0];
			{
				for (var i=1; i<name_cmdAndVals.Length; ++i)
				{
					name_cmdAndVals[i] = name_cmdAndVals[i].Trim().ToLower();
				}
			}
			
			this.ParseCommandType(name_cmdAndVals, layer, errorPreMsg);
			if (this.type == ControlType.Script)
			{
				this.text = string.IsNullOrEmpty(layer.text) ? "" : layer.text.Trim();
			}
			else
			{
				this.fullName = this.name + 
					(string.IsNullOrEmpty(this.command) ? "" : '@' + this.command);
				
				var comment = this.ParseComment(name_cmdAndVals);
				if (!string.IsNullOrEmpty(comment))
					this.name = this.name + "(" + comment + ")";
				
				this.area = new PsdLayerRect(
					layer.psdLayer.area.left, 
					layer.psdLayer.area.top, 
					layer.psdLayer.area.width, 
					layer.psdLayer.area.height);
				
				this.hasBoxCollider = this.ParseCollider(name_cmdAndVals) == "box";
				this.sliceArea = this.ParseSliceArea(name_cmdAndVals);
				this.color = this.ParseColor(name_cmdAndVals);
				if (!string.IsNullOrEmpty(layer.text))
				{
					this.text = layer.text.Trim();
					var arr = this.text.Split('\n');
					this.fontSize = Mathf.FloorToInt(this.area.height / arr.Length * 0.92f);
				}
				else
					this.text = this.ParseText(name_cmdAndVals);
				
				this.bold = this.IsBold(name_cmdAndVals);
				this.shadow = this.IsShadow(name_cmdAndVals);
				this.align = this.ParseAlign(name_cmdAndVals);

				this.fps = this.ParseFps(name_cmdAndVals);
			}
		}
	private Texture MakeSlicedSprites(ref byte[] data, Layer layer, PsdLayerRect area)
	{
		var channelCount = layer.psdLayer.channels.Length;
		var pitch = layer.psdLayer.pitch;
		var w = layer.psdLayer.area.width;
		var h = layer.psdLayer.area.height;
		
		var x1 = area.left;
		var y1 = area.top;
		var x2 = area.right;
		var y2 = area.bottom;
		
		var aaa = 0;
		var rc1 = new Rect(0, 0, x1 + aaa, y1 + aaa);
		var rc2 = new Rect(w - x2, 0, x2, y1 + aaa);
		var rc3 = new Rect(0, h - y2, x1 + aaa, y2);
		var rc4 = new Rect(w - x2, h - y2, x2, y2);
		var ww = (int)(rc1.width + rc2.width);
		var hh = (int)(rc1.height + rc3.height);
		
		var format = channelCount == 3 ? TextureFormat.RGB24 : TextureFormat.ARGB32;
		var tex = new Texture2D(ww, hh, format, false);
		var opacity = (byte)Mathf.RoundToInt(layer.psdLayer.opacity * 255f);
		var colors = new Color32[ww * hh];
		var k = 0;
		for (var y=h-1; y>=0; --y)
		{
			var yy = h-1-y;
			var xx = 0;
			
			for (var x=0; x<pitch; x+=channelCount)
			{
				var n = x + y * pitch;
				var c = new Color32(1,1,1,1);
				if (channelCount == 3)
				{
					c.b = data[n++];
					c.g = data[n++];
					c.r = data[n++];
					c.a = opacity;
				}
				else
				{
					c.b = data[n++];
					c.g = data[n++];
					c.r = data[n++];
					c.a = (byte)Mathf.RoundToInt(data[n++]/255f * opacity);
				}
				
				var pt = new Vector2(xx++, yy);
				if (rc1.Contains(pt) || rc2.Contains(pt) || rc3.Contains(pt) || rc4.Contains(pt))
					colors[k++] = c;
			}
		}
		tex.filterMode = FilterMode.Point;
		tex.SetPixels32(colors);
		tex.Apply();
		data = tex.EncodeToPNG();
		return tex;
	}
示例#7
0
	private static bool SetSlicedSprite(string fullName, PsdLayerRect sliceArea)
	{
		if (sliceArea == null)
			return false;
		
		var spr = PsdLayerToNGUI.data.atlasPrefab.GetSprite(fullName);
		if (spr != null)
		{
			spr.borderLeft = (int)sliceArea.left;
			spr.borderRight = (int)sliceArea.right;
			spr.borderBottom = (int)sliceArea.bottom;
			spr.borderTop = (int)sliceArea.top;
		}
		return true;
	}