1 /*
2  * Copyright 2017 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 GrCCAtlas_DEFINED
9 #define GrCCAtlas_DEFINED
10 
11 #include "SkRefCnt.h"
12 #include "SkSize.h"
13 
14 class GrCaps;
15 class GrCCPathParser;
16 class GrDrawOp;
17 class GrOnFlushResourceProvider;
18 class GrRenderTargetContext;
19 class GrTextureProxy;
20 struct SkIPoint16;
21 
22 /**
23  * This class implements a dynamic size GrRectanizer that grows until it reaches the implementation-
24  * dependent max texture size. When finalized, it also creates and stores a GrTextureProxy for the
25  * underlying atlas.
26  */
27 class GrCCAtlas {
28 public:
29     using CoverageCountBatchID = int;
30 
31     GrCCAtlas(const GrCaps&, int minSize);
32     ~GrCCAtlas();
33 
34     bool addRect(int devWidth, int devHeight, SkIPoint16* loc);
35     const SkISize& drawBounds() { return fDrawBounds; }
36 
37     void setCoverageCountBatchID(CoverageCountBatchID batchID) {
38         SkASSERT(!fCoverageCountBatchID);
39         SkASSERT(!fTextureProxy);
40         fCoverageCountBatchID = batchID;
41     }
42 
43     sk_sp<GrRenderTargetContext> SK_WARN_UNUSED_RESULT finalize(GrOnFlushResourceProvider*,
44                                                                 sk_sp<const GrCCPathParser>);
45 
46     GrTextureProxy* textureProxy() const { return fTextureProxy.get(); }
47 
48 private:
49     class Node;
50     class DrawCoverageCountOp;
51 
52     bool internalPlaceRect(int w, int h, SkIPoint16* loc);
53 
54     const int fMaxAtlasSize;
55 
56     int fWidth, fHeight;
57     std::unique_ptr<Node> fTopNode;
58     SkISize fDrawBounds = {0, 0};
59 
60     CoverageCountBatchID fCoverageCountBatchID SkDEBUGCODE(= 0);
61     sk_sp<GrTextureProxy> fTextureProxy;
62 };
63 
64 #endif
65