17b53706a7d596a2d8dce6cfe5b543264e5a37239junov@chromium.org/*
27b53706a7d596a2d8dce6cfe5b543264e5a37239junov@chromium.org * Copyright 2012 Google Inc.
37b53706a7d596a2d8dce6cfe5b543264e5a37239junov@chromium.org *
47b53706a7d596a2d8dce6cfe5b543264e5a37239junov@chromium.org * Use of this source code is governed by a BSD-style license that can be
57b53706a7d596a2d8dce6cfe5b543264e5a37239junov@chromium.org * found in the LICENSE file.
67b53706a7d596a2d8dce6cfe5b543264e5a37239junov@chromium.org */
77b53706a7d596a2d8dce6cfe5b543264e5a37239junov@chromium.org
87b53706a7d596a2d8dce6cfe5b543264e5a37239junov@chromium.org#ifndef SkTileGrid_DEFINED
97b53706a7d596a2d8dce6cfe5b543264e5a37239junov@chromium.org#define SkTileGrid_DEFINED
107b53706a7d596a2d8dce6cfe5b543264e5a37239junov@chromium.org
11770963f23f4fc313db0fa3bac18b1b8aafb55f17robertphillips@google.com#include "SkBBHFactory.h"
127b53706a7d596a2d8dce6cfe5b543264e5a37239junov@chromium.org#include "SkBBoxHierarchy.h"
137b53706a7d596a2d8dce6cfe5b543264e5a37239junov@chromium.org
147b53706a7d596a2d8dce6cfe5b543264e5a37239junov@chromium.org/**
157b53706a7d596a2d8dce6cfe5b543264e5a37239junov@chromium.org * Subclass of SkBBoxHierarchy that stores elements in buckets that correspond
167b53706a7d596a2d8dce6cfe5b543264e5a37239junov@chromium.org * to tile regions, disposed in a regular grid.  This is useful when the tile
177b53706a7d596a2d8dce6cfe5b543264e5a37239junov@chromium.org * structure that will be use in search() calls is known prior to insertion.
187b53706a7d596a2d8dce6cfe5b543264e5a37239junov@chromium.org */
197b53706a7d596a2d8dce6cfe5b543264e5a37239junov@chromium.orgclass SkTileGrid : public SkBBoxHierarchy {
207b53706a7d596a2d8dce6cfe5b543264e5a37239junov@chromium.orgpublic:
2103bde3e6fa8deaf635bd19b45de69ebea71ec299mtklein    SkTileGrid(int xTiles, int yTiles, const SkTileGridFactory::TileGridInfo& info);
227b53706a7d596a2d8dce6cfe5b543264e5a37239junov@chromium.org
237b53706a7d596a2d8dce6cfe5b543264e5a37239junov@chromium.org    virtual ~SkTileGrid();
247b53706a7d596a2d8dce6cfe5b543264e5a37239junov@chromium.org
257b53706a7d596a2d8dce6cfe5b543264e5a37239junov@chromium.org    /**
267b53706a7d596a2d8dce6cfe5b543264e5a37239junov@chromium.org     * Insert a data pointer and corresponding bounding box
2703bde3e6fa8deaf635bd19b45de69ebea71ec299mtklein     * @param data   An arbitrary data pointer, may be NULL.
28a7f7b168ae6c4658efe2a7acd1b22f2dd989bb35mtklein     * @param bounds The bounding box, should not be empty.
29a7f7b168ae6c4658efe2a7acd1b22f2dd989bb35mtklein     * @param defer  Ignored; SkTileGrid does not defer insertions.
307b53706a7d596a2d8dce6cfe5b543264e5a37239junov@chromium.org     */
31533eb782edaa0b6fece6166d3001edf72ec39f11mtklein    virtual void insert(void* data, const SkRect& bounds, bool) SK_OVERRIDE;
327b53706a7d596a2d8dce6cfe5b543264e5a37239junov@chromium.org
337b53706a7d596a2d8dce6cfe5b543264e5a37239junov@chromium.org    virtual void flushDeferredInserts() SK_OVERRIDE {};
347b53706a7d596a2d8dce6cfe5b543264e5a37239junov@chromium.org
357b53706a7d596a2d8dce6cfe5b543264e5a37239junov@chromium.org    /**
36a7f7b168ae6c4658efe2a7acd1b22f2dd989bb35mtklein     * Populate 'results' with data pointers corresponding to bounding boxes that intersect 'query'.
37a7f7b168ae6c4658efe2a7acd1b22f2dd989bb35mtklein     * This will be fastest if the query is an exact match to a single grid tile.
387b53706a7d596a2d8dce6cfe5b543264e5a37239junov@chromium.org     */
39533eb782edaa0b6fece6166d3001edf72ec39f11mtklein    virtual void search(const SkRect& query, SkTDArray<void*>* results) const SK_OVERRIDE;
407b53706a7d596a2d8dce6cfe5b543264e5a37239junov@chromium.org
417b53706a7d596a2d8dce6cfe5b543264e5a37239junov@chromium.org    virtual void clear() SK_OVERRIDE;
427b53706a7d596a2d8dce6cfe5b543264e5a37239junov@chromium.org
4303bde3e6fa8deaf635bd19b45de69ebea71ec299mtklein    virtual int getCount() const SK_OVERRIDE { return fCount; }
447b53706a7d596a2d8dce6cfe5b543264e5a37239junov@chromium.org
45c22d1398089fdb95480fb3459b23e4931e4f5280commit-bot@chromium.org    virtual int getDepth() const SK_OVERRIDE { return -1; }
46c22d1398089fdb95480fb3459b23e4931e4f5280commit-bot@chromium.org
474b32bd53c63b245707822ae83e3215863303bf43commit-bot@chromium.org    virtual void rewindInserts() SK_OVERRIDE;
484b32bd53c63b245707822ae83e3215863303bf43commit-bot@chromium.org
4903bde3e6fa8deaf635bd19b45de69ebea71ec299mtklein    // For testing.
5003bde3e6fa8deaf635bd19b45de69ebea71ec299mtklein    int tileCount(int x, int y) { return fTiles[y * fXTiles + x].count(); }
519f9d5829c29d8934fa0d4d348173d5ae39bed4e9tfarina@chromium.org
527b53706a7d596a2d8dce6cfe5b543264e5a37239junov@chromium.orgprivate:
5303bde3e6fa8deaf635bd19b45de69ebea71ec299mtklein    struct Entry {
5403bde3e6fa8deaf635bd19b45de69ebea71ec299mtklein        size_t order;  // Insertion order.  Used to preserve order when merging multiple tiles.
5503bde3e6fa8deaf635bd19b45de69ebea71ec299mtklein        void*  data;
5603bde3e6fa8deaf635bd19b45de69ebea71ec299mtklein    };
577b53706a7d596a2d8dce6cfe5b543264e5a37239junov@chromium.org
5803bde3e6fa8deaf635bd19b45de69ebea71ec299mtklein    const int fXTiles, fYTiles;
595fb2ce38b3dcb8e60e9e112df23c9d42456d7069commit-bot@chromium.org    SkTileGridFactory::TileGridInfo fInfo;
6003bde3e6fa8deaf635bd19b45de69ebea71ec299mtklein    size_t fCount;
6103bde3e6fa8deaf635bd19b45de69ebea71ec299mtklein
6203bde3e6fa8deaf635bd19b45de69ebea71ec299mtklein    // (fXTiles * fYTiles) SkTDArrays, each listing data overlapping that tile in insertion order.
6303bde3e6fa8deaf635bd19b45de69ebea71ec299mtklein    SkTDArray<Entry>* fTiles;
647b53706a7d596a2d8dce6cfe5b543264e5a37239junov@chromium.org
657b53706a7d596a2d8dce6cfe5b543264e5a37239junov@chromium.org    typedef SkBBoxHierarchy INHERITED;
667b53706a7d596a2d8dce6cfe5b543264e5a37239junov@chromium.org};
677b53706a7d596a2d8dce6cfe5b543264e5a37239junov@chromium.org
6861b05dcc7ebe48663c3ba84b7bd7449d6c887ac1skia.committer@gmail.com#endif
69