105b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger/*
205b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger    Copyright 2010 Google Inc.
305b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger
405b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger    Licensed under the Apache License, Version 2.0 (the "License");
505b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger    you may not use this file except in compliance with the License.
605b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger    You may obtain a copy of the License at
705b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger
805b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger         http://www.apache.org/licenses/LICENSE-2.0
905b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger
1005b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger    Unless required by applicable law or agreed to in writing, software
1105b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger    distributed under the License is distributed on an "AS IS" BASIS,
1205b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1305b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger    See the License for the specific language governing permissions and
1405b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger    limitations under the License.
1505b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger */
1605b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger
1705b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger
1805b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger#ifndef GrRectanizer_DEFINED
1905b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger#define GrRectanizer_DEFINED
2005b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger
2105b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger#include "GrRect.h"
2205b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger#include "GrTDArray.h"
2305b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger
2405b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenbergerclass GrRectanizerPurgeListener {
2505b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenbergerpublic:
2605b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger    virtual ~GrRectanizerPurgeListener() {}
2705b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger
2805b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger    virtual void notifyPurgeStrip(void*, int yCoord) = 0;
2905b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger};
3005b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger
3105b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenbergerclass GrRectanizer {
3205b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenbergerpublic:
3305b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger    GrRectanizer(int width, int height) : fWidth(width), fHeight(height) {
3405b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger        GrAssert(width >= 0);
3505b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger        GrAssert(height >= 0);
3605b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger    }
3705b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger
3805b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger    virtual ~GrRectanizer() {}
3905b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger
4005b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger    int width() const { return fWidth; }
4105b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger    int height() const { return fHeight; }
4205b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger
4305b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger    virtual bool addRect(int width, int height, GrIPoint16* loc) = 0;
4405b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger    virtual float percentFull() const = 0;
4505b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger
4605b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger    // return the Y-coordinate of a strip that should be purged, given height
4705b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger    // i.e. return the oldest such strip, or some other criteria. Return -1
4805b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger    // if there is no candidate
4905b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger    virtual int stripToPurge(int height) const = 0;
5005b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger    virtual void purgeStripAtY(int yCoord) = 0;
5105b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger
5205b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger    /**
5305b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger     *  Our factory, which returns the subclass du jour
5405b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger     */
5505b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger    static GrRectanizer* Factory(int width, int height);
5605b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger
5705b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenbergerprivate:
5805b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger    int fWidth;
5905b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger    int fHeight;
6005b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger};
6105b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger
6205b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger#endif
6305b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger
6405b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger
65