Beispiel #1
0
SEGMENTH CombinePolygonPieces(SEGMENTH *A1, SEGMENTH *B1,
							  Boolean keepAinB, Boolean keepAnotinB,
							  Boolean keepBinA, Boolean keepBnotinA)
{
	long i, j, err, numSegsA, numSegsB, numSegsC = 0;
	WorldPoint m;
	SEGMENTH C = 0, A2 = 0, B2 = 0, *A = 0, *B = 0;
	
	err = 0;
	
	numSegsA = _GetHandleSize((Handle)*A1) / sizeof(Segment);
	numSegsB = _GetHandleSize((Handle)*B1) / sizeof(Segment);
	
	A2 = (SEGMENTH)_NewHandle(numSegsA * sizeof(Segment));
	if (_MemError()) { TechError("CombinePolygonPieces()", "_NewHandle()", 0); goto done; }
	for (i = 0 ; i < numSegsA ; i++)
		INDEXH(A2, i) = INDEXH(*A1, i);
	A = &A2;
	
	B2 = (SEGMENTH)_NewHandle(numSegsB * sizeof(Segment));
	if (_MemError()) { TechError("CombinePolygonPieces()", "_NewHandle()", 0); goto done; }
	for (i = 0 ; i < numSegsB ; i++)
		INDEXH(B2, i) = INDEXH(*B1, i);
	B = &B2;
	
	for (i = 0 ; i < numSegsA ; i++)
		for (j = 0 ; j < numSegsB ; j++)
			if (SegmentTouchesSegment(INDEXH(*A, i), INDEXH(*B, j)) &&
				!SameSegmentEndPoints(INDEXH(*A, i), INDEXH(*B, j))) {
				m = PointOfIntersection(INDEXH(*A, i), INDEXH(*B, j));
				if (err = InsertSegment(A, &numSegsA, i, m)) goto done;
				if (err = InsertSegment(B, &numSegsB, j, m)) goto done;
			}
	
	C = (SEGMENTH)_NewHandle(0);
	if (_MemError()) { TechError("CombinePolygonPieces()", "_NewHandle()", 0); goto done; }
	
	for (i = 0 ; i < numSegsA ; i++) {
		m = Midpoint(INDEXH(*A, i));
		if ((keepAinB && PointInPolygon(m, *B, numSegsB, TRUE)) ||
			(keepAnotinB && !PointInPolygon(m, *B, numSegsB, TRUE)))
			if (err = AddSegment(&C, &numSegsC, INDEXH(*A, i))) goto done;
	}
	for (j = 0 ; j < numSegsB ; j++) {
		m = Midpoint(INDEXH(*B, j));
		if ((keepBinA && PointInPolygon(m, *A, numSegsA, TRUE)) ||
			(keepBnotinA && !PointInPolygon(m, *A, numSegsA, TRUE)))
			if (err = AddSegment(&C, &numSegsC, INDEXH(*B, j))) goto done;
	}
	
	SortSegments(C, numSegsC);
	
	done:
		if (A2) DisposeHandle((Handle)A2);
		if (B2) DisposeHandle((Handle)B2);
		if (err && C) DisposeHandle((Handle)C);
		
		return err ? 0 : C;
}
nsresult sbSeekableChannel::InsertSegment(
    Segment                     *pInsertSegment)
{
    DataSet::iterator           dataSetIterator;
    Segment                     *pSegment = NULL;
    nsresult                    result = NS_OK;

    /* Find the first intersecting data segment and merge with it.  If new    */
    /* data segment does not intersect any other data segments, simply insert */
    /* it into data set.                                                      */
    dataSetIterator = mChannelData.find(pInsertSegment);
    if (dataSetIterator != mChannelData.end())
    {
        pSegment = *dataSetIterator;
        mChannelData.erase(pSegment);
        result = MergeSegments(pSegment, pInsertSegment, &pSegment);
        InsertSegment(pSegment);
    }
    else
    {
        mChannelData.insert(pInsertSegment);
    }

    return (result);
}
Beispiel #3
0
bool HexDoc::InsertAt(THSIZE nIndex, const uint8 *psrc, int nSize, THSIZE nCount /*= 1*/, int flags /*= 0*/)
{
    if (!(flags & SUPPRESS_UPDATE) && !CanReplaceAt(nIndex, 0, nSize * nCount))
        return false;

    if (nSize == 0 || nCount == 0)
        return true; // nothing to do

    //! todo: if we can append to the preceding block, do that instead?

    Segment *ts = new Segment(nSize * nCount);
    if (!ts || !ts->pData)
        return false;

    // copy data to the newly allocated block
    if (nSize == 1)
        memset(ts->pData, *psrc, nCount); //! todo: use fill data?
    else for (int i = 0; i < nCount; i++)
        memcpy(ts->pData + i * nSize, psrc, nSize);

    if (!InsertSegment(nIndex, ts))
        return false;
    m_iChangeIndex++;
    if (hw && !(flags & SUPPRESS_UPDATE))
        hw->OnDataChange(nIndex, 0, nSize * nCount);
    return true;
}
Beispiel #4
0
bool HexDoc::ReplaceSerialized(THSIZE nAddress, THSIZE ToReplaceLength, SerialData &sInsert)
{
    if (!sInsert.Ok()) // not an error if len == 0
        return false;

    if (!CanReplaceAt(nAddress, ToReplaceLength, sInsert.m_nTotalSize))
        return false;

    if (!RemoveAt(nAddress, ToReplaceLength, SUPPRESS_UPDATE))
        return false;

    //! todo: get data sources

    for (int iSeg = 0; iSeg < sInsert.hdr.nSegments; iSeg++)
    {
        Segment *ts = Segment::Unserialize(sInsert, iSeg);
        InsertSegment(nAddress, ts);
        nAddress += ts->size;
    }

    m_iChangeIndex++;
    if (hw)
        hw->OnDataChange(nAddress, ToReplaceLength, sInsert.m_nTotalSize);
    return true;
}
Beispiel #5
0
/*----------------------------------------------------------------------------*/
int Threshold::DivideState (int index)
{
	SegmentState *new_segment = NULL;
	// min value of No.index    : not changed
	// max value of No.index    : changed to (min + max) / 2 of old No.index
	// min value of No.index+1  : changed to (min + max) / 2 of old No.index
	// max value of No.index+1  : changed to max of old No.index

	for (int dim=0; dim<dimension; dim++) {
		double new_thre_value = (segment_seq[index].MinValue(dim) + segment_seq[index].MaxValue(dim)) / 2;
		if (debug) tl_message ("new_thre_value = %g (%g + %g)/2", new_thre_value, segment_seq[index].MinValue(dim), segment_seq[index].MaxValue(dim));
		new_segment = new SegmentState (new_thre_value, segment_seq[index].MaxValue(dim));
		segment_seq[index].SetMaxValue(dim, new_thre_value);
		InsertSegment (index, new_segment);
	}
	number_of_state++;
	return TRUE;
}
nsresult sbSeekableChannel::ReadSegment(
    nsIInputStream              *pStream,
    PRUint32                    numBytes)
{
    Segment                     *pSegment = NULL;
    char                        *buffer = NULL;
    PRUint64                    readOffset = mBasePos;
    PRUint32                    bytesRead;
    nsresult                    result = NS_OK;

    /* Allocate a data segment buffer. */
    buffer = (char *) nsMemory::Alloc(numBytes);
    if (!buffer)
        result = NS_ERROR_OUT_OF_MEMORY;

    /* Read data from the stream. */
    if (NS_SUCCEEDED(result))
    {
        result = pStream->Read(buffer, numBytes, &bytesRead);
        if (NS_SUCCEEDED(result))
        {
            mBasePos += bytesRead;
            if (mBasePos > mContentLength)
                mContentLength = mBasePos;
        }
    }

    /* Create a new data segment buffer. */
    if (NS_SUCCEEDED(result))
    {
        pSegment = new Segment();
        if (pSegment)
        {
            pSegment->offset = readOffset;
            pSegment->length = bytesRead;
            pSegment->buffer = buffer;
            buffer = NULL;
        }
        else
        {
            result = NS_ERROR_UNEXPECTED;
        }
    }

    /* Insert the segment into the channel data set. */
    if (NS_SUCCEEDED(result))
        result = InsertSegment(pSegment);
    if (NS_SUCCEEDED(result))
        pSegment = NULL;

    /* Channel reading is complete if an error occured */
    /* or if all of the channel data has been read.    */
    if (NS_FAILED(result) || AllDataRead())
        mCompleted = PR_TRUE;

    /* Clean up on error. */
    if (!NS_SUCCEEDED(result))
    {
        if (pSegment)
            delete (pSegment);
        if (buffer)
            nsMemory::Free(buffer);
    }

    return (result);
}