/** * Draw circle * * @param ezcGraphCoordinate $center Center of ellipse * @param mixed $width Width of ellipse * @param mixed $height height of ellipse * @param ezcGraphColor $color Color * @param mixed $filled Filled * @return void */ public function drawCircle(ezcGraphCoordinate $center, $width, $height, ezcGraphColor $color, $filled = true) { $this->initiliazeSurface(); $this->context->save(); // Draw circular arc path $this->context->newPath(); $this->context->translate($center->x, $center->y); $this->context->scale(1, $height / $width); $this->context->arc(0.0, 0.0, $width / 2, 0, 2 * M_PI); $this->context->restore(); $this->getStyle($color, $filled); $this->context->stroke(); // Create polygon array to return $polygonArray = array(); for ($angle = 0; $angle < 2 * M_PI; $angle += deg2rad($this->options->imageMapResolution)) { $polygonArray[] = new ezcGraphCoordinate($center->x + cos($angle) * $width / 2, $center->y + sin($angle) * $height / 2); } return $polygonArray; }
<?php $sur = new CairoImageSurface(CairoFormat::ARGB32, 100, 100); $con = new CairoContext($sur); $s = new CairoImageSurface(CairoFormat::ARGB32, 1, 1); $s->createFromPng(dirname(__FILE__) . "/romedalen.png"); $con->setSourceRgb(0, 0, 0); $con->rectangle(0, 0, 100, 100); $con->fill(); $con->translate(10, 10); $con->setOperator(CairoOperator::OVER); $con->setSourceSurface($s, 0, 0); $con->rectangle(0, 0, 90, 90); $con->fill(); $sur->writeToPng(dirname(__FILE__) . "/composite-integer-translate-over-php.png"); ?>
$sur = new CairoImageSurface(CairoFormat::ARGB32, 3 * (3 + 6 + 3), 8 * (6 + 3) + 3); $con = new CairoContext($sur); $cap = array(CairoLineCap::ROUND, CairoLineCap::SQUARE, CairoLineCap::BUTT); $dash = array(2.0, 2.0); $dash_long = array(6.0, 6.0); $con->setSourceRgb(1, 0, 0); for ($i = 0; $i < 3; $i++) { $con->save(); $con->setLineCap($cap[$i]); /* simple degenerate paths */ $con->setLineWidth(6); $con->moveTo(6, 6); $con->lineTo(6, 6); $con->stroke(); $con->translate(0, 3 * 3); $con->moveTo(6, 6); $con->closePath(); $con->stroke(); /* degenerate paths starting with dash on */ $con->setDash($dash, 0.0); $con->translate(0, 3 * 3); $con->moveTo(6, 6); $con->lineTo(6, 6); $con->stroke(); $con->translate(0, 3 * 3); $con->moveTo(6, 6); $con->closePath(); $con->stroke(); /* degenerate paths starting with dash off */ /* these should not draw anything */
function render_svg($filepath, $w, $h, DOMElement $node) { static $svgRenderCache = array(); if (!isset($svgRenderCache[$filepath . $w . $h])) { $filename = tempnam(dirname($filepath), "ca_dompdf_img_"); $svg = file_get_contents($filepath); $renderSupersample = DOMPDF_SVG_SUPERSAMPLE; $rsvg = rsvg_create($svg); $dim = $rsvg->getDimensions(); if ($node) { $viewBox = explode(' ', $node->getAttribute('viewbox')); if (count($viewBox) == 4) { list($innerx, $innery, $innerwidth, $innerheight) = $viewBox; } else { list($innerx, $innery, $innerwidth, $innerheight) = [0, 0, $dim['width'], $dim['height']]; } } else { list($innerx, $innery, $innerwidth, $innerheight) = [0, 0, $dim['width'], $dim['height']]; } $scaleW = $w / $innerwidth; $scaleH = $h / $innerheight; $matrixScale = min($scaleW, $scaleH); $csf = cairo_image_surface_create(CairoFormat::ARGB32, floor($w * $renderSupersample), floor($h * $renderSupersample)); $cctx = new CairoContext($csf); $cctx->setMatrix(CairoMatrix::initScale($renderSupersample * $matrixScale, $renderSupersample * $matrixScale)); $cctx->translate(-$innerx, $innery); $rsvg->render($cctx); $csf->writeToPng($filename); return $svgRenderCache[$filepath . $w . $h] = $filename; } else { return $svgRenderCache[$filepath . $w . $h]; } }
<?php $sur = new CairoImageSurface(CairoFormat::ARGB32, 120, 100); $con = new CairoContext($sur); $con->setSourceRgb(1, 1, 1); $con->paint(); $con->setSourceRgb(0, 0, 0); $con->setMiterLimit(100000); for ($xscale = 1; $xscale <= 1000; $xscale += 999) { for ($yscale = 1; $yscale <= 1000; $yscale += 999) { //$max_scale = ($xscale > $yscale) ? $xscale : $yscale; $max_scale = max($xscale, $yscale); $con->save(); if ($xscale > 1) { $con->translate(50, 0); } if ($yscale > 1) { $con->translate(0, 50); } $con->scale($xscale, $yscale); $con->setLineWidth(10.0 / $max_scale); $con->moveTo(10.0 / $xscale, 10.0 / $yscale); $con->lineTo(40.0 / $xscale, 10.0 / $yscale); $con->lineTo(10.0 / $xscale, 30.0 / $yscale); $con->stroke(); $con->restore(); } } $sur->writeToPng(dirname(__FILE__) . "/miter-precision-php.png");
<?php $sur = new CairoImageSurface(CairoFormat::ARGB32, 36, 36); $con = new CairoContext($sur); $s = new CairoImageSurface(CairoFormat::ARGB32, 2, 2); $con2 = new CairoContext($s); $con2->setSourceRgb(1, 0, 0); $con2->paint(); $con2->setSourceRgb(0, 0, 1); $con2->rectangle(0, 1, 1, 1); $con2->rectangle(1, 0, 1, 1); $con2->fill(); $con->setSourceRgb(0, 0, 0); $con->paint(); $con->save(); $con->translate(3, 3); $con->scale(10, 10); $con->translate(0.5, 0.5); $con->setSourceSurface($s, 0, 0); $con->paint(); $con->restore(); $sur->writeToPng(dirname(__FILE__) . "/filter-bilinear-extents-php.png"); ?>
<?php $sur = new CairoImageSurface(CairoFormat::ARGB32, 10, 10); $con = new CairoContext($sur); $con->setSourceRgb(0, 0, 1); $con->paint(); $con->resetClip(); $con->clip(); $con->translate(0.5, 0.5); $con->setSourceRgb(0, 1, 0); $con->rectangle(0, 0, 10, 10); $con->fillPreserve(); $con->setSourceRgb(1, 0, 0); $con->stroke(); $con->selectFontFace("Bitstream Vera Sans", CairoFontSlant::NORMAL, CairoFontWeight::NORMAL); $con->moveTo(0, 10); $con->showText("cairo"); $sur->writeToPng(dirname(__FILE__) . "/clip-empty-php.png");
<?php $starsize = 20; $sur = new CairoImageSurface(CairoFormat::ARGB32, $starsize * 2 + 2, $starsize + 2); $con = new CairoContext($sur); $con->setSourceRgb(1, 0, 0); $con->translate(1, 1); $con->save(); $con->moveTo(10, 0); $con->relLineTo(6, 20); $con->relLineTo(-16, -12); $con->relLineTo(20, 0); $con->relLineTo(-16, 12); $con->setFillRule(CairoFillRule::WINDING); $con->clip(); $con->paint(); $con->restore(); $con->translate($starsize + 1, 0); $con->save(); $con->moveTo(10, 0); $con->relLineTo(6, 20); $con->relLineTo(-16, -12); $con->relLineTo(20, 0); $con->relLineTo(-16, 12); $con->setFillRule(CairoFillRule::EVEN_ODD); $con->clip(); $con->paint(); $con->restore(); $sur->writeToPng(dirname(__FILE__) . "/clip-fill-rule-php.png"); ?>
<?php $size = 25; $sur = new CairoImageSurface(CairoFormat::ARGB32, $size, $size); $con = new CairoContext($sur); /* Paint background white, then draw in black. */ $con->setSourceRgb(1.0, 1.0, 1.0); /* white */ $con->paint(); $con->setSourceRgb(0.0, 0.0, 0.0); /* black */ $con->setLineWidth(1.0); $con->translate(1, 1); /* Draw everything first with square caps. */ $con->setLineCap(CairoLineCap::SQUARE); /* Draw horizontal and vertical segments, each in both * directions. */ $con->moveTo(4.5, 0.5); $con->relLineTo(2.0, 0.0); $con->moveTo(10.5, 4.5); $con->relLineTo(0.0, 2.0); $con->moveTo(6.5, 10.5); $con->relLineTo(-2.0, 0.0); $con->moveTo(0.5, 6.5); $con->relLineTo(0.0, -2.0); /* Draw right angle turns in four directions. */ $con->moveTo(0.5, 2.5); $con->relLineTo(0.0, -2.0); $con->relLineTo(2.0, 0.0); $con->moveTo(8.5, 0.5); $con->relLineTo(2.0, 0.0);
$con->setSourceRgb(0, 0, 1); $fo->setHintStyle(Cairo::HINT_STYLE_NONE); $con->setFontOptions($fo); $con->showText("the "); $fo->setHintStyle(Cairo::HINT_STYLE_SLIGHT); $con->setFontOptions($fo); $con->showText("quick "); $fo->setHintStyle(Cairo::HINT_STYLE_MEDIUM); $con->setFontOptions($fo); $con->showText("brown"); $fo->setHintStyle(Cairo::HINT_STYLE_FULL); $con->setFontOptions($fo); $con->showText(" fox"); $con->textPath(" jumps over a lazy dog"); $con->fill(); $con->translate($width, $height); $con->rotate(M_PI); $con->moveTo(1, $fe["height"] - $fe["descent"] - 1); $fo->setHintMetrics(CairoHintMetrics::METRICS_OFF); $fo->setHintStyle(Cairo::HINT_STYLE_NONE); $con->setFontOptions($fo); $con->showText("the "); $fo->setHintStyle(Cairo::HINT_STYLE_SLIGHT); $con->setFontOptions($fo); $con->showText("quick"); $fo->setHintStyle(Cairo::HINT_STYLE_MEDIUM); $con->setFontOptions($fo); $con->showText(" brown"); $fo->setHintStyle(Cairo::HINT_STYLE_FULL); $con->setFontOptions($fo); $con->showText(" fox");
$con->arc(0, 0, $cisize / 2, 0, 2 * M_PI); $con->fill(); $con->restore(); } function draw_circles() { global $con, $cisize; draw_circle(0, $cisize * -0.1); draw_circle($cisize * 0.4, $cisize * 0.25); draw_circle($cisize * 2, 0); draw_circle($cisize * 4, 0); draw_circle($cisize * 6, 0); } $sur = new CairoImageSurface(CairoFormat::ARGB32, $width, $height); $con = new CairoContext($sur); $con->translate($pad, $pad); $con->setSourceRgb(0, 1, 0); $con->setOperator(CairoOperator::OVER); draw_circle($cisize * 0.5, $cisize * 1.5); $con->setSourceRgb(1, 0, 0); $con->setOperator(CairoOperator::ADD); draw_circle($cisize * 0.75, $cisize * 1.75); $con->setSourceRgb(0, 1, 0); $con->setOperator(CairoOperator::OVER); $con->translate($cisize * 2.5, $cisize * 0.6); draw_circles(); $con->setSourceRgb(1, 0, 0); $con->setOperator(CairoOperator::ADD); $con->translate(0, $cisize * 2); draw_circles(); $sur->writeToPng(dirname(__FILE__) . "/finer-grained-fallbacks-php.png");
<?php $sur = new CairoImageSurface(CairoFormat::RGB24, 165, 30); $con = new CairoContext($sur); $con->moveTo(0, 0); $con->setSourceRgb(1, 1, 1); $con->paint(); $con->setSourceRgb(0, 0, 0); $con->moveTo(0, 0); $con->translate(5, 5); /* First compress the pen to a vertical line. */ $con->rectangle(0, 0, 20, 20); $con->curveTo(20 / 2, 0, 20, 20 / 2, 20, 20); $con->save(); $con->scale(1.0E-5, 1.0); $con->stroke(); $con->restore(); $con->translate(5 + 20, 0); /* Then compress the pen to a horizontal line. */ $con->rectangle(0, 0, 20, 20); $con->curveTo(20 / 2, 0, 20, 20 / 2, 20, 20); $con->save(); $con->scale(1.0, 1.0E-5); $con->stroke(); $con->restore(); $con->translate(5 + 20, 0); /* Finally a line at an angle. */ $con->rectangle(0, 0, 20, 20); $con->curveTo(20 / 2, 0, 20, 20 / 2, 20, 20); $con->save(); $con->rotate(M_PI / 4.0);
$con->stroke(); $con->save(); $con->setDash($dash, 0.0); $con->moveTo(0, 0); $con->arc(0, 0, 12.5, 0, 3 * M_PI / 2); $con->closePath(); $con->stroke(); $con->restore(); } $sur = new CairoImageSurface(CairoFormat::ARGB32, 200, 200); $con = new CairoContext($sur); $con->setSourceRgb(1, 1, 1); $con->paint(); $con->setSourceRgb(0, 0, 0); $con->save(); $con->translate(50, 50); $con->scale(1, 1); draw_symbol($con); $con->restore(); $con->save(); $con->translate(150, 50); $con->scale(-1, 1); draw_symbol($con); $con->restore(); $con->save(); $con->translate(150, 150); $con->scale(-1, -1); draw_symbol($con); $con->restore(); $con->save(); $con->translate(50, 150);
<?php $sur = new CairoImageSurface(CairoFormat::ARGB32, 10, 20); $con = new CairoContext($sur); $con->translate(1.0, 1.0); $con->setSourceRgb(1, 0, 0); /* red */ /* First draw the desired shape with a fill */ $con->rectangle(0.5, 0.5, 4.0, 4.0); $con->rectangle(3.5, 3.5, 4.0, 4.0); $con->rectangle(3.5, 1.5, -2.0, 2.0); $con->rectangle(6.5, 4.5, -2.0, 2.0); $con->fill(); /* Then try the same thing with a stroke */ $con->translate(0, 10); $con->moveTo(1.0, 1.0); $con->relLineTo(3.0, 0.0); $con->relLineTo(0.0, 6.0); $con->relLineTo(3.0, 0.0); $con->relLineTo(0.0, -3.0); $con->relLineTo(-6.0, 0.0); $con->closePath(); $con->setLineWidth(1.0); $con->stroke(); $sur->writeToPng(dirname(__FILE__) . '/self-intersecting.png');
<?php $sur = new CairoImageSurface(CairoFormat::ARGB32, 76, 76); $con = new CairoContext($sur); $con->setSourceRgb(1, 1, 1); $con->paint(); $con->setAntialias(CairoAntialias::MODE_NONE); $con->setSourceRgb(0, 0, 0); $con->translate(-300, -300); $con->scale(677.0 / 26, 677.0 / 26); $con->translate(1, 1); $con->rectangle(11, 11, 1, 1); $con->rectangle(11, 12, 1, 1); $con->rectangle(12, 11, 1, 1); $con->rectangle(12, 12, 1, 1); $con->setSourceRgb(0, 0, 0); $con->fill(); $sur->writeToPng(dirname(__FILE__) . "/rectangle-rounding-error-php.png"); ?>
<?php $sur = new CairoImageSurface(CairoFormat::ARGB32, 32, 16); $con = new CairoContext($sur); $con->save(); $con->setSourceRgb(1, 1, 1); $con->paint(); $con->restore(); $con->arc(8, 8, 4, 0, M_PI); $con->closePath(); $con->arc(8, 8, 4, M_PI, 2 * M_PI); $con->fill(); $con->translate(16, 0); $con->moveTo(8, 4); $con->arcNegative(8, 8, 4, 3 * M_PI / 2, M_PI / 2); $con->closePath(); $con->curveTo(12, 4, 12, 12, 8, 12); $path = $con->copyPathFlat(); $con->newPath(); $con->appendPath($path); $con->fill(); $sur->writeToPng(dirname(__FILE__) . "/close-path-php.png"); ?>
$surface_size = sqrt(($size - 2 * $pad) * ($size - 2 * $pad) / 2); $sur = new CairoImageSurface(CairoFormat::ARGB32, $size, $size); $con = new CairoContext($sur); $s = new CairoImageSurface(CairoFormat::RGB24, $surface_size, $surface_size); $con2 = new CairoContext($s); $con2->setSourceRgb(1, 1, 1); $con2->rectangle(0, 0, $surface_size / 2, $surface_size / 2); $con2->fill(); $con2->setSourceRgb(1, 0, 0); $con2->rectangle($surface_size / 2, 0, $surface_size / 2, $surface_size / 2); $con2->fill(); $con2->setSourceRgb(0, 1, 0); $con2->rectangle(0, $surface_size / 2, $surface_size / 2, $surface_size / 2); $con2->fill(); $con2->setSourceRgb(0, 0, 1); $con2->rectangle($surface_size / 2, $surface_size / 2, $surface_size / 2, $surface_size / 2); $con2->fill(); /* First paint opaque background (black) so we don't need separate * ARGB32 and RGB24 reference images. */ $con->setSourceRgb(0, 0, 0); /* black */ $con->paint(); $con->translate($size / 2, $size / 2); $con->rotate(M_PI / 4.0); $con->translate(-$surface_size / 2, -$surface_size / 2); $con->setSourceSurface($s, 0, 0); $pat = $con->getSource(); $pat->setFilter(CairoFilter::NEAREST); $con->setSource($pat); $con->paint(); $sur->writeToPng(dirname(__FILE__) . "/rotate-image-surface-paint-php.png");
$con->relLineTo(-16, 12); } function big_star_path() { global $con; $con->moveTo(40, 0); $con->relLineTo(25, 80); $con->relLineTo(-65, -50); $con->relLineTo(80, 0); $con->relLineTo(-65, 50); $con->closePath(); } $sur = new CairoImageSurface(CairoFormat::ARGB32, 163, 103); $con = new CairoContext($sur); $con->setSourceRgb(1, 0, 0); $con->translate(1, 1); little_star_path(); $con->setFillRule(CairoFillRule::WINDING); $con->fill(); $con->translate(21, 0); little_star_path(); $con->setFillRule(CairoFillRule::EVEN_ODD); $con->fill(); $con->translate(-21, 21); big_star_path(); $con->setFillRule(CairoFillRule::WINDING); $con->fill(); $con->translate(81, 0); big_star_path(); $con->setFillRule(CairoFillRule::EVEN_ODD); $con->fill();
<?php $sur = new CairoImageSurface(CairoFormat::ARGB32, 10, 10); $con = new CairoContext($sur); $data = ""; for ($i = 0; $i < 4; $i++) { $data = $data . chr(0x80); $data = $data . chr(0x0); $data = $data . chr(0x0); $data = $data . chr(0x0); } $s = new CairoImageSurface(CairoFormat::ARGB32, 1, 1); $s->createForData(data, CairoFormat::ARGB32, 2, 2, 8); $pat = new CairoSurfacePattern($s); $con->setSourceRgb(1, 0, 0); $con->save(); $con->translate(2, 2); $con->mask($pat); $con->restore(); $mat = new CairoMatrix(); $mat->translate(-4, -4); $pat->setMatrix($mat); $con->mask($pat); $con->translate(2, 2); $con->mask($pat); $sur->writeToPng(dirname(__FILE__) . "/mask-ctm-php.png"); ?>
<?php $sur = new CairoImageSurface(CairoFormat::ARGB32, 28, 14); $con = new CairoContext($sur); $con->rectangle(2, 2, 10, 10); $con->setSourceRgb(0, 0, 1); $con->fillPreserve(); $con->setSourceRgb(1, 0, 0); $con->stroke(); $con->translate(14, 0); $con->arc(7, 7, 5, 0, 2 * M_PI); $con->fillPreserve(); $con->setSourceRgb(0, 0, 1); $con->stroke(); $sur->writeToPng(dirname(__FILE__) . "/fill-and-stroke-php.png"); ?>
<?php $patwidth = 120; $patheight = 120; $size = $patwidth * 2; $pad = 2; $width = $pad + $size + $pad; $height = $width; $sur = new CairoImageSurface(CairoFormat::ARGB32, $width, $height); $con = new CairoContext($sur); //$s = new CairoImageSurface(FORMATARGB32, $width, $height); $con->translate($pad, $pad); $pat_surface = $sur->createSimilar(CairoContent::COLOR_ALPHA, $patwidth, $patheight); $cr2 = new CairoContext($pat_surface); $cr2->setSourceRgba(1, 0, 1, 0.5); $cr2->rectangle($patwidth / 6.0, $patheight / 6.0, $patwidth / 4.0, $patheight / 4.0); $cr2->fill(); $cr2->setSourceRgba(0, 1, 1, 0.5); $cr2->rectangle($patwidth / 2.0, $patheight / 2.0, $patwidth / 4.0, $patheight / 4.0); $cr2->fill(); $cr2->setLineWidth(1); $cr2->moveTo($patwidth / 6.0, 0); $cr2->lineTo(0, 0); $cr2->lineTo(0, $patheight / 6.0); $cr2->setSourceRgb(1, 0, 0); $cr2->stroke(); $cr2->moveTo($patwidth / 6.0, $patheight); $cr2->lineTo(0, $patheight); $cr2->lineTo(0, 5 * $patheight / 6.0); $cr2->setSourceRgb(0, 1, 0); $cr2->stroke();
<?php $sur = new CairoImageSurface(CairoFormat::ARGB32, 8, 8); $con = new CairoContext($sur); $con->setSourceRgb(1, 1, 1); $con->paint(); $con->setSourceRgb(0, 0, 0); $con->setLineJoin(CairoLineJoin::ROUND); $con->scale(20.0 / 100.0, 20 / 100.0); $con->scale(1.0 / 20, 1.0 / 20); $con->setLineWidth(20); $con->translate(-18300, -13200); $con->newPath(); $con->moveTo(18928, 13843); $con->lineTo(18500, 13843); $con->lineTo(18500, 13400); $con->lineTo(18928, 13400); $con->lineTo(18928, 13843); $con->stroke(); $sur->writeToPng(dirname(__FILE__) . "/infinite-join-php.png"); ?>
<?php $sur = new CairoImageSurface(CairoFormat::ARGB32, 53, 53); $con = new CairoContext($sur); $con->setSourceRgb(1, 0, 0); $con->translate(1, 1); $con->moveTo(0, 0); $con->lineTo(25, 50); $con->lineTo(25, 0); $con->lineTo(50, 25); $con->lineTo(0, 25); $con->closePath(); $con->fill(); $sur->writeToPng(dirname(__FILE__) . "/fill-missed-stop-php.png"); ?>
$yscale = 2.0; $width = $xscale * $spline * 6.0; $height = $yscale * $spline * 2.0; $sur = new CairoImageSurface(CairoFormat::ARGB32, $width, $height); $con = new CairoContext($sur); $con->setSourceRgb(1.0, 1.0, 1.0); /* white */ $con->paint(); $con->setSourceRgb(0.0, 0.0, 0.0); /* black */ for ($i = 0; $i < 4; $i++) { $con->save(); // $con->translate($width/4 + ($i % 2)*$width/2, $height/4 + ($i/2)*$height/2); switch ($i) { case 0: $con->translate($width / 4, $height / 4); scale_then_set_line_width_and_stroke(); break; case 1: $con->translate($width / 4 + $width / 2, $height / 4); scale_path_and_line_width(); break; case 2: $con->translate($width / 4, $height / 4 + $height / 2); set_line_width_then_scale_and_stroke(); break; case 3: $con->translate($width / 4 + $width / 2, $height / 4 + $height / 2); scale_path_not_line_width(); break; }
$linewidth = 10.0; $size = 5 * $linewidth; $pad = 2 * $linewidth; $sur = new CairoImageSurface(CairoFormat::ARGB32, 3 * ($pad + $size) + $pad, 3 * $pad + 2 * $size); $con = new CairoContext($sur); $dash = array($linewidth, 1.5 * $linewidth); $dashoff = -2 * $linewidth; $con->save(); $con->setSourceRgb(1, 1, 1); $con->paint(); $con->restore(); for ($i = 0; $i < 2; $i++) { $con->save(); $con->setLineWidth($linewidth); $con->setDash($dash, $dashoff); $con->translate($pad, $pad); $con->moveTo(0, 0); $con->relLineTo(0, $size); $con->relLineTo($size, 0); $con->closePath(); $con->moveTo(2 * $linewidth, 0); $con->relLineTo(3 * $linewidth, 0); $con->relLineTo(0, 3 * $linewidth); $con->setLineCap(CairoLineCap::BUTT); $con->setLineJoin(CairoLineJoin::BEVEL); $con->stroke(); $con->translate($size + $pad, 0); $con->moveTo(0, 0); $con->relLineTo(0, $size); $con->relLineTo($size, 0); $con->closePath();
$ext = $con->textExtents($str); $sf = $con->getScaledFont(); $sext = $sf->textExtents("text"); $lw = $con->getLineWidth(); $con->rectangle($x + $ext["x_bearing"] - $lw / 2, $y + $ext["y_bearing"] - $lw / 2, $ext["width"] + $lw, $ext["height"] + $lw); $con->stroke(); $con->moveTo($x, $y); $con->showText($str); $con->restore(); } $sur = new CairoImageSurface(CairoFormat::ARGB32, 38, 34); $con = new CairoContext($sur); $con->setSourceRgb(1, 1, 1); $con->paint(); $con->selectFontFace("Bitstream Vera Sans"); $con->setFontSize(12); $con->translate(4, 4); $con->setLineWidth(1); $ext = $con->textExtents("text"); $con->setSourceRgb(0, 0, 0); box_text("text", 0, -$ext["y_bearing"]); $mat = new CairoMatrix(); $mat->translate(6, 16); $mat->scale(12, 12); $con->setFontMatrix($mat); $con->setSourceRgb(0, 0, 1); box_text("text", 0, -$ext["y_bearing"]); $sur->writeToPng(dirname(__FILE__) . "/font-matrix-translation-php.png"); ?>