1#include "SkParsePaint.h"
2#include "SkTSearch.h"
3#include "SkParse.h"
4#include "SkImageDecoder.h"
5#include "SkGradientShader.h"
6
7static SkShader* inflate_shader(const SkDOM& dom, const SkDOM::Node* node)
8{
9	if ((node = dom.getFirstChild(node, "shader")) == NULL)
10		return NULL;
11
12	const char* str;
13
14	if (dom.hasAttr(node, "type", "linear-gradient"))
15	{
16		SkColor		colors[2];
17		SkPoint		pts[2];
18
19		colors[0] = colors[1] = SK_ColorBLACK;	// need to initialized the alpha to opaque, since FindColor doesn't set it
20		if ((str = dom.findAttr(node, "c0")) != NULL &&
21			SkParse::FindColor(str, &colors[0]) &&
22			(str = dom.findAttr(node, "c1")) != NULL &&
23			SkParse::FindColor(str, &colors[1]) &&
24			dom.findScalars(node, "p0", &pts[0].fX, 2) &&
25			dom.findScalars(node, "p1", &pts[1].fX, 2))
26		{
27			SkShader::TileMode	mode = SkShader::kClamp_TileMode;
28			int					index;
29
30			if ((index = dom.findList(node, "tile-mode", "clamp,repeat,mirror")) >= 0)
31				mode = (SkShader::TileMode)index;
32			return SkGradientShader::CreateLinear(pts, colors, NULL, 2, mode);
33		}
34	}
35	else if (dom.hasAttr(node, "type", "bitmap"))
36	{
37		if ((str = dom.findAttr(node, "src")) == NULL)
38			return NULL;
39
40		SkBitmap	bm;
41
42		if (SkImageDecoder::DecodeFile(str, &bm))
43		{
44			SkShader::TileMode	mode = SkShader::kRepeat_TileMode;
45			int					index;
46
47			if ((index = dom.findList(node, "tile-mode", "clamp,repeat,mirror")) >= 0)
48				mode = (SkShader::TileMode)index;
49
50			return SkShader::CreateBitmapShader(bm, mode, mode);
51		}
52	}
53	return NULL;
54}
55
56void SkPaint_Inflate(SkPaint* paint, const SkDOM& dom, const SkDOM::Node* node)
57{
58	SkASSERT(paint);
59	SkASSERT(&dom);
60	SkASSERT(node);
61
62	SkScalar x;
63
64	if (dom.findScalar(node, "stroke-width", &x))
65		paint->setStrokeWidth(x);
66	if (dom.findScalar(node, "text-size", &x))
67		paint->setTextSize(x);
68
69	bool	b;
70
71	SkASSERT("legacy: use is-stroke" && !dom.findBool(node, "is-frame", &b));
72
73	if (dom.findBool(node, "is-stroke", &b))
74		paint->setStyle(b ? SkPaint::kStroke_Style : SkPaint::kFill_Style);
75	if (dom.findBool(node, "is-antialias", &b))
76		paint->setAntiAlias(b);
77	if (dom.findBool(node, "is-lineartext", &b))
78		paint->setLinearText(b);
79
80	const char* str = dom.findAttr(node, "color");
81	if (str)
82	{
83		SkColor	c = paint->getColor();
84		if (SkParse::FindColor(str, &c))
85			paint->setColor(c);
86	}
87
88	// do this AFTER parsing for the color
89	if (dom.findScalar(node, "opacity", &x))
90	{
91		x = SkMaxScalar(0, SkMinScalar(x, SK_Scalar1));
92		paint->setAlpha(SkScalarRound(x * 255));
93	}
94
95	int	index = dom.findList(node, "text-anchor", "left,center,right");
96	if (index >= 0)
97		paint->setTextAlign((SkPaint::Align)index);
98
99	SkShader* shader = inflate_shader(dom, node);
100	if (shader)
101		paint->setShader(shader)->unref();
102}
103
104