int GetCacheMesTextureID( char *msg, int font_size, int font_style ) { // キャッシュ済みのテクスチャIDを返す(OpenGLテクスチャIDを返す) // (作成されていないメッセージテクスチャは自動的に作成する) // (作成の必要がない場合は-1を返す) // GLuint id; int texid; int tsx,tsy; unsigned char *pImg; TEXINF *t; int mylen; short mycache; mycache = str2hash( msg, &mylen ); // キャッシュを取得 if ( mylen <= 0 ) return -1; texid = getCache( msg, mycache, font_size, font_style ); if ( texid >= 0 ) { return texid; // キャッシュがあった } // キャッシュが存在しないので作成 pImg = (unsigned char *)j_callFontBitmap( msg, font_size, font_style, &tsx, &tsy ); texid = MakeEmptyTex( tsx, tsy ); if ( texid < 0 ) return -1; t = GetTex( texid ); t->hash = mycache; t->font_size = font_size; t->font_style = font_style; if ( curmestex >= GetSysReq(SYSREQ_MESCACHE_MAX) ) { // エントリ数がオーバーしているものは次のフレームで破棄 t->life = 0; t->buf[0] = 0; } else { // キャッシュの登録 if ( mylen >= ( TEXMES_NAME_BUFFER - 1 ) ) { t->text = (char *)malloc( mylen+1 ); // テキストハッシュネーム用バッファを作成する strcpy( t->text, msg ); } else { strcpy( t->buf, msg ); // 標準バッファにコピーする } } id = (GLuint)t->texid; glBindTexture( GL_TEXTURE_2D, id ); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE); glPixelStorei( GL_UNPACK_ALIGNMENT, 1); glTexSubImage2D( GL_TEXTURE_2D, 0, (GLint)0, (GLint)0, (GLsizei)tsx, (GLsizei)tsy, GL_ALPHA, GL_UNSIGNED_BYTE, pImg ); glBindTexture(GL_TEXTURE_2D, 0); glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE); free(pImg); return texid; }
int GetCacheMesTextureID( char *msg, int font_size, int font_style ) { // キャッシュ済みのテクスチャIDを返す(OpenGLテクスチャIDを返す) // (作成されていないメッセージテクスチャは自動的に作成する) // (作成の必要がない場合は-1を返す) // #ifdef HSPNDK GLuint id; int texid; int tsx,tsy; unsigned char *pImg; TEXINF *t; int mylen; short mycache; mycache = str2hash( msg, &mylen ); // キャッシュを取得 if ( mylen <= 0 ) return -1; texid = getCache( msg, mycache, font_size, font_style ); if ( texid >= 0 ) { return texid; // キャッシュがあった } // キャッシュが存在しないので作成 pImg = (unsigned char *)j_callFontBitmap( msg, font_size, font_style, &tsx, &tsy ); texid = MakeEmptyTex( tsx, tsy ); if ( texid < 0 ) return -1; t = GetTex( texid ); t->hash = mycache; t->font_size = font_size; t->font_style = font_style; if ( curmestex >= GetSysReq(SYSREQ_MESCACHE_MAX) ) { // エントリ数がオーバーしているものは次のフレームで破棄 t->life = 0; t->buf[0] = 0; } else { // キャッシュの登録 if ( mylen >= ( TEXMES_NAME_BUFFER - 1 ) ) { t->text = (char *)malloc( mylen+1 ); // テキストハッシュネーム用バッファを作成する strcpy( t->text, msg ); } else { strcpy( t->buf, msg ); // 標準バッファにコピーする } } id = (GLuint)t->texid; glBindTexture( GL_TEXTURE_2D, id ); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE); glPixelStorei( GL_UNPACK_ALIGNMENT, 1); glTexSubImage2D( GL_TEXTURE_2D, 0, (GLint)0, (GLint)0, (GLsizei)tsx, (GLsizei)tsy, GL_ALPHA, GL_UNSIGNED_BYTE, pImg ); glBindTexture(GL_TEXTURE_2D, 0); glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE); free(pImg); return texid; #endif #ifdef HSPEMSCRIPTEN GLuint id; int texid; int tsx,tsy; unsigned char *pImg; TEXINF *t; int mylen; short mycache; mycache = str2hash( msg, &mylen ); // キャッシュを取得 if ( mylen <= 0 ) return -1; texid = getCache( msg, mycache, font_size, font_style ); if ( texid >= 0 ) { return texid; // キャッシュがあった } EM_ASM_({ var d = document.getElementById('hsp3dishFontDiv'); if (!d) { d = document.createElement("div"); d.id = 'hsp3dishFontDiv'; d.style.setProperty("width", "auto"); d.style.setProperty("height", "auto"); d.style.setProperty("position", "absolute"); d.style.setProperty("visibility", "hidden"); } d.style.setProperty("font", $1 + "px 'sans-serif'"); document.body.appendChild(d); var t = document.createTextNode(Pointer_stringify($0)); if (d.hasChildNodes()) d.removeChild(d.firstChild); d.appendChild(t); }, msg, font_size);