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

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

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