
/*
 * Copyright 2011 Google Inc.
 *
 * Use of this source code is governed by a BSD-style license that can be
 * found in the LICENSE file.
 */
#include "SkParsePaint.h"
#include "SkTSearch.h"
#include "SkParse.h"
#include "SkImageDecoder.h"
#include "SkGradientShader.h"

static SkShader* inflate_shader(const SkDOM& dom, const SkDOM::Node* node)
{
	if ((node = dom.getFirstChild(node, "shader")) == NULL)
		return NULL;

	const char* str;

	if (dom.hasAttr(node, "type", "linear-gradient"))
	{
		SkColor		colors[2];
		SkPoint		pts[2];

		colors[0] = colors[1] = SK_ColorBLACK;	// need to initialized the alpha to opaque, since FindColor doesn't set it
		if ((str = dom.findAttr(node, "c0")) != NULL &&
			SkParse::FindColor(str, &colors[0]) &&
			(str = dom.findAttr(node, "c1")) != NULL &&
			SkParse::FindColor(str, &colors[1]) &&
			dom.findScalars(node, "p0", &pts[0].fX, 2) &&
			dom.findScalars(node, "p1", &pts[1].fX, 2))
		{
			SkShader::TileMode	mode = SkShader::kClamp_TileMode;
			int					index;

			if ((index = dom.findList(node, "tile-mode", "clamp,repeat,mirror")) >= 0)
				mode = (SkShader::TileMode)index;
			return SkGradientShader::CreateLinear(pts, colors, NULL, 2, mode);
		}
	}
	else if (dom.hasAttr(node, "type", "bitmap"))
	{
		if ((str = dom.findAttr(node, "src")) == NULL)
			return NULL;

		SkBitmap	bm;

		if (SkImageDecoder::DecodeFile(str, &bm))
		{
			SkShader::TileMode	mode = SkShader::kRepeat_TileMode;
			int					index;

			if ((index = dom.findList(node, "tile-mode", "clamp,repeat,mirror")) >= 0)
				mode = (SkShader::TileMode)index;

			return SkShader::CreateBitmapShader(bm, mode, mode);
		}
	}
	return NULL;
}

void SkPaint_Inflate(SkPaint* paint, const SkDOM& dom, const SkDOM::Node* node)
{
	SkASSERT(paint);
	SkASSERT(&dom);
	SkASSERT(node);

	SkScalar x;

	if (dom.findScalar(node, "stroke-width", &x))
		paint->setStrokeWidth(x);
	if (dom.findScalar(node, "text-size", &x))
		paint->setTextSize(x);
	
	bool	b;

	SkASSERT("legacy: use is-stroke" && !dom.findBool(node, "is-frame", &b));

	if (dom.findBool(node, "is-stroke", &b))
		paint->setStyle(b ? SkPaint::kStroke_Style : SkPaint::kFill_Style);
	if (dom.findBool(node, "is-antialias", &b))
		paint->setAntiAlias(b);
	if (dom.findBool(node, "is-lineartext", &b))
		paint->setLinearText(b);

	const char* str = dom.findAttr(node, "color");
	if (str)
	{
		SkColor	c = paint->getColor();
		if (SkParse::FindColor(str, &c))
			paint->setColor(c);
	}

	// do this AFTER parsing for the color
	if (dom.findScalar(node, "opacity", &x))
	{
		x = SkMaxScalar(0, SkMinScalar(x, SK_Scalar1));
		paint->setAlpha(SkScalarRound(x * 255));
	}

	int	index = dom.findList(node, "text-anchor", "left,center,right");
	if (index >= 0)
		paint->setTextAlign((SkPaint::Align)index);

	SkShader* shader = inflate_shader(dom, node);
	if (shader)
		paint->setShader(shader)->unref();
}

