mirror of
https://github.com/flutter/flutter.git
synced 2026-02-20 02:29:02 +08:00
* Fix pixel rounding error in the picture layer by first ensuring that the texture for the image is at least as big as the next integer size along each dimension and using kStrict_SrcRectConstraint while drawing the same image. We already select the source subset by looking at the cull rect of the picture. * Decompose the transformation matrix into a series of operations that generated the same to calculate the scale at which to rasterize the picture. This make the rasterization scale resilient to transformations that introduce a perspective component to the resultant matrix. * The scale in the decomposed matrix is now part of the key in the cache. * Raster cache images that could never be rasterized were still taking part in the cache. Now, those entries are rejected early on. This leads to the sweep after the frame iterating over fewer items. * Added a unit test target.
52 lines
1.4 KiB
C++
52 lines
1.4 KiB
C++
// 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 FLUTTER_FLOW_RASTER_CACHE_KEY_H_
|
|
#define FLUTTER_FLOW_RASTER_CACHE_KEY_H_
|
|
|
|
#include <unordered_map>
|
|
#include "flutter/flow/matrix_decomposition.h"
|
|
#include "lib/ftl/macros.h"
|
|
#include "third_party/skia/include/core/SkImage.h"
|
|
#include "third_party/skia/include/core/SkPicture.h"
|
|
|
|
namespace flow {
|
|
|
|
class RasterCacheKey {
|
|
public:
|
|
RasterCacheKey(const SkPicture& picture, const MatrixDecomposition& matrix)
|
|
: picture_id_(picture.uniqueID()),
|
|
scale_key_(SkISize::Make(matrix.scale().x() * 1e3,
|
|
matrix.scale().y() * 1e3)) {}
|
|
|
|
uint32_t picture_id() const { return picture_id_; }
|
|
|
|
const SkISize& scale_key() const { return scale_key_; }
|
|
|
|
struct Hash {
|
|
std::size_t operator()(RasterCacheKey const& key) const {
|
|
return key.picture_id_;
|
|
}
|
|
};
|
|
|
|
struct Equal {
|
|
constexpr bool operator()(const RasterCacheKey& lhs,
|
|
const RasterCacheKey& rhs) const {
|
|
return lhs.picture_id_ == rhs.picture_id_ &&
|
|
lhs.scale_key_ == rhs.scale_key_;
|
|
}
|
|
};
|
|
|
|
template <class Value>
|
|
using Map = std::unordered_map<RasterCacheKey, Value, Hash, Equal>;
|
|
|
|
private:
|
|
uint32_t picture_id_;
|
|
SkISize scale_key_;
|
|
};
|
|
|
|
} // namespace flow
|
|
|
|
#endif // FLUTTER_FLOW_RASTER_CACHE_KEY_H_
|