[Webkit-unassigned] [Bug 39168] http://philip.html5.org/tests/canvas/suite/tests/2d.fillStyle.parse.system.html fails
bugzilla-daemon at webkit.org
bugzilla-daemon at webkit.org
Sun Aug 29 13:31:25 PDT 2010
https://bugs.webkit.org/show_bug.cgi?id=39168
Darin Adler <darin at apple.com> changed:
What |Removed |Added
----------------------------------------------------------------------------
Attachment #64752|review?, commit-queue? |review-, commit-queue-
Flag| |
--- Comment #12 from Darin Adler <darin at apple.com> 2010-08-29 13:31:24 PST ---
(From update of attachment 64752)
Nice work. Getting closer.
> if (value->cssValueType() == CSSValue::CSS_PRIMITIVE_VALUE) {
> CSSPrimitiveValue* primitiveValue = static_cast<CSSPrimitiveValue*>(value);
> - color = primitiveValue->getRGBA32Value();
> + if (primitiveValue->primitiveType() == CSSPrimitiveValue::CSS_RGBCOLOR) {
> + color = primitiveValue->getRGBA32Value();
> + return true;
> + }
> + return false;
> }
>
> return true;
It seems strange that if the value type is not a primitive the function returns true, but if it's a primitive that is not an RGB color it returns false. Is that correct? Are both code paths covered by a test case?
Our normal style is to use early return, rather than nested ifs.
> +bool CSSParser::parseSystemColor(RGBA32& color, const String& string, PassRefPtr<RenderTheme> theme)
The theme argument should be a raw pointer, not a PassRefPtr, because this function uses the theme, but does not take ownership of it.
> + RefPtr<RenderTheme> renderTheme(theme);
And there's no need for this local variable.
> + int id = cssValueKeywordID(cssColor);
> + if (id > 0) {
> + color = renderTheme->systemColor(id).rgb();
> + return true;
> + }
> + return false;
We'd normally do early return here, rather than nesting the success case inside an if statement.
> + static bool parseSystemColor(RGBA32& color, const String&, PassRefPtr<RenderTheme> theme);
There's no need for the argument names "color and "theme" here. The types make them clear without names.
> + Document* document = canvas()->document();
> + Page* page = document ? document->page() : 0;
> + RefPtr<RenderTheme> theme = RenderTheme::themeForPage(page);
> + setStrokeStyle(CanvasStyle::createFromString(color, theme.release()));
Creating a new RenderTheme here every time this function is called is a massive performance mistake that will make our canvas a lot slower. What we need to do is call page->theme() instead.
> +PassRefPtr<CanvasStyle> CanvasStyle::createFromString(const String& color, PassRefPtr<RenderTheme> theme)
This argument should be a raw pointer, not a PassRefPtr. This function does not take ownership of a theme.
For best performance, the functions should not go from the Document* to the theme. Instead, we should pass a Document* in rather than a RenderTheme*. The code to go from the document to the page and then to the theme should be inside the CSSParser::parseSystemColor function.
> - int RGBValue;
> + unsigned int ARGBValue;
We use just "unsigned", not "unsigned int". Another possibility would be "uint32_t".
--
Configure bugmail: https://bugs.webkit.org/userprefs.cgi?tab=email
------- You are receiving this mail because: -------
You are the assignee for the bug.
More information about the webkit-unassigned
mailing list