예제 #1
0
    /// <summary>
    /// Parses the resize command.
    /// </summary>
    /// <param name="engine">The engine.</param>
    /// <param name="dimensions">The dimensions.</param>
    /// <param name="filterName">Name of the filter(and parameters if any).</param>
    /// <returns></returns>
    private static CLIExitCode _ParseResizeCommand(ScriptEngine engine, string dimensions, string filterName) {
      Contract.Requires(engine != null);
      Contract.Requires(dimensions != null);
      Contract.Requires(filterName != null);

      var match = _DIMENSIONS_REGEX.Match(dimensions);
      if (!match.Success)
        return (CLIExitCode.InvalidTargetDimensions);

      var width = match.Groups["width"].Value;
      var height = match.Groups["height"].Value;
      var percent = match.Groups["percent"].Value;

      word targetWidth = 0;
      word targetHeight = 0;
      word targetPercent = 0;

      if (!(string.IsNullOrWhiteSpace(width) || word.TryParse(width, out targetWidth)))
        return (CLIExitCode.CouldNotParseDimensionsAsWord);

      if (!(string.IsNullOrWhiteSpace(height) || word.TryParse(height, out targetHeight)))
        return (CLIExitCode.CouldNotParseDimensionsAsWord);

      if (!(string.IsNullOrWhiteSpace(percent) || word.TryParse(percent, out targetPercent)))
        return (CLIExitCode.CouldNotParseDimensionsAsWord);

      var useAspect = targetWidth == 0 || targetHeight == 0;

      var filterMatch = _FILTER_REGEX.Match(filterName);
      if (!filterMatch.Success)
        return (CLIExitCode.InvalidFilterDescription);

      var filterParams = filterMatch.Groups["params"].Value;
      filterName = filterMatch.Groups["filter"].Value;

      var useThresholds = true;
      var useCenteredGrid = true;
      var repeat = (byte)1;
      var radius = 1f;
      var vbounds = OutOfBoundsMode.ConstantExtension;
      var hbounds = OutOfBoundsMode.ConstantExtension;

      if (!string.IsNullOrWhiteSpace(filterParams) && !byte.TryParse(filterParams, out repeat)) {
        repeat = 1;

        // parse parameterlist, splitted with "," and assigned using "="
        var parameters = (
          from p in filterParams.Split(',')
          let idx = p.IndexOf('=')
          where idx > 0
          let name = p.Substring(0, idx).Trim().ToLower()
          let value = p.Substring(idx + 1).Trim()
          select new KeyValuePair<string, string>(name, value)
        );

        #region supported parameter handling
        foreach (var pair in parameters) {
          switch (pair.Key) {
            case VBOUNDS_PARAMETER_NAME: {
              var value = pair.Value.ToLower();
              if (value == CONST_BOUNDS_VALUE)
                vbounds = OutOfBoundsMode.ConstantExtension;
              else if (value == HALF_BOUNDS_VALUE)
                vbounds = OutOfBoundsMode.HalfSampleSymmetric;
              else if (value == WHOLE_BOUNDS_VALUE)
                vbounds = OutOfBoundsMode.WholeSampleSymmetric;
              else if (value == WRAP_BOUNDS_VALUE)
                vbounds = OutOfBoundsMode.WrapAround;
              else
                return (CLIExitCode.InvalidOutOfBoundsMode);
              break;
            }
            case HBOUNDS_PARAMETER_NAME: {
              var value = pair.Value.ToLower();
              if (value == CONST_BOUNDS_VALUE)
                hbounds = OutOfBoundsMode.ConstantExtension;
              else if (value == HALF_BOUNDS_VALUE)
                hbounds = OutOfBoundsMode.HalfSampleSymmetric;
              else if (value == WHOLE_BOUNDS_VALUE)
                hbounds = OutOfBoundsMode.WholeSampleSymmetric;
              else if (value == WRAP_BOUNDS_VALUE)
                hbounds = OutOfBoundsMode.WrapAround;
              else
                return (CLIExitCode.InvalidOutOfBoundsMode);
              break;
            }
            case RADIUS_PARAMETER_NAME: {
              if (!float.TryParse(pair.Value, NumberStyles.Float, CultureInfo.InvariantCulture, out radius))
                return (CLIExitCode.CouldNotParseParameterAsFloat);
              break;
            }
            case REPEAT_PARAMETER_NAME: {
              if (!byte.TryParse(pair.Value, NumberStyles.Integer, CultureInfo.InvariantCulture, out repeat))
                return (CLIExitCode.CouldNotParseParameterAsByte);
              break;
            }
            case CENTERED_GRID_PARAMETER_NAME: {
              useCenteredGrid = pair.Value == "1";
              break;
            }
            case THRESHOLDS_PARAMETER_NAME: {
              useThresholds = pair.Value == "1";
              break;
            }
            default: {
              return (CLIExitCode.UnknownParameter);
            }
          }
        }
        #endregion

      }

      // find the given manipulator
      var manipulator = SupportedManipulators.MANIPULATORS
        .Where(resizer => string.Compare(resizer.Key, filterName, true) == 0)
        .Select(kvp => kvp.Value)
        .FirstOrDefault()
      ;

      if (manipulator == null)
        return (CLIExitCode.UnknownFilter);

      engine.AddWithoutExecution(new ResizeCommand(true, manipulator, targetWidth, targetHeight, targetPercent, useAspect, hbounds, vbounds, repeat, useThresholds, useCenteredGrid, radius));
      return (CLIExitCode.OK);
    }
