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

Side by Side Diff: Source/core/rendering/FastTextAutosizer.h

Issue 145123010: Fix supercluster logic. (Closed) Base URL: https://chromium.googlesource.com/chromium/blink.git@master
Patch Set: 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 unified diff | Download patch
OLDNEW
1 /* 1 /*
2 * Copyright (C) 2013 Google Inc. All rights reserved. 2 * Copyright (C) 2013 Google Inc. All rights reserved.
3 * 3 *
4 * Redistribution and use in source and binary forms, with or without 4 * Redistribution and use in source and binary forms, with or without
5 * modification, are permitted provided that the following conditions are 5 * modification, are permitted provided that the following conditions are
6 * met: 6 * met:
7 * 7 *
8 * * Redistributions of source code must retain the above copyright 8 * * Redistributions of source code must retain the above copyright
9 * notice, this list of conditions and the following disclaimer. 9 * notice, this list of conditions and the following disclaimer.
10 * * Redistributions in binary form must reproduce the above 10 * * Redistributions in binary form must reproduce the above
(...skipping 52 matching lines...) Expand 10 before | Expand all | Expand 10 after
63 63
64 void record(const RenderBlock*); 64 void record(const RenderBlock*);
65 void destroy(const RenderBlock*); 65 void destroy(const RenderBlock*);
66 66
67 void beginLayout(RenderBlock*); 67 void beginLayout(RenderBlock*);
68 void endLayout(RenderBlock*); 68 void endLayout(RenderBlock*);
69 69
70 void inflateListItem(RenderListItem*, RenderListMarker*); 70 void inflateListItem(RenderListItem*, RenderListMarker*);
71 71
72 private: 72 private:
73 typedef HashSet<const RenderBlock*> BlockSet;
74
75 struct Supercluster {
pdr. 2014/02/06 22:03:27 Can you add a comment here describing what supercl
skobes 2014/02/06 23:55:50 Done.
76 explicit Supercluster(const BlockSet* roots)
77 : m_roots(roots)
78 , m_multiplier(0)
79 , m_anyClusterHasEnoughText(false)
80 {
81 }
82
83 const BlockSet* const m_roots;
84 float m_multiplier;
85 bool m_anyClusterHasEnoughText;
86 };
87
73 struct Cluster { 88 struct Cluster {
74 explicit Cluster(const RenderBlock* root, bool autosize, Cluster* parent ) 89 explicit Cluster(const RenderBlock* root, bool autosize, Cluster* parent , Supercluster* supercluster = 0)
75 : m_root(root) 90 : m_root(root)
76 , m_deepestBlockContainingAllText(0) 91 , m_deepestBlockContainingAllText(0)
77 , m_parent(parent) 92 , m_parent(parent)
78 , m_autosize(autosize) 93 , m_autosize(autosize)
79 , m_multiplier(0) 94 , m_multiplier(0)
80 , m_textLength(-1) 95 , m_textLength(-1)
96 , m_supercluster(supercluster)
81 { 97 {
82 } 98 }
83 99
84 const RenderBlock* m_root; 100 const RenderBlock* const m_root;
85 // The deepest block containing all text is computed lazily (see: 101 // The deepest block containing all text is computed lazily (see:
86 // deepestBlockContainingAllText). A value of 0 indicates the value has not been computed yet. 102 // deepestBlockContainingAllText). A value of 0 indicates the value has not been computed yet.
87 const RenderBlock* m_deepestBlockContainingAllText; 103 const RenderBlock* m_deepestBlockContainingAllText;
88 Cluster* m_parent; 104 Cluster* m_parent;
89 bool m_autosize; 105 bool m_autosize;
90 // The multiplier is computed lazily (see: clusterMultiplier) because it must be calculated 106 // The multiplier is computed lazily (see: clusterMultiplier) because it must be calculated
91 // after the lowest block containing all text has entered layout (the 107 // after the lowest block containing all text has entered layout (the
92 // m_blocksThatHaveBegunLayout assertions cover this). Note: the multipl ier is still 108 // m_blocksThatHaveBegunLayout assertions cover this). Note: the multipl ier is still
93 // calculated when m_autosize is false because child clusters may depend on this multiplier. 109 // calculated when m_autosize is false because child clusters may depend on this multiplier.
94 float m_multiplier; 110 float m_multiplier;
95 // Text length is computed lazily (see: textLength). This is an approxim ation and characters 111 // Text length is computed lazily (see: textLength). This is an approxim ation and characters
96 // are assumed to be 1em wide. Negative values indicate the length has n ot been computed. 112 // are assumed to be 1em wide. Negative values indicate the length has n ot been computed.
97 int m_textLength; 113 int m_textLength;
114 // A set of blocks that are similar to this block.
115 Supercluster* m_supercluster;
98 }; 116 };
99 117
100 enum TextLeafSearch { 118 enum TextLeafSearch {
101 First, 119 First,
102 Last 120 Last
103 }; 121 };
104 122
105 typedef HashSet<const RenderBlock*> BlockSet; 123 typedef HashMap<AtomicString, OwnPtr<Supercluster> > SuperclusterMap;
106 typedef HashMap<const RenderBlock*, OwnPtr<Cluster> > ClusterMap; 124 typedef Vector<OwnPtr<Cluster> > ClusterStack;
107 typedef Vector<Cluster*> ClusterStack;
108 125
109 // Fingerprints are computed during style recalc, for (some subset of) 126 // Fingerprints are computed during style recalc, for (some subset of)
110 // blocks that will become cluster roots. 127 // blocks that will become cluster roots.
111 class FingerprintMapper { 128 class FingerprintMapper {
112 public: 129 public:
113 void add(const RenderBlock*, AtomicString); 130 void add(const RenderBlock*, AtomicString);
114 void remove(const RenderBlock*); 131 void remove(const RenderBlock*);
115 AtomicString get(const RenderBlock*); 132 AtomicString get(const RenderBlock*);
116 BlockSet& getBlocks(AtomicString); 133 BlockSet& getBlocks(AtomicString);
117 private: 134 private:
118 typedef HashMap<const RenderBlock*, AtomicString> FingerprintMap; 135 typedef HashMap<const RenderBlock*, AtomicString> FingerprintMap;
119 typedef HashMap<AtomicString, OwnPtr<BlockSet> > ReverseFingerprintMap; 136 typedef HashMap<AtomicString, OwnPtr<BlockSet> > ReverseFingerprintMap;
120 137
121 FingerprintMap m_fingerprints; 138 FingerprintMap m_fingerprints;
122 ReverseFingerprintMap m_blocksForFingerprint; 139 ReverseFingerprintMap m_blocksForFingerprint;
123 }; 140 };
124 141
125 explicit FastTextAutosizer(const Document*); 142 explicit FastTextAutosizer(const Document*);
126 143
127 void inflate(RenderBlock*); 144 void inflate(RenderBlock*);
128 bool enabled(); 145 bool enabled();
129 void prepareRenderViewInfo(RenderView*); 146 void prepareRenderViewInfo(RenderView*);
130 bool isFingerprintingCandidate(const RenderBlock*); 147 bool isFingerprintingCandidate(const RenderBlock*);
131 bool clusterHasEnoughTextToAutosize(Cluster*); 148 bool clusterHasEnoughTextToAutosize(Cluster*);
132 float textLength(Cluster*); 149 float textLength(Cluster*);
133 AtomicString computeFingerprint(const RenderBlock*); 150 AtomicString computeFingerprint(const RenderBlock*);
134 Cluster* maybeGetOrCreateCluster(const RenderBlock*); 151 Cluster* maybeCreateCluster(const RenderBlock*);
135 Cluster* addSupercluster(AtomicString, const RenderBlock*); 152 Supercluster* getSupercluster(const RenderBlock*);
136 const RenderBlock* deepestCommonAncestor(BlockSet&); 153 const RenderBlock* deepestCommonAncestor(BlockSet&);
137 float clusterMultiplier(Cluster*); 154 float clusterMultiplier(Cluster*);
155 float superclusterMultiplier(Supercluster*);
156 float multiplierFromBlock(const RenderBlock*);
138 void applyMultiplier(RenderObject*, float); 157 void applyMultiplier(RenderObject*, float);
139 bool mightBeWiderOrNarrowerDescendant(const RenderBlock*); 158 bool mightBeWiderOrNarrowerDescendant(const RenderBlock*);
140 bool isWiderDescendant(Cluster*); 159 bool isWiderDescendant(Cluster*);
141 bool isNarrowerDescendant(Cluster*); 160 bool isNarrowerDescendant(Cluster*);
142 161
143 Cluster* currentCluster() const; 162 Cluster* currentCluster() const;
144 163
145 RenderObject* nextChildSkippingChildrenOfBlocks(const RenderObject*, const R enderObject*); 164 RenderObject* nextChildSkippingChildrenOfBlocks(const RenderObject*, const R enderObject*);
146 165
147 const RenderBlock* deepestBlockContainingAllText(Cluster*); 166 const RenderBlock* deepestBlockContainingAllText(Cluster*);
148 // Returns the first text leaf that is in the current cluster. We attempt to not include text 167 // Returns the first text leaf that is in the current cluster. We attempt to not include text
149 // from descendant clusters but because descendant clusters may not exist, t his is only an approximation. 168 // from descendant clusters but because descendant clusters may not exist, t his is only an approximation.
150 // The TraversalDirection controls whether we return the first or the last t ext leaf. 169 // The TraversalDirection controls whether we return the first or the last t ext leaf.
151 const RenderObject* findTextLeaf(const RenderObject*, size_t&, TextLeafSearc h); 170 const RenderObject* findTextLeaf(const RenderObject*, size_t&, TextLeafSearc h);
152 171
153 const Document* m_document; 172 const Document* m_document;
154 int m_frameWidth; // Frame width in density-independent pixels (DIPs). 173 int m_frameWidth; // Frame width in density-independent pixels (DIPs).
155 int m_layoutWidth; // Layout width in CSS pixels. 174 int m_layoutWidth; // Layout width in CSS pixels.
156 float m_baseMultiplier; // Includes accessibility font scale factor and devi ce scale adjustment. 175 float m_baseMultiplier; // Includes accessibility font scale factor and devi ce scale adjustment.
157 #ifndef NDEBUG 176 #ifndef NDEBUG
158 bool m_renderViewInfoPrepared; 177 bool m_renderViewInfoPrepared;
159 BlockSet m_blocksThatHaveBegunLayout; // Used to ensure we don't compute pro perties of a block before beginLayout() is called on it. 178 BlockSet m_blocksThatHaveBegunLayout; // Used to ensure we don't compute pro perties of a block before beginLayout() is called on it.
160 #endif 179 #endif
161 180
162 // Clusters are created and destroyed during layout. The map key is the 181 // Clusters are created and destroyed during layout. The map key is the
163 // cluster root. Clusters whose roots share the same fingerprint use the 182 // cluster root. Clusters whose roots share the same fingerprint use the
164 // same multiplier. 183 // same multiplier.
165 ClusterMap m_clusters; 184 SuperclusterMap m_superclusters;
166 ClusterStack m_clusterStack; 185 ClusterStack m_clusterStack;
167 FingerprintMapper m_fingerprintMapper; 186 FingerprintMapper m_fingerprintMapper;
168 }; 187 };
169 188
170 } // namespace WebCore 189 } // namespace WebCore
171 190
172 #endif // FastTextAutosizer_h 191 #endif // FastTextAutosizer_h
OLDNEW
« no previous file with comments | « no previous file | Source/core/rendering/FastTextAutosizer.cpp » ('j') | Source/core/rendering/FastTextAutosizer.cpp » ('J')

Powered by Google App Engine
This is Rietveld 408576698