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

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, 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_parsedInputArguments) {
ikilpatrick 2017/02/21 17:40:36 This is unfortunately racy. You'll need to check i
renjieliu1 2017/02/22 04:47:54 thank you for the suggestion! I will keep the code
53 m_parsedInputArguments = new CSSStyleValueVector();
54
55 // Parse arguments.
56 if (RuntimeEnabledFeatures::cssPaintAPIArgumentsEnabled()) {
57 const Vector<CSSSyntaxDescriptor>& inputArgumentTypes =
58 m_generator->inputArgumentTypes();
59 if (m_argumentVariableData.size() != inputArgumentTypes.size()) {
60 m_parsedInputArguments = nullptr;
61 return nullptr;
62 }
63 for (size_t i = 0; i < m_argumentVariableData.size(); ++i) {
64 const CSSValue* parsedValue =
65 m_argumentVariableData[i]->parseForSyntax(inputArgumentTypes[i]);
66 if (!parsedValue) {
67 m_parsedInputArguments = nullptr;
68 return nullptr;
69 }
70 m_parsedInputArguments->appendVector(
71 StyleValueFactory::cssValueToStyleValueVector(*parsedValue));
72 }
73 }
74 }
75
76 return m_generator->paint(layoutObject, size, zoom, m_parsedInputArguments);
51 } 77 }
52 78
53 void CSSPaintValue::Observer::paintImageGeneratorReady() { 79 void CSSPaintValue::Observer::paintImageGeneratorReady() {
54 m_ownerValue->paintImageGeneratorReady(); 80 m_ownerValue->paintImageGeneratorReady();
55 } 81 }
56 82
57 void CSSPaintValue::paintImageGeneratorReady() { 83 void CSSPaintValue::paintImageGeneratorReady() {
58 for (const LayoutObject* client : clients().keys()) { 84 for (const LayoutObject* client : clients().keys()) {
59 const_cast<LayoutObject*>(client)->imageChanged( 85 const_cast<LayoutObject*>(client)->imageChanged(
60 static_cast<WrappedImagePtr>(this)); 86 static_cast<WrappedImagePtr>(this));
61 } 87 }
62 } 88 }
63 89
64 bool CSSPaintValue::knownToBeOpaque(const LayoutObject& layoutObject) const { 90 bool CSSPaintValue::knownToBeOpaque(const LayoutObject& layoutObject) const {
65 return m_generator && !m_generator->hasAlpha(); 91 return m_generator && !m_generator->hasAlpha();
66 } 92 }
67 93
68 bool CSSPaintValue::equals(const CSSPaintValue& other) const { 94 bool CSSPaintValue::equals(const CSSPaintValue& other) const {
69 return name() == other.name() && customCSSText() == other.customCSSText(); 95 return name() == other.name() && customCSSText() == other.customCSSText();
70 } 96 }
71 97
72 DEFINE_TRACE_AFTER_DISPATCH(CSSPaintValue) { 98 DEFINE_TRACE_AFTER_DISPATCH(CSSPaintValue) {
73 visitor->trace(m_name); 99 visitor->trace(m_name);
74 visitor->trace(m_generator); 100 visitor->trace(m_generator);
75 visitor->trace(m_paintImageGeneratorObserver); 101 visitor->trace(m_paintImageGeneratorObserver);
102 visitor->trace(m_parsedInputArguments);
76 CSSImageGeneratorValue::traceAfterDispatch(visitor); 103 CSSImageGeneratorValue::traceAfterDispatch(visitor);
77 } 104 }
78 105
79 } // namespace blink 106 } // namespace blink
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698