function setGlobalCompositeOperation(newGlobalCompositeOperation) { var vgBlendMode = compositeOperation2vg[newGlobalCompositeOperation]; if (vgBlendMode) { globalCompositeOperation = newGlobalCompositeOperation; blendMode = vgBlendMode; vg.setI(vg.VGParamType.VG_BLEND_MODE, vgBlendMode); } // TODO else ? (@see spec) var saveBlendMode = vg.getI(vg.VGParamType.VG_BLEND_MODE); }
function dropShadow(paintFn) { var success; var saveBlendMode = vg.getI(vg.VGParamType.VG_BLEND_MODE); vg.getMatrix(shadowTransform); success = vg.egl.makeCurrent(shadowSurface, shadowContext); vg.loadMatrix(shadowTransform); vg.clear(0, 0, width, height); vg.translate(shadowOffsetX, shadowOffsetY); paintFn(); vg.translate(-shadowOffsetX, -shadowOffsetY); vg.setI(vg.VGParamType.VG_BLEND_MODE, vg.VGBlendMode.VG_BLEND_SRC_IN); vg.setParameterI(shadowPaint, vg.VGPaintParamType.VG_PAINT_TYPE, vg.VGPaintType.VG_PAINT_TYPE_COLOR); vg.setParameterFV(shadowPaint, vg.VGPaintParamType.VG_PAINT_COLOR, shadowColor); vg.setPaint(shadowPaint, vg.VGPaintMode.VG_FILL_PATH); vg.getMatrix(shadowTransform); vg.loadIdentity(); var vgPath = vg.createPath(vg.VG_PATH_FORMAT_STANDARD, vg.VGPathDatatype.VG_PATH_DATATYPE_F, 1.0 /* scale */ , 0.0 /* bias */, 5 /* segCapacityHint */, 5 /* coordCapacityHint */, vg.VGPathCapabilities.VG_PATH_CAPABILITY_APPEND_TO); vg.vgu.rect(vgPath, 0, 0, width, height); vg.drawPath(vgPath, vg.VGPaintMode.VG_FILL_PATH); vg.destroyPath(vgPath); vg.loadMatrix(shadowTransform); vg.setI(vg.VGParamType.VG_BLEND_MODE, vg.VGBlendMode.VG_BLEND_SRC_OVER); if (shadowBlur !== 0) { var sigma = shadowBlur / 2; vg.gaussianBlur(shadowDstImage, shadowSrcImage, sigma, sigma, vg.VGTilingMode.VG_TILE_PAD); } success = vg.egl.makeCurrent(vg.screen.surface, vg.screen.context); vg.setI(vg.VGParamType.VG_BLEND_MODE, vg.VGBlendMode.VG_BLEND_SRC_OVER); vg.getMatrix(shadowTransform); vg.loadIdentity(); vg.drawImage(shadowBlur !== 0 ? shadowDstImage : shadowSrcImage); vg.loadMatrix(shadowTransform); vg.setI(vg.VGParamType.VG_BLEND_MODE, saveBlendMode); }