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

Side by Side Diff: third_party/WebKit/Source/core/css/CSSPaintValue.cpp

Issue 2661323002: Implement CSSPaintValue and add a layout test. (Closed)
Patch Set: refactor Created 3 years, 9 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 // Copyright 2016 The Chromium Authors. All rights reserved. 1 // Copyright 2016 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 "core/css/CSSPaintValue.h" 5 #include "core/css/CSSPaintValue.h"
6 6
7 #include "core/css/CSSCustomIdentValue.h" 7 #include "core/css/CSSCustomIdentValue.h"
8 #include "core/css/CSSSyntaxDescriptor.h"
9 #include "core/css/cssom/StyleValueFactory.h"
8 #include "core/layout/LayoutObject.h" 10 #include "core/layout/LayoutObject.h"
9 #include "platform/graphics/Image.h" 11 #include "platform/graphics/Image.h"
10 #include "wtf/text/StringBuilder.h" 12 #include "wtf/text/StringBuilder.h"
11 13
12 namespace blink { 14 namespace blink {
13 15
14 CSSPaintValue::CSSPaintValue(CSSCustomIdentValue* name) 16 CSSPaintValue::CSSPaintValue(CSSCustomIdentValue* name)
15 : CSSImageGeneratorValue(PaintClass), 17 : CSSImageGeneratorValue(PaintClass),
16 m_name(name), 18 m_name(name),
17 m_paintImageGeneratorObserver(new Observer(this)) {} 19 m_paintImageGeneratorObserver(new Observer(this)) {}
(...skipping 22 matching lines...) Expand all
40 return m_name->value(); 42 return m_name->value();
41 } 43 }
42 44
43 PassRefPtr<Image> CSSPaintValue::image(const LayoutObject& layoutObject, 45 PassRefPtr<Image> CSSPaintValue::image(const LayoutObject& layoutObject,
44 const IntSize& size, 46 const IntSize& size,
45 float zoom) { 47 float zoom) {
46 if (!m_generator) 48 if (!m_generator)
47 m_generator = CSSPaintImageGenerator::create( 49 m_generator = CSSPaintImageGenerator::create(
48 name(), layoutObject.document(), m_paintImageGeneratorObserver); 50 name(), layoutObject.document(), m_paintImageGeneratorObserver);
49 51
50 return m_generator->paint(layoutObject, size, zoom); 52 if (!parseInputArguments())
53 return nullptr;
54
55 return m_generator->paint(layoutObject, size, zoom, m_parsedInputArguments);
56 }
57
58 bool CSSPaintValue::parseInputArguments() {
59 if (m_inputArgumentsInvalid)
60 return false;
61
62 if (!m_parsedInputArguments) {
ikilpatrick 2017/02/27 23:24:29 oh could you de-nest this? e.g. if (m_parsedInput
renjieliu1 2017/02/28 00:06:09 Done.
63 // Parse arguments.
64 if (RuntimeEnabledFeatures::cssPaintAPIArgumentsEnabled()) {
65 if (!m_generator->isImageGeneratorReady()) {
66 return false;
67 }
68 const Vector<CSSSyntaxDescriptor>& inputArgumentTypes =
69 m_generator->inputArgumentTypes();
70 if (m_argumentVariableData.size() != inputArgumentTypes.size()) {
71 m_inputArgumentsInvalid = true;
72 return false;
73 }
74
75 m_parsedInputArguments = new CSSStyleValueVector();
76
77 for (size_t i = 0; i < m_argumentVariableData.size(); ++i) {
78 const CSSValue* parsedValue =
79 m_argumentVariableData[i]->parseForSyntax(inputArgumentTypes[i]);
80 if (!parsedValue) {
81 m_inputArgumentsInvalid = true;
82 m_parsedInputArguments = nullptr;
83 return false;
84 }
85 m_parsedInputArguments->appendVector(
86 StyleValueFactory::cssValueToStyleValueVector(*parsedValue));
87 }
88 }
89 }
90 return true;
51 } 91 }
52 92
53 void CSSPaintValue::Observer::paintImageGeneratorReady() { 93 void CSSPaintValue::Observer::paintImageGeneratorReady() {
54 m_ownerValue->paintImageGeneratorReady(); 94 m_ownerValue->paintImageGeneratorReady();
55 } 95 }
56 96
57 void CSSPaintValue::paintImageGeneratorReady() { 97 void CSSPaintValue::paintImageGeneratorReady() {
58 for (const LayoutObject* client : clients().keys()) { 98 for (const LayoutObject* client : clients().keys()) {
59 const_cast<LayoutObject*>(client)->imageChanged( 99 const_cast<LayoutObject*>(client)->imageChanged(
60 static_cast<WrappedImagePtr>(this)); 100 static_cast<WrappedImagePtr>(this));
61 } 101 }
62 } 102 }
63 103
64 bool CSSPaintValue::knownToBeOpaque(const LayoutObject& layoutObject) const { 104 bool CSSPaintValue::knownToBeOpaque(const LayoutObject& layoutObject) const {
65 return m_generator && !m_generator->hasAlpha(); 105 return m_generator && !m_generator->hasAlpha();
66 } 106 }
67 107
68 bool CSSPaintValue::equals(const CSSPaintValue& other) const { 108 bool CSSPaintValue::equals(const CSSPaintValue& other) const {
69 return name() == other.name() && customCSSText() == other.customCSSText(); 109 return name() == other.name() && customCSSText() == other.customCSSText();
70 } 110 }
71 111
72 DEFINE_TRACE_AFTER_DISPATCH(CSSPaintValue) { 112 DEFINE_TRACE_AFTER_DISPATCH(CSSPaintValue) {
73 visitor->trace(m_name); 113 visitor->trace(m_name);
74 visitor->trace(m_generator); 114 visitor->trace(m_generator);
75 visitor->trace(m_paintImageGeneratorObserver); 115 visitor->trace(m_paintImageGeneratorObserver);
116 visitor->trace(m_parsedInputArguments);
76 CSSImageGeneratorValue::traceAfterDispatch(visitor); 117 CSSImageGeneratorValue::traceAfterDispatch(visitor);
77 } 118 }
78 119
79 } // namespace blink 120 } // namespace blink
OLDNEW
« no previous file with comments | « third_party/WebKit/Source/core/css/CSSPaintValue.h ('k') | third_party/WebKit/Source/core/css/CSSVariableData.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698