33 document.namespaces.add(
"cg_vml_",
"urn:schemas-microsoft-com:vml");
34 document.createStyleSheet().cssText =
"cg_vml_\\:*{behavior:url(#default#VML)}";
38 return _CGBitmapGraphicsContextCreate();
43 if ([aColor patternImage])
45 aContext.gState.fillStyle =
"!" + [[aColor patternImage] filename];
47 aContext.gState.fillStyle = [aColor cssString];
53 if (aContext.buffer != nil)
56 aContext.DOMElement.innerHTML =
"";
66 #define COORD(aCoordinate) (aCoordinate === 0.0 ? 0 : ROUND(Z * (aCoordinate) - Z_2)) 72 if (anImage.buffer != nil)
73 string = anImage.buffer;
76 var ctm = aContext.gState.CTM,
78 similarity = ctm.a == ctm.d && ctm.b == -ctm.c,
79 vml = ["<cg_vml_:group coordsize=\"1,1\" coordorigin=\"0,0\" style=\"width:1;height:1;position:absolute"];
96 var transformedRect = CGRectApplyAffineTransform(aRect, ctm);
98 vml.push(
";padding:0 ", ROUND(CGRectGetMaxX(transformedRect)),
"px ", ROUND(CGRectGetMaxY(transformedRect)),
99 "px 0;filter:progid:DXImageTransform.Microsoft.Matrix(",
100 "M11='", ctm.a,
"',M12='", ctm.c,
"',M21='", ctm.b,
"',M22='", ctm.d,
"',",
101 "Dx='", ROUND(origin.x),
"', Dy='", ROUND(origin.y),
"', sizingmethod='clip');");
106 vml.push(
"\"><cg_vml_:image src=\"", anImage._image.src,
107 "\" style=\"width:", CGRectGetWidth(aRect),
"px;height:", CGRectGetHeight(aRect),
108 "px;\"/></g_vml_:group>");
110 string = vml.join(
"");
113 if (aContext.buffer != nil)
114 aContext.buffer += string;
116 aContext.DOMElement.insertAdjacentHTML(
"BeforeEnd",
string);
124 var elements = aContext.path.elements,
127 count = aContext.path.count,
129 gState = aContext.gState,
133 vml = ["<cg_vml_:shape"];
135 if (gState.fillStyle.charAt(0) !==
"!")
136 vml.push(
" fillcolor=\"", gState.fillStyle,
"\"");
139 "\" style=\"position:absolute;width:",
W,
";height:",
H,
140 ";\" coordorigin=\"0 0\" coordsize=\"",
Z *
W,
" ",
Z *
H,
142 "\" strokeweight=\"", gState.lineWidth,
143 "\" strokecolor=\"", gState.strokeStyle,
146 for (; i < count; ++i)
148 var element = elements[i],
158 COORD(element.cpx),
',',
COORD(element.cpy),
',',
163 COORD(element.cp1x),
',',
COORD(element.cp1y),
',',
164 COORD(element.cp2x),
',',
COORD(element.cp2y),
',',
173 radius = element.radius,
174 clockwise = element.clockwise ? 1 : 0,
175 endAngle = element.endAngle,
176 startAngle = element.startAngle,
178 start = CGPointMake(x + radius * COS(startAngle), y + radius * SIN(startAngle));
184 if (startAngle == endAngle && !clockwise)
191 var end = CGPointMake(x + radius * COS(endAngle), y + radius * SIN(endAngle));
196 if (clockwise && startAngle != endAngle && CGPointEqualToPoint(
start, end))
213 COORD(x - radius),
',',
COORD(y - radius),
" ",
214 COORD(x + radius),
',',
COORD(y + radius),
" ",
245 vml.push(gState.gradient);
249 if (gState.fillStyle.charAt(0) ===
"!")
250 vml.push(
"<cg_vml_:fill type=\"tile\" src=\"", gState.fillStyle.substring(1),
"\" opacity=\"",
opacity,
"\" />");
252 vml.push(
"<cg_vml_:fill color=\"", gState.fillStyle,
"\" opacity=\"",
opacity,
"\" />");
256 vml.push(
"<cg_vml_:stroke opacity=\"",
opacity,
258 "\" miterlimit=\"", gState.miterLimit,
260 "\" weight=\"", gState.lineWidth,
"",
261 "px\" color=\"", gState.strokeStyle,
"\" />");
263 var shadowColor = gState.shadowColor;
267 var shadowOffset = gState.shadowOffset;
269 vml.push(
"<cg_vml_:shadow on=\"t\" offset=\"",
270 shadowOffset.width,
"pt ", shadowOffset.height,
"pt\" opacity=\"", [shadowColor alphaComponent],
"\" color=black />");
273 vml.push(
"</cg_vml_:shape>");
275 if (aContext.buffer != nil)
276 aContext.buffer += vml.join(
"");
278 aContext.DOMElement.insertAdjacentHTML(
"BeforeEnd", vml.join(
""));
283 return "rgb(" + ROUND(aColor.components[0] * 255) +
", " + ROUND(aColor.components[1] * 255) +
", " + ROUND(255 * aColor.components[2]) +
")";
288 if (!aContext || !aGradient)
293 if (aGradient.vml_gradient)
295 var stops = [[aGradient.vml_gradient stops] sortedArrayUsingSelector:@selector(comparePosition:)],
296 count = [stops count];
298 vml = ["<cg_vml_:fill type=\"gradient\" method=\"linear sigma\" "];
299 vml.push(
"angle=\"" + ([aGradient.vml_gradient angle] + 90) +
"\" ");
301 vml.push(
"colors=\"");
303 for (var i = 0; i < count; i++)
305 vml.push(([stops[i]
position] * 100).toFixed(0) +
"% ");
306 vml.push([[[stops[i] color] colorForSlideBase:nil] cssString]);
316 var colors = aGradient.colors,
317 count = colors.length;
319 vml = ["<cg_vml_:fill type=\"gradient\" "];
321 vml.push(
"colors=\"");
323 for (var i = 0; i < count; i++)
324 vml.push((aGradient.locations[i] * 100).toFixed(0)+
"% " +
to_string(colors[i])+(i < count - 1 ?
"," :
""));
329 aContext.gState.gradient = vml.join(
"");
CGPath kCGPathElementMoveToPoint
function CGContextDrawImage(aContext, aRect, anImage)
function CGContextDrawPath(aContext, aMode)
kCGPathElementAddLineToPoint
kCGPathElementAddArcToPoint
function CGPathIsEmpty(aPath)
kCGPathElementCloseSubpath
function CGContextClearRect(aContext, aRect)
#define COORD(aCoordinate)
function CGContextSetFillColor(aContext, aColor)
function CGContextDrawLinearGradient(aContext, aGradient, aStartPoint, anEndPoint, options)
kCGPathElementAddCurveToPoint
FrameUpdater prototype start
function CGBitmapGraphicsContextCreate()
kCGPathElementAddQuadCurveToPoint
function to_string(aColor)