Bug 748433: Adds support for blending to the canvas globalCompositeOperator. r=jrmuizel

This commit is contained in:
Rik Cabanier 2012-12-12 21:28:17 +01:00
parent 3024c6e42a
commit db7b579813
5 changed files with 182 additions and 1 deletions

View File

@ -3075,6 +3075,21 @@ CanvasRenderingContext2D::SetGlobalCompositeOperation(const nsAString& op,
else CANVAS_OP_TO_GFX_OP("destination-atop", DEST_ATOP)
else CANVAS_OP_TO_GFX_OP("lighter", ADD)
else CANVAS_OP_TO_GFX_OP("xor", XOR)
else CANVAS_OP_TO_GFX_OP("multiply", MULTIPLY)
else CANVAS_OP_TO_GFX_OP("screen", SCREEN)
else CANVAS_OP_TO_GFX_OP("overlay", OVERLAY)
else CANVAS_OP_TO_GFX_OP("darken", DARKEN)
else CANVAS_OP_TO_GFX_OP("lighten", LIGHTEN)
else CANVAS_OP_TO_GFX_OP("color-dodge", COLOR_DODGE)
else CANVAS_OP_TO_GFX_OP("color-burn", COLOR_BURN)
else CANVAS_OP_TO_GFX_OP("hard-light", HARD_LIGHT)
else CANVAS_OP_TO_GFX_OP("soft-light", SOFT_LIGHT)
else CANVAS_OP_TO_GFX_OP("difference", DIFFERENCE)
else CANVAS_OP_TO_GFX_OP("exclusion", EXCLUSION)
else CANVAS_OP_TO_GFX_OP("hue", HUE)
else CANVAS_OP_TO_GFX_OP("saturation", SATURATION)
else CANVAS_OP_TO_GFX_OP("color", COLOR)
else CANVAS_OP_TO_GFX_OP("luminosity", LUMINOSITY)
// XXX ERRMSG we need to report an error to developers here! (bug 329026)
else return;
@ -3103,6 +3118,21 @@ CanvasRenderingContext2D::GetGlobalCompositeOperation(nsAString& op,
else CANVAS_OP_TO_GFX_OP("source-out", OUT)
else CANVAS_OP_TO_GFX_OP("source-over", OVER)
else CANVAS_OP_TO_GFX_OP("xor", XOR)
else CANVAS_OP_TO_GFX_OP("multiply", MULTIPLY)
else CANVAS_OP_TO_GFX_OP("screen", SCREEN)
else CANVAS_OP_TO_GFX_OP("overlay", OVERLAY)
else CANVAS_OP_TO_GFX_OP("darken", DARKEN)
else CANVAS_OP_TO_GFX_OP("lighten", LIGHTEN)
else CANVAS_OP_TO_GFX_OP("color-dodge", COLOR_DODGE)
else CANVAS_OP_TO_GFX_OP("color-burn", COLOR_BURN)
else CANVAS_OP_TO_GFX_OP("hard-light", HARD_LIGHT)
else CANVAS_OP_TO_GFX_OP("soft-light", SOFT_LIGHT)
else CANVAS_OP_TO_GFX_OP("difference", DIFFERENCE)
else CANVAS_OP_TO_GFX_OP("exclusion", EXCLUSION)
else CANVAS_OP_TO_GFX_OP("hue", HUE)
else CANVAS_OP_TO_GFX_OP("saturation", SATURATION)
else CANVAS_OP_TO_GFX_OP("color", COLOR)
else CANVAS_OP_TO_GFX_OP("luminosity", LUMINOSITY)
else {
error.Throw(NS_ERROR_FAILURE);
}

View File

@ -65,6 +65,51 @@ CGBlendMode ToBlendMode(CompositionOp op)
case OP_XOR:
mode = kCGBlendModeXOR;
break;
case OP_MULTIPLY:
mode = kCGBlendModeMultiply;
break;
case OP_SCREEN:
mode = kCGBlendModeScreen;
break;
case OP_OVERLAY:
mode = kCGBlendModeOverlay;
break;
case OP_DARKEN:
mode = kCGBlendModeDarken;
break;
case OP_LIGHTEN:
mode = kCGBlendModeLighten;
break;
case OP_COLOR_DODGE:
mode = kCGBlendModeColorDodge;
break;
case OP_COLOR_BURN:
mode = kCGBlendModeColorBurn;
break;
case OP_HARD_LIGHT:
mode = kCGBlendModeHardLight;
break;
case OP_SOFT_LIGHT:
mode = kCGBlendModeSoftLight;
break;
case OP_DIFFERENCE:
mode = kCGBlendModeDifference;
break;
case OP_EXCLUSION:
mode = kCGBlendModeExclusion;
break;
case OP_HUE:
mode = kCGBlendModeHue;
break;
case OP_SATURATION:
mode = kCGBlendModeSaturation;
break;
case OP_COLOR:
mode = kCGBlendModeColor;
break;
case OP_LUMINOSITY:
mode = kCGBlendModeLuminosity;
break;
/*
case OP_CLEAR:
mode = kCGBlendModeClear;

View File

@ -40,6 +40,36 @@ GfxOpToCairoOp(CompositionOp op)
return CAIRO_OPERATOR_DEST_ATOP;
case OP_XOR:
return CAIRO_OPERATOR_XOR;
case OP_MULTIPLY:
return CAIRO_OPERATOR_MULTIPLY;
case OP_SCREEN:
return CAIRO_OPERATOR_SCREEN;
case OP_OVERLAY:
return CAIRO_OPERATOR_OVERLAY;
case OP_DARKEN:
return CAIRO_OPERATOR_DARKEN;
case OP_LIGHTEN:
return CAIRO_OPERATOR_LIGHTEN;
case OP_COLOR_DODGE:
return CAIRO_OPERATOR_COLOR_DODGE;
case OP_COLOR_BURN:
return CAIRO_OPERATOR_COLOR_BURN;
case OP_HARD_LIGHT:
return CAIRO_OPERATOR_HARD_LIGHT;
case OP_SOFT_LIGHT:
return CAIRO_OPERATOR_SOFT_LIGHT;
case OP_DIFFERENCE:
return CAIRO_OPERATOR_DIFFERENCE;
case OP_EXCLUSION:
return CAIRO_OPERATOR_EXCLUSION;
case OP_HUE:
return CAIRO_OPERATOR_HSL_HUE;
case OP_SATURATION:
return CAIRO_OPERATOR_HSL_SATURATION;
case OP_COLOR:
return CAIRO_OPERATOR_HSL_COLOR;
case OP_LUMINOSITY:
return CAIRO_OPERATOR_HSL_LUMINOSITY;
case OP_COUNT:
break;
}

View File

@ -248,6 +248,36 @@ inline CompositionOp CompositionOpForOp(gfxContext::GraphicsOperator aOp)
return OP_DEST_ATOP;
case gfxContext::OPERATOR_XOR:
return OP_XOR;
case gfxContext::OPERATOR_MULTIPLY:
return OP_MULTIPLY;
case gfxContext::OPERATOR_SCREEN:
return OP_SCREEN;
case gfxContext::OPERATOR_OVERLAY:
return OP_OVERLAY;
case gfxContext::OPERATOR_DARKEN:
return OP_DARKEN;
case gfxContext::OPERATOR_LIGHTEN:
return OP_LIGHTEN;
case gfxContext::OPERATOR_COLOR_DODGE:
return OP_COLOR_DODGE;
case gfxContext::OPERATOR_COLOR_BURN:
return OP_COLOR_BURN;
case gfxContext::OPERATOR_HARD_LIGHT:
return OP_HARD_LIGHT;
case gfxContext::OPERATOR_SOFT_LIGHT:
return OP_SOFT_LIGHT;
case gfxContext::OPERATOR_DIFFERENCE:
return OP_DIFFERENCE;
case gfxContext::OPERATOR_EXCLUSION:
return OP_EXCLUSION;
case gfxContext::OPERATOR_HUE:
return OP_HUE;
case gfxContext::OPERATOR_SATURATION:
return OP_SATURATION;
case gfxContext::OPERATOR_COLOR:
return OP_COLOR;
case gfxContext::OPERATOR_LUMINOSITY:
return OP_LUMINOSITY;
default:
return OP_OVER;
}
@ -274,6 +304,36 @@ inline gfxContext::GraphicsOperator ThebesOp(CompositionOp aOp)
return gfxContext::OPERATOR_DEST_ATOP;
case OP_XOR:
return gfxContext::OPERATOR_XOR;
case OP_MULTIPLY:
return gfxContext::OPERATOR_MULTIPLY;
case OP_SCREEN:
return gfxContext::OPERATOR_SCREEN;
case OP_OVERLAY:
return gfxContext::OPERATOR_OVERLAY;
case OP_DARKEN:
return gfxContext::OPERATOR_DARKEN;
case OP_LIGHTEN:
return gfxContext::OPERATOR_LIGHTEN;
case OP_COLOR_DODGE:
return gfxContext::OPERATOR_COLOR_DODGE;
case OP_COLOR_BURN:
return gfxContext::OPERATOR_COLOR_BURN;
case OP_HARD_LIGHT:
return gfxContext::OPERATOR_HARD_LIGHT;
case OP_SOFT_LIGHT:
return gfxContext::OPERATOR_SOFT_LIGHT;
case OP_DIFFERENCE:
return gfxContext::OPERATOR_DIFFERENCE;
case OP_EXCLUSION:
return gfxContext::OPERATOR_EXCLUSION;
case OP_HUE:
return gfxContext::OPERATOR_HUE;
case OP_SATURATION:
return gfxContext::OPERATOR_SATURATION;
case OP_COLOR:
return gfxContext::OPERATOR_COLOR;
case OP_LUMINOSITY:
return gfxContext::OPERATOR_LUMINOSITY;
default:
return gfxContext::OPERATOR_OVER;
}

View File

@ -529,7 +529,23 @@ public:
OPERATOR_XOR,
OPERATOR_ADD,
OPERATOR_SATURATE
OPERATOR_SATURATE,
OPERATOR_MULTIPLY,
OPERATOR_SCREEN,
OPERATOR_OVERLAY,
OPERATOR_DARKEN,
OPERATOR_LIGHTEN,
OPERATOR_COLOR_DODGE,
OPERATOR_COLOR_BURN,
OPERATOR_HARD_LIGHT,
OPERATOR_SOFT_LIGHT,
OPERATOR_DIFFERENCE,
OPERATOR_EXCLUSION,
OPERATOR_HUE,
OPERATOR_SATURATION,
OPERATOR_COLOR,
OPERATOR_LUMINOSITY
};
/**
* Sets the operator used for all further drawing. The operator affects