1fe7b1ed30a75cecfe80d1ba4d1f60295e99aeef0reed@google.com/*
2fe7b1ed30a75cecfe80d1ba4d1f60295e99aeef0reed@google.com * Copyright 2012 Google Inc.
3fe7b1ed30a75cecfe80d1ba4d1f60295e99aeef0reed@google.com *
4fe7b1ed30a75cecfe80d1ba4d1f60295e99aeef0reed@google.com * Use of this source code is governed by a BSD-style license that can be
5fe7b1ed30a75cecfe80d1ba4d1f60295e99aeef0reed@google.com * found in the LICENSE file.
6fe7b1ed30a75cecfe80d1ba4d1f60295e99aeef0reed@google.com */
7fe7b1ed30a75cecfe80d1ba4d1f60295e99aeef0reed@google.com
8fe7b1ed30a75cecfe80d1ba4d1f60295e99aeef0reed@google.com#ifndef SkPictureUtils_DEFINED
9fe7b1ed30a75cecfe80d1ba4d1f60295e99aeef0reed@google.com#define SkPictureUtils_DEFINED
10fe7b1ed30a75cecfe80d1ba4d1f60295e99aeef0reed@google.com
11fe7b1ed30a75cecfe80d1ba4d1f60295e99aeef0reed@google.com#include "SkPicture.h"
1256bf6e4bce26710b017b61ddadb13e277aab8a45robertphillips@google.com#include "SkTDArray.h"
13fe7b1ed30a75cecfe80d1ba4d1f60295e99aeef0reed@google.com
14fe7b1ed30a75cecfe80d1ba4d1f60295e99aeef0reed@google.comclass SkData;
15fe7b1ed30a75cecfe80d1ba4d1f60295e99aeef0reed@google.comstruct SkRect;
16fe7b1ed30a75cecfe80d1ba4d1f60295e99aeef0reed@google.com
17fdabcb511d112bcbbc6ce767199cdcc49b834b90djsollen@google.comclass SK_API SkPictureUtils {
18fe7b1ed30a75cecfe80d1ba4d1f60295e99aeef0reed@google.compublic:
19fe7b1ed30a75cecfe80d1ba4d1f60295e99aeef0reed@google.com    /**
20fe7b1ed30a75cecfe80d1ba4d1f60295e99aeef0reed@google.com     *  Given a rectangular visible "window" into the picture, return an array
21fe7b1ed30a75cecfe80d1ba4d1f60295e99aeef0reed@google.com     *  of SkPixelRefs that might intersect that area. To keep the call fast,
22fe7b1ed30a75cecfe80d1ba4d1f60295e99aeef0reed@google.com     *  the returned list is not guaranteed to be exact, so it may miss some,
23fe7b1ed30a75cecfe80d1ba4d1f60295e99aeef0reed@google.com     *  and it may return false positives.
24fe7b1ed30a75cecfe80d1ba4d1f60295e99aeef0reed@google.com     *
25fe7b1ed30a75cecfe80d1ba4d1f60295e99aeef0reed@google.com     *  The pixelrefs returned in the SkData are already owned by the picture,
26fe7b1ed30a75cecfe80d1ba4d1f60295e99aeef0reed@google.com     *  so the returned pointers are only valid while the picture is in scope
27fe7b1ed30a75cecfe80d1ba4d1f60295e99aeef0reed@google.com     *  and remains unchanged.
28fe7b1ed30a75cecfe80d1ba4d1f60295e99aeef0reed@google.com     */
29ce4dd3de38cd7c29bf5b9d8a8efb55c08ec9be47robertphillips    static SkData* GatherPixelRefs(const SkPicture* pict, const SkRect& area);
3056bf6e4bce26710b017b61ddadb13e277aab8a45robertphillips@google.com
3156bf6e4bce26710b017b61ddadb13e277aab8a45robertphillips@google.com    /**
3256bf6e4bce26710b017b61ddadb13e277aab8a45robertphillips@google.com     * SkPixelRefContainer provides a base class for more elaborate pixel ref
3356bf6e4bce26710b017b61ddadb13e277aab8a45robertphillips@google.com     * query structures (e.g., rtrees, quad-trees, etc.)
3456bf6e4bce26710b017b61ddadb13e277aab8a45robertphillips@google.com     */
3556bf6e4bce26710b017b61ddadb13e277aab8a45robertphillips@google.com    class SkPixelRefContainer : public SkRefCnt {
3656bf6e4bce26710b017b61ddadb13e277aab8a45robertphillips@google.com    public:
3756bf6e4bce26710b017b61ddadb13e277aab8a45robertphillips@google.com        virtual void add(SkPixelRef* pr, const SkRect& rect) = 0;
3856bf6e4bce26710b017b61ddadb13e277aab8a45robertphillips@google.com
3956bf6e4bce26710b017b61ddadb13e277aab8a45robertphillips@google.com        // The returned array may contain duplicates
4056bf6e4bce26710b017b61ddadb13e277aab8a45robertphillips@google.com        virtual void query(const SkRect& queryRect, SkTDArray<SkPixelRef*> *result) = 0;
4156bf6e4bce26710b017b61ddadb13e277aab8a45robertphillips@google.com
4256bf6e4bce26710b017b61ddadb13e277aab8a45robertphillips@google.com    private:
4356bf6e4bce26710b017b61ddadb13e277aab8a45robertphillips@google.com        typedef SkRefCnt INHERITED;
4456bf6e4bce26710b017b61ddadb13e277aab8a45robertphillips@google.com    };
4556bf6e4bce26710b017b61ddadb13e277aab8a45robertphillips@google.com
4656bf6e4bce26710b017b61ddadb13e277aab8a45robertphillips@google.com    // Simple query structure that just stores a linked list of pixel refs
4756bf6e4bce26710b017b61ddadb13e277aab8a45robertphillips@google.com    // and rects.
4856bf6e4bce26710b017b61ddadb13e277aab8a45robertphillips@google.com    class SkPixelRefsAndRectsList : public SkPixelRefContainer {
4956bf6e4bce26710b017b61ddadb13e277aab8a45robertphillips@google.com    public:
5056bf6e4bce26710b017b61ddadb13e277aab8a45robertphillips@google.com        virtual void add(SkPixelRef* pr, const SkRect& rect) SK_OVERRIDE {
5156bf6e4bce26710b017b61ddadb13e277aab8a45robertphillips@google.com            PixelRefAndRect *dst = fArray.append();
5256bf6e4bce26710b017b61ddadb13e277aab8a45robertphillips@google.com
5356bf6e4bce26710b017b61ddadb13e277aab8a45robertphillips@google.com            dst->fPixelRef = pr;
5456bf6e4bce26710b017b61ddadb13e277aab8a45robertphillips@google.com            dst->fRect = rect;
5556bf6e4bce26710b017b61ddadb13e277aab8a45robertphillips@google.com        }
5656bf6e4bce26710b017b61ddadb13e277aab8a45robertphillips@google.com
5756bf6e4bce26710b017b61ddadb13e277aab8a45robertphillips@google.com        virtual void query(const SkRect& queryRect, SkTDArray<SkPixelRef*> *result) SK_OVERRIDE {
5856bf6e4bce26710b017b61ddadb13e277aab8a45robertphillips@google.com            for (int i = 0; i < fArray.count(); ++i) {
5956bf6e4bce26710b017b61ddadb13e277aab8a45robertphillips@google.com                if (SkRect::Intersects(fArray[i].fRect, queryRect)) {
6056bf6e4bce26710b017b61ddadb13e277aab8a45robertphillips@google.com                    *result->append() = fArray[i].fPixelRef;
6156bf6e4bce26710b017b61ddadb13e277aab8a45robertphillips@google.com                }
6256bf6e4bce26710b017b61ddadb13e277aab8a45robertphillips@google.com            }
6356bf6e4bce26710b017b61ddadb13e277aab8a45robertphillips@google.com        }
6456bf6e4bce26710b017b61ddadb13e277aab8a45robertphillips@google.com
6556bf6e4bce26710b017b61ddadb13e277aab8a45robertphillips@google.com    private:
6656bf6e4bce26710b017b61ddadb13e277aab8a45robertphillips@google.com        struct PixelRefAndRect {
6756bf6e4bce26710b017b61ddadb13e277aab8a45robertphillips@google.com            SkPixelRef* fPixelRef;
6856bf6e4bce26710b017b61ddadb13e277aab8a45robertphillips@google.com            SkRect      fRect;
6956bf6e4bce26710b017b61ddadb13e277aab8a45robertphillips@google.com        };
7056bf6e4bce26710b017b61ddadb13e277aab8a45robertphillips@google.com
7156bf6e4bce26710b017b61ddadb13e277aab8a45robertphillips@google.com        SkTDArray<PixelRefAndRect> fArray;
7256bf6e4bce26710b017b61ddadb13e277aab8a45robertphillips@google.com
7356bf6e4bce26710b017b61ddadb13e277aab8a45robertphillips@google.com        typedef SkPixelRefContainer INHERITED;
7456bf6e4bce26710b017b61ddadb13e277aab8a45robertphillips@google.com    };
7556bf6e4bce26710b017b61ddadb13e277aab8a45robertphillips@google.com
7656bf6e4bce26710b017b61ddadb13e277aab8a45robertphillips@google.com    /**
7756bf6e4bce26710b017b61ddadb13e277aab8a45robertphillips@google.com     *  Fill the provided pixel ref container with the picture's pixel ref
7856bf6e4bce26710b017b61ddadb13e277aab8a45robertphillips@google.com     *  and rect information.
7956bf6e4bce26710b017b61ddadb13e277aab8a45robertphillips@google.com     */
8056bf6e4bce26710b017b61ddadb13e277aab8a45robertphillips@google.com    static void GatherPixelRefsAndRects(SkPicture* pict, SkPixelRefContainer* prCont);
81fe7b1ed30a75cecfe80d1ba4d1f60295e99aeef0reed@google.com};
82fe7b1ed30a75cecfe80d1ba4d1f60295e99aeef0reed@google.com
83fe7b1ed30a75cecfe80d1ba4d1f60295e99aeef0reed@google.com#endif
84