예제 #1
0
/* propagate a list of attributes */
PTErr_t moveAttrList (	PTRefNum_t PTRefNum1, PTRefNum_t PTRefNum2,
						KpInt32_p attrList, KpInt32_t hasSimAttr, PTRefNum_t PTRefNumR)
{
PTErr_t 	errnum = KCP_SUCCESS;
KpHandle_t	startR1AttrList = NULL, startR2AttrList = NULL;
KpInt32_t	i1;
KpInt32_t	attrSize;
KpChar_t	attribute[KCM_MAX_ATTRIB_VALUE_LENGTH+1];

	errnum = getPTStatus (PTRefNum1);
	if ((errnum == KCP_PT_ACTIVE) || (errnum == KCP_PT_INACTIVE) || (errnum == KCP_SERIAL_PT)) {
		startR1AttrList = getPTAttr (PTRefNum1);
	}
	
	errnum = getPTStatus (PTRefNum2);
	if ((errnum == KCP_PT_ACTIVE) || (errnum == KCP_PT_INACTIVE) || (errnum == KCP_SERIAL_PT)) {
		startR2AttrList = getPTAttr (PTRefNum2);
	}
	
	for (i1 = 0; attrList[i1] != ATTR_LIST_END; i1++) {
		errnum = KCP_FAILURE;

		if (startR1AttrList != NULL) {
			attrSize = KCM_MAX_ATTRIB_VALUE_LENGTH;
			errnum = GetAttribute (startR1AttrList, attrList[i1], &attrSize, attribute);
		}

		if ((errnum != KCP_SUCCESS) && (startR2AttrList != NULL)) {	/* try for default attribute */
			attrSize = KCM_MAX_ATTRIB_VALUE_LENGTH;
			errnum = GetAttribute (startR2AttrList, attrList[i1], &attrSize, attribute);
		}

		if (errnum == KCP_SUCCESS) {
			errnum = PTSetAttribute(PTRefNumR, attrList[i1], attribute);	/* write to destination PT */
		}

		if (hasSimAttr == 1) {
			if (errnum == KCP_INVAL_PTA_TAG) {	/* try for backup attribute */
				attrSize = KCM_MAX_ATTRIB_VALUE_LENGTH;	/* read attribute */
				errnum = GetAttribute (startR2AttrList, attrList[i1+1], &attrSize, attribute);
				if (errnum == KCP_SUCCESS) {	/* write to destination PT */
					errnum = PTSetAttribute (PTRefNumR, attrList[i1], attribute);
				}
			}
			
			i1++;		/* skip past backup attribute */
		}

		if ((errnum != KCP_INVAL_PTA_TAG) && (errnum != KCP_SUCCESS)) {
			return (errnum);
		}
	}

	return KCP_SUCCESS;
}
예제 #2
0
/* deactivate a checked in PT */
PTErr_t PTDeActivate (PTRefNum_t PTRefNum)
{
PTErr_t errnum;

	errnum = getPTStatus (PTRefNum);		/* must currently be active */

	if ((errnum == KCP_PT_ACTIVE) || (errnum == KCP_SERIAL_PT)) {
		errnum = makeInActive (PTRefNum, KPTRUE);	/* deactivate the PT */
		if (KCP_PT_TABLE_DELETED == errnum)
		{
			errnum = KCP_SUCCESS;
		}
	}

	return errnum;
}
예제 #3
0
/* PTGetPTF writes a PT to external memory in a variety of formats.  */
PTErr_t
	PTGetPTF (	PTRefNum_t	PTRefNum,
				PTType_t	format,
				KpInt32_t	mBlkSize,
				PTAddr_t	PTAddr)
{
PTErr_t		errnum, PTstatus;
KpHandle_t	PTHdr, PTAttr, PTData;
KpFd_t		fd;
KpInt32_t	attrSize, resultSize, nBytes;
PTRefNum_t	resizePTRefNum = 0, thePTRefNum;
KpChar_p	memData;


	errnum = getPTStatus (PTRefNum);

	if ((errnum == KCP_PT_ACTIVE) || (errnum == KCP_PT_INACTIVE) || (errnum == KCP_SERIAL_PT)) {
		#if defined KCP_DIAG_LOG
		{KpChar_t	string[256];
		sprintf (string, "\nPTGetPTF\n PTRefNum %x, format %x, mBlkSize %d, PTAddr %x\n",
							PTRefNum, format, mBlkSize, PTAddr);
		kcpDiagLog (string);}
		#endif

		PTstatus = errnum;

		/* 	verify the dimensions of the grid table are valid for the specified format. */
		errnum = gridDimValid (format, PTRefNum, &resizePTRefNum);
		if (errnum != KCP_SUCCESS) {
			goto ErrOut1;
		}

		if (resizePTRefNum != 0) {
			thePTRefNum = resizePTRefNum;	/* resized PT made */
		}
		else {
			thePTRefNum = PTRefNum;			/* use original PT */
		}
		
		/*	determine the size the resized PT */
		errnum = PTGetSizeF (thePTRefNum, format, &resultSize);
		if (errnum != KCP_SUCCESS) {
			goto ErrOut1;
		}

		if (resultSize > mBlkSize) {	/* PT may not be larger than the buffer size */
			errnum = KCP_PT_BLOCK_TOO_SMALL;
			goto ErrOut1;
		}

		PTAttr = getPTAttr (thePTRefNum);
		PTHdr = getPTHdr (thePTRefNum);
		PTData = getPTData (thePTRefNum);

		/* initialize memory file manager to write the PT */
		if (KpOpen (NULL, "m", &fd, NULL, (KpGenericPtr_t)PTAddr, mBlkSize) != KCMS_IO_SUCCESS) {
			errnum = KCP_SYSERR_1;
			goto ErrOut1;
		}

		attrSize = getAttrSize (PTAttr);					/* get size of attributes */
		errnum = TpWriteHdr (&fd, format, PTHdr, attrSize);	/* write the header info */

		if (errnum != KCP_SUCCESS) {
			Kp_close (&fd);
			goto ErrOut1;
		} 	

#if !defined KCP_ICC_ONLY
		switch (format) {
		case PTTYPE_FUTF:
			errnum = writeAttributes (&fd, PTAttr);	/* write the attributes */
			if (errnum != KCP_SUCCESS) {
				break;
			}

		default:
			break;
		}
#endif

		/* if PT active, write data to external format */
		if (((PTstatus == KCP_PT_ACTIVE) || (PTstatus == KCP_SERIAL_PT)) && (errnum == KCP_SUCCESS)) {
			errnum = TpWriteData (&fd, format, PTHdr, PTData);
		}

		(void) Kp_close (&fd);

		/*	if the result PT size is smaller than the memory block size
			fill the end of the memory block with zeros						*/
		nBytes = mBlkSize - resultSize;
		if (nBytes > 0) {
			memData = (KpChar_p)PTAddr + resultSize;
			while (nBytes--) {
				*memData++ = 0;
			}
		}			

	}

ErrOut1:
	if (resizePTRefNum != 0) {
		PTCheckOut (resizePTRefNum);
	}

	return (errnum);
}
예제 #4
0
/* PTGetSizeF calculates the size of a PT in any format.  */
PTErr_t
	PTGetSizeF (PTRefNum_t	PTRefNum,
				PTType_t	format,
				KpInt32_p	mBlkSize)
{
PTErr_t		errnum, errnum1;
KpInt32_t	extSize, intSize;
KpHandle_t	PTHdr, PTData;
PTRefNum_t	matrixPTRefNum;
KpUInt32_t	lutConfig;
#if !defined KCP_ICC_ONLY
KpHandle_t	PTAttr;
#endif
#if !defined KCMS_NO_CRC
KpChar_t 	strCRCmade[KCM_MAX_ATTRIB_VALUE_LENGTH+1];
KpInt32_t	crc32;
#endif

	errnum = getPTStatus (PTRefNum);

	if ((errnum == KCP_PT_ACTIVE) || (errnum == KCP_PT_INACTIVE) || (errnum == KCP_SERIAL_PT)) {

		if (mBlkSize == NULL)
			return (KCP_BAD_PTR);

		switch (format) {
#if !defined KCP_ICC_ONLY
			case PTTYPE_FUTF:
				extSize = KCP_PT_HEADER_SIZE;	/* size of external header */
				break;
#endif

			case PTTYPE_MFT1:
			case PTTYPE_MFT2:
			case PTTYPE_MFT2_VER_0:
				extSize = (2 * sizeof (KpInt32_t)) + (4 * sizeof (KpUInt8_t))
					+ (MF_MATRIX_DIM * MF_MATRIX_DIM * sizeof (KpInt32_t));
				break;

			case PTTYPE_MAB1:
			case PTTYPE_MAB2:
			case PTTYPE_MBA1:
			case PTTYPE_MBA2:
				extSize = (7 * sizeof (KpInt32_t)) + (2 * sizeof (KpUInt8_t)) + sizeof (KpUInt16_t);
				errnum1 = getMatrixPTRefNum (PTRefNum, &matrixPTRefNum, &lutConfig);
				if (KCP_SUCCESS == errnum1)
				{
					extSize += ((MF_MATRIX_DIM * MF_MATRIX_DIM + MF_MATRIX_DIM) * sizeof (KpInt32_t));
				}
				break;

			default:
				return (KCP_INVAL_PTTYPE);
		}
	   	
		if ((errnum == KCP_PT_ACTIVE) || (errnum == KCP_SERIAL_PT)) {

		/* when active, add size of external PT data block */
			PTHdr = getPTHdr (PTRefNum);
			PTData = getPTData (PTRefNum);

			intSize = TpGetDataSize (PTHdr, PTData, format);
			if (intSize == 0) {
				PTRefNum_t	resizePTRefNum;

				/* 	TpGetDataSize will return 0 if the grid table 
					dimensions are not valid for the format specified.
					PTGetPTF will attempt to resize the grid table of
					the PT.  Check if that resizing is possible */
				errnum = gridDimValid (format, PTRefNum, &resizePTRefNum);
  				if (errnum != KCP_SUCCESS) {
					return errnum;
				}

				/*	Determine the size of the resized PT */
				PTHdr = getPTHdr (resizePTRefNum);
				PTData = getPTData (resizePTRefNum);
				intSize = TpGetDataSize (PTHdr, PTData, format);
				PTCheckOut (resizePTRefNum);
				if (intSize == 0) {
					return KCP_INCON_PT;
				}
			}
			extSize += intSize;	/* add size of data */

		#if !defined KCMS_NO_CRC
			switch (format) {
			case PTTYPE_FUTF:
				errnum = TpCalCrc (PTHdr, PTData, &crc32);
				if (errnum == KCP_SUCCESS) {
					KpItoa(crc32, strCRCmade);
					PTSetAttribute(PTRefNum, KCM_CRC, strCRCmade);
				}
				break;

			default:
				break;
			}
		#endif
		}
	   	
/* add size of attributes. Must be done after CRC calculation */
#if !defined KCP_ICC_ONLY
		switch (format) {
		case PTTYPE_FUTF:
			PTAttr = getPTAttr (PTRefNum);
			extSize += getAttrSize(PTAttr);		/* plus size of attributes */

			break;

		default:
			break;
		}
#endif
	   	
		*mBlkSize = extSize;	/* return external size of PT */
		errnum = KCP_SUCCESS;
	}

	return (errnum);
}
예제 #5
0
/* PTActivate reads the PT data from an external memory block and
 * sets up the technology specific PT memory structures.  Before loading
 * the PT, check to make sure that it matches the "checked in" info.
 */
