OLD | NEW |
| (Empty) |
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 | |
3 // found in the LICENSE file. | |
4 | |
5 #include "config.h" | |
6 #include "platform/graphics/paint/DisplayItemTransformTreeBuilder.h" | |
7 | |
8 #include "platform/graphics/paint/DisplayItem.h" | |
9 #include "platform/graphics/paint/DisplayItemTransformTree.h" | |
10 #include "platform/graphics/paint/Transform3DDisplayItem.h" | |
11 | |
12 namespace blink { | |
13 | |
14 DisplayItemTransformTreeBuilder::DisplayItemTransformTreeBuilder() | |
15 : m_transformTree(adoptPtr(new DisplayItemTransformTree)) | |
16 , m_rangeBeginIndex(0) | |
17 , m_currentIndex(0) | |
18 { | |
19 pushCurrentTransformNode(0 /* root node */, FloatSize()); | |
20 } | |
21 | |
22 DisplayItemTransformTreeBuilder::~DisplayItemTransformTreeBuilder() | |
23 { | |
24 } | |
25 | |
26 PassOwnPtr<DisplayItemTransformTree> DisplayItemTransformTreeBuilder::releaseTra
nsformTree() | |
27 { | |
28 ASSERT(m_currentTransformNodeStack.size() == 1); | |
29 ASSERT(currentTransformNodeData().ignoredBeginCount == 0); | |
30 | |
31 finishRange(); | |
32 return m_transformTree.release(); | |
33 } | |
34 | |
35 namespace { | |
36 | |
37 enum BeginDisplayItemClassification { NotATransform = 0, Only2DTranslation, Requ
iresTransformNode }; | |
38 | |
39 // Classifies a display item based on whether it is a transform, and if so, | |
40 // whether it should be get a transform node. | |
41 // If it is a transform (including a translation), the TransformationMatrix | |
42 // will be copied to output parameter. | |
43 static BeginDisplayItemClassification classifyBeginItem(const DisplayItem& begin
DisplayItem, TransformationMatrix* transform) | |
44 { | |
45 ASSERT(beginDisplayItem.isBegin()); | |
46 | |
47 if (DisplayItem::isTransform3DType(beginDisplayItem.type())) { | |
48 const auto& begin3D = static_cast<const BeginTransform3DDisplayItem&>(be
ginDisplayItem); | |
49 *transform = begin3D.transform(); | |
50 if (transform->isIdentityOr2DTranslation()) | |
51 return Only2DTranslation; | |
52 return RequiresTransformNode; | |
53 } | |
54 return NotATransform; | |
55 } | |
56 | |
57 } // namespace | |
58 | |
59 void DisplayItemTransformTreeBuilder::processDisplayItem(const DisplayItem& disp
layItem) | |
60 { | |
61 if (displayItem.isBegin()) { | |
62 TransformationMatrix matrix; | |
63 switch (classifyBeginItem(displayItem, &matrix)) { | |
64 case NotATransform: | |
65 // Remember to ignore this begin later on. | |
66 currentTransformNodeData().ignoredBeginCount++; | |
67 break; | |
68 case Only2DTranslation: | |
69 // Adjust the offset associated with the current transform node. | |
70 finishRange(); | |
71 pushCurrentTransformNode( | |
72 currentTransformNodeData().transformNode, | |
73 currentTransformNodeData().offset + matrix.to2DTranslation()); | |
74 break; | |
75 case RequiresTransformNode: | |
76 // Emit a transform node. | |
77 finishRange(); | |
78 size_t newNode = m_transformTree->createNewNode( | |
79 currentTransformNodeData().transformNode, | |
80 matrix); | |
81 pushCurrentTransformNode(newNode, FloatSize()); | |
82 break; | |
83 } | |
84 } else if (displayItem.isEnd()) { | |
85 if (currentTransformNodeData().ignoredBeginCount) { | |
86 // Ignored this end display item. | |
87 currentTransformNodeData().ignoredBeginCount--; | |
88 } else { | |
89 // We've closed the scope of a transform. | |
90 finishRange(); | |
91 popCurrentTransformNode(); | |
92 ASSERT(!m_currentTransformNodeStack.isEmpty()); | |
93 } | |
94 } | |
95 m_currentIndex++; | |
96 } | |
97 | |
98 void DisplayItemTransformTreeBuilder::finishRange() | |
99 { | |
100 // Don't emit an empty range record. | |
101 if (m_rangeBeginIndex != m_currentIndex) { | |
102 const auto& current = currentTransformNodeData(); | |
103 m_transformTree->appendRangeRecord(m_rangeBeginIndex, m_currentIndex, cu
rrent.transformNode, current.offset); | |
104 } | |
105 | |
106 // The current display item is a boundary. | |
107 // The earliest the next range could begin is the next one. | |
108 m_rangeBeginIndex = m_currentIndex + 1; | |
109 } | |
110 | |
111 } // namespace blink | |
OLD | NEW |