#-------------------------------------------------------------
#
# Licensed to the Apache Software Foundation (ASF) under one
# or more contributor license agreements.  See the NOTICE file
# distributed with this work for additional information
# regarding copyright ownership.  The ASF licenses this file
# to you under the Apache License, Version 2.0 (the
# "License"); you may not use this file except in compliance
# with the License.  You may obtain a copy of the License at
#
#   http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing,
# software distributed under the License is distributed on an
# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
# KIND, either express or implied.  See the License for the
# specific language governing permissions and limitations
# under the License.
#
#-------------------------------------------------------------

m_img_crop = function(Matrix[Double] img_in, Integer w, Integer h, Integer x_offset, Integer y_offset) return (Matrix[Double] img_out) {
  # crop - cut out a subregion of an image. Adapted from image_utils.dml
  orig_w = ncol(img_in)
  orig_h = nrow(img_in)

  start_h = (ceil((orig_h - h) / 2)) + y_offset
  end_h = (start_h + h - 1) 
  start_w = (ceil((orig_w - w) / 2)) + x_offset
  end_w = (start_w + w - 1) 

  if((start_h < 0) | (end_h > orig_h) | (start_w < 0) | (end_w > orig_w)) {
    print("Offset out of bounds! Returning input.")
    img_out = img_in
  }
  else {
    mask = matrix(0, rows=orig_h, cols=orig_w)
    temp_mask = matrix(1, rows=h , cols=w )
    mask[start_h:end_h, start_w:end_w] = temp_mask
    mask = matrix(mask, rows=1, cols=orig_w * orig_h)
    img_out = matrix(removeEmpty(target=(matrix(img_in+1, 1, orig_w * orig_h)), margin="cols", select=mask) - 1, h, w)
  }
}
