#include "config.h"
#include "GraphicsTypes.h"
#include <wtf/Assertions.h>
#include <wtf/text/TextStream.h>
#include <wtf/text/WTFString.h>
namespace WebCore {
static const char* const compositeOperatorNames[] = {
"clear",
"copy",
"source-over",
"source-in",
"source-out",
"source-atop",
"destination-over",
"destination-in",
"destination-out",
"destination-atop",
"xor",
"darker",
"lighter",
"difference"
};
static const char* const blendOperatorNames[] = {
"normal",
"multiply",
"screen",
"darken",
"lighten",
"overlay",
"color-dodge",
"color-burn",
"hard-light",
"soft-light",
"difference",
"exclusion",
"hue",
"saturation",
"color",
"luminosity",
"plus-darker",
"plus-lighter"
};
const int numCompositeOperatorNames = WTF_ARRAY_LENGTH(compositeOperatorNames);
const int numBlendOperatorNames = WTF_ARRAY_LENGTH(blendOperatorNames);
bool parseBlendMode(const String& s, BlendMode& blendMode)
{
for (int i = 0; i < numBlendOperatorNames; i++) {
if (s == blendOperatorNames[i]) {
blendMode = static_cast<BlendMode>(i + BlendModeNormal);
return true;
}
}
return false;
}
bool parseCompositeAndBlendOperator(const String& s, CompositeOperator& op, BlendMode& blendOp)
{
for (int i = 0; i < numCompositeOperatorNames; i++) {
if (s == compositeOperatorNames[i]) {
op = static_cast<CompositeOperator>(i);
blendOp = BlendModeNormal;
return true;
}
}
if (parseBlendMode(s, blendOp)) {
op = CompositeSourceOver;
return true;
}
return false;
}
String compositeOperatorName(CompositeOperator op, BlendMode blendOp)
{
ASSERT(op >= 0);
ASSERT(op < numCompositeOperatorNames);
ASSERT(blendOp >= BlendModeNormal);
ASSERT(blendOp <= numBlendOperatorNames);
if (blendOp > BlendModeNormal)
return blendOperatorNames[blendOp - BlendModeNormal];
return compositeOperatorNames[op];
}
String blendModeName(BlendMode blendOp)
{
ASSERT(blendOp >= BlendModeNormal);
ASSERT(blendOp <= BlendModePlusLighter);
return blendOperatorNames[blendOp - BlendModeNormal];
}
TextStream& operator<<(TextStream& ts, CompositeOperator op)
{
return ts << compositeOperatorName(op, BlendModeNormal);
}
TextStream& operator<<(TextStream& ts, BlendMode blendMode)
{
return ts << blendModeName(blendMode);
}
TextStream& operator<<(TextStream& ts, WindRule rule)
{
switch (rule) {
case WindRule::NonZero:
ts << "NON-ZERO";
break;
case WindRule::EvenOdd:
ts << "EVEN-ODD";
break;
}
return ts;
}
TextStream& operator<<(TextStream& ts, LineCap capStyle)
{
switch (capStyle) {
case ButtCap:
ts << "BUTT";
break;
case RoundCap:
ts << "ROUND";
break;
case SquareCap:
ts << "SQUARE";
break;
}
return ts;
}
TextStream& operator<<(TextStream& ts, LineJoin joinStyle)
{
switch (joinStyle) {
case MiterJoin:
ts << "MITER";
break;
case RoundJoin:
ts << "ROUND";
break;
case BevelJoin:
ts << "BEVEL";
break;
}
return ts;
}
TextStream& operator<<(TextStream& ts, AlphaPremultiplication premultiplication)
{
switch (premultiplication) {
case AlphaPremultiplication::Premultiplied:
ts << "premultiplied";
break;
case AlphaPremultiplication::Unpremultiplied:
ts << "unpremultiplied";
break;
}
return ts;
}
}