< prev index next >
src/java.desktop/share/native/common/java2d/opengl/OGLPaints.c
Print this page
*** 380,440 ****
* The handle to the gradient color table texture object used by the shaders.
*/
static GLuint multiGradientTexID = 0;
/**
- * This is essentially a template of the shader source code that can be used
- * for either LinearGradientPaint or RadialGradientPaint. It includes the
- * structure and some variables that are common to each; the remaining
- * code snippets (for CycleMethod, ColorSpaceType, and mask modulation)
- * are filled in prior to compiling the shader at runtime depending on the
- * paint parameters. See OGLPaints_CreateMultiGradProgram() for more details.
- */
- static const char *multiGradientShaderSource =
- // gradient texture size (in texels)
- "const int TEXTURE_SIZE = %d;"
- // maximum number of fractions/colors supported by this shader
- "const int MAX_FRACTIONS = %d;"
- // size of a single texel
- "const float FULL_TEXEL = (1.0 / float(TEXTURE_SIZE));"
- // size of half of a single texel
- "const float HALF_TEXEL = (FULL_TEXEL / 2.0);"
- // texture containing the gradient colors
- "uniform sampler1D colors;"
- // array of gradient stops/fractions
- "uniform float fractions[MAX_FRACTIONS];"
- // array of scale factors (one for each interval)
- "uniform float scaleFactors[MAX_FRACTIONS-1];"
- // (placeholder for mask variable)
- "%s"
- // (placeholder for Linear/RadialGP-specific variables)
- "%s"
- ""
- "void main(void)"
- "{"
- " float dist;"
- // (placeholder for Linear/RadialGradientPaint-specific code)
- " %s"
- ""
- " float tc;"
- // (placeholder for CycleMethod-specific code)
- " %s"
- ""
- // calculate interpolated color
- " vec4 result = texture1D(colors, tc);"
- ""
- // (placeholder for ColorSpace conversion code)
- " %s"
- ""
- // (placeholder for mask modulation code)
- " %s"
- ""
- // modulate with gl_Color in order to apply extra alpha
- " gl_FragColor = result * gl_Color;"
- "}";
-
- /**
* This code takes a "dist" value as input (as calculated earlier by the
* LGP/RGP-specific code) in the range [0,1] and produces a texture
* coordinate value "tc" that represents the position of the chosen color
* in the one-dimensional gradient texture (also in the range [0,1]).
*
--- 380,389 ----
*** 474,506 ****
"}"
// we offset by half a texel so that we find the linearly interpolated
// color between the two texel centers of interest
"tc = HALF_TEXEL + (FULL_TEXEL * relFraction);";
- /** Code for NO_CYCLE that gets plugged into the CycleMethod placeholder. */
- static const char *noCycleCode =
- "if (dist <= 0.0) {"
- " tc = 0.0;"
- "} else if (dist >= 1.0) {"
- " tc = 1.0;"
- "} else {"
- // (placeholder for texcoord calculation)
- " %s"
- "}";
-
- /** Code for REFLECT that gets plugged into the CycleMethod placeholder. */
- static const char *reflectCode =
- "dist = 1.0 - (abs(fract(dist * 0.5) - 0.5) * 2.0);"
- // (placeholder for texcoord calculation)
- "%s";
-
- /** Code for REPEAT that gets plugged into the CycleMethod placeholder. */
- static const char *repeatCode =
- "dist = fract(dist);"
- // (placeholder for texcoord calculation)
- "%s";
-
static void
OGLPaints_InitMultiGradientTexture()
{
GLclampf priority = 1.0f;
--- 423,432 ----
*** 576,595 ****
colorSpaceCode =
"result.rgb = 1.055 * pow(result.rgb, vec3(0.416667)) - 0.055;";
}
if (cycleMethod == CYCLE_NONE) {
! sprintf(cycleCode, noCycleCode, texCoordCalcCode);
} else if (cycleMethod == CYCLE_REFLECT) {
! sprintf(cycleCode, reflectCode, texCoordCalcCode);
} else { // (cycleMethod == CYCLE_REPEAT)
! sprintf(cycleCode, repeatCode, texCoordCalcCode);
}
// compose the final source code string from the various pieces
! sprintf(finalSource, multiGradientShaderSource,
! MAX_COLORS, maxFractions,
maskVars, paintVars, distCode,
cycleCode, colorSpaceCode, maskCode);
multiGradProgram = OGLContext_CreateFragmentProgram(finalSource);
if (multiGradProgram == 0) {
--- 502,586 ----
colorSpaceCode =
"result.rgb = 1.055 * pow(result.rgb, vec3(0.416667)) - 0.055;";
}
if (cycleMethod == CYCLE_NONE) {
! sprintf(cycleCode,
! /** Code for NO_CYCLE that gets plugged into the CycleMethod placeholder. */
! "if (dist <= 0.0) {"
! " tc = 0.0;"
! "} else if (dist >= 1.0) {"
! " tc = 1.0;"
! "} else {"
! // (placeholder for texcoord calculation)
! " %s"
! "}", texCoordCalcCode);
} else if (cycleMethod == CYCLE_REFLECT) {
! sprintf(cycleCode,
! /** Code for REFLECT that gets plugged into the CycleMethod placeholder. */
! "dist = 1.0 - (abs(fract(dist * 0.5) - 0.5) * 2.0);"
! // (placeholder for texcoord calculation)
! "%s", texCoordCalcCode);
} else { // (cycleMethod == CYCLE_REPEAT)
! sprintf(cycleCode,
! /** Code for REPEAT that gets plugged into the CycleMethod placeholder. */
! "dist = fract(dist);"
! // (placeholder for texcoord calculation)
! "%s", texCoordCalcCode);
}
// compose the final source code string from the various pieces
! sprintf(finalSource,
! /**
! * This is essentially a template of the shader source code that can be used
! * for either LinearGradientPaint or RadialGradientPaint. It includes the
! * structure and some variables that are common to each; the remaining
! * code snippets (for CycleMethod, ColorSpaceType, and mask modulation)
! * are filled in prior to compiling the shader at runtime depending on the
! * paint parameters. See OGLPaints_CreateMultiGradProgram() for more details.
! */
! // gradient texture size (in texels)
! "const int TEXTURE_SIZE = %d;"
! // maximum number of fractions/colors supported by this shader
! "const int MAX_FRACTIONS = %d;"
! // size of a single texel
! "const float FULL_TEXEL = (1.0 / float(TEXTURE_SIZE));"
! // size of half of a single texel
! "const float HALF_TEXEL = (FULL_TEXEL / 2.0);"
! // texture containing the gradient colors
! "uniform sampler1D colors;"
! // array of gradient stops/fractions
! "uniform float fractions[MAX_FRACTIONS];"
! // array of scale factors (one for each interval)
! "uniform float scaleFactors[MAX_FRACTIONS-1];"
! // (placeholder for mask variable)
! "%s"
! // (placeholder for Linear/RadialGP-specific variables)
! "%s"
! ""
! "void main(void)"
! "{"
! " float dist;"
! // (placeholder for Linear/RadialGradientPaint-specific code)
! " %s"
! ""
! " float tc;"
! // (placeholder for CycleMethod-specific code)
! " %s"
! ""
! // calculate interpolated color
! " vec4 result = texture1D(colors, tc);"
! ""
! // (placeholder for ColorSpace conversion code)
! " %s"
! ""
! // (placeholder for mask modulation code)
! " %s"
! ""
! // modulate with gl_Color in order to apply extra alpha
! " gl_FragColor = result * gl_Color;"
! "}", MAX_COLORS, maxFractions,
maskVars, paintVars, distCode,
cycleCode, colorSpaceCode, maskCode);
multiGradProgram = OGLContext_CreateFragmentProgram(finalSource);
if (multiGradProgram == 0) {
< prev index next >