1/*
2 * Copyright 2015 Google Inc.
3 *
4 * Use of this source code is governed by a BSD-style license that can be
5 * found in the LICENSE file.
6 */
7
8#ifndef SkBitmapController_DEFINED
9#define SkBitmapController_DEFINED
10
11#include "SkBitmap.h"
12#include "SkBitmapCache.h"
13#include "SkFilterQuality.h"
14#include "SkMatrix.h"
15
16class SkBitmapProvider;
17
18/**
19 *  Handles request to scale, filter, and lock a bitmap to be rasterized.
20 */
21class SkBitmapController : ::SkNoncopyable {
22public:
23    class State : ::SkNoncopyable {
24    public:
25        virtual ~State() {}
26
27        const SkPixmap& pixmap() const { return fPixmap; }
28        const SkMatrix& invMatrix() const { return fInvMatrix; }
29        SkFilterQuality quality() const { return fQuality; }
30
31    protected:
32        SkPixmap        fPixmap;
33        SkMatrix        fInvMatrix;
34        SkFilterQuality fQuality;
35
36    private:
37        friend class SkBitmapController;
38    };
39
40    virtual ~SkBitmapController() {}
41
42    State* requestBitmap(const SkBitmapProvider&, const SkMatrix& inverse, SkFilterQuality,
43                         void* storage, size_t storageSize);
44
45    State* requestBitmap(const SkBitmapProvider& bp, const SkMatrix& inv, SkFilterQuality quality) {
46        return this->requestBitmap(bp, inv, quality, nullptr, 0);
47    }
48
49protected:
50    virtual State* onRequestBitmap(const SkBitmapProvider&, const SkMatrix& inv, SkFilterQuality,
51                                   void* storage, size_t storageSize) = 0;
52};
53
54///////////////////////////////////////////////////////////////////////////////////////////////////
55
56#include "SkMipMap.h"
57
58class SkDefaultBitmapController : public SkBitmapController {
59public:
60    enum class CanShadeHQ { kNo, kYes };
61    SkDefaultBitmapController(CanShadeHQ canShadeHQ)
62        : fCanShadeHQ(canShadeHQ == CanShadeHQ::kYes) {}
63
64protected:
65    State* onRequestBitmap(const SkBitmapProvider&, const SkMatrix& inverse, SkFilterQuality,
66                           void* storage, size_t storageSize) override;
67    bool fCanShadeHQ;
68};
69
70#endif
71