#include "config.h"
#if ENABLE(SVG)
#include <ApplicationServices/ApplicationServices.h>
#include "CgSupport.h"
#include "FloatConversion.h"
#include "GraphicsContext.h"
#include "KCanvasRenderingStyle.h"
#include "RenderStyle.h"
#include "SVGRenderStyle.h"
#include <wtf/Assertions.h>
namespace WebCore {
CFStringRef CFStringFromCGAffineTransform(CGAffineTransform t)
{
return CFStringCreateWithFormat(0, 0, CFSTR("a: %f b: %f c: %f d: %f tx: %f ty: %f"), t.a, t.b, t.c, t.d, t.tx, t.ty);
}
CGAffineTransform CGAffineTransformMakeMapBetweenRects(CGRect source, CGRect dest)
{
CGAffineTransform transform = CGAffineTransformMakeTranslation(dest.origin.x - source.origin.x, dest.origin.y - source.origin.y);
transform = CGAffineTransformScale(transform, dest.size.width/source.size.width, dest.size.height/source.size.height);
return transform;
}
void applyStrokeStyleToContext(CGContextRef context, RenderStyle* style, const RenderObject* object)
{
CGContextSetLineWidth(context, narrowPrecisionToCGFloat(KSVGPainterFactory::cssPrimitiveToLength(object, style->svgStyle()->strokeWidth(), 1.0)));
CGContextSetLineCap(context, CGLineCapFromKC(style->svgStyle()->capStyle()));
CGContextSetLineJoin(context, CGLineJoinFromKC(style->svgStyle()->joinStyle()));
CGContextSetMiterLimit(context, style->svgStyle()->strokeMiterLimit());
const KCDashArray& dashes = KSVGPainterFactory::dashArrayFromRenderingStyle(style);
double dashOffset = KSVGPainterFactory::cssPrimitiveToLength(object, style->svgStyle()->strokeDashOffset(), 0.0);
CGContextSetLineDash(context, narrowPrecisionToCGFloat(dashOffset), dashes.data(), dashes.size());
}
CGContextRef scratchContext()
{
static CGContextRef scratch = 0;
if (!scratch) {
CFMutableDataRef empty = CFDataCreateMutable(NULL, 0);
CGDataConsumerRef consumer = CGDataConsumerCreateWithCFData(empty);
scratch = CGPDFContextCreate(consumer, NULL, NULL);
CGDataConsumerRelease(consumer);
CFRelease(empty);
CGFloat black[4] = {0, 0, 0, 1};
CGContextSetFillColor(scratch, black);
CGContextSetStrokeColor(scratch, black);
}
return scratch;
}
FloatRect strokeBoundingBox(const Path& path, RenderStyle* style, const RenderObject* object)
{
CGPathRef cgPath = path.platformPath();
CGContextRef context = scratchContext();
CGContextSaveGState(context);
CGContextBeginPath(context);
CGContextAddPath(context, cgPath);
applyStrokeStyleToContext(context, style, object);
CGContextReplacePathWithStrokedPath(context);
CGRect box = CGContextGetPathBoundingBox(context);
CGContextRestoreGState(context);
return FloatRect(box);
}
}
#endif // ENABLE(SVG)