/*
 * Copyright 2015 Google Inc.
 *
 * Use of this source code is governed by a BSD-style license that can be
 * found in the LICENSE file.
 */

#ifndef BitmapRegionDecoderPriv_DEFINED
#define BitmapRegionDecoderPriv_DEFINED

#include "include/core/SkRect.h"

enum SubsetType {
    kFullyInside_SubsetType,
    kPartiallyInside_SubsetType,
    kOutside_SubsetType,
};

/*
 * Corrects image subset offsets and dimensions in order to perform a valid decode.
 * Also indicates if the image subset should be placed at an offset within the
 * output bitmap.
 *
 * Values of output variables are undefined if the SubsetType is kInvalid.
 *
 * @param imageDims Original image dimensions.
 * @param subset    As input, the subset that the client requested.
 *                  As output, the image subset that we will decode.
 * @param outX      The left offset of the image subset within the output bitmap.
 * @param outY      The top offset of the image subset within the output bitmap.
 *
 * @return An indication of how the subset is contained in the image.
 *         If the return value is kInvalid, values of output variables are undefined.
 */
inline SubsetType adjust_subset_rect(const SkISize& imageDims, SkIRect* subset, int* outX,
        int* outY) {
    // These must be at least zero, we can't start decoding the image at a negative coordinate.
    int left = std::max(0, subset->fLeft);
    int top = std::max(0, subset->fTop);

    // If input offsets are less than zero, we decode to an offset location in the output bitmap.
    *outX = left - subset->fLeft;
    *outY = top - subset->fTop;

    // Make sure we don't decode pixels past the edge of the image or past the edge of the subset.
    int width = std::min(imageDims.width() - left, subset->width() - *outX);
    int height = std::min(imageDims.height() - top, subset->height() - *outY);
    if (width <= 0 || height <= 0) {
        return SubsetType::kOutside_SubsetType;
    }

    subset->setXYWH(left, top, width, height);
    if ((*outX != 0) || (*outY != 0) || (width != subset->width()) ||
            (height != subset->height())) {
        return SubsetType::kPartiallyInside_SubsetType;
    }

    return SubsetType::kFullyInside_SubsetType;
}

#endif // BitmapRegionDecoderPriv_DEFINED
