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

Side by Side Diff: Source/platform/graphics/paint/DisplayItemPropertyTreeBuilder.cpp

Issue 1346733004: Include transform origin in the transform tree. (Closed) Base URL: svn://svn.chromium.org/blink/trunk
Patch Set: Created 5 years, 3 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 | Annotate | Revision Log
OLDNEW
1 // Copyright 2015 The Chromium Authors. All rights reserved. 1 // Copyright 2015 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "config.h" 5 #include "config.h"
6 #include "platform/graphics/paint/DisplayItemPropertyTreeBuilder.h" 6 #include "platform/graphics/paint/DisplayItemPropertyTreeBuilder.h"
7 7
8 #include "platform/graphics/paint/DisplayItem.h" 8 #include "platform/graphics/paint/DisplayItem.h"
9 #include "platform/graphics/paint/DisplayItemClipTree.h" 9 #include "platform/graphics/paint/DisplayItemClipTree.h"
10 #include "platform/graphics/paint/DisplayItemTransformTree.h" 10 #include "platform/graphics/paint/DisplayItemTransformTree.h"
(...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after
58 processEndItem(displayItem); 58 processEndItem(displayItem);
59 m_currentIndex++; 59 m_currentIndex++;
60 } 60 }
61 61
62 namespace { 62 namespace {
63 63
64 enum TransformKind { NotATransform = 0, Only2DTranslation, RequiresTransformNode }; 64 enum TransformKind { NotATransform = 0, Only2DTranslation, RequiresTransformNode };
65 enum ClipKind { NotAClip = 0, RequiresClipNode }; 65 enum ClipKind { NotAClip = 0, RequiresClipNode };
66 66
67 struct BeginDisplayItemClassification { 67 struct BeginDisplayItemClassification {
68 // |transformOrigin| is irrelevant unless a non-translation matrix is
69 // provided.
68 TransformKind transformKind = NotATransform; 70 TransformKind transformKind = NotATransform;
69 TransformationMatrix matrix; 71 TransformationMatrix matrix;
72 FloatPoint3D transformOrigin;
73
70 ClipKind clipKind = NotAClip; 74 ClipKind clipKind = NotAClip;
71 FloatRect clipRect; 75 FloatRect clipRect;
72 }; 76 };
73 77
74 // Classifies a begin display item based on how it affects the property trees. 78 // Classifies a begin display item based on how it affects the property trees.
75 static BeginDisplayItemClassification classifyBeginItem(const DisplayItem& begin DisplayItem) 79 static BeginDisplayItemClassification classifyBeginItem(const DisplayItem& begin DisplayItem)
76 { 80 {
77 ASSERT(beginDisplayItem.isBegin()); 81 ASSERT(beginDisplayItem.isBegin());
78 82
79 BeginDisplayItemClassification result; 83 BeginDisplayItemClassification result;
80 DisplayItem::Type type = beginDisplayItem.type(); 84 DisplayItem::Type type = beginDisplayItem.type();
81 if (DisplayItem::isTransform3DType(type)) { 85 if (DisplayItem::isTransform3DType(type)) {
82 const auto& begin3D = static_cast<const BeginTransform3DDisplayItem&>(be ginDisplayItem); 86 const auto& begin3D = static_cast<const BeginTransform3DDisplayItem&>(be ginDisplayItem);
83 result.matrix = begin3D.transform(); 87 result.matrix = begin3D.transform();
88 result.transformOrigin = begin3D.transformOrigin();
84 result.transformKind = result.matrix.isIdentityOr2DTranslation() ? Only2 DTranslation : RequiresTransformNode; 89 result.transformKind = result.matrix.isIdentityOr2DTranslation() ? Only2 DTranslation : RequiresTransformNode;
85 } else if (type == DisplayItem::BeginTransform) { 90 } else if (type == DisplayItem::BeginTransform) {
86 const auto& begin2D = static_cast<const BeginTransformDisplayItem&>(begi nDisplayItem); 91 const auto& begin2D = static_cast<const BeginTransformDisplayItem&>(begi nDisplayItem);
87 result.matrix = begin2D.transform(); 92 result.matrix = begin2D.transform();
88 result.transformKind = begin2D.transform().isIdentityOrTranslation() ? O nly2DTranslation : RequiresTransformNode; 93 result.transformKind = begin2D.transform().isIdentityOrTranslation() ? O nly2DTranslation : RequiresTransformNode;
89 } else if (DisplayItem::isScrollType(type)) { 94 } else if (DisplayItem::isScrollType(type)) {
90 const auto& beginScroll = static_cast<const BeginScrollDisplayItem&>(beg inDisplayItem); 95 const auto& beginScroll = static_cast<const BeginScrollDisplayItem&>(beg inDisplayItem);
91 const IntSize& offset = beginScroll.currentOffset(); 96 const IntSize& offset = beginScroll.currentOffset();
92 result.matrix.translate(-offset.width(), -offset.height()); 97 result.matrix.translate(-offset.width(), -offset.height());
93 result.transformKind = Only2DTranslation; 98 result.transformKind = Only2DTranslation;
(...skipping 19 matching lines...) Expand all
113 switch (classification.transformKind) { 118 switch (classification.transformKind) {
114 case NotATransform: 119 case NotATransform:
115 break; 120 break;
116 case Only2DTranslation: 121 case Only2DTranslation:
117 // Adjust the offset associated with the current transform node. 122 // Adjust the offset associated with the current transform node.
118 newState.offset += classification.matrix.to2DTranslation(); 123 newState.offset += classification.matrix.to2DTranslation();
119 break; 124 break;
120 case RequiresTransformNode: 125 case RequiresTransformNode:
121 // Emit a transform node. 126 // Emit a transform node.
122 newState.transformNode = m_transformTree->createNewNode( 127 newState.transformNode = m_transformTree->createNewNode(
123 newState.transformNode, classification.matrix); 128 newState.transformNode, classification.matrix, classification.transf ormOrigin);
124 newState.offset = FloatSize(); 129 newState.offset = FloatSize();
125 break; 130 break;
126 } 131 }
127 132
128 switch (classification.clipKind) { 133 switch (classification.clipKind) {
129 case NotAClip: 134 case NotAClip:
130 break; 135 break;
131 case RequiresClipNode: 136 case RequiresClipNode:
132 // Emit a clip node. 137 // Emit a clip node.
133 FloatRect adjustedClipRect = classification.clipRect; 138 FloatRect adjustedClipRect = classification.clipRect;
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after
166 rangeRecord.clipNodeIndex = current.clipNode; 171 rangeRecord.clipNodeIndex = current.clipNode;
167 m_rangeRecords.append(rangeRecord); 172 m_rangeRecords.append(rangeRecord);
168 } 173 }
169 174
170 // The current display item is a boundary. 175 // The current display item is a boundary.
171 // The earliest the next range could begin is the next one. 176 // The earliest the next range could begin is the next one.
172 m_rangeBeginIndex = m_currentIndex + 1; 177 m_rangeBeginIndex = m_currentIndex + 1;
173 } 178 }
174 179
175 } // namespace blink 180 } // namespace blink
OLDNEW
« no previous file with comments | « Source/platform/geometry/FloatPoint3D.h ('k') | Source/platform/graphics/paint/DisplayItemPropertyTreeBuilderTest.cpp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698