2017年6月16日金曜日

HTMLで炎に燃える文字

野球中継を見ていたら、バックスクリーンに炎に燃える文字が出てまして。

文字が燃えてるんじゃなくて、文字のフォント部分の背景が燃えてるんですね。

で、こいつをHTMLでできるんじゃないかとやってみたよ。


<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<style>
<!--
.fireback
{
text-align: center;
line-height: 1.1;
font-size: 5em;
font-weight: bold;
display: inline-block;
margin: .45em;
padding: .5em .75em;
color: #fff;
background-color: #000;
background-image: url(./fire.gif);
background-repeat: no-repeat;
-webkit-background-clip: text;
-webkit-text-fill-color: transparent;
}
-->
</style>
</head>
<body>
<div class="fireback">
熱男<br>
</div>
</body>
</html>

ここから実際の表示を見ることができます。

2017年6月13日火曜日

___iob_func リンクエラー

以前のプロジェクトを、VisualStudio 2015 で再構築すると、
Error LNK2019: unresolved external symbol ___iob_func referenced in function 
というエラーでビルドに失敗しました。

ちょいと調べてみたら VS2015より前のバージョンでは
#define stdin  (&__iob_func()[0])
#define stdout (&__iob_func()[1])
#define stderr (&__iob_func()[2])
が定義されていて

VS2015では#define stdin  (__acrt_iob_func(0))
#define stdout (__acrt_iob_func(1))
#define stderr (__acrt_iob_func(2))
と定義が異なっているためのエラーのようです。

そう、一部のライブラリについて古いバージョンでのビルドを利用してるわけです。
すべてのライブラリを VS2015 で再ビルドすればいいのですが、よそのプロジェクトだったりしてめんどくさい。

___iob_func はないので、つくっちまおう。ということで。
FILE _iob[] = {*stdin, *stdout, *stderr};

extern "C" FILE * __cdecl __iob_func(void)
{
    return _iob;
}

ってのを書いてビルドしたら動作するようになりました。
次にビルドするときのために記録しておこ。

参考
https://stackoverflow.com/questions/30412951/unresolved-external-symbol-imp-fprintf-and-imp-iob-func-sdl2