예제 #2
0
    /// <summary>
    /// Parses a script line and adds the action from it to the engine's list.
    /// </summary>
    /// <param name="line">The line.</param>
    /// <param name="engine">The engine.</param>
    private static CLIExitCode _ParseScriptLine(string line, ScriptEngine engine) {
      Contract.Requires(engine != null);
      if (string.IsNullOrWhiteSpace(line))
        return (CLIExitCode.OK);

      var arguments = line.SplitWithQuotes(' ').ToArray();
      var length = arguments.Length;
      if (length < 1)
        return (CLIExitCode.OK);

      var i = 0;
      while (i < length) {
        var command = arguments[i++].ToLowerInvariant();

        // skip empty stuff
        if (command.IsNullOrWhiteSpace())
          continue;

        switch (command) {
          #region /STDIN
          case STDIN_COMMAND_NAME: {
            engine.AddWithoutExecution(new LoadStdInCommand());
            engine.AddWithoutExecution(new NullTransformCommand());
            break;
          }
          #endregion
          #region /STDOUT
          case STDOUT_COMMAND_NAME: {
            engine.AddWithoutExecution(new SaveStdOutCommand());
            break;
          }
          #endregion
          #region /LOAD
          case LOAD_COMMAND_NAME: {
            if (length - i < 1) {
              return (CLIExitCode.TooLessArguments);
            }
            var filename = arguments[i++];
            if (filename == null) {
              return (CLIExitCode.FilenameMustNotBeNull);
            }

            engine.AddWithoutExecution(new LoadFileCommand(filename));
            engine.AddWithoutExecution(new NullTransformCommand());
            break;
          }
          #endregion
          #region /RESIZE
          case RESIZE_COMMAND_NAME: {
            if (length - i < 2) {
              return (CLIExitCode.TooLessArguments);
            }
            var dimensions = arguments[i++].Trim();
            var filterName = arguments[i++].Trim();

            var result = _ParseResizeCommand(engine, dimensions, filterName);
            if (result != CLIExitCode.OK)
              return (result);
            break;
          }
          #endregion
          #region /SAVE
          case SAVE_COMMAND_NAME: {
            if (length - i < 1) {
              return (CLIExitCode.TooLessArguments);
            }
            var filename = arguments[i++];
            if (filename == null) {
              return (CLIExitCode.FilenameMustNotBeNull);
            }

            engine.AddWithoutExecution(new SaveFileCommand(filename));
            break;
          }
          #endregion
          #region /SCRIPT
          case SCRIPT_COMMAND_NAME: {
            if (length - i < 1) {
              return (CLIExitCode.TooLessArguments);
            }
            var filename = arguments[i++];
            if (filename == null) {
              return (CLIExitCode.FilenameMustNotBeNull);
            }

            LoadFromFile(engine, filename);
            break;
          }
          #endregion
          default: {
            return (CLIExitCode.UnknownParameter);
          }
        }
      }
      return (CLIExitCode.OK);
    }
        /// <summary>
        /// Parses a script line and adds the action from it to the engine's list.
        /// </summary>
        /// <param name="line">The line.</param>
        /// <param name="engine">The engine.</param>
        private static CLIExitCode _ParseScriptLine(string line, ScriptEngine engine)
        {
            Contract.Requires(engine != null);
            if (string.IsNullOrWhiteSpace(line))
            {
                return(CLIExitCode.OK);
            }

            var arguments = line.SplitWithQuotes(' ').ToArray();
            var length    = arguments.Length;

            if (length < 1)
            {
                return(CLIExitCode.OK);
            }

            var i = 0;

            while (i < length)
            {
                var command = arguments[i++].ToLowerInvariant();

                // skip empty stuff
                if (command.IsNullOrWhiteSpace())
                {
                    continue;
                }

                switch (command)
                {
                    #region /STDIN
                case STDIN_COMMAND_NAME: {
                    engine.AddWithoutExecution(new LoadStdInCommand());
                    engine.AddWithoutExecution(new NullTransformCommand());
                    break;
                }

                    #endregion
                    #region /STDOUT
                case STDOUT_COMMAND_NAME: {
                    engine.AddWithoutExecution(new SaveStdOutCommand());
                    break;
                }

                    #endregion
                    #region /LOAD
                case LOAD_COMMAND_NAME: {
                    if (length - i < 1)
                    {
                        return(CLIExitCode.TooLessArguments);
                    }
                    var filename = arguments[i++];
                    if (filename == null)
                    {
                        return(CLIExitCode.FilenameMustNotBeNull);
                    }

                    engine.AddWithoutExecution(new LoadFileCommand(filename));
                    engine.AddWithoutExecution(new NullTransformCommand());
                    break;
                }

                    #endregion
                    #region /RESIZE
                case RESIZE_COMMAND_NAME: {
                    if (length - i < 2)
                    {
                        return(CLIExitCode.TooLessArguments);
                    }
                    var dimensions = arguments[i++].Trim();
                    var filterName = arguments[i++].Trim();

                    var result = _ParseResizeCommand(engine, dimensions, filterName);
                    if (result != CLIExitCode.OK)
                    {
                        return(result);
                    }
                    break;
                }

                    #endregion
                    #region /SAVE
                case SAVE_COMMAND_NAME: {
                    if (length - i < 1)
                    {
                        return(CLIExitCode.TooLessArguments);
                    }
                    var filename = arguments[i++];
                    if (filename == null)
                    {
                        return(CLIExitCode.FilenameMustNotBeNull);
                    }

                    engine.AddWithoutExecution(new SaveFileCommand(filename));
                    break;
                }

                    #endregion
                    #region /SCRIPT
                case SCRIPT_COMMAND_NAME: {
                    if (length - i < 1)
                    {
                        return(CLIExitCode.TooLessArguments);
                    }
                    var filename = arguments[i++];
                    if (filename == null)
                    {
                        return(CLIExitCode.FilenameMustNotBeNull);
                    }

                    LoadFromFile(engine, filename);
                    break;
                }

                    #endregion
                default: {
                    return(CLIExitCode.UnknownParameter);
                }
                }
            }
            return(CLIExitCode.OK);
        }
        /// <summary>
        /// Parses the resize command.
        /// </summary>
        /// <param name="engine">The engine.</param>
        /// <param name="dimensions">The dimensions.</param>
        /// <param name="filterName">Name of the filter(and parameters if any).</param>
        /// <returns></returns>
        private static CLIExitCode _ParseResizeCommand(ScriptEngine engine, string dimensions, string filterName)
        {
            Contract.Requires(engine != null);
            Contract.Requires(dimensions != null);
            Contract.Requires(filterName != null);

            var match = _DIMENSIONS_REGEX.Match(dimensions);

            if (!match.Success)
            {
                return(CLIExitCode.InvalidTargetDimensions);
            }

            var width   = match.Groups["width"].Value;
            var height  = match.Groups["height"].Value;
            var percent = match.Groups["percent"].Value;

            word targetWidth   = 0;
            word targetHeight  = 0;
            word targetPercent = 0;

            if (!(string.IsNullOrWhiteSpace(width) || word.TryParse(width, out targetWidth)))
            {
                return(CLIExitCode.CouldNotParseDimensionsAsWord);
            }

            if (!(string.IsNullOrWhiteSpace(height) || word.TryParse(height, out targetHeight)))
            {
                return(CLIExitCode.CouldNotParseDimensionsAsWord);
            }

            if (!(string.IsNullOrWhiteSpace(percent) || word.TryParse(percent, out targetPercent)))
            {
                return(CLIExitCode.CouldNotParseDimensionsAsWord);
            }

            var useAspect = targetWidth == 0 || targetHeight == 0;

            var filterMatch = _FILTER_REGEX.Match(filterName);

            if (!filterMatch.Success)
            {
                return(CLIExitCode.InvalidFilterDescription);
            }

            var filterParams = filterMatch.Groups["params"].Value;

            filterName = filterMatch.Groups["filter"].Value;

            var useThresholds   = true;
            var useCenteredGrid = true;
            var repeat          = (byte)1;
            var radius          = 1f;
            var vbounds         = OutOfBoundsMode.ConstantExtension;
            var hbounds         = OutOfBoundsMode.ConstantExtension;

            if (!string.IsNullOrWhiteSpace(filterParams) && !byte.TryParse(filterParams, out repeat))
            {
                repeat = 1;

                // parse parameterlist, splitted with "," and assigned using "="
                var parameters = (
                    from p in filterParams.Split(',')
                    let idx = p.IndexOf('=')
                              where idx > 0
                              let name = p.Substring(0, idx).Trim().ToLower()
                                         let value = p.Substring(idx + 1).Trim()
                                                     select new KeyValuePair <string, string>(name, value)
                    );

                #region supported parameter handling
                foreach (var pair in parameters)
                {
                    switch (pair.Key)
                    {
                    case VBOUNDS_PARAMETER_NAME: {
                        var value = pair.Value.ToLower();
                        if (value == CONST_BOUNDS_VALUE)
                        {
                            vbounds = OutOfBoundsMode.ConstantExtension;
                        }
                        else if (value == HALF_BOUNDS_VALUE)
                        {
                            vbounds = OutOfBoundsMode.HalfSampleSymmetric;
                        }
                        else if (value == WHOLE_BOUNDS_VALUE)
                        {
                            vbounds = OutOfBoundsMode.WholeSampleSymmetric;
                        }
                        else if (value == WRAP_BOUNDS_VALUE)
                        {
                            vbounds = OutOfBoundsMode.WrapAround;
                        }
                        else
                        {
                            return(CLIExitCode.InvalidOutOfBoundsMode);
                        }
                        break;
                    }

                    case HBOUNDS_PARAMETER_NAME: {
                        var value = pair.Value.ToLower();
                        if (value == CONST_BOUNDS_VALUE)
                        {
                            hbounds = OutOfBoundsMode.ConstantExtension;
                        }
                        else if (value == HALF_BOUNDS_VALUE)
                        {
                            hbounds = OutOfBoundsMode.HalfSampleSymmetric;
                        }
                        else if (value == WHOLE_BOUNDS_VALUE)
                        {
                            hbounds = OutOfBoundsMode.WholeSampleSymmetric;
                        }
                        else if (value == WRAP_BOUNDS_VALUE)
                        {
                            hbounds = OutOfBoundsMode.WrapAround;
                        }
                        else
                        {
                            return(CLIExitCode.InvalidOutOfBoundsMode);
                        }
                        break;
                    }

                    case RADIUS_PARAMETER_NAME: {
                        if (!float.TryParse(pair.Value, NumberStyles.Float, CultureInfo.InvariantCulture, out radius))
                        {
                            return(CLIExitCode.CouldNotParseParameterAsFloat);
                        }
                        break;
                    }

                    case REPEAT_PARAMETER_NAME: {
                        if (!byte.TryParse(pair.Value, NumberStyles.Integer, CultureInfo.InvariantCulture, out repeat))
                        {
                            return(CLIExitCode.CouldNotParseParameterAsByte);
                        }
                        break;
                    }

                    case CENTERED_GRID_PARAMETER_NAME: {
                        useCenteredGrid = pair.Value == "1";
                        break;
                    }

                    case THRESHOLDS_PARAMETER_NAME: {
                        useThresholds = pair.Value == "1";
                        break;
                    }

                    default: {
                        return(CLIExitCode.UnknownParameter);
                    }
                    }
                }
                #endregion
            }

            // find the given manipulator
            var manipulator = SupportedManipulators.MANIPULATORS
                              .Where(resizer => string.Compare(resizer.Key, filterName, true) == 0)
                              .Select(kvp => kvp.Value)
                              .FirstOrDefault()
            ;

            if (manipulator == null)
            {
                return(CLIExitCode.UnknownFilter);
            }

            engine.AddWithoutExecution(new ResizeCommand(true, manipulator, targetWidth, targetHeight, targetPercent, useAspect, hbounds, vbounds, repeat, useThresholds, useCenteredGrid, radius));
            return(CLIExitCode.OK);
        }
예제 #5
0
 /// <summary>
 /// Applies the given script file to the source image.
 /// </summary>
 /// <param name="fileName">Name of the file.</param>
 private void _ApplyScriptFile(string fileName) {
   var localEngine = new ScriptEngine();
   localEngine.AddWithoutExecution(new NullTransformCommand());
   ScriptSerializer.LoadFromFile(localEngine, fileName);
   this._ExecuteScriptActions(localEngine.Actions.ToArray());
 }