PTErr_t
	PTActivate(	PTRefNum_t	PTRefNum,
				KpInt32_t	mBlkSize,
				PTAddr_t	PTAddr)
{
PTErr_t		errnum;
KpFd_t		fd;
KpHandle_t	PTHdr, PTData, PTHdr2;
fut_hdr_p	futp;
#if !defined KCMS_NO_CRC
KpChar_t 	strCRCmade[KCM_MAX_ATTRIB_VALUE_LENGTH+1];
KpChar_t 	strCRCfound[KCM_MAX_ATTRIB_VALUE_LENGTH+1];
KpInt32_t	crcAttrSize, crc32;
#endif
KpInt32_t	attrSize;
PTType_t	format;

	errnum = getPTStatus (PTRefNum);
	if (errnum != KCP_PT_INACTIVE) {
		goto ErrOut1;
	}

	/* initialize memory file manager */
	if (KpOpen (NULL, "m", &fd, NULL, (KpGenericPtr_t)PTAddr, mBlkSize) != KCMS_IO_SUCCESS) {
		errnum = KCP_SYSERR_1;
		goto ErrOut1;
	}

/* read in the encoded header, verify that its the same as the original, then discard */
	errnum = TpReadHdr (&fd, &PTHdr2, &format);
	if (errnum != KCP_SUCCESS ) {
		goto ErrOut2;
	}

	#if defined KCP_DIAG_LOG
	{KpChar_t	string[256];
	sprintf (string, "\nPTActivate\n PTRefNum %x, mBlkSize %d, PTAddr %x, format %x\n",
						PTRefNum, mBlkSize, PTAddr, format);
	kcpDiagLog (string);}
	#endif

/* get and save size of attributes */
    futp = lockBuffer (PTHdr2);
	attrSize = futp->idstr_len;
	unlockBuffer (PTHdr2);

	PTHdr = getPTHdr (PTRefNum);	/* get the original PT header */

/* make sure the PT header and checkin info match */
	errnum = TpCompareHdr (PTHdr, PTHdr2);

	(void) TpFreeHdr (PTHdr2);		/* free the header */

	if (errnum != KCP_SUCCESS) {	/* then check for an error in hdrVerify */
		goto ErrOut2;
	}

#if !defined KCP_ICC_ONLY
	switch (format) {
	case PTTYPE_FUTF:						/* discard the attribute info */
		if (Kp_skip (&fd, attrSize) != KCMS_IO_SUCCESS){ /* may have been setAttribute after checkin */
			errnum = KCP_PTERR_3;
			goto ErrOut2;
		}

		break;

	default:
		break;
	}
#endif

	errnum = TpReadData (&fd, format, PTRefNum, PTHdr, &PTData);		/* get the PT data */
	if (errnum == KCP_SUCCESS) {
		if (PTMemTest () == 0) {			/* enough memory to continue operations? */
			errnum = KCP_NO_ACTIVATE_MEM;
			goto ErrOut3;
		}

	#if !defined KCMS_NO_CRC
		errnum = TpCalCrc (PTHdr, PTData, &crc32);	/* calculate the CRC */
		if (errnum == KCP_SUCCESS) {
			KpItoa(crc32, strCRCmade);
			crcAttrSize = KCM_MAX_ATTRIB_VALUE_LENGTH;
			errnum = PTGetAttribute(PTRefNum, KCM_CRC, &crcAttrSize, strCRCfound);

			if (errnum == KCP_INVAL_PTA_TAG) {		/* if not present, just set it */
				PTSetAttribute(PTRefNum, KCM_CRC, strCRCmade);
				errnum = KCP_SUCCESS;
			}
			else {
/*				if ((errnum == KCP_SUCCESS)*/			/* if present, must match */ 
/*					&& (strcmp (strCRCmade, strCRCfound) != 0)) { */
/*					errnum = KCP_INCON_PT; */
/*					goto ErrOut3; */
/*				} */
			}
		}
	#endif
	}

	if (errnum == KCP_SUCCESS) {	/* Everything's OK, now activate */
		makeActive (PTRefNum, PTData);
	}

ErrOut2:
	(void) Kp_close (&fd);
ErrOut1:
	return (errnum);


ErrOut3:
	(void) TpFreeData (PTData);	/* Release the PT memory */
	goto ErrOut2;
}
예제 #6
0
PTErr_t
	PTEvaluate (	PTRefNum_t		PTRefNum,
					PTEvalDTPB_p	evalDef,
					PTEvalTypes_t	evalID,
					KpInt32_t		devNum,
					KpInt32_t		aSync,
					opRefNum_p		opRefNum,
					callBack_p		callBack)
{
PTErr_t			PTErr;
PTEvalDTPB_t	lEvalDef;
PTCompDef_t		thisInput [FUT_NICHAN], thisOutput [FUT_NOCHAN];
PTRefNum_t		PTList [MAX_PT_CHAIN_SIZE];
PTTable_p		evalList [MAX_PT_CHAIN_SIZE], PTTableP;
PTTable_p*		listStart;
KpInt32_t		theSerialCount, i1, i2, i3, i4, nOutputs, nFuts, PTcount;
KpUInt32_t		tempMemNeeded, oMask, ioMaskList [MAX_PT_CHAIN_SIZE];
PTImgAddr_t		addr;
#if defined (KCP_ACCEL)
PTEvalTypes_t	evaluator;
KpInt32_t		numEvals;
#endif

	if (devNum) {}
	if (aSync) {}
	if (opRefNum) {}

#if defined (KCP_MACPPC_MP)
	KCPInitializeMP ();
#endif

	PTErr = getPTStatus (PTRefNum);			/* must be an active or serial PT */
	if ((PTErr != KCP_PT_ACTIVE) && (PTErr != KCP_SERIAL_PT)) {
		goto ErrOut0;
	}

#if defined (KCP_ACCEL)
	PTErr = GetEval (evalID, &evaluator);	/* get an evaluator */
	if (PTErr != KCP_SUCCESS) {
		goto ErrOut0;
	}
#endif

	/* valid PTEvalDTPB_p? */
	if (evalDef == NULL) goto ErrOut1;
	if (evalDef->input == NULL) goto ErrOut1;
	if (evalDef->output == NULL) goto ErrOut1;
	if (evalDef->nInputs > FUT_NICHAN) goto ErrOut3;
	if (evalDef->nOutputs > FUT_NOCHAN) goto ErrOut3;

	/* set up the local evaluation structures */
	/* set input and output to NULL */
	/* this preserves the channel position while allowing */
	/* the number of channels to indicate the number of valid addresses */
	/* this is needed to keep both the CTE and SW evaluations happy */
	for (i1 = 0; i1 < FUT_NICHAN; i1++) {
		thisInput[i1].pelStride = 0;
		thisInput[i1].lineStride = 0;
		thisInput[i1].addr = NULL;
	} 

	lEvalDef.nPels = evalDef->nPels;
	lEvalDef.nLines = evalDef->nLines;

	lEvalDef.nInputs = FUT_NICHAN;
	lEvalDef.dataTypeI = evalDef->dataTypeI;
	lEvalDef.input = thisInput;
	for (i1 = 0; i1 < evalDef->nInputs; i1++) {
		lEvalDef.input[i1].pelStride	= evalDef->input[i1].pelStride;
		lEvalDef.input[i1].lineStride	= evalDef->input[i1].lineStride;
		lEvalDef.input[i1].addr			= evalDef->input[i1].addr;
	} 

	/* output addresses are loaded in the evaluation loop, no need to do anything here */

	/* clear the PT and evaluation lists, just for clarity */
	for (i1 = 0; i1 < MAX_PT_CHAIN_SIZE; i1++) {
		PTList[i1] = NULL;
		evalList[i1] = NULL;
	}

	/* get the list of PTs which we must actually evaluate */
	PTErr = resolvePTData (PTRefNum, &theSerialCount, PTList);

	/* set up list of futs through which the image is evaluated */
	for (i1 = 0; i1 < theSerialCount; i1++) {
		PTTableP = lockPTTable (PTList[i1]);	/* lock tables while evaluating */
		evalList[i1] = PTTableP;
	}

	/* initialize the evaluation list */
	PTErr = setupEvalList (theSerialCount, evalList, ioMaskList, evalDef, &tempMemNeeded);
	if (PTErr != KCP_SUCCESS) {
		goto ErrOut2;
	}

	/* if temporary memory is not needed, */
	/* then evaluate a full image at a time until */
	/* the image has been processed through all futs */
	/* if temporary memory is needed, */
	/* then this level processes the image just once */
	/* and a lower level processes the image through all futs */
	if (tempMemNeeded == 0) {
		PTcount = theSerialCount;
	}
	else {
		PTcount = 1;
	}

	initProgressPasses (PTcount, callBack);

	/* process the image through each fut in the list */ 
	for (i1 = 0; i1 < PTcount; i1++) {

		/* set up the output data addresses */
		/* use io mask to order output channels properly */
		if (tempMemNeeded == 1) {
			nFuts = theSerialCount;					/* this many futs to evaluate */
			listStart = &evalList[0];
			oMask = FUT_OMASK(ioMaskList[nFuts-1]);	/* use mask of last fut */
		}
		else {
			nFuts = 1;								/* evaluate one fut */
			listStart = &evalList[i1];
			oMask = FUT_OMASK(ioMaskList[i1]);		/* use mask of this fut */
		}

		/* initialize the output data structures */
		lEvalDef.nOutputs = FUT_NOCHAN;
		lEvalDef.dataTypeO = evalDef->dataTypeO;
		lEvalDef.output = thisOutput;

		for (i2 = 0; i2 < FUT_NOCHAN; i2++) {
			thisOutput[i2].pelStride = 0;
			thisOutput[i2].lineStride = 0;
			thisOutput[i2].addr = NULL;
		} 

		/* set the output channel addresses */
		if (i1 == (PTcount -1)) {		/* last, just use supplied stuff */
			for (i2 = 0, nOutputs = 0; i2 < evalDef->nOutputs; i2++) {
				lEvalDef.output[i2].pelStride	= evalDef->output[i2].pelStride;
				lEvalDef.output[i2].lineStride	= evalDef->output[i2].lineStride;
				lEvalDef.output[i2].addr		= evalDef->output[i2].addr;

				nOutputs++;		/* count actual outputs */
			}

			getDataBytes (evalDef->dataTypeO, &i3);	/* get output data size */
			if (i3 == 0) {
				nOutputs = 3;
			}
		}
		else {
			for (i2 = oMask, i3 = 0, i4 = 0, nOutputs = 0; i2 != 0; i2 >>= 1, i3++) {
				if ((i2 & 1) == 1) {	/* this output channel is needed */
					while ((addr = evalDef->output[i4].addr) == NULL) {
						i4++;		/* get next available output channel */
					}

					if (i4 > evalDef->nOutputs) {
						PTErr = KCP_PTERR_4;				/* programming error */
						goto ErrOut2;
					}

					lEvalDef.output[i3].pelStride	= evalDef->output[i4].pelStride;
					lEvalDef.output[i3].lineStride	= evalDef->output[i4].lineStride;
					lEvalDef.output[i3].addr		= addr;

					i4++;			/* next output address */
					nOutputs++;		/* count actual outputs */
				}
			}
		}

#if defined (KCP_ACCEL)
		/* if there are less than FASTER_IN_SW evaluations, it's faster to do it in software. */
		numEvals = lEvalDef.nPels * lEvalDef.nLines * nOutputs;
		
		if ((numEvals < FASTER_IN_SW) || (tempMemNeeded == 1)) {
			evaluator = KCP_EVAL_SW;
		}
		
		switch (evaluator) {
		case KCP_EVAL_SW:		/* evaluate in software */

software_evaluation:
#endif

			PTErr = PTEvalSeq (nFuts, listStart, ioMaskList, &lEvalDef, callBack);
			if (PTErr != KCP_SUCCESS) {
				goto ErrOut2;
			}

#if defined (KCP_ACCEL)
			break;

		case KCP_EVAL_CTE:	/* evaluate using the NFE */
		{
		PTRefNum_t		thePTRefNum;
		KpHandle_t		PTData;

			thePTRefNum = listStart[0]->refNum;			/* get the PT reference number */

			PTData = getPTData (thePTRefNum);	/* get the transform data */

			PTErr = PT_eval_cteDT (PTData, &lEvalDef, 0, 0, callBack);

			if ((PTErr == KCP_CTE_GRID_TOO_BIG) || (PTErr == KCP_CTE_NOT_ATTEMPTED)) {
				goto software_evaluation;
			}
			
			break;
		}

		default:
			PTErr = KCP_INVAL_EVAL;

			break;
		}
#else
		if (evalID) {}	/* unreferenced formal parameter */
#endif
				
		/* output for this PT is input for next PT */
		lEvalDef.nInputs = lEvalDef.nOutputs;
		lEvalDef.dataTypeI = lEvalDef.dataTypeO;

		for (i2 = 0; i2 < lEvalDef.nInputs; i2++) {
			lEvalDef.input[i2].pelStride	= lEvalDef.output[i2].pelStride;
			lEvalDef.input[i2].lineStride	= lEvalDef.output[i2].lineStride;
			lEvalDef.input[i2].addr			= lEvalDef.output[i2].addr;
		}
	}


ErrOut2:
	/* unlock the PTs used for evaluation */
	for (i1 = 0; i1 < theSerialCount; i1++) {
		unlockPTTable (PTList[i1]);
	}

ErrOut0:
	return (PTErr);


ErrOut1:
	PTErr = KCP_BAD_PTR;
	goto ErrOut0;

ErrOut3:
	PTErr = KCP_INVAL_EVAL;
	goto ErrOut0;
}