blob: 45ff6a45986608f0ed33cf7a765950427967df7d [file] [log] [blame]
// Copyright 2016 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 RasterInvalidationTracking_h
#define RasterInvalidationTracking_h
#include "platform/geometry/IntRect.h"
#include "platform/geometry/Region.h"
#include "platform/graphics/PaintInvalidationReason.h"
#include "platform/json/JSONValues.h"
#include "third_party/skia/include/core/SkColor.h"
#include "third_party/skia/include/core/SkPicture.h"
#include "wtf/Allocator.h"
#include "wtf/text/WTFString.h"
namespace blink {
class DisplayItemClient;
struct RasterInvalidationInfo {
DISALLOW_NEW_EXCEPT_PLACEMENT_NEW();
// This is for comparison only. Don't dereference because the client may have
// died.
const DisplayItemClient* client;
String clientDebugName;
IntRect rect;
PaintInvalidationReason reason;
RasterInvalidationInfo() : reason(PaintInvalidationFull) {}
};
inline bool operator==(const RasterInvalidationInfo& a,
const RasterInvalidationInfo& b) {
return a.rect == b.rect;
}
struct UnderPaintInvalidation {
DISALLOW_NEW_EXCEPT_PLACEMENT_NEW();
int x;
int y;
SkColor oldPixel;
SkColor newPixel;
};
struct PLATFORM_EXPORT RasterInvalidationTracking {
DISALLOW_NEW_EXCEPT_PLACEMENT_NEW();
Vector<RasterInvalidationInfo> trackedRasterInvalidations;
sk_sp<SkPicture> lastPaintedPicture;
IntRect lastInterestRect;
Region rasterInvalidationRegionSinceLastPaint;
Vector<UnderPaintInvalidation> underPaintInvalidations;
void asJSON(JSONObject*);
};
template <class TargetClass>
class PLATFORM_EXPORT RasterInvalidationTrackingMap {
public:
void asJSON(TargetClass* key, JSONObject* json) {
auto it = m_invalidationTrackingMap.find(key);
if (it != m_invalidationTrackingMap.end())
it->value.asJSON(json);
}
void remove(TargetClass* key) {
auto it = m_invalidationTrackingMap.find(key);
if (it != m_invalidationTrackingMap.end())
m_invalidationTrackingMap.remove(it);
}
RasterInvalidationTracking& add(TargetClass* key) {
return m_invalidationTrackingMap.add(key, RasterInvalidationTracking())
.storedValue->value;
}
RasterInvalidationTracking* find(TargetClass* key) {
auto it = m_invalidationTrackingMap.find(key);
if (it == m_invalidationTrackingMap.end())
return nullptr;
return &it->value;
}
private:
typedef HashMap<TargetClass*, RasterInvalidationTracking>
InvalidationTrackingMap;
InvalidationTrackingMap m_invalidationTrackingMap;
};
} // namespace blink
#endif // RasterInvalidationTracking_h