HRESULT D3DGlyphCache::Init(D3DContext *pCtx) { D3DFORMAT format; RETURN_STATUS_IF_NULL(pCtx, E_FAIL); J2dTraceLn1(J2D_TRACE_INFO, "D3DGlyphCache::Init pCtx=%x", pCtx); this->pCtx = pCtx; if (pGlyphCache == NULL) { // init glyph cache data structure pGlyphCache = AccelGlyphCache_Init(D3DTR_CACHE_WIDTH, D3DTR_CACHE_HEIGHT, D3DTR_CACHE_CELL_WIDTH, D3DTR_CACHE_CELL_HEIGHT, D3DGlyphCache_FlushGlyphVertexCache); if (pGlyphCache == NULL) { J2dRlsTraceLn(J2D_TRACE_ERROR, "D3DGlyphCache::Init: "\ "could not init D3D glyph cache"); return E_FAIL; } } if (gcType == CACHE_GRAY) { format = pCtx->IsTextureFormatSupported(D3DFMT_A8) ? D3DFMT_A8 : D3DFMT_A8R8G8B8; } else { // gcType == CACHE_LCD format = pCtx->IsTextureFormatSupported(D3DFMT_R8G8B8) ? D3DFMT_R8G8B8 : D3DFMT_A8R8G8B8; } HRESULT res = pCtx->GetResourceManager()-> CreateTexture(D3DTR_CACHE_WIDTH, D3DTR_CACHE_HEIGHT, FALSE/*isRTT*/, FALSE/*isOpaque*/, &format, 0/*usage*/, &pGlyphCacheRes); if (FAILED(res)) { J2dRlsTraceLn(J2D_TRACE_ERROR, "D3DGlyphCache::Init: "\ "could not create glyph cache texture"); } return res; }
/** * Initializes the one glyph cache (texture and data structure). * If lcdCache is JNI_TRUE, the texture will contain RGB data, * otherwise we will simply store the grayscale/monochrome glyph images * as intensity values (which work well with the GL_MODULATE function). */ static jboolean OGLTR_InitGlyphCache(jboolean lcdCache) { GlyphCacheInfo *gcinfo; GLclampf priority = 1.0f; GLenum internalFormat = lcdCache ? GL_RGB8 : GL_INTENSITY8; GLenum pixelFormat = lcdCache ? GL_RGB : GL_LUMINANCE; J2dTraceLn(J2D_TRACE_INFO, "OGLTR_InitGlyphCache"); // init vertex cache (if it hasn't been already) if (!OGLVertexCache_InitVertexCache()) { return JNI_FALSE; } // init glyph cache data structure gcinfo = AccelGlyphCache_Init(OGLTR_CACHE_WIDTH, OGLTR_CACHE_HEIGHT, OGLTR_CACHE_CELL_WIDTH, OGLTR_CACHE_CELL_HEIGHT, OGLVertexCache_FlushVertexCache); if (gcinfo == NULL) { J2dRlsTraceLn(J2D_TRACE_ERROR, "OGLTR_InitGlyphCache: could not init OGL glyph cache"); return JNI_FALSE; } // init cache texture object j2d_glGenTextures(1, &gcinfo->cacheID); j2d_glBindTexture(GL_TEXTURE_2D, gcinfo->cacheID); j2d_glPrioritizeTextures(1, &gcinfo->cacheID, &priority); j2d_glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); j2d_glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); j2d_glTexImage2D(GL_TEXTURE_2D, 0, internalFormat, OGLTR_CACHE_WIDTH, OGLTR_CACHE_HEIGHT, 0, pixelFormat, GL_UNSIGNED_BYTE, NULL); cacheStatus = (lcdCache ? CACHE_LCD : CACHE_GRAY); glyphCache = gcinfo; return JNI_TRUE; }