11fcc1b80994f7bfa60bbc74e924484da09b47e3brobertphillips@google.com/*
21fcc1b80994f7bfa60bbc74e924484da09b47e3brobertphillips@google.com * Copyright 2012 Google Inc.
31fcc1b80994f7bfa60bbc74e924484da09b47e3brobertphillips@google.com *
41fcc1b80994f7bfa60bbc74e924484da09b47e3brobertphillips@google.com * Use of this source code is governed by a BSD-style license that can be
51fcc1b80994f7bfa60bbc74e924484da09b47e3brobertphillips@google.com * found in the LICENSE file.
61fcc1b80994f7bfa60bbc74e924484da09b47e3brobertphillips@google.com */
71fcc1b80994f7bfa60bbc74e924484da09b47e3brobertphillips@google.com
81fcc1b80994f7bfa60bbc74e924484da09b47e3brobertphillips@google.com#ifndef GrClipMaskCache_DEFINED
91fcc1b80994f7bfa60bbc74e924484da09b47e3brobertphillips@google.com#define GrClipMaskCache_DEFINED
101fcc1b80994f7bfa60bbc74e924484da09b47e3brobertphillips@google.com
111fcc1b80994f7bfa60bbc74e924484da09b47e3brobertphillips@google.com#include "GrContext.h"
121fcc1b80994f7bfa60bbc74e924484da09b47e3brobertphillips@google.com#include "SkClipStack.h"
13a0b40280a49a8a43af7929ead3b3489951c58501commit-bot@chromium.org#include "SkTypes.h"
141fcc1b80994f7bfa60bbc74e924484da09b47e3brobertphillips@google.com
151fcc1b80994f7bfa60bbc74e924484da09b47e3brobertphillips@google.comclass GrTexture;
161fcc1b80994f7bfa60bbc74e924484da09b47e3brobertphillips@google.com
171fcc1b80994f7bfa60bbc74e924484da09b47e3brobertphillips@google.com/**
181fcc1b80994f7bfa60bbc74e924484da09b47e3brobertphillips@google.com * The stencil buffer stores the last clip path - providing a single entry
191fcc1b80994f7bfa60bbc74e924484da09b47e3brobertphillips@google.com * "cache". This class provides similar functionality for AA clip paths
201fcc1b80994f7bfa60bbc74e924484da09b47e3brobertphillips@google.com */
21e3beb6bd7de7fa211681abbb0be58e80b19885e0commit-bot@chromium.orgclass GrClipMaskCache : SkNoncopyable {
221fcc1b80994f7bfa60bbc74e924484da09b47e3brobertphillips@google.compublic:
231fcc1b80994f7bfa60bbc74e924484da09b47e3brobertphillips@google.com    GrClipMaskCache();
241fcc1b80994f7bfa60bbc74e924484da09b47e3brobertphillips@google.com
251fcc1b80994f7bfa60bbc74e924484da09b47e3brobertphillips@google.com    ~GrClipMaskCache() {
261fcc1b80994f7bfa60bbc74e924484da09b47e3brobertphillips@google.com
271fcc1b80994f7bfa60bbc74e924484da09b47e3brobertphillips@google.com        while (!fStack.empty()) {
281fcc1b80994f7bfa60bbc74e924484da09b47e3brobertphillips@google.com            GrClipStackFrame* temp = (GrClipStackFrame*) fStack.back();
291fcc1b80994f7bfa60bbc74e924484da09b47e3brobertphillips@google.com            temp->~GrClipStackFrame();
301fcc1b80994f7bfa60bbc74e924484da09b47e3brobertphillips@google.com            fStack.pop_back();
311fcc1b80994f7bfa60bbc74e924484da09b47e3brobertphillips@google.com        }
321fcc1b80994f7bfa60bbc74e924484da09b47e3brobertphillips@google.com    }
331fcc1b80994f7bfa60bbc74e924484da09b47e3brobertphillips@google.com
344c2443e36fdc6c095b17e90baa4a2f26a6f00b08bsalomon@google.com    bool canReuse(int32_t clipGenID, const SkIRect& bounds) {
351fcc1b80994f7bfa60bbc74e924484da09b47e3brobertphillips@google.com
364c2443e36fdc6c095b17e90baa4a2f26a6f00b08bsalomon@google.com        SkASSERT(clipGenID != SkClipStack::kWideOpenGenID);
374c2443e36fdc6c095b17e90baa4a2f26a6f00b08bsalomon@google.com        SkASSERT(clipGenID != SkClipStack::kEmptyGenID);
384c2443e36fdc6c095b17e90baa4a2f26a6f00b08bsalomon@google.com
391fcc1b80994f7bfa60bbc74e924484da09b47e3brobertphillips@google.com        GrClipStackFrame* back = (GrClipStackFrame*) fStack.back();
401fcc1b80994f7bfa60bbc74e924484da09b47e3brobertphillips@google.com
414c2443e36fdc6c095b17e90baa4a2f26a6f00b08bsalomon@google.com        // We could reuse the mask if bounds is a subset of last bounds. We'd have to communicate
424c2443e36fdc6c095b17e90baa4a2f26a6f00b08bsalomon@google.com        // an offset to the caller.
431fcc1b80994f7bfa60bbc74e924484da09b47e3brobertphillips@google.com        if (back->fLastMask.texture() &&
444c2443e36fdc6c095b17e90baa4a2f26a6f00b08bsalomon@google.com            back->fLastBound == bounds &&
454c2443e36fdc6c095b17e90baa4a2f26a6f00b08bsalomon@google.com            back->fLastClipGenID == clipGenID) {
461fcc1b80994f7bfa60bbc74e924484da09b47e3brobertphillips@google.com            return true;
471fcc1b80994f7bfa60bbc74e924484da09b47e3brobertphillips@google.com        }
481fcc1b80994f7bfa60bbc74e924484da09b47e3brobertphillips@google.com
491fcc1b80994f7bfa60bbc74e924484da09b47e3brobertphillips@google.com        return false;
501fcc1b80994f7bfa60bbc74e924484da09b47e3brobertphillips@google.com    }
511fcc1b80994f7bfa60bbc74e924484da09b47e3brobertphillips@google.com
521fcc1b80994f7bfa60bbc74e924484da09b47e3brobertphillips@google.com    void reset() {
531fcc1b80994f7bfa60bbc74e924484da09b47e3brobertphillips@google.com        if (fStack.empty()) {
54f6de475e5cbd143f348ff7738919e397b7fe7f57tfarina@chromium.org//            SkASSERT(false);
551fcc1b80994f7bfa60bbc74e924484da09b47e3brobertphillips@google.com            return;
561fcc1b80994f7bfa60bbc74e924484da09b47e3brobertphillips@google.com        }
571fcc1b80994f7bfa60bbc74e924484da09b47e3brobertphillips@google.com
581fcc1b80994f7bfa60bbc74e924484da09b47e3brobertphillips@google.com        GrClipStackFrame* back = (GrClipStackFrame*) fStack.back();
591fcc1b80994f7bfa60bbc74e924484da09b47e3brobertphillips@google.com
601fcc1b80994f7bfa60bbc74e924484da09b47e3brobertphillips@google.com        back->reset();
611fcc1b80994f7bfa60bbc74e924484da09b47e3brobertphillips@google.com    }
621fcc1b80994f7bfa60bbc74e924484da09b47e3brobertphillips@google.com
631fcc1b80994f7bfa60bbc74e924484da09b47e3brobertphillips@google.com    /**
641fcc1b80994f7bfa60bbc74e924484da09b47e3brobertphillips@google.com     * After a "push" the clip state is entirely open. Currently, the
651fcc1b80994f7bfa60bbc74e924484da09b47e3brobertphillips@google.com     * entire clip stack will be re-rendered into a new clip mask.
661fcc1b80994f7bfa60bbc74e924484da09b47e3brobertphillips@google.com     * TODO: can we take advantage of the nested nature of the clips to
671fcc1b80994f7bfa60bbc74e924484da09b47e3brobertphillips@google.com     * reduce the mask creation cost?
681fcc1b80994f7bfa60bbc74e924484da09b47e3brobertphillips@google.com     */
691fcc1b80994f7bfa60bbc74e924484da09b47e3brobertphillips@google.com    void push();
701fcc1b80994f7bfa60bbc74e924484da09b47e3brobertphillips@google.com
711fcc1b80994f7bfa60bbc74e924484da09b47e3brobertphillips@google.com    void pop() {
72f6de475e5cbd143f348ff7738919e397b7fe7f57tfarina@chromium.org        //SkASSERT(!fStack.empty());
731fcc1b80994f7bfa60bbc74e924484da09b47e3brobertphillips@google.com
741fcc1b80994f7bfa60bbc74e924484da09b47e3brobertphillips@google.com        if (!fStack.empty()) {
751fcc1b80994f7bfa60bbc74e924484da09b47e3brobertphillips@google.com            GrClipStackFrame* back = (GrClipStackFrame*) fStack.back();
761fcc1b80994f7bfa60bbc74e924484da09b47e3brobertphillips@google.com
771fcc1b80994f7bfa60bbc74e924484da09b47e3brobertphillips@google.com            back->~GrClipStackFrame();
781fcc1b80994f7bfa60bbc74e924484da09b47e3brobertphillips@google.com            fStack.pop_back();
791fcc1b80994f7bfa60bbc74e924484da09b47e3brobertphillips@google.com        }
801fcc1b80994f7bfa60bbc74e924484da09b47e3brobertphillips@google.com    }
811fcc1b80994f7bfa60bbc74e924484da09b47e3brobertphillips@google.com
824c2443e36fdc6c095b17e90baa4a2f26a6f00b08bsalomon@google.com    int32_t getLastClipGenID() const {
831fcc1b80994f7bfa60bbc74e924484da09b47e3brobertphillips@google.com
841fcc1b80994f7bfa60bbc74e924484da09b47e3brobertphillips@google.com        if (fStack.empty()) {
854c2443e36fdc6c095b17e90baa4a2f26a6f00b08bsalomon@google.com            return SkClipStack::kInvalidGenID;
861fcc1b80994f7bfa60bbc74e924484da09b47e3brobertphillips@google.com        }
871fcc1b80994f7bfa60bbc74e924484da09b47e3brobertphillips@google.com
884c2443e36fdc6c095b17e90baa4a2f26a6f00b08bsalomon@google.com        return ((GrClipStackFrame*) fStack.back())->fLastClipGenID;
891fcc1b80994f7bfa60bbc74e924484da09b47e3brobertphillips@google.com    }
901fcc1b80994f7bfa60bbc74e924484da09b47e3brobertphillips@google.com
911fcc1b80994f7bfa60bbc74e924484da09b47e3brobertphillips@google.com    GrTexture* getLastMask() {
921fcc1b80994f7bfa60bbc74e924484da09b47e3brobertphillips@google.com
931fcc1b80994f7bfa60bbc74e924484da09b47e3brobertphillips@google.com        if (fStack.empty()) {
94f6de475e5cbd143f348ff7738919e397b7fe7f57tfarina@chromium.org            SkASSERT(false);
951fcc1b80994f7bfa60bbc74e924484da09b47e3brobertphillips@google.com            return NULL;
961fcc1b80994f7bfa60bbc74e924484da09b47e3brobertphillips@google.com        }
971fcc1b80994f7bfa60bbc74e924484da09b47e3brobertphillips@google.com
981fcc1b80994f7bfa60bbc74e924484da09b47e3brobertphillips@google.com        GrClipStackFrame* back = (GrClipStackFrame*) fStack.back();
991fcc1b80994f7bfa60bbc74e924484da09b47e3brobertphillips@google.com
1001fcc1b80994f7bfa60bbc74e924484da09b47e3brobertphillips@google.com        return back->fLastMask.texture();
1011fcc1b80994f7bfa60bbc74e924484da09b47e3brobertphillips@google.com    }
1021fcc1b80994f7bfa60bbc74e924484da09b47e3brobertphillips@google.com
1031fcc1b80994f7bfa60bbc74e924484da09b47e3brobertphillips@google.com    const GrTexture* getLastMask() const {
1041fcc1b80994f7bfa60bbc74e924484da09b47e3brobertphillips@google.com
1051fcc1b80994f7bfa60bbc74e924484da09b47e3brobertphillips@google.com        if (fStack.empty()) {
106f6de475e5cbd143f348ff7738919e397b7fe7f57tfarina@chromium.org            SkASSERT(false);
1071fcc1b80994f7bfa60bbc74e924484da09b47e3brobertphillips@google.com            return NULL;
1081fcc1b80994f7bfa60bbc74e924484da09b47e3brobertphillips@google.com        }
1091fcc1b80994f7bfa60bbc74e924484da09b47e3brobertphillips@google.com
1101fcc1b80994f7bfa60bbc74e924484da09b47e3brobertphillips@google.com        GrClipStackFrame* back = (GrClipStackFrame*) fStack.back();
1111fcc1b80994f7bfa60bbc74e924484da09b47e3brobertphillips@google.com
1121fcc1b80994f7bfa60bbc74e924484da09b47e3brobertphillips@google.com        return back->fLastMask.texture();
1131fcc1b80994f7bfa60bbc74e924484da09b47e3brobertphillips@google.com    }
1141fcc1b80994f7bfa60bbc74e924484da09b47e3brobertphillips@google.com
1154c2443e36fdc6c095b17e90baa4a2f26a6f00b08bsalomon@google.com    void acquireMask(int32_t clipGenID,
1161fcc1b80994f7bfa60bbc74e924484da09b47e3brobertphillips@google.com                     const GrTextureDesc& desc,
117fd03d4a829efe2d77a712fd991927c55f59a2ffecommit-bot@chromium.org                     const SkIRect& bound) {
1181fcc1b80994f7bfa60bbc74e924484da09b47e3brobertphillips@google.com
1191fcc1b80994f7bfa60bbc74e924484da09b47e3brobertphillips@google.com        if (fStack.empty()) {
120f6de475e5cbd143f348ff7738919e397b7fe7f57tfarina@chromium.org            SkASSERT(false);
1211fcc1b80994f7bfa60bbc74e924484da09b47e3brobertphillips@google.com            return;
1221fcc1b80994f7bfa60bbc74e924484da09b47e3brobertphillips@google.com        }
1231fcc1b80994f7bfa60bbc74e924484da09b47e3brobertphillips@google.com
1241fcc1b80994f7bfa60bbc74e924484da09b47e3brobertphillips@google.com        GrClipStackFrame* back = (GrClipStackFrame*) fStack.back();
1251fcc1b80994f7bfa60bbc74e924484da09b47e3brobertphillips@google.com
1264c2443e36fdc6c095b17e90baa4a2f26a6f00b08bsalomon@google.com        back->acquireMask(fContext, clipGenID, desc, bound);
1271fcc1b80994f7bfa60bbc74e924484da09b47e3brobertphillips@google.com    }
1281fcc1b80994f7bfa60bbc74e924484da09b47e3brobertphillips@google.com
1291fcc1b80994f7bfa60bbc74e924484da09b47e3brobertphillips@google.com    int getLastMaskWidth() const {
1301fcc1b80994f7bfa60bbc74e924484da09b47e3brobertphillips@google.com
1311fcc1b80994f7bfa60bbc74e924484da09b47e3brobertphillips@google.com        if (fStack.empty()) {
132f6de475e5cbd143f348ff7738919e397b7fe7f57tfarina@chromium.org            SkASSERT(false);
1331fcc1b80994f7bfa60bbc74e924484da09b47e3brobertphillips@google.com            return -1;
1341fcc1b80994f7bfa60bbc74e924484da09b47e3brobertphillips@google.com        }
1351fcc1b80994f7bfa60bbc74e924484da09b47e3brobertphillips@google.com
1361fcc1b80994f7bfa60bbc74e924484da09b47e3brobertphillips@google.com        GrClipStackFrame* back = (GrClipStackFrame*) fStack.back();
1371fcc1b80994f7bfa60bbc74e924484da09b47e3brobertphillips@google.com
1381fcc1b80994f7bfa60bbc74e924484da09b47e3brobertphillips@google.com        if (NULL == back->fLastMask.texture()) {
1391fcc1b80994f7bfa60bbc74e924484da09b47e3brobertphillips@google.com            return -1;
1401fcc1b80994f7bfa60bbc74e924484da09b47e3brobertphillips@google.com        }
1411fcc1b80994f7bfa60bbc74e924484da09b47e3brobertphillips@google.com
1421fcc1b80994f7bfa60bbc74e924484da09b47e3brobertphillips@google.com        return back->fLastMask.texture()->width();
1431fcc1b80994f7bfa60bbc74e924484da09b47e3brobertphillips@google.com    }
1441fcc1b80994f7bfa60bbc74e924484da09b47e3brobertphillips@google.com
1451fcc1b80994f7bfa60bbc74e924484da09b47e3brobertphillips@google.com    int getLastMaskHeight() const {
1461fcc1b80994f7bfa60bbc74e924484da09b47e3brobertphillips@google.com
1471fcc1b80994f7bfa60bbc74e924484da09b47e3brobertphillips@google.com        if (fStack.empty()) {
148f6de475e5cbd143f348ff7738919e397b7fe7f57tfarina@chromium.org            SkASSERT(false);
1491fcc1b80994f7bfa60bbc74e924484da09b47e3brobertphillips@google.com            return -1;
1501fcc1b80994f7bfa60bbc74e924484da09b47e3brobertphillips@google.com        }
1511fcc1b80994f7bfa60bbc74e924484da09b47e3brobertphillips@google.com
1521fcc1b80994f7bfa60bbc74e924484da09b47e3brobertphillips@google.com        GrClipStackFrame* back = (GrClipStackFrame*) fStack.back();
1531fcc1b80994f7bfa60bbc74e924484da09b47e3brobertphillips@google.com
1541fcc1b80994f7bfa60bbc74e924484da09b47e3brobertphillips@google.com        if (NULL == back->fLastMask.texture()) {
1551fcc1b80994f7bfa60bbc74e924484da09b47e3brobertphillips@google.com            return -1;
1561fcc1b80994f7bfa60bbc74e924484da09b47e3brobertphillips@google.com        }
1571fcc1b80994f7bfa60bbc74e924484da09b47e3brobertphillips@google.com
1581fcc1b80994f7bfa60bbc74e924484da09b47e3brobertphillips@google.com        return back->fLastMask.texture()->height();
1591fcc1b80994f7bfa60bbc74e924484da09b47e3brobertphillips@google.com    }
1601fcc1b80994f7bfa60bbc74e924484da09b47e3brobertphillips@google.com
161fd03d4a829efe2d77a712fd991927c55f59a2ffecommit-bot@chromium.org    void getLastBound(SkIRect* bound) const {
1621fcc1b80994f7bfa60bbc74e924484da09b47e3brobertphillips@google.com
1631fcc1b80994f7bfa60bbc74e924484da09b47e3brobertphillips@google.com        if (fStack.empty()) {
164f6de475e5cbd143f348ff7738919e397b7fe7f57tfarina@chromium.org            SkASSERT(false);
1651fcc1b80994f7bfa60bbc74e924484da09b47e3brobertphillips@google.com            bound->setEmpty();
1661fcc1b80994f7bfa60bbc74e924484da09b47e3brobertphillips@google.com            return;
1671fcc1b80994f7bfa60bbc74e924484da09b47e3brobertphillips@google.com        }
1681fcc1b80994f7bfa60bbc74e924484da09b47e3brobertphillips@google.com
1691fcc1b80994f7bfa60bbc74e924484da09b47e3brobertphillips@google.com        GrClipStackFrame* back = (GrClipStackFrame*) fStack.back();
1701fcc1b80994f7bfa60bbc74e924484da09b47e3brobertphillips@google.com
1711fcc1b80994f7bfa60bbc74e924484da09b47e3brobertphillips@google.com        *bound = back->fLastBound;
1721fcc1b80994f7bfa60bbc74e924484da09b47e3brobertphillips@google.com    }
1731fcc1b80994f7bfa60bbc74e924484da09b47e3brobertphillips@google.com
1741fcc1b80994f7bfa60bbc74e924484da09b47e3brobertphillips@google.com    void setContext(GrContext* context) {
1751fcc1b80994f7bfa60bbc74e924484da09b47e3brobertphillips@google.com        fContext = context;
1761fcc1b80994f7bfa60bbc74e924484da09b47e3brobertphillips@google.com    }
1771fcc1b80994f7bfa60bbc74e924484da09b47e3brobertphillips@google.com
1781fcc1b80994f7bfa60bbc74e924484da09b47e3brobertphillips@google.com    GrContext* getContext() {
1791fcc1b80994f7bfa60bbc74e924484da09b47e3brobertphillips@google.com        return fContext;
1801fcc1b80994f7bfa60bbc74e924484da09b47e3brobertphillips@google.com    }
1811fcc1b80994f7bfa60bbc74e924484da09b47e3brobertphillips@google.com
1821fcc1b80994f7bfa60bbc74e924484da09b47e3brobertphillips@google.com    void releaseResources() {
1831fcc1b80994f7bfa60bbc74e924484da09b47e3brobertphillips@google.com
1841fcc1b80994f7bfa60bbc74e924484da09b47e3brobertphillips@google.com        SkDeque::F2BIter iter(fStack);
1851fcc1b80994f7bfa60bbc74e924484da09b47e3brobertphillips@google.com        for (GrClipStackFrame* frame = (GrClipStackFrame*) iter.next();
1861fcc1b80994f7bfa60bbc74e924484da09b47e3brobertphillips@google.com                frame != NULL;
1871fcc1b80994f7bfa60bbc74e924484da09b47e3brobertphillips@google.com                frame = (GrClipStackFrame*) iter.next()) {
1881fcc1b80994f7bfa60bbc74e924484da09b47e3brobertphillips@google.com            frame->reset();
1891fcc1b80994f7bfa60bbc74e924484da09b47e3brobertphillips@google.com        }
1901fcc1b80994f7bfa60bbc74e924484da09b47e3brobertphillips@google.com    }
1911fcc1b80994f7bfa60bbc74e924484da09b47e3brobertphillips@google.com
1921fcc1b80994f7bfa60bbc74e924484da09b47e3brobertphillips@google.comprivate:
1931fcc1b80994f7bfa60bbc74e924484da09b47e3brobertphillips@google.com    struct GrClipStackFrame {
1941fcc1b80994f7bfa60bbc74e924484da09b47e3brobertphillips@google.com
1951fcc1b80994f7bfa60bbc74e924484da09b47e3brobertphillips@google.com        GrClipStackFrame() {
1964c2443e36fdc6c095b17e90baa4a2f26a6f00b08bsalomon@google.com            this->reset();
1971fcc1b80994f7bfa60bbc74e924484da09b47e3brobertphillips@google.com        }
1981fcc1b80994f7bfa60bbc74e924484da09b47e3brobertphillips@google.com
1991fcc1b80994f7bfa60bbc74e924484da09b47e3brobertphillips@google.com        void acquireMask(GrContext* context,
2004c2443e36fdc6c095b17e90baa4a2f26a6f00b08bsalomon@google.com                         int32_t clipGenID,
2011fcc1b80994f7bfa60bbc74e924484da09b47e3brobertphillips@google.com                         const GrTextureDesc& desc,
202fd03d4a829efe2d77a712fd991927c55f59a2ffecommit-bot@chromium.org                         const SkIRect& bound) {
2031fcc1b80994f7bfa60bbc74e924484da09b47e3brobertphillips@google.com
2044c2443e36fdc6c095b17e90baa4a2f26a6f00b08bsalomon@google.com            fLastClipGenID = clipGenID;
2051fcc1b80994f7bfa60bbc74e924484da09b47e3brobertphillips@google.com
2061fcc1b80994f7bfa60bbc74e924484da09b47e3brobertphillips@google.com            fLastMask.set(context, desc);
2071fcc1b80994f7bfa60bbc74e924484da09b47e3brobertphillips@google.com
2081fcc1b80994f7bfa60bbc74e924484da09b47e3brobertphillips@google.com            fLastBound = bound;
2091fcc1b80994f7bfa60bbc74e924484da09b47e3brobertphillips@google.com        }
2101fcc1b80994f7bfa60bbc74e924484da09b47e3brobertphillips@google.com
2111fcc1b80994f7bfa60bbc74e924484da09b47e3brobertphillips@google.com        void reset () {
2124c2443e36fdc6c095b17e90baa4a2f26a6f00b08bsalomon@google.com            fLastClipGenID = SkClipStack::kInvalidGenID;
2131fcc1b80994f7bfa60bbc74e924484da09b47e3brobertphillips@google.com
2141fcc1b80994f7bfa60bbc74e924484da09b47e3brobertphillips@google.com            GrTextureDesc desc;
2151fcc1b80994f7bfa60bbc74e924484da09b47e3brobertphillips@google.com
2161fcc1b80994f7bfa60bbc74e924484da09b47e3brobertphillips@google.com            fLastMask.set(NULL, desc);
2171fcc1b80994f7bfa60bbc74e924484da09b47e3brobertphillips@google.com            fLastBound.setEmpty();
2181fcc1b80994f7bfa60bbc74e924484da09b47e3brobertphillips@google.com        }
2191fcc1b80994f7bfa60bbc74e924484da09b47e3brobertphillips@google.com
2204c2443e36fdc6c095b17e90baa4a2f26a6f00b08bsalomon@google.com        int32_t                 fLastClipGenID;
2214c2443e36fdc6c095b17e90baa4a2f26a6f00b08bsalomon@google.com        // The mask's width & height values are used by GrClipMaskManager to correctly scale the
2224c2443e36fdc6c095b17e90baa4a2f26a6f00b08bsalomon@google.com        // texture coords for the geometry drawn with this mask.
2231fcc1b80994f7bfa60bbc74e924484da09b47e3brobertphillips@google.com        GrAutoScratchTexture    fLastMask;
2244c2443e36fdc6c095b17e90baa4a2f26a6f00b08bsalomon@google.com        // fLastBound stores the bounding box of the clip mask in clip-stack space. This rect is
2254c2443e36fdc6c095b17e90baa4a2f26a6f00b08bsalomon@google.com        // used by GrClipMaskManager to position a rect and compute texture coords for the mask.
226fd03d4a829efe2d77a712fd991927c55f59a2ffecommit-bot@chromium.org        SkIRect                 fLastBound;
2271fcc1b80994f7bfa60bbc74e924484da09b47e3brobertphillips@google.com    };
2281fcc1b80994f7bfa60bbc74e924484da09b47e3brobertphillips@google.com
2291fcc1b80994f7bfa60bbc74e924484da09b47e3brobertphillips@google.com    GrContext*   fContext;
2301fcc1b80994f7bfa60bbc74e924484da09b47e3brobertphillips@google.com    SkDeque      fStack;
2311fcc1b80994f7bfa60bbc74e924484da09b47e3brobertphillips@google.com
232a0b40280a49a8a43af7929ead3b3489951c58501commit-bot@chromium.org    typedef SkNoncopyable INHERITED;
2331fcc1b80994f7bfa60bbc74e924484da09b47e3brobertphillips@google.com};
2341fcc1b80994f7bfa60bbc74e924484da09b47e3brobertphillips@google.com
2351fcc1b80994f7bfa60bbc74e924484da09b47e3brobertphillips@google.com#endif // GrClipMaskCache_DEFINED
236