/** * Returns a pixel format identifier that is suitable for Java 2D's needs * (must have a stencil buffer, support for pbuffers, etc). If no * appropriate pixel format can be found, this method returns 0. */ static int WGLGC_GetPixelFormatForDC(HDC hdc) { int attrs[] = { WGL_PIXEL_TYPE_ARB, WGL_TYPE_RGBA_ARB, WGL_DRAW_TO_WINDOW_ARB, GL_TRUE, WGL_DRAW_TO_PBUFFER_ARB, GL_TRUE, WGL_BIND_TO_TEXTURE_RGB_ARB, GL_TRUE, WGL_DOUBLE_BUFFER_ARB, GL_TRUE, WGL_STENCIL_BITS_ARB, 1, 0 }; int pixfmt; int nfmts; J2dTraceLn(J2D_TRACE_INFO, "in WGLGC_GetPixelFormatForDC"); // find pixel format if (!j2d_wglChoosePixelFormatARB(hdc, attrs, NULL, 1, &pixfmt, &nfmts)) { J2dTraceLn(J2D_TRACE_ERROR, "error choosing pixel format"); return 0; } if (nfmts <= 0) { J2dTraceLn(J2D_TRACE_ERROR, "no pixel formats found"); return 0; } J2dTraceLn1(J2D_TRACE_VERBOSE, "chose pixel format: %d", pixfmt); return pixfmt; }
/** * Returns a pixel format identifier that is suitable for Java 2D's needs * (must have a depth buffer, support for pbuffers, etc). This method will * iterate through all pixel formats (if any) that match the requested * attributes and will attempt to find a pixel format with a minimal combined * depth+stencil buffer. Note that we currently only need depth capabilities * (for shape clipping purposes), but wglChoosePixelFormatARB() will often * return a list of pixel formats with the largest depth buffer (and stencil) * sizes at the top of the list. Therefore, we scan through the whole list * to find the most VRAM-efficient pixel format. If no appropriate pixel * format can be found, this method returns 0. */ static int WGLGC_GetPixelFormatForDC(HDC hdc) { int attrs[] = { WGL_PIXEL_TYPE_ARB, WGL_TYPE_RGBA_ARB, WGL_DRAW_TO_WINDOW_ARB, GL_TRUE, WGL_DRAW_TO_PBUFFER_ARB, GL_TRUE, WGL_DOUBLE_BUFFER_ARB, GL_TRUE, WGL_DEPTH_BITS_ARB, 16, // anything >= 16 will work for us 0 }; int pixfmts[32]; int chosenPixFmt = 0; int nfmts, i; // this is the initial minimum value for the combined depth+stencil size // (we initialize it to some absurdly high value; realistic values will // be much less than this number) int minDepthPlusStencil = 512; J2dRlsTraceLn(J2D_TRACE_INFO, "WGLGC_GetPixelFormatForDC"); // find all pixel formats (maximum of 32) with the provided attributes if (!j2d_wglChoosePixelFormatARB(hdc, attrs, NULL, 32, pixfmts, &nfmts)) { J2dRlsTraceLn(J2D_TRACE_ERROR, "WGLGC_GetPixelFormatForDC: error choosing pixel format"); return 0; } if (nfmts <= 0) { J2dRlsTraceLn(J2D_TRACE_ERROR, "WGLGC_GetPixelFormatForDC: no pixel formats found"); return 0; } J2dRlsTraceLn(J2D_TRACE_VERBOSE, " candidate pixel formats:"); // iterate through the list of pixel formats, looking for the one that // meets our requirements while keeping the combined depth+stencil sizes // to a minimum for (i = 0; i < nfmts; i++) { int attrKeys[] = { WGL_DEPTH_BITS_ARB, WGL_STENCIL_BITS_ARB, WGL_DOUBLE_BUFFER_ARB, WGL_ALPHA_BITS_ARB }; int attrVals[4]; int pixfmt = pixfmts[i]; int depth, stencil, db, alpha; j2d_wglGetPixelFormatAttribivARB(hdc, pixfmt, 0, 4, attrKeys, attrVals); depth = attrVals[0]; stencil = attrVals[1]; db = attrVals[2]; alpha = attrVals[3]; J2dRlsTrace5(J2D_TRACE_VERBOSE, "[V] pixfmt=%d db=%d alpha=%d depth=%d stencil=%d valid=", pixfmt, db, alpha, depth, stencil); if ((depth + stencil) < minDepthPlusStencil) { J2dRlsTrace(J2D_TRACE_VERBOSE, "true\n"); minDepthPlusStencil = depth + stencil; chosenPixFmt = pixfmt; } else { J2dRlsTrace(J2D_TRACE_VERBOSE, "false (large depth)\n"); } } if (chosenPixFmt == 0) { J2dRlsTraceLn(J2D_TRACE_ERROR, "WGLGC_GetPixelFormatForDC: could not find appropriate pixfmt"); return 0; } J2dRlsTraceLn1(J2D_TRACE_INFO, "WGLGC_GetPixelFormatForDC: chose %d as the best pixel format", chosenPixFmt); return chosenPixFmt; }