GrClipMaskCache.h revision f6de475e5cbd143f348ff7738919e397b7fe7f57
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 "GrNoncopyable.h"
131fcc1b80994f7bfa60bbc74e924484da09b47e3brobertphillips@google.com#include "SkClipStack.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 */
211fcc1b80994f7bfa60bbc74e924484da09b47e3brobertphillips@google.comclass GrClipMaskCache : public GrNoncopyable {
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
394c2443e36fdc6c095b17e90baa4a2f26a6f00b08bsalomon@google.com        if (SkClipStack::kInvalidGenID == clipGenID) {
401fcc1b80994f7bfa60bbc74e924484da09b47e3brobertphillips@google.com            return false;
411fcc1b80994f7bfa60bbc74e924484da09b47e3brobertphillips@google.com        }
421fcc1b80994f7bfa60bbc74e924484da09b47e3brobertphillips@google.com
431fcc1b80994f7bfa60bbc74e924484da09b47e3brobertphillips@google.com        GrClipStackFrame* back = (GrClipStackFrame*) fStack.back();
441fcc1b80994f7bfa60bbc74e924484da09b47e3brobertphillips@google.com
454c2443e36fdc6c095b17e90baa4a2f26a6f00b08bsalomon@google.com        // We could reuse the mask if bounds is a subset of last bounds. We'd have to communicate
464c2443e36fdc6c095b17e90baa4a2f26a6f00b08bsalomon@google.com        // an offset to the caller.
471fcc1b80994f7bfa60bbc74e924484da09b47e3brobertphillips@google.com        if (back->fLastMask.texture() &&
484c2443e36fdc6c095b17e90baa4a2f26a6f00b08bsalomon@google.com            back->fLastBound == bounds &&
494c2443e36fdc6c095b17e90baa4a2f26a6f00b08bsalomon@google.com            back->fLastClipGenID == clipGenID) {
501fcc1b80994f7bfa60bbc74e924484da09b47e3brobertphillips@google.com            return true;
511fcc1b80994f7bfa60bbc74e924484da09b47e3brobertphillips@google.com        }
521fcc1b80994f7bfa60bbc74e924484da09b47e3brobertphillips@google.com
531fcc1b80994f7bfa60bbc74e924484da09b47e3brobertphillips@google.com        return false;
541fcc1b80994f7bfa60bbc74e924484da09b47e3brobertphillips@google.com    }
551fcc1b80994f7bfa60bbc74e924484da09b47e3brobertphillips@google.com
561fcc1b80994f7bfa60bbc74e924484da09b47e3brobertphillips@google.com    void reset() {
571fcc1b80994f7bfa60bbc74e924484da09b47e3brobertphillips@google.com        if (fStack.empty()) {
58f6de475e5cbd143f348ff7738919e397b7fe7f57tfarina@chromium.org//            SkASSERT(false);
591fcc1b80994f7bfa60bbc74e924484da09b47e3brobertphillips@google.com            return;
601fcc1b80994f7bfa60bbc74e924484da09b47e3brobertphillips@google.com        }
611fcc1b80994f7bfa60bbc74e924484da09b47e3brobertphillips@google.com
621fcc1b80994f7bfa60bbc74e924484da09b47e3brobertphillips@google.com        GrClipStackFrame* back = (GrClipStackFrame*) fStack.back();
631fcc1b80994f7bfa60bbc74e924484da09b47e3brobertphillips@google.com
641fcc1b80994f7bfa60bbc74e924484da09b47e3brobertphillips@google.com        back->reset();
651fcc1b80994f7bfa60bbc74e924484da09b47e3brobertphillips@google.com    }
661fcc1b80994f7bfa60bbc74e924484da09b47e3brobertphillips@google.com
671fcc1b80994f7bfa60bbc74e924484da09b47e3brobertphillips@google.com    /**
681fcc1b80994f7bfa60bbc74e924484da09b47e3brobertphillips@google.com     * After a "push" the clip state is entirely open. Currently, the
691fcc1b80994f7bfa60bbc74e924484da09b47e3brobertphillips@google.com     * entire clip stack will be re-rendered into a new clip mask.
701fcc1b80994f7bfa60bbc74e924484da09b47e3brobertphillips@google.com     * TODO: can we take advantage of the nested nature of the clips to
711fcc1b80994f7bfa60bbc74e924484da09b47e3brobertphillips@google.com     * reduce the mask creation cost?
721fcc1b80994f7bfa60bbc74e924484da09b47e3brobertphillips@google.com     */
731fcc1b80994f7bfa60bbc74e924484da09b47e3brobertphillips@google.com    void push();
741fcc1b80994f7bfa60bbc74e924484da09b47e3brobertphillips@google.com
751fcc1b80994f7bfa60bbc74e924484da09b47e3brobertphillips@google.com    void pop() {
76f6de475e5cbd143f348ff7738919e397b7fe7f57tfarina@chromium.org        //SkASSERT(!fStack.empty());
771fcc1b80994f7bfa60bbc74e924484da09b47e3brobertphillips@google.com
781fcc1b80994f7bfa60bbc74e924484da09b47e3brobertphillips@google.com        if (!fStack.empty()) {
791fcc1b80994f7bfa60bbc74e924484da09b47e3brobertphillips@google.com            GrClipStackFrame* back = (GrClipStackFrame*) fStack.back();
801fcc1b80994f7bfa60bbc74e924484da09b47e3brobertphillips@google.com
811fcc1b80994f7bfa60bbc74e924484da09b47e3brobertphillips@google.com            back->~GrClipStackFrame();
821fcc1b80994f7bfa60bbc74e924484da09b47e3brobertphillips@google.com            fStack.pop_back();
831fcc1b80994f7bfa60bbc74e924484da09b47e3brobertphillips@google.com        }
841fcc1b80994f7bfa60bbc74e924484da09b47e3brobertphillips@google.com    }
851fcc1b80994f7bfa60bbc74e924484da09b47e3brobertphillips@google.com
864c2443e36fdc6c095b17e90baa4a2f26a6f00b08bsalomon@google.com    int32_t getLastClipGenID() const {
871fcc1b80994f7bfa60bbc74e924484da09b47e3brobertphillips@google.com
881fcc1b80994f7bfa60bbc74e924484da09b47e3brobertphillips@google.com        if (fStack.empty()) {
894c2443e36fdc6c095b17e90baa4a2f26a6f00b08bsalomon@google.com            return SkClipStack::kInvalidGenID;
901fcc1b80994f7bfa60bbc74e924484da09b47e3brobertphillips@google.com        }
911fcc1b80994f7bfa60bbc74e924484da09b47e3brobertphillips@google.com
924c2443e36fdc6c095b17e90baa4a2f26a6f00b08bsalomon@google.com        return ((GrClipStackFrame*) fStack.back())->fLastClipGenID;
931fcc1b80994f7bfa60bbc74e924484da09b47e3brobertphillips@google.com    }
941fcc1b80994f7bfa60bbc74e924484da09b47e3brobertphillips@google.com
951fcc1b80994f7bfa60bbc74e924484da09b47e3brobertphillips@google.com    GrTexture* getLastMask() {
961fcc1b80994f7bfa60bbc74e924484da09b47e3brobertphillips@google.com
971fcc1b80994f7bfa60bbc74e924484da09b47e3brobertphillips@google.com        if (fStack.empty()) {
98f6de475e5cbd143f348ff7738919e397b7fe7f57tfarina@chromium.org            SkASSERT(false);
991fcc1b80994f7bfa60bbc74e924484da09b47e3brobertphillips@google.com            return NULL;
1001fcc1b80994f7bfa60bbc74e924484da09b47e3brobertphillips@google.com        }
1011fcc1b80994f7bfa60bbc74e924484da09b47e3brobertphillips@google.com
1021fcc1b80994f7bfa60bbc74e924484da09b47e3brobertphillips@google.com        GrClipStackFrame* back = (GrClipStackFrame*) fStack.back();
1031fcc1b80994f7bfa60bbc74e924484da09b47e3brobertphillips@google.com
1041fcc1b80994f7bfa60bbc74e924484da09b47e3brobertphillips@google.com        return back->fLastMask.texture();
1051fcc1b80994f7bfa60bbc74e924484da09b47e3brobertphillips@google.com    }
1061fcc1b80994f7bfa60bbc74e924484da09b47e3brobertphillips@google.com
1071fcc1b80994f7bfa60bbc74e924484da09b47e3brobertphillips@google.com    const GrTexture* getLastMask() const {
1081fcc1b80994f7bfa60bbc74e924484da09b47e3brobertphillips@google.com
1091fcc1b80994f7bfa60bbc74e924484da09b47e3brobertphillips@google.com        if (fStack.empty()) {
110f6de475e5cbd143f348ff7738919e397b7fe7f57tfarina@chromium.org            SkASSERT(false);
1111fcc1b80994f7bfa60bbc74e924484da09b47e3brobertphillips@google.com            return NULL;
1121fcc1b80994f7bfa60bbc74e924484da09b47e3brobertphillips@google.com        }
1131fcc1b80994f7bfa60bbc74e924484da09b47e3brobertphillips@google.com
1141fcc1b80994f7bfa60bbc74e924484da09b47e3brobertphillips@google.com        GrClipStackFrame* back = (GrClipStackFrame*) fStack.back();
1151fcc1b80994f7bfa60bbc74e924484da09b47e3brobertphillips@google.com
1161fcc1b80994f7bfa60bbc74e924484da09b47e3brobertphillips@google.com        return back->fLastMask.texture();
1171fcc1b80994f7bfa60bbc74e924484da09b47e3brobertphillips@google.com    }
1181fcc1b80994f7bfa60bbc74e924484da09b47e3brobertphillips@google.com
1194c2443e36fdc6c095b17e90baa4a2f26a6f00b08bsalomon@google.com    void acquireMask(int32_t clipGenID,
1201fcc1b80994f7bfa60bbc74e924484da09b47e3brobertphillips@google.com                     const GrTextureDesc& desc,
121fd03d4a829efe2d77a712fd991927c55f59a2ffecommit-bot@chromium.org                     const SkIRect& bound) {
1221fcc1b80994f7bfa60bbc74e924484da09b47e3brobertphillips@google.com
1231fcc1b80994f7bfa60bbc74e924484da09b47e3brobertphillips@google.com        if (fStack.empty()) {
124f6de475e5cbd143f348ff7738919e397b7fe7f57tfarina@chromium.org            SkASSERT(false);
1251fcc1b80994f7bfa60bbc74e924484da09b47e3brobertphillips@google.com            return;
1261fcc1b80994f7bfa60bbc74e924484da09b47e3brobertphillips@google.com        }
1271fcc1b80994f7bfa60bbc74e924484da09b47e3brobertphillips@google.com
1281fcc1b80994f7bfa60bbc74e924484da09b47e3brobertphillips@google.com        GrClipStackFrame* back = (GrClipStackFrame*) fStack.back();
1291fcc1b80994f7bfa60bbc74e924484da09b47e3brobertphillips@google.com
1304c2443e36fdc6c095b17e90baa4a2f26a6f00b08bsalomon@google.com        back->acquireMask(fContext, clipGenID, desc, bound);
1311fcc1b80994f7bfa60bbc74e924484da09b47e3brobertphillips@google.com    }
1321fcc1b80994f7bfa60bbc74e924484da09b47e3brobertphillips@google.com
1331fcc1b80994f7bfa60bbc74e924484da09b47e3brobertphillips@google.com    int getLastMaskWidth() const {
1341fcc1b80994f7bfa60bbc74e924484da09b47e3brobertphillips@google.com
1351fcc1b80994f7bfa60bbc74e924484da09b47e3brobertphillips@google.com        if (fStack.empty()) {
136f6de475e5cbd143f348ff7738919e397b7fe7f57tfarina@chromium.org            SkASSERT(false);
1371fcc1b80994f7bfa60bbc74e924484da09b47e3brobertphillips@google.com            return -1;
1381fcc1b80994f7bfa60bbc74e924484da09b47e3brobertphillips@google.com        }
1391fcc1b80994f7bfa60bbc74e924484da09b47e3brobertphillips@google.com
1401fcc1b80994f7bfa60bbc74e924484da09b47e3brobertphillips@google.com        GrClipStackFrame* back = (GrClipStackFrame*) fStack.back();
1411fcc1b80994f7bfa60bbc74e924484da09b47e3brobertphillips@google.com
1421fcc1b80994f7bfa60bbc74e924484da09b47e3brobertphillips@google.com        if (NULL == back->fLastMask.texture()) {
1431fcc1b80994f7bfa60bbc74e924484da09b47e3brobertphillips@google.com            return -1;
1441fcc1b80994f7bfa60bbc74e924484da09b47e3brobertphillips@google.com        }
1451fcc1b80994f7bfa60bbc74e924484da09b47e3brobertphillips@google.com
1461fcc1b80994f7bfa60bbc74e924484da09b47e3brobertphillips@google.com        return back->fLastMask.texture()->width();
1471fcc1b80994f7bfa60bbc74e924484da09b47e3brobertphillips@google.com    }
1481fcc1b80994f7bfa60bbc74e924484da09b47e3brobertphillips@google.com
1491fcc1b80994f7bfa60bbc74e924484da09b47e3brobertphillips@google.com    int getLastMaskHeight() const {
1501fcc1b80994f7bfa60bbc74e924484da09b47e3brobertphillips@google.com
1511fcc1b80994f7bfa60bbc74e924484da09b47e3brobertphillips@google.com        if (fStack.empty()) {
152f6de475e5cbd143f348ff7738919e397b7fe7f57tfarina@chromium.org            SkASSERT(false);
1531fcc1b80994f7bfa60bbc74e924484da09b47e3brobertphillips@google.com            return -1;
1541fcc1b80994f7bfa60bbc74e924484da09b47e3brobertphillips@google.com        }
1551fcc1b80994f7bfa60bbc74e924484da09b47e3brobertphillips@google.com
1561fcc1b80994f7bfa60bbc74e924484da09b47e3brobertphillips@google.com        GrClipStackFrame* back = (GrClipStackFrame*) fStack.back();
1571fcc1b80994f7bfa60bbc74e924484da09b47e3brobertphillips@google.com
1581fcc1b80994f7bfa60bbc74e924484da09b47e3brobertphillips@google.com        if (NULL == back->fLastMask.texture()) {
1591fcc1b80994f7bfa60bbc74e924484da09b47e3brobertphillips@google.com            return -1;
1601fcc1b80994f7bfa60bbc74e924484da09b47e3brobertphillips@google.com        }
1611fcc1b80994f7bfa60bbc74e924484da09b47e3brobertphillips@google.com
1621fcc1b80994f7bfa60bbc74e924484da09b47e3brobertphillips@google.com        return back->fLastMask.texture()->height();
1631fcc1b80994f7bfa60bbc74e924484da09b47e3brobertphillips@google.com    }
1641fcc1b80994f7bfa60bbc74e924484da09b47e3brobertphillips@google.com
165fd03d4a829efe2d77a712fd991927c55f59a2ffecommit-bot@chromium.org    void getLastBound(SkIRect* bound) const {
1661fcc1b80994f7bfa60bbc74e924484da09b47e3brobertphillips@google.com
1671fcc1b80994f7bfa60bbc74e924484da09b47e3brobertphillips@google.com        if (fStack.empty()) {
168f6de475e5cbd143f348ff7738919e397b7fe7f57tfarina@chromium.org            SkASSERT(false);
1691fcc1b80994f7bfa60bbc74e924484da09b47e3brobertphillips@google.com            bound->setEmpty();
1701fcc1b80994f7bfa60bbc74e924484da09b47e3brobertphillips@google.com            return;
1711fcc1b80994f7bfa60bbc74e924484da09b47e3brobertphillips@google.com        }
1721fcc1b80994f7bfa60bbc74e924484da09b47e3brobertphillips@google.com
1731fcc1b80994f7bfa60bbc74e924484da09b47e3brobertphillips@google.com        GrClipStackFrame* back = (GrClipStackFrame*) fStack.back();
1741fcc1b80994f7bfa60bbc74e924484da09b47e3brobertphillips@google.com
1751fcc1b80994f7bfa60bbc74e924484da09b47e3brobertphillips@google.com        *bound = back->fLastBound;
1761fcc1b80994f7bfa60bbc74e924484da09b47e3brobertphillips@google.com    }
1771fcc1b80994f7bfa60bbc74e924484da09b47e3brobertphillips@google.com
1781fcc1b80994f7bfa60bbc74e924484da09b47e3brobertphillips@google.com    void setContext(GrContext* context) {
1791fcc1b80994f7bfa60bbc74e924484da09b47e3brobertphillips@google.com        fContext = context;
1801fcc1b80994f7bfa60bbc74e924484da09b47e3brobertphillips@google.com    }
1811fcc1b80994f7bfa60bbc74e924484da09b47e3brobertphillips@google.com
1821fcc1b80994f7bfa60bbc74e924484da09b47e3brobertphillips@google.com    GrContext* getContext() {
1831fcc1b80994f7bfa60bbc74e924484da09b47e3brobertphillips@google.com        return fContext;
1841fcc1b80994f7bfa60bbc74e924484da09b47e3brobertphillips@google.com    }
1851fcc1b80994f7bfa60bbc74e924484da09b47e3brobertphillips@google.com
1861fcc1b80994f7bfa60bbc74e924484da09b47e3brobertphillips@google.com    void releaseResources() {
1871fcc1b80994f7bfa60bbc74e924484da09b47e3brobertphillips@google.com
1881fcc1b80994f7bfa60bbc74e924484da09b47e3brobertphillips@google.com        SkDeque::F2BIter iter(fStack);
1891fcc1b80994f7bfa60bbc74e924484da09b47e3brobertphillips@google.com        for (GrClipStackFrame* frame = (GrClipStackFrame*) iter.next();
1901fcc1b80994f7bfa60bbc74e924484da09b47e3brobertphillips@google.com                frame != NULL;
1911fcc1b80994f7bfa60bbc74e924484da09b47e3brobertphillips@google.com                frame = (GrClipStackFrame*) iter.next()) {
1921fcc1b80994f7bfa60bbc74e924484da09b47e3brobertphillips@google.com            frame->reset();
1931fcc1b80994f7bfa60bbc74e924484da09b47e3brobertphillips@google.com        }
1941fcc1b80994f7bfa60bbc74e924484da09b47e3brobertphillips@google.com    }
1951fcc1b80994f7bfa60bbc74e924484da09b47e3brobertphillips@google.com
1961fcc1b80994f7bfa60bbc74e924484da09b47e3brobertphillips@google.comprivate:
1971fcc1b80994f7bfa60bbc74e924484da09b47e3brobertphillips@google.com    struct GrClipStackFrame {
1981fcc1b80994f7bfa60bbc74e924484da09b47e3brobertphillips@google.com
1991fcc1b80994f7bfa60bbc74e924484da09b47e3brobertphillips@google.com        GrClipStackFrame() {
2004c2443e36fdc6c095b17e90baa4a2f26a6f00b08bsalomon@google.com            this->reset();
2011fcc1b80994f7bfa60bbc74e924484da09b47e3brobertphillips@google.com        }
2021fcc1b80994f7bfa60bbc74e924484da09b47e3brobertphillips@google.com
2031fcc1b80994f7bfa60bbc74e924484da09b47e3brobertphillips@google.com        void acquireMask(GrContext* context,
2044c2443e36fdc6c095b17e90baa4a2f26a6f00b08bsalomon@google.com                         int32_t clipGenID,
2051fcc1b80994f7bfa60bbc74e924484da09b47e3brobertphillips@google.com                         const GrTextureDesc& desc,
206fd03d4a829efe2d77a712fd991927c55f59a2ffecommit-bot@chromium.org                         const SkIRect& bound) {
2071fcc1b80994f7bfa60bbc74e924484da09b47e3brobertphillips@google.com
2084c2443e36fdc6c095b17e90baa4a2f26a6f00b08bsalomon@google.com            fLastClipGenID = clipGenID;
2091fcc1b80994f7bfa60bbc74e924484da09b47e3brobertphillips@google.com
2101fcc1b80994f7bfa60bbc74e924484da09b47e3brobertphillips@google.com            fLastMask.set(context, desc);
2111fcc1b80994f7bfa60bbc74e924484da09b47e3brobertphillips@google.com
2121fcc1b80994f7bfa60bbc74e924484da09b47e3brobertphillips@google.com            fLastBound = bound;
2131fcc1b80994f7bfa60bbc74e924484da09b47e3brobertphillips@google.com        }
2141fcc1b80994f7bfa60bbc74e924484da09b47e3brobertphillips@google.com
2151fcc1b80994f7bfa60bbc74e924484da09b47e3brobertphillips@google.com        void reset () {
2164c2443e36fdc6c095b17e90baa4a2f26a6f00b08bsalomon@google.com            fLastClipGenID = SkClipStack::kInvalidGenID;
2171fcc1b80994f7bfa60bbc74e924484da09b47e3brobertphillips@google.com
2181fcc1b80994f7bfa60bbc74e924484da09b47e3brobertphillips@google.com            GrTextureDesc desc;
2191fcc1b80994f7bfa60bbc74e924484da09b47e3brobertphillips@google.com
2201fcc1b80994f7bfa60bbc74e924484da09b47e3brobertphillips@google.com            fLastMask.set(NULL, desc);
2211fcc1b80994f7bfa60bbc74e924484da09b47e3brobertphillips@google.com            fLastBound.setEmpty();
2221fcc1b80994f7bfa60bbc74e924484da09b47e3brobertphillips@google.com        }
2231fcc1b80994f7bfa60bbc74e924484da09b47e3brobertphillips@google.com
2244c2443e36fdc6c095b17e90baa4a2f26a6f00b08bsalomon@google.com        int32_t                 fLastClipGenID;
2254c2443e36fdc6c095b17e90baa4a2f26a6f00b08bsalomon@google.com        // The mask's width & height values are used by GrClipMaskManager to correctly scale the
2264c2443e36fdc6c095b17e90baa4a2f26a6f00b08bsalomon@google.com        // texture coords for the geometry drawn with this mask.
2271fcc1b80994f7bfa60bbc74e924484da09b47e3brobertphillips@google.com        GrAutoScratchTexture    fLastMask;
2284c2443e36fdc6c095b17e90baa4a2f26a6f00b08bsalomon@google.com        // fLastBound stores the bounding box of the clip mask in clip-stack space. This rect is
2294c2443e36fdc6c095b17e90baa4a2f26a6f00b08bsalomon@google.com        // used by GrClipMaskManager to position a rect and compute texture coords for the mask.
230fd03d4a829efe2d77a712fd991927c55f59a2ffecommit-bot@chromium.org        SkIRect                 fLastBound;
2311fcc1b80994f7bfa60bbc74e924484da09b47e3brobertphillips@google.com    };
2321fcc1b80994f7bfa60bbc74e924484da09b47e3brobertphillips@google.com
2331fcc1b80994f7bfa60bbc74e924484da09b47e3brobertphillips@google.com    GrContext*   fContext;
2341fcc1b80994f7bfa60bbc74e924484da09b47e3brobertphillips@google.com    SkDeque      fStack;
2351fcc1b80994f7bfa60bbc74e924484da09b47e3brobertphillips@google.com
2361fcc1b80994f7bfa60bbc74e924484da09b47e3brobertphillips@google.com    typedef GrNoncopyable INHERITED;
2371fcc1b80994f7bfa60bbc74e924484da09b47e3brobertphillips@google.com};
2381fcc1b80994f7bfa60bbc74e924484da09b47e3brobertphillips@google.com
2391fcc1b80994f7bfa60bbc74e924484da09b47e3brobertphillips@google.com#endif // GrClipMaskCache_DEFINED
240