aboutsummaryrefslogtreecommitdiff
path: root/demos/freetype.html
blob: b605fdc3fe6d0b12b38718e9f14719dabee88f59 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
<html>
<head>
  <title>
    Emscripten: FreeType Demo
  </title>
  <script type="text/javascript">
    arguments = [];
    NO_RUN = 1;
  </script>
  <script src="freetype.cc.js"></script>
  <script type="text/javascript">
    // print function which the runtime will call
    function print(text) {
      //document.getElementById('output').innerHTML += text + '<br>';
    }

    // Override the _show_image in freetype.js.
    __Z10show_imagev = function() {
      var canvas = document.getElementById('canvas');
      var ctx = canvas.getContext('2d');
      var image = ctx.getImageData(0, 0, canvas.width, canvas.height);

      var ptr = IHEAP[_image];
      for (var y = 0; y < canvas.height; y++) {
        for (var x = 0; x < canvas.width; x++) {
          var value = IHEAP[ptr + y*canvas.width + x];
          var base = (y*canvas.width + x)*4;
          image.data[base + 0] = value;
          image.data[base + 1] = value;
          image.data[base + 2] = value;
          image.data[base + 3] = 255;
        }
      }
      ctx.putImageData(image, 0, 0);
    };

    function render(angle, text) {
      var canvas = document.getElementById('canvas');
      canvas.width = 600;
      canvas.height = 200;

      run(['font.ttf', text, canvas.width.toString(), canvas.height.toString(), angle.toString()]); // will call _show_image, above
    }
  </script>
</head>
<body onload="render(10, 'Hello world!')">
  <h1>TrueType Fonts in JavaScript</h1>
  <p>This is a demo of <a href="http://www.freetype.org/">FreeType</a>, an open source font engine written in C++,
  compiled to JavaScript using <a href="http://emscripten.org">Emscripten</a>. A <a href="http://en.wikipedia.org/wiki/TrueType">TrueType</a> font
  (<a href="https://fedorahosted.org/liberation-fonts/">Liberation Sans Bold</a>) is loaded in FreeType and used to render text, all entirely in JavaScript.
  </p>
  <p>(Note: The demo is a proof of concept and <b>not</b> optimized for speed. For example, the font file is
  loaded and parsed every time text is rendered. Also, the code is a debug build with runtime checks for
  validity.)</p>
  <p>Why was this demo done? Just to show it's possible, and definitely not to suggest people should do things this way.
     If you want nice fonts on the web, use <a href="http://en.wikipedia.org/wiki/Web_Open_Font_Format">WOFF</a>.</p>
  <hr>
  <canvas id='canvas' width=1 height=1></canvas>
  <hr>
  <form onsubmit="render(parseInt(angle.value), texty.value); return false">
    Text: <input type="text" name="texty" value="Hello world!"><br>
    Angle (in degrees): <input type="text" name="angle" value="10"><br>
    <input type="submit" value="Go!">
  </form>
  <div id="output" style="font-family: Courier New,Courier,monospace;"></div>
</body>
</html>