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