/** * Compiles and links the LCD text shader program. If successful, this * function returns a handle to the newly created shader program; otherwise * returns 0. */ static GLhandleARB OGLTR_CreateLCDTextProgram() { GLhandleARB lcdTextProgram; GLint loc; J2dTraceLn(J2D_TRACE_INFO, "OGLTR_CreateLCDTextProgram"); lcdTextProgram = OGLContext_CreateFragmentProgram(lcdTextShaderSource); if (lcdTextProgram == 0) { J2dRlsTraceLn(J2D_TRACE_ERROR, "OGLTR_CreateLCDTextProgram: error creating program"); return 0; } // "use" the program object temporarily so that we can set the uniforms j2d_glUseProgramObjectARB(lcdTextProgram); // set the "uniform" values loc = j2d_glGetUniformLocationARB(lcdTextProgram, "glyph_tex"); j2d_glUniform1iARB(loc, 0); // texture unit 0 loc = j2d_glGetUniformLocationARB(lcdTextProgram, "dst_tex"); j2d_glUniform1iARB(loc, 1); // texture unit 1 loc = j2d_glGetUniformLocationARB(lcdTextProgram, "invgamma_tex"); j2d_glUniform1iARB(loc, 2); // texture unit 2 loc = j2d_glGetUniformLocationARB(lcdTextProgram, "gamma_tex"); j2d_glUniform1iARB(loc, 3); // texture unit 3 // "unuse" the program object; it will be re-bound later as needed j2d_glUseProgramObjectARB(0); return lcdTextProgram; }
/** * Disables any pending state associated with the current "glyph mode". */ static void OGLTR_DisableGlyphModeState() { switch (glyphMode) { case MODE_NO_CACHE_LCD: j2d_glPixelStorei(GL_UNPACK_SKIP_PIXELS, 0); j2d_glPixelStorei(GL_UNPACK_SKIP_ROWS, 0); /* FALLTHROUGH */ case MODE_USE_CACHE_LCD: j2d_glPixelStorei(GL_UNPACK_ROW_LENGTH, 0); j2d_glPixelStorei(GL_UNPACK_ALIGNMENT, 4); j2d_glUseProgramObjectARB(0); j2d_glActiveTextureARB(GL_TEXTURE3_ARB); j2d_glDisable(GL_TEXTURE_3D); j2d_glActiveTextureARB(GL_TEXTURE2_ARB); j2d_glDisable(GL_TEXTURE_3D); j2d_glActiveTextureARB(GL_TEXTURE1_ARB); j2d_glDisable(GL_TEXTURE_2D); j2d_glActiveTextureARB(GL_TEXTURE0_ARB); break; case MODE_NO_CACHE_GRAY: case MODE_USE_CACHE_GRAY: case MODE_NOT_INITED: default: break; } }
void OGLPaints_ResetPaint(OGLContext *oglc) { jubyte ea; J2dTraceLn(J2D_TRACE_INFO, "OGLPaints_ResetPaint"); RETURN_IF_NULL(oglc); J2dTraceLn1(J2D_TRACE_VERBOSE, " state=%d", oglc->paintState); RESET_PREVIOUS_OP(); if (oglc->useMask) { // switch to texture unit 1, where paint state is currently enabled j2d_glActiveTextureARB(GL_TEXTURE1_ARB); } switch (oglc->paintState) { case sun_java2d_SunGraphics2D_PAINT_GRADIENT: j2d_glDisable(GL_TEXTURE_1D); j2d_glDisable(GL_TEXTURE_GEN_S); break; case sun_java2d_SunGraphics2D_PAINT_TEXTURE: // Note: The texture object used in SetTexturePaint() will // still be bound at this point, so it is safe to call the following. OGLSD_RESET_TEXTURE_WRAP(GL_TEXTURE_2D); j2d_glDisable(GL_TEXTURE_2D); j2d_glDisable(GL_TEXTURE_GEN_S); j2d_glDisable(GL_TEXTURE_GEN_T); break; case sun_java2d_SunGraphics2D_PAINT_LIN_GRADIENT: case sun_java2d_SunGraphics2D_PAINT_RAD_GRADIENT: j2d_glUseProgramObjectARB(0); j2d_glDisable(GL_TEXTURE_1D); break; case sun_java2d_SunGraphics2D_PAINT_ALPHACOLOR: default: break; } if (oglc->useMask) { // restore control to texture unit 0 j2d_glActiveTextureARB(GL_TEXTURE0_ARB); } // set each component of the current color state to the extra alpha // value, which will effectively apply the extra alpha to each fragment // in paint/texturing operations ea = (jubyte)(oglc->extraAlpha * 0xff + 0.5f); j2d_glColor4ub(ea, ea, ea, ea); oglc->pixel = (ea << 24) | (ea << 16) | (ea << 8) | (ea << 0); oglc->r = ea; oglc->g = ea; oglc->b = ea; oglc->a = ea; oglc->useMask = JNI_FALSE; oglc->paintState = -1; }
/** * Enables the LCD text shader and updates any related state, such as the * gamma lookup table textures. */ static jboolean OGLTR_EnableLCDGlyphModeState(GLuint glyphTextureID, jint contrast) { // bind the texture containing glyph data to texture unit 0 j2d_glActiveTextureARB(GL_TEXTURE0_ARB); j2d_glBindTexture(GL_TEXTURE_2D, glyphTextureID); // bind the texture tile containing destination data to texture unit 1 j2d_glActiveTextureARB(GL_TEXTURE1_ARB); if (cachedDestTextureID == 0) { cachedDestTextureID = OGLContext_CreateBlitTexture(GL_RGB8, GL_RGB, OGLTR_CACHED_DEST_WIDTH, OGLTR_CACHED_DEST_HEIGHT); if (cachedDestTextureID == 0) { return JNI_FALSE; } } j2d_glBindTexture(GL_TEXTURE_2D, cachedDestTextureID); // note that GL_TEXTURE_2D was already enabled for texture unit 0, // but we need to explicitly enable it for texture unit 1 j2d_glEnable(GL_TEXTURE_2D); // create the LCD text shader, if necessary if (lcdTextProgram == 0) { lcdTextProgram = OGLTR_CreateLCDTextProgram(); if (lcdTextProgram == 0) { return JNI_FALSE; } } // enable the LCD text shader j2d_glUseProgramObjectARB(lcdTextProgram); // update the current contrast settings, if necessary if (lastLCDContrast != contrast) { if (!OGLTR_UpdateLCDTextContrast(contrast)) { return JNI_FALSE; } lastLCDContrast = contrast; } // update the current color settings if (!OGLTR_UpdateLCDTextColor(contrast)) { return JNI_FALSE; } // bind the gamma LUT textures j2d_glActiveTextureARB(GL_TEXTURE2_ARB); j2d_glBindTexture(GL_TEXTURE_3D, invGammaLutTextureID); j2d_glEnable(GL_TEXTURE_3D); j2d_glActiveTextureARB(GL_TEXTURE3_ARB); j2d_glBindTexture(GL_TEXTURE_3D, gammaLutTextureID); j2d_glEnable(GL_TEXTURE_3D); return JNI_TRUE; }