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

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

Issue 2661323002: Implement CSSPaintValue and add a layout test. (Closed)
Patch Set: add flag Created 3 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 // 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 (m_inputArgumentsInValid)
53 return nullptr;
54
55 if (!m_parsedInputArguments) {
56 // Parse arguments.
ikilpatrick 2017/02/27 17:25:02 Could you extract this into a private function, an
renjieliu1 2017/02/27 23:20:43 thanks for the suggestion
57 if (RuntimeEnabledFeatures::cssPaintAPIArgumentsEnabled()) {
58 if (!m_generator->isImageGeneratorReady()) {
59 return nullptr;
60 }
61 const Vector<CSSSyntaxDescriptor>& inputArgumentTypes =
62 m_generator->inputArgumentTypes();
63 if (m_argumentVariableData.size() != inputArgumentTypes.size()) {
64 m_inputArgumentsInValid = true;
65 return nullptr;
66 }
67
68 m_parsedInputArguments = new CSSStyleValueVector();
69
70 for (size_t i = 0; i < m_argumentVariableData.size(); ++i) {
71 const CSSValue* parsedValue =
72 m_argumentVariableData[i]->parseForSyntax(inputArgumentTypes[i]);
73 if (!parsedValue) {
74 m_inputArgumentsInValid = true;
75 m_parsedInputArguments = nullptr;
76 return nullptr;
77 }
78 m_parsedInputArguments->appendVector(
79 StyleValueFactory::cssValueToStyleValueVector(*parsedValue));
80 }
81 }
82 }
83
84 return m_generator->paint(layoutObject, size, zoom, m_parsedInputArguments);
51 } 85 }
52 86
53 void CSSPaintValue::Observer::paintImageGeneratorReady() { 87 void CSSPaintValue::Observer::paintImageGeneratorReady() {
54 m_ownerValue->paintImageGeneratorReady(); 88 m_ownerValue->paintImageGeneratorReady();
55 } 89 }
56 90
57 void CSSPaintValue::paintImageGeneratorReady() { 91 void CSSPaintValue::paintImageGeneratorReady() {
58 for (const LayoutObject* client : clients().keys()) { 92 for (const LayoutObject* client : clients().keys()) {
59 const_cast<LayoutObject*>(client)->imageChanged( 93 const_cast<LayoutObject*>(client)->imageChanged(
60 static_cast<WrappedImagePtr>(this)); 94 static_cast<WrappedImagePtr>(this));
61 } 95 }
62 } 96 }
63 97
64 bool CSSPaintValue::knownToBeOpaque(const LayoutObject& layoutObject) const { 98 bool CSSPaintValue::knownToBeOpaque(const LayoutObject& layoutObject) const {
65 return m_generator && !m_generator->hasAlpha(); 99 return m_generator && !m_generator->hasAlpha();
66 } 100 }
67 101
68 bool CSSPaintValue::equals(const CSSPaintValue& other) const { 102 bool CSSPaintValue::equals(const CSSPaintValue& other) const {
69 return name() == other.name() && customCSSText() == other.customCSSText(); 103 return name() == other.name() && customCSSText() == other.customCSSText();
70 } 104 }
71 105
72 DEFINE_TRACE_AFTER_DISPATCH(CSSPaintValue) { 106 DEFINE_TRACE_AFTER_DISPATCH(CSSPaintValue) {
73 visitor->trace(m_name); 107 visitor->trace(m_name);
74 visitor->trace(m_generator); 108 visitor->trace(m_generator);
75 visitor->trace(m_paintImageGeneratorObserver); 109 visitor->trace(m_paintImageGeneratorObserver);
110 visitor->trace(m_parsedInputArguments);
76 CSSImageGeneratorValue::traceAfterDispatch(visitor); 111 CSSImageGeneratorValue::traceAfterDispatch(visitor);
77 } 112 }
78 113
79 } // namespace blink 114 } // namespace blink
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698