HRESULT D3DTR_EnableGlyphVertexCache(D3DContext *d3dc) { J2dTraceLn(J2D_TRACE_INFO, "D3DTR_EnableGlyphVertexCache"); IDirect3DDevice9 *pd3dDevice = d3dc->Get3DDevice(); D3DTEXTUREFILTERTYPE fhint = d3dc->IsTextureFilteringSupported(D3DTEXF_NONE) ? D3DTEXF_NONE : D3DTEXF_POINT; pd3dDevice->SetSamplerState(0, D3DSAMP_MAGFILTER, fhint); pd3dDevice->SetSamplerState(0, D3DSAMP_MINFILTER, fhint); // glyph cache had been successfully initialized if we got here D3DResource *pGlyphCacheTexRes = d3dc->GetGrayscaleGlyphCache()->GetGlyphCacheTexture(); return d3dc->SetTexture(pGlyphCacheTexRes->GetTexture(), 0); }
HRESULT D3DResourceManager::GetStockTextureResource(UINT width, UINT height, BOOL isRTT, BOOL isOpaque, D3DFORMAT *pFormat/*in/out*/, DWORD dwUsage, D3DResource **ppTextureResource) { D3DResource *pResource = *ppTextureResource; if (pResource != NULL) { if (pResource->GetTexture() != NULL) { return S_OK; } ReleaseResource(pResource); *ppTextureResource = NULL; } return CreateTexture(width, height, isRTT, isOpaque, pFormat, dwUsage, ppTextureResource); }
HRESULT D3DMaskCache::Enable() { HRESULT res; J2dTraceLn(J2D_TRACE_INFO, "D3DMaskCache::Enable"); D3DResource *pMaskTexRes; res = pCtx->GetResourceManager()->GetMaskTexture(&pMaskTexRes); RETURN_STATUS_IF_FAILED(res); res = pCtx->SetTexture(pMaskTexRes->GetTexture(), 0); IDirect3DDevice9 *pd3dDevice = pCtx->Get3DDevice(); D3DTEXTUREFILTERTYPE fhint = pCtx->IsTextureFilteringSupported(D3DTEXF_NONE) ? D3DTEXF_NONE : D3DTEXF_POINT; pd3dDevice->SetSamplerState(0, D3DSAMP_MAGFILTER, fhint); pd3dDevice->SetSamplerState(0, D3DSAMP_MINFILTER, fhint); return res; }
HRESULT D3DBufImgOps_EnableLookupOp(D3DContext *d3dc, jboolean nonPremult, jboolean shortData, jint numBands, jint bandLength, jint offset, void *tableValues) { HRESULT res; IDirect3DDevice9 *pd3dDevice; D3DResource *pLutTexRes; IDirect3DTexture9 *pLutTex; int bytesPerElem = (shortData ? 2 : 1); jfloat foffsets[4]; void *bands[4]; int i; jint flags = 0; J2dTraceLn4(J2D_TRACE_INFO, "D3DBufImgOps_EnableLookupOp: short=%d num=%d len=%d off=%d", shortData, numBands, bandLength, offset); RETURN_STATUS_IF_NULL(d3dc, E_FAIL); d3dc->UpdateState(STATE_CHANGE); // choose the appropriate shader, depending on the source image // and the number of bands involved if (numBands != 4) { flags |= LOOKUP_USE_SRC_ALPHA; } if (nonPremult) { flags |= LOOKUP_NON_PREMULT; } // locate/enable the shader program for the given flags res = d3dc->EnableLookupProgram(flags); RETURN_STATUS_IF_FAILED(res); // update the "uniform" offset value for (i = 0; i < 4; i++) { foffsets[i] = offset / 255.0f; } pd3dDevice = d3dc->Get3DDevice(); pd3dDevice->SetPixelShaderConstantF(0, foffsets, 1); res = d3dc->GetResourceManager()->GetLookupOpLutTexture(&pLutTexRes); RETURN_STATUS_IF_FAILED(res); pLutTex = pLutTexRes->GetTexture(); // update the lookup table with the user-provided values if (numBands == 1) { // replicate the single band for R/G/B; alpha band is unused for (i = 0; i < 3; i++) { bands[i] = tableValues; } bands[3] = NULL; } else if (numBands == 3) { // user supplied band for each of R/G/B; alpha band is unused for (i = 0; i < 3; i++) { bands[i] = PtrAddBytes(tableValues, i*bandLength*bytesPerElem); } bands[3] = NULL; } else if (numBands == 4) { // user supplied band for each of R/G/B/A for (i = 0; i < 4; i++) { bands[i] = PtrAddBytes(tableValues, i*bandLength*bytesPerElem); } } // upload the bands one row at a time into our lookup table texture D3DLOCKED_RECT lockedRect; res = pLutTex->LockRect(0, &lockedRect, NULL, D3DLOCK_NOSYSLOCK); RETURN_STATUS_IF_FAILED(res); jushort *pBase = (jushort*)lockedRect.pBits; for (i = 0; i < 4; i++) { jushort *pDst; if (bands[i] == NULL) { continue; } pDst = pBase + (i * 256); if (shortData) { memcpy(pDst, bands[i], bandLength*sizeof(jushort)); } else { int j; jubyte *pSrc = (jubyte *)bands[i]; for (j = 0; j < bandLength; j++) { pDst[j] = (jushort)(pSrc[j] << 8); } } } pLutTex->UnlockRect(0); // bind the lookup table to texture unit 1 and enable texturing res = d3dc->SetTexture(pLutTex, 1); pd3dDevice->SetSamplerState(1, D3DSAMP_ADDRESSU, D3DTADDRESS_CLAMP); pd3dDevice->SetSamplerState(1, D3DSAMP_ADDRESSV, D3DTADDRESS_CLAMP); pd3dDevice->SetSamplerState(1, D3DSAMP_MAGFILTER, D3DTEXF_LINEAR); pd3dDevice->SetSamplerState(1, D3DSAMP_MINFILTER, D3DTEXF_LINEAR); return res; }
/** * REMIND: This method assumes that the dimensions of the incoming pixel * array are less than or equal to the cached blit texture tile; * these are rather fragile assumptions, and should be cleaned up... */ HRESULT D3DMaskBlit_MaskBlit(JNIEnv *env, D3DContext *d3dc, jint dstx, jint dsty, jint width, jint height, void *pPixels) { HRESULT res = S_OK; jfloat dx1, dy1, dx2, dy2; jfloat tx1, ty1, tx2, ty2; J2dTraceLn(J2D_TRACE_INFO, "D3DMaskBlit_MaskBlit"); if (width <= 0 || height <= 0) { J2dTraceLn(J2D_TRACE_WARNING, "D3DMaskBlit_MaskBlit: invalid dimensions"); return res; } RETURN_STATUS_IF_NULL(pPixels, E_FAIL); RETURN_STATUS_IF_NULL(d3dc, E_FAIL); if (FAILED(res = d3dc->BeginScene(STATE_TEXTUREOP))) { return res; } D3DResource *pBlitTexRes; if (FAILED(res = d3dc->GetResourceManager()->GetBlitTexture(&pBlitTexRes))) { return res; } IDirect3DTexture9 *pBlitTex = pBlitTexRes->GetTexture(); if (FAILED(res = d3dc->SetTexture(pBlitTex, 0))) { return res; } IDirect3DDevice9 *pd3dDevice = d3dc->Get3DDevice(); D3DTEXTUREFILTERTYPE fhint = d3dc->IsTextureFilteringSupported(D3DTEXF_NONE) ? D3DTEXF_NONE : D3DTEXF_POINT; pd3dDevice->SetSamplerState(0, D3DSAMP_MAGFILTER, fhint); pd3dDevice->SetSamplerState(0, D3DSAMP_MINFILTER, fhint); // copy system memory IntArgbPre surface into cached texture if (FAILED(res = d3dc->UploadTileToTexture(pBlitTexRes, pPixels, 0, 0, 0, 0, width, height, width*4, TILEFMT_4BYTE_ARGB_PRE))) { return res; } dx1 = (jfloat)dstx; dy1 = (jfloat)dsty; dx2 = dx1 + width; dy2 = dy1 + height; tx1 = 0.0f; ty1 = 0.0f; tx2 = ((jfloat)width) / D3DC_BLIT_TILE_SIZE; ty2 = ((jfloat)height) / D3DC_BLIT_TILE_SIZE; // render cached texture to the destination surface res = d3dc->pVCacher->DrawTexture(dx1, dy1, dx2, dy2, tx1, ty1, tx2, ty2); res = d3dc->pVCacher->Render(); return res; }