/*
 * 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 SkMipmapAccessor_DEFINED
#define SkMipmapAccessor_DEFINED

#include "include/core/SkBitmap.h"
#include "include/core/SkImage.h"
#include "include/core/SkMatrix.h"
#include "src/core/SkMipmap.h"
#include <tuple>

class SkImage_Base;

class SkMipmapAccessor : ::SkNoncopyable {
public:
    // Returns null on failure
    static SkMipmapAccessor* Make(SkArenaAlloc*, const SkImage*, const SkMatrix& inv, SkMipmapMode);

    std::pair<SkPixmap, SkMatrix> level() const {
        SkASSERT(fUpper.addr() != nullptr);
        return std::make_pair(fUpper, fUpperInv);
    }

    std::pair<SkPixmap, SkMatrix> lowerLevel() const {
        SkASSERT(fLower.addr() != nullptr);
        return std::make_pair(fLower, fLowerInv);
    }

    // 0....1. Will be 0 if there is no lowerLevel
    float lowerWeight() const { return fLowerWeight; }

private:
    SkPixmap     fUpper,
                 fLower; // only valid for mip_linear
    float        fLowerWeight;   // lower * weight + upper * (1 - weight)
    SkMatrix     fUpperInv,
                 fLowerInv;

    // these manage lifetime for the buffers
    SkBitmap              fBaseStorage;
    sk_sp<const SkMipmap> fCurrMip;

public:
    // Don't call publicly -- this is only public for SkArenaAlloc to access it inside Make()
    SkMipmapAccessor(const SkImage_Base*, const SkMatrix& inv, SkMipmapMode requestedMode);
};

#endif
