Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(992)

Unified Diff: Source/core/rendering/FastTextAutosizer.h

Issue 145123010: Fix supercluster logic. (Closed) Base URL: https://chromium.googlesource.com/chromium/blink.git@master
Patch Set: Address review comment. Created 6 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: Source/core/rendering/FastTextAutosizer.h
diff --git a/Source/core/rendering/FastTextAutosizer.h b/Source/core/rendering/FastTextAutosizer.h
index b024b760f73f647909fb83e7ecce2d820bb87755..9de5a1f317f1ff232ae9207c5df9986bebb09741 100644
--- a/Source/core/rendering/FastTextAutosizer.h
+++ b/Source/core/rendering/FastTextAutosizer.h
@@ -91,18 +91,38 @@ public:
};
private:
+ typedef HashSet<const RenderBlock*> BlockSet;
+
+ // A supercluster represents autosizing information about a set of two or
+ // more blocks that all have the same fingerprint. Clusters whose roots
+ // belong to a supercluster will share a common multiplier and
+ // text-length-based autosizing status.
+ struct Supercluster {
+ explicit Supercluster(const BlockSet* roots)
+ : m_roots(roots)
+ , m_multiplier(0)
+ , m_anyClusterHasEnoughText(false)
+ {
+ }
+
+ const BlockSet* const m_roots;
+ float m_multiplier;
+ bool m_anyClusterHasEnoughText;
+ };
+
struct Cluster {
- explicit Cluster(const RenderBlock* root, bool autosize, Cluster* parent)
+ explicit Cluster(const RenderBlock* root, bool autosize, Cluster* parent, Supercluster* supercluster = 0)
: m_root(root)
, m_deepestBlockContainingAllText(0)
, m_parent(parent)
, m_autosize(autosize)
, m_multiplier(0)
, m_textLength(-1)
+ , m_supercluster(supercluster)
{
}
- const RenderBlock* m_root;
+ const RenderBlock* const m_root;
// The deepest block containing all text is computed lazily (see:
// deepestBlockContainingAllText). A value of 0 indicates the value has not been computed yet.
const RenderBlock* m_deepestBlockContainingAllText;
@@ -116,6 +136,8 @@ private:
// Text length is computed lazily (see: textLength). This is an approximation and characters
// are assumed to be 1em wide. Negative values indicate the length has not been computed.
int m_textLength;
+ // A set of blocks that are similar to this block.
+ Supercluster* m_supercluster;
};
enum TextLeafSearch {
@@ -123,9 +145,8 @@ private:
Last
};
- typedef HashSet<const RenderBlock*> BlockSet;
- typedef HashMap<const RenderBlock*, OwnPtr<Cluster> > ClusterMap;
- typedef Vector<Cluster*> ClusterStack;
+ typedef HashMap<AtomicString, OwnPtr<Supercluster> > SuperclusterMap;
+ typedef Vector<OwnPtr<Cluster> > ClusterStack;
// Fingerprints are computed during style recalc, for (some subset of)
// blocks that will become cluster roots.
@@ -152,12 +173,15 @@ private:
void prepareRenderViewInfo(RenderView*);
bool isFingerprintingCandidate(const RenderBlock*);
bool clusterHasEnoughTextToAutosize(Cluster*);
+ bool clusterWouldHaveEnoughTextToAutosize(const RenderBlock*);
float textLength(Cluster*);
AtomicString computeFingerprint(const RenderBlock*);
- Cluster* maybeGetOrCreateCluster(const RenderBlock*);
- Cluster* addSupercluster(AtomicString, const RenderBlock*);
+ Cluster* maybeCreateCluster(const RenderBlock*);
+ Supercluster* getSupercluster(const RenderBlock*);
const RenderBlock* deepestCommonAncestor(BlockSet&);
float clusterMultiplier(Cluster*);
+ float superclusterMultiplier(Supercluster*);
+ float multiplierFromBlock(const RenderBlock*);
void applyMultiplier(RenderObject*, float);
bool mightBeWiderOrNarrowerDescendant(const RenderBlock*);
bool isWiderDescendant(Cluster*);
@@ -168,6 +192,7 @@ private:
RenderObject* nextChildSkippingChildrenOfBlocks(const RenderObject*, const RenderObject*);
const RenderBlock* deepestBlockContainingAllText(Cluster*);
+ const RenderBlock* deepestBlockContainingAllText(const RenderBlock*);
// Returns the first text leaf that is in the current cluster. We attempt to not include text
// from descendant clusters but because descendant clusters may not exist, this is only an approximation.
// The TraversalDirection controls whether we return the first or the last text leaf.
@@ -185,7 +210,7 @@ private:
// Clusters are created and destroyed during layout. The map key is the
// cluster root. Clusters whose roots share the same fingerprint use the
// same multiplier.
- ClusterMap m_clusters;
+ SuperclusterMap m_superclusters;
ClusterStack m_clusterStack;
FingerprintMapper m_fingerprintMapper;
};
« no previous file with comments | « LayoutTests/fast/text-autosizing/textarea-fontsize-change-expected.html ('k') | Source/core/rendering/FastTextAutosizer.cpp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698