How to show fontello icons in Canvas?

88 Views Asked by At

I am tying to use custom fontello font in Canvas so I can export the icon as PNG, but I am getting only an empty square - ⎕ This is the outcome no matter which code I use from this font: enter image description here

So basically I am trying to use it like this:

 ctx.font = `30px fontello`;
 ctx.fillText('\ue804', canvas.width / 2, canvas.height / 2);
 const image = canvas.toDataURL('image/png');

The font is correctly loaded in the document, I've been using it in other places, also testing to use it like this works:

const span = document.createElement('span');
span.style.fontFamily = 'fontello'
span.innerHTML = '&#xe804'
document.body.appendChild(span)

I also tried

ctx.font = `30px "fontello"`;
ctx.fillText('\\ue804', canvas.width / 2, canvas.height / 2);
ctx.fillText('\uE804', canvas.width / 2, canvas.height / 2);
ctx.fillText('&#xe804', canvas.width / 2, canvas.height / 2);
ctx.fillText('&#xE804', canvas.width / 2, canvas.height / 2);

All of the above does not work. Any suggestions will be appreciated.

const canvas = document.createElement('canvas');
                canvas.width = 30; 
                canvas.height = 30; 
                const ctx = canvas.getContext('2d');
                const circleStrokeColor = filter.filter_color.polyline; 
                const circleFillColor = filter.filter_color.polygon; 
                const circleRadius = Math.min(canvas.width, canvas.height) / 2 - 1;
                ctx.strokeStyle = this.hexToRgb(circleStrokeColor);
                ctx.fillStyle = this.hexToRgb(circleFillColor);
                ctx.beginPath();
                ctx.arc(canvas.width / 2, canvas.height / 2, circleRadius, 0, 2 * Math.PI);
                ctx.fill();
                ctx.lineWidth = 1;
                ctx.stroke();
                ctx.fillStyle = this.hexToRgb(circleStrokeColor);
                ctx.textAlign = 'center';
                ctx.textBaseline = 'middle';
                ctx.font = `30px fontello`;
                ctx.fillText('\ue804', canvas.width / 2, canvas.height / 2);
                const image = canvas.toDataURL('image/png');
                console.log(image)
                return image
@font-face {
  font-family: 'fontello';
  src: url('../font/fontello.eot?41849995');
  src: url('../font/fontello.eot?41849995#iefix') format('embedded-opentype'),
       url('../font/fontello.woff2?41849995') format('woff2'),
       url('../font/fontello.woff?41849995') format('woff'),
       url('../font/fontello.ttf?41849995') format('truetype'),
       url('../font/fontello.svg?41849995#fontello') format('svg');
  font-weight: normal;
  font-style: normal;
}
/* Chrome hack: SVG is rendered more smooth in Windozze. 100% magic, uncomment if you need it. */
/* Note, that will break hinting! In other OS-es font will be not as sharp as it could be */
/*
@media screen and (-webkit-min-device-pixel-ratio:0) {
  @font-face {
    font-family: 'fontello';
    src: url('../font/fontello.svg?41849995#fontello') format('svg');
  }
}
*/
[class^="icon-"]:before, [class*=" icon-"]:before {
  font-family: "fontello";
  font-style: normal;
  font-weight: normal;
  speak: never;

  display: inline-block;
  text-decoration: inherit;
  width: 1em;
  margin-right: .2em;
  text-align: center;
  /* opacity: .8; */

  /* For safety - reset parent styles, that can break glyph codes*/
  font-variant: normal;
  text-transform: none;

  /* fix buttons height, for twitter bootstrap */
  line-height: 1em;

  /* Animation center compensation - margins should be symmetric */
  /* remove if not needed */
  margin-left: .2em;

  /* you can be more comfortable with increased icons size */
  /* font-size: 120%; */

  /* Font smoothing. That was taken from TWBS */
  -webkit-font-smoothing: antialiased;
  -moz-osx-font-smoothing: grayscale;

  /* Uncomment for 3D effect */
  /* text-shadow: 1px 1px 1px rgba(127, 127, 127, 0.3); */
}

.icon-gebouwen:before { content: '\e800'; } /* '' */
.icon-groen:before { content: '\e801'; } /* '' */
.icon-kabels-leidingen:before { content: '\e802'; } /* '' */
.icon-kunstwerken:before { content: '\e803'; } /* '' */
.icon-legenda:before { content: '\e804'; } /* '' */
.icon-meubilair:before { content: '\e805'; } /* '' */
.icon-riolering:before { content: '\e806'; } /* '' */
.icon-rioolgemalen:before { content: '\e807'; } /* '' */
.icon-speeltoestellen:before { content: '\e808'; } /* '' */
.icon-spoor-masten:before { content: '\e809'; } /* '' */
.icon-sport:before { content: '\e80a'; } /* '' */
.icon-verhardingen:before { content: '\e80b'; } /* '' */
.icon-verlichting:before { content: '\e80c'; } /* '' */
.icon-vri:before { content: '\e80d'; } /* '' */
.icon-water:before { content: '\e80e'; } /* '' */

1

There are 1 best solutions below

2
herrstrietzel On

Text elements are rendered from bottom (baseline position) to top

Y-coordinates in fillText() define the baseline position so ctx.fillText('\ue804', 0, 0); will render your text off-canvas.

canvas.width = 30;
canvas.height = 30;

document.fonts.ready.then((e) => {
  const ctx = canvas.getContext("2d");
  ctx.font = "30px fontello";
  ctx.fillText("\ue832", 0, 26);
  const dataURL = canvas.toDataURL("image/png");
  btnDownload.href=dataURL;
  dataUrlText.value = dataURL;
  //console.log(dataURL)
});
@font-face {
    font-family: 'fontello';
    src: url('data:font/woff2;charset=utf-8;base64,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') format('woff2');
    font-weight: normal;
    font-style: normal;
}


p{
  font-family:fontello
}


canvas{
  border: 1px solid #ccc
}
<p class="fontello">&#xe832;</p>
<canvas id="canvas"></canvas>
<textarea id="dataUrlText" style="width:100%; min-height:20em;"></textarea>
<a href="" id="btnDownload" download="icon.png">Download</a>