blob: 9df098ae95d5e58abf3f51453bfdc886fc5262c5 [file] [log] [blame]
// Copyright 2015 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 SKY_COMPOSITOR_PICTURE_RASTERIZER_H_
#define SKY_COMPOSITOR_PICTURE_RASTERIZER_H_
#include "base/macros.h"
#include "third_party/skia/include/core/SkSize.h"
#include "third_party/skia/include/core/SkImage.h"
#include "sky/compositor/instrumentation.h"
#include "sky/engine/wtf/PassRefPtr.h"
#include "sky/engine/wtf/RefPtr.h"
#include <functional> // for std::hash
#include <unordered_map>
#include <unordered_set>
namespace sky {
namespace compositor {
class PaintContext;
class PictureRasterzier {
public:
PictureRasterzier();
~PictureRasterzier();
RefPtr<SkImage> GetCachedImageIfPresent(PaintContext& context,
GrContext* gr_context,
SkPicture* picture,
const SkISize& physical_size,
const SkMatrix& incoming_ctm);
void PurgeCache();
const instrumentation::Counter& cache_fills() { return cache_fills_; }
const instrumentation::Counter& cache_hits() { return cache_hits_; }
const instrumentation::Counter& cache_evictions() { return cache_evictions_; }
private:
struct Key {
uint32_t pictureID;
SkISize size;
explicit Key(uint32_t ident, SkISize sz);
Key(const Key& key);
};
struct KeyHash {
std::size_t operator()(const Key& key) const {
return std::hash<uint32_t>()(key.pictureID) ^
std::hash<int32_t>()(key.size.width()) ^
std::hash<int32_t>()(key.size.height());
}
};
struct KeyEqual {
bool operator()(const Key& lhs, const Key& rhs) const {
return lhs.pictureID == rhs.pictureID && lhs.size == rhs.size;
}
};
struct Value {
static const int8_t kDeadAccessCount = -1;
int8_t access_count;
RefPtr<SkImage> image;
Value();
~Value();
};
using Cache = std::unordered_map<Key, Value, KeyHash, KeyEqual>;
Cache cache_;
instrumentation::Counter cache_fills_;
instrumentation::Counter cache_hits_;
instrumentation::Counter cache_evictions_;
RefPtr<SkImage> ImageFromPicture(PaintContext& context,
GrContext* gr_context,
SkPicture* picture,
const SkISize& physical_size,
const SkMatrix& incomingCTM);
DISALLOW_COPY_AND_ASSIGN(PictureRasterzier);
};
} // namespace compositor
} // namespace sky
#endif // SKY_COMPOSITOR_PICTURE_RASTERIZER_H_