/*! \file layer_composite.cpp
** \brief Template File
**
-** $Id: layer_composite.cpp,v 1.2 2005/01/24 03:08:18 darco Exp $
+** $Id$
**
** \legal
** Copyright (c) 2002-2005 Robert B. Quattlebaum Jr., Adrian Bentley
Layer_Composite::accelerated_render(Context context,Surface *surface,int quality, const RendDesc &renddesc_, ProgressCallback *cb) const
{
RendDesc renddesc(renddesc_);
-
+
if(!amount_)
return context.accelerated_render(surface,quality,renddesc,cb);
Layer_Bitmap::Handle surfacelayer(new class Layer_Bitmap());
Context iter;
-
+
for(iter=context;*iter;iter++)
image.push_back(*iter);
// Set up a surface target
Target::Handle target(surface_target(surface));
-
+
if(!target)
{
if(cb)cb->error(_("Unable to create surface target"));
return false;
}
-
+
RendDesc desc(renddesc);
-
+
target->set_rend_desc(&desc);
// Render the scene
bool
Layer_Composite::set_param(const String & param, const ValueBase &value)
{
- if(param=="amount" && value.same_as(amount_))
+ if(param=="amount" && value.same_type_as(amount_))
amount_=value.get(amount_);
else
- if(param=="blend_method" && value.same_as(int()))
- blend_method_=static_cast<Color::BlendMethod>(value.get(int()));
+ if(param=="blend_method" && value.same_type_as(int()))
+ {
+ blend_method_ = static_cast<Color::BlendMethod>(value.get(int()));
+
+ if (blend_method_ < 0 || blend_method_ >= Color::BLEND_END)
+ {
+ warning("illegal value (%d) for blend_method - using Composite instead", blend_method_);
+ blend_method_ = Color::BLEND_COMPOSITE;
+ return false;
+ }
+
+ if (blend_method_ == Color::BLEND_STRAIGHT && !reads_context())
+ {
+ Canvas::Handle canvas(get_canvas());
+ if (canvas)
+ {
+ String version(canvas->get_version());
+
+ if (version == "0.1" || version == "0.2")
+ {
+ if (get_name() == "PasteCanvas")
+ warning("loaded a version %s canvas with a 'Straight' blended PasteCanvas (%s) - check it renders OK",
+ version.c_str(), get_non_empty_description().c_str());
+ else
+ {
+ blend_method_ = Color::BLEND_COMPOSITE;
+ converted_blend_ = true;
+
+ // if this layer has a transparent color, go back and set the color again
+ // now that we know we are converting the blend method as well. that will
+ // make the color non-transparent, and change the blend method to alpha over
+ if (transparent_color_)
+ set_param("color", get_param("color"));
+ }
+ }
+ }
+ }
+ }
else
return Layer::set_param(param,value);
return true;