FX_BOOL CPDF_StitchFunc::v_Call(FX_FLOAT* inputs, FX_FLOAT* outputs) const { FX_FLOAT input = inputs[0]; size_t i; for (i = 0; i < m_pSubFunctions.size() - 1; i++) { if (input < m_pBounds[i + 1]) break; } input = PDF_Interpolate(input, m_pBounds[i], m_pBounds[i + 1], m_pEncode[i * 2], m_pEncode[i * 2 + 1]); int nresults; m_pSubFunctions[i]->Call(&input, kRequiredNumInputs, outputs, nresults); return TRUE; }
FX_BOOL CPDF_StitchFunc::v_Call(FX_FLOAT* inputs, FX_FLOAT* outputs) const { FX_FLOAT input = inputs[0]; int i; for (i = 0; i < m_nSubs - 1; i ++) if (input < m_pBounds[i + 1]) { break; } if (m_pSubFunctions[i] == NULL) { return FALSE; } input = PDF_Interpolate(input, m_pBounds[i], m_pBounds[i + 1], m_pEncode[i * 2], m_pEncode[i * 2 + 1]); int nresults; m_pSubFunctions[i]->Call(&input, m_nInputs, outputs, nresults); return TRUE; }
FX_BOOL CPDF_SampledFunc::v_Call(FX_FLOAT* inputs, FX_FLOAT* results) const { int pos = 0; CFX_FixedBufGrow<FX_FLOAT, 16> encoded_input_buf(m_nInputs); FX_FLOAT* encoded_input = encoded_input_buf; CFX_FixedBufGrow<uint32_t, 32> int_buf(m_nInputs * 2); uint32_t* index = int_buf; uint32_t* blocksize = index + m_nInputs; for (uint32_t i = 0; i < m_nInputs; i++) { if (i == 0) blocksize[i] = 1; else blocksize[i] = blocksize[i - 1] * m_EncodeInfo[i - 1].sizes; encoded_input[i] = PDF_Interpolate(inputs[i], m_pDomains[i * 2], m_pDomains[i * 2 + 1], m_EncodeInfo[i].encode_min, m_EncodeInfo[i].encode_max); index[i] = std::min((uint32_t)std::max(0.f, encoded_input[i]), m_EncodeInfo[i].sizes - 1); pos += index[i] * blocksize[i]; } FX_SAFE_INT32 bits_to_output = m_nOutputs; bits_to_output *= m_nBitsPerSample; if (!bits_to_output.IsValid()) return FALSE; FX_SAFE_INT32 bitpos = pos; bitpos *= bits_to_output.ValueOrDie(); if (!bitpos.IsValid()) return FALSE; FX_SAFE_INT32 range_check = bitpos; range_check += bits_to_output.ValueOrDie(); if (!range_check.IsValid()) return FALSE; const uint8_t* pSampleData = m_pSampleStream->GetData(); if (!pSampleData) return FALSE; for (uint32_t j = 0; j < m_nOutputs; j++) { uint32_t sample = GetBits32(pSampleData, bitpos.ValueOrDie() + j * m_nBitsPerSample, m_nBitsPerSample); FX_FLOAT encoded = (FX_FLOAT)sample; for (uint32_t i = 0; i < m_nInputs; i++) { if (index[i] == m_EncodeInfo[i].sizes - 1) { if (index[i] == 0) encoded = encoded_input[i] * (FX_FLOAT)sample; } else { FX_SAFE_INT32 bitpos2 = blocksize[i]; bitpos2 += pos; bitpos2 *= m_nOutputs; bitpos2 += j; bitpos2 *= m_nBitsPerSample; if (!bitpos2.IsValid()) return FALSE; uint32_t sample1 = GetBits32(pSampleData, bitpos2.ValueOrDie(), m_nBitsPerSample); encoded += (encoded_input[i] - index[i]) * ((FX_FLOAT)sample1 - (FX_FLOAT)sample); } } results[j] = PDF_Interpolate(encoded, 0, (FX_FLOAT)m_SampleMax, m_DecodeInfo[j].decode_min, m_DecodeInfo[j].decode_max); } return TRUE; }
FX_BOOL CPDF_SampledFunc::v_Call(FX_FLOAT* inputs, FX_FLOAT* results) const { int pos = 0; CFX_FixedBufGrow<FX_FLOAT, 16> encoded_input_buf(m_nInputs); FX_FLOAT* encoded_input = encoded_input_buf; CFX_FixedBufGrow<int, 32> int_buf(m_nInputs * 2); int* index = int_buf; int* blocksize = index + m_nInputs; for (int i = 0; i < m_nInputs; i ++) { if (i == 0) { blocksize[i] = 1; } else { blocksize[i] = blocksize[i - 1] * m_pEncodeInfo[i - 1].sizes; } encoded_input[i] = PDF_Interpolate(inputs[i], m_pDomains[i * 2], m_pDomains[i * 2 + 1], m_pEncodeInfo[i].encode_min, m_pEncodeInfo[i].encode_max); index[i] = (int)encoded_input[i]; if (index[i] < 0) { index[i] = 0; } else if (index[i] > m_pEncodeInfo[i].sizes - 1) { index[i] = m_pEncodeInfo[i].sizes - 1; } pos += index[i] * blocksize[i]; } FX_SAFE_INT32 bitpos = pos; bitpos *= m_nBitsPerSample; bitpos *= m_nOutputs; if (!bitpos.IsValid()) { return FALSE; } FX_LPCBYTE pSampleData = m_pSampleStream->GetData(); if (pSampleData == NULL) { return FALSE; } FX_SAFE_INT32 bitpos1 = m_nOutputs - 1 > 0 ? m_nOutputs - 1 : 0; bitpos1 *= m_nBitsPerSample; bitpos1 += bitpos.ValueOrDie(); if (!bitpos1.IsValid()) { return FALSE; } for (int j = 0; j < m_nOutputs; j ++) { FX_DWORD sample = _GetBits32(pSampleData, bitpos.ValueOrDie() + j * m_nBitsPerSample, m_nBitsPerSample); FX_FLOAT encoded = (FX_FLOAT)sample; for (int i = 0; i < m_nInputs; i ++) { if (index[i] == m_pEncodeInfo[i].sizes - 1) { if (index[i] == 0) { encoded = encoded_input[i] * (FX_FLOAT)sample; } } else { FX_SAFE_INT32 bitpos2 = blocksize[i]; bitpos2 += 1; bitpos2 *= m_nBitsPerSample; bitpos2 *= m_nOutputs; bitpos2 += bitpos.ValueOrDie(); if (!bitpos2.IsValid()) { return FALSE; } FX_DWORD sample1 = _GetBits32(pSampleData, bitpos2.ValueOrDie(), m_nBitsPerSample); encoded += (encoded_input[i] - index[i]) * ((FX_FLOAT)sample1 - (FX_FLOAT)sample); } } results[j] = PDF_Interpolate(encoded, 0, (FX_FLOAT)m_SampleMax, m_pDecodeInfo[j].decode_min, m_pDecodeInfo[j].decode_max); } return TRUE; }