| Index: components/viz/hit_test/hit_test_aggregator.h
|
| diff --git a/components/viz/hit_test/hit_test_aggregator.h b/components/viz/hit_test/hit_test_aggregator.h
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..892c7f83c68bcd05ca8d586ab7bc35b60e1264be
|
| --- /dev/null
|
| +++ b/components/viz/hit_test/hit_test_aggregator.h
|
| @@ -0,0 +1,112 @@
|
| +// Copyright 2017 The Chromium Authors. All rights reserved.
|
| +// Use of this source code is governed by a BSD-style license that can be
|
| +// found in the LICENSE file.
|
| +
|
| +#ifndef COMPONENTS_VIZ_HIT_TEST_HIT_TEST_AGGREGATOR_H_
|
| +#define COMPONENTS_VIZ_HIT_TEST_HIT_TEST_AGGREGATOR_H_
|
| +
|
| +#include <stdint.h>
|
| +
|
| +#include <map>
|
| +#include <memory>
|
| +
|
| +#include "cc/surfaces/surface_id.h"
|
| +#include "cc/surfaces/surface_observer.h"
|
| +#include "components/viz/hit_test/display_hit_test_data.h"
|
| +#include "components/viz/hit_test/display_hit_test_data_factory.h"
|
| +#include "components/viz/hit_test/hit_test_export.h"
|
| +#include "components/viz/hit_test/public/interfaces/hit_test_data.mojom.h"
|
| +#include "ui/gfx/geometry/quad_f.h"
|
| +
|
| +namespace viz {
|
| +namespace hit_test {
|
| +
|
| +namespace test {
|
| +class HitTestAggregatorTest;
|
| +}
|
| +
|
| +// HitTest maintains maping between display regions and associated surfaces
|
| +// in shared memory to enable efficient hit testing across processes.
|
| +//
|
| +// This is intended to be created in the viz or GPU process. For mus+ash this
|
| +// will be true after the mus process split.
|
| +
|
| +using HitTestDataMap = std::map<cc::SurfaceId, hit_test::mojom::HitTestDataPtr>;
|
| +
|
| +class HIT_TEST_EXPORT HitTestAggregator : public cc::SurfaceObserver {
|
| + public:
|
| + HitTestAggregator(
|
| + std::unique_ptr<DisplayHitTestDataFactory> display_hit_test_data_factory);
|
| + ~HitTestAggregator();
|
| +
|
| + // Called when HitTestData is submitted along with every call
|
| + // to SubmitCompositorFrame. This is collected in pending_ until
|
| + // surfaces are aggregated and put on the display.
|
| + void SubmitHitTestData(hit_test::mojom::HitTestDataPtr hit_test_data);
|
| +
|
| + // Called after surfaces have been aggregated into the DisplayFrame.
|
| + // In this call HitTestData structures received from active surfaces
|
| + // are aggregated into the DisplayHitTestData structure in
|
| + // shared memory used for event targetting.
|
| + void PostTaskAggregate(cc::SurfaceId display_surface_id);
|
| + void Aggregate(cc::SurfaceId display_surface_id);
|
| +
|
| + // Called at BeginFrame to swap buffers in shared memory.
|
| + void Swap();
|
| +
|
| + // SurfaceObserver
|
| + void OnSurfaceCreated(const cc::SurfaceInfo& surface_info) override {}
|
| + void OnSurfaceDestroyed(const cc::SurfaceId& surface_id) override {}
|
| + void OnSurfaceDamaged(const cc::SurfaceId& surface_id,
|
| + const cc::BeginFrameAck& ack,
|
| + bool* changed) override {}
|
| + void OnSurfaceDiscarded(const cc::SurfaceId& surface_id) override;
|
| + void OnSurfaceDamageExpected(const cc::SurfaceId& surface_id,
|
| + const cc::BeginFrameArgs& args) override {}
|
| + // Called when a surface has been aggregated and added to the
|
| + // display frame. HitTestData objects are held but ignored until
|
| + // this happens. HitTestData for the surface is copied from pending_
|
| + // to active_ in this method.
|
| + void OnSurfaceWillDraw(const cc::SurfaceId& surface_id) override;
|
| +
|
| + DisplayHitTestData* GetDisplayHitTestData();
|
| + DisplayHitTestRegion* GetCurrentRegions();
|
| +
|
| + private:
|
| + friend class viz::hit_test::test::HitTestAggregatorTest;
|
| +
|
| + HitTestDataMap pending_;
|
| + HitTestDataMap active_;
|
| +
|
| + // Keep track of the number of regions in the active list
|
| + // so that we know when we exceed the available length.
|
| + int active_region_count_;
|
| +
|
| + std::unique_ptr<DisplayHitTestDataFactory> display_hit_test_data_factory_;
|
| +
|
| + DisplayHitTestData* display_hit_test_data_;
|
| +
|
| + // Allocates memory for the DisplayHitTestData Structure.
|
| + void AllocateDisplayHitTestData();
|
| + void AllocateDisplayHitTestData(int length);
|
| +
|
| + // Resize the memory for the DispalyHitTestData Structure.
|
| + // Copies current data and marks the structure
|
| + void ResizeDisplayHitTestData(int length);
|
| +
|
| + int GetBackIndex();
|
| +
|
| + int Append(cc::SurfaceId surface_id, int index);
|
| + int Append(const hit_test::mojom::HitTestRegionPtr& region, int index);
|
| +
|
| + // WeakPtr to handle the case when this object is deleted after
|
| + // the PostTaskAggregation call is scheduled but before invocation.
|
| + base::WeakPtrFactory<HitTestAggregator> weak_ptr_factory_;
|
| +
|
| + DISALLOW_COPY_AND_ASSIGN(HitTestAggregator);
|
| +};
|
| +
|
| +} // namespace hit_test
|
| +} // namespace viz
|
| +
|
| +#endif // COMPONENTS_VIZ_HIT_TEST_HIT_TEST_AGGREGATOR_H_
|
|
|