void D3DGlyphCache::ReleaseDefPoolResources() { J2dTraceLn(J2D_TRACE_INFO, "D3DGlyphCache::ReleaseDefPoolResources"); AccelGlyphCache_Invalidate(pGlyphCache); // REMIND: the glyph cache texture is not in the default pool, so // this can be optimized not to release the texture pCtx->GetResourceManager()->ReleaseResource(pGlyphCacheRes); pGlyphCacheRes = NULL; }
HRESULT D3DGlyphCache::CheckGlyphCacheByteOrder(jboolean rgbOrder) { J2dTraceLn(J2D_TRACE_INFO, "D3DGlyphCache::CheckGlyphCacheByteOrder"); if (gcType != CACHE_LCD) { J2dTraceLn(J2D_TRACE_ERROR, "D3DGlyphCache::CheckGlyphCacheByteOrder"\ " invoked on CACHE_GRAY cache type instance!"); return E_FAIL; } if (rgbOrder != lastRGBOrder) { // need to invalidate the cache in this case; see comments // for lastRGBOrder AccelGlyphCache_Invalidate(pGlyphCache); lastRGBOrder = rgbOrder; } tileFormat = rgbOrder ? TILEFMT_3BYTE_RGB : TILEFMT_3BYTE_BGR; return S_OK; }
static jboolean OGLTR_DrawLCDGlyphViaCache(OGLContext *oglc, OGLSDOps *dstOps, GlyphInfo *ginfo, jint x, jint y, jint glyphIndex, jint totalGlyphs, jboolean rgbOrder, jint contrast) { CacheCellInfo *cell; jint dx1, dy1, dx2, dy2; jfloat dtx1, dty1, dtx2, dty2; if (glyphMode != MODE_USE_CACHE_LCD) { OGLTR_DisableGlyphModeState(); CHECK_PREVIOUS_OP(GL_TEXTURE_2D); j2d_glPixelStorei(GL_UNPACK_ALIGNMENT, 1); if (glyphCache == NULL) { if (!OGLTR_InitGlyphCache(JNI_TRUE)) { return JNI_FALSE; } } if (rgbOrder != lastRGBOrder) { // need to invalidate the cache in this case; see comments // for lastRGBOrder above AccelGlyphCache_Invalidate(glyphCache); lastRGBOrder = rgbOrder; } if (!OGLTR_EnableLCDGlyphModeState(glyphCache->cacheID, contrast)) { return JNI_FALSE; } // when a fragment shader is enabled, the texture function state is // ignored, so the following line is not needed... // OGLC_UPDATE_TEXTURE_FUNCTION(oglc, GL_MODULATE); glyphMode = MODE_USE_CACHE_LCD; } if (ginfo->cellInfo == NULL) { // rowBytes will always be a multiple of 3, so the following is safe j2d_glPixelStorei(GL_UNPACK_ROW_LENGTH, ginfo->rowBytes / 3); // make sure the glyph cache texture is bound to texture unit 0 j2d_glActiveTextureARB(GL_TEXTURE0_ARB); // attempt to add glyph to accelerated glyph cache OGLTR_AddToGlyphCache(ginfo, rgbOrder); if (ginfo->cellInfo == NULL) { // we'll just no-op in the rare case that the cell is NULL return JNI_TRUE; } } cell = (CacheCellInfo *) (ginfo->cellInfo); cell->timesRendered++; // location of the glyph in the destination's coordinate space dx1 = x; dy1 = y; dx2 = dx1 + ginfo->width; dy2 = dy1 + ginfo->height; // copy destination into second cached texture, if necessary OGLTR_UpdateCachedDestination(dstOps, ginfo, dx1, dy1, dx2, dy2, glyphIndex, totalGlyphs); // texture coordinates of the destination tile dtx1 = ((jfloat)(dx1 - cachedDestBounds.x1)) / OGLTR_CACHED_DEST_WIDTH; dty1 = ((jfloat)(cachedDestBounds.y2 - dy1)) / OGLTR_CACHED_DEST_HEIGHT; dtx2 = ((jfloat)(dx2 - cachedDestBounds.x1)) / OGLTR_CACHED_DEST_WIDTH; dty2 = ((jfloat)(cachedDestBounds.y2 - dy2)) / OGLTR_CACHED_DEST_HEIGHT; // render composed texture to the destination surface j2d_glBegin(GL_QUADS); j2d_glMultiTexCoord2fARB(GL_TEXTURE0_ARB, cell->tx1, cell->ty1); j2d_glMultiTexCoord2fARB(GL_TEXTURE1_ARB, dtx1, dty1); j2d_glVertex2i(dx1, dy1); j2d_glMultiTexCoord2fARB(GL_TEXTURE0_ARB, cell->tx2, cell->ty1); j2d_glMultiTexCoord2fARB(GL_TEXTURE1_ARB, dtx2, dty1); j2d_glVertex2i(dx2, dy1); j2d_glMultiTexCoord2fARB(GL_TEXTURE0_ARB, cell->tx2, cell->ty2); j2d_glMultiTexCoord2fARB(GL_TEXTURE1_ARB, dtx2, dty2); j2d_glVertex2i(dx2, dy2); j2d_glMultiTexCoord2fARB(GL_TEXTURE0_ARB, cell->tx1, cell->ty2); j2d_glMultiTexCoord2fARB(GL_TEXTURE1_ARB, dtx1, dty2); j2d_glVertex2i(dx1, dy2); j2d_glEnd(); return JNI_TRUE; }