95 lines
2.1 KiB
C
95 lines
2.1 KiB
C
//$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$
|
|
//
|
|
// Copyright (c) 2001 Microsoft Corporation. All rights reserved.
|
|
//
|
|
// Module:
|
|
// volcano/dll/strkutil.c
|
|
//
|
|
// Description:
|
|
// Functions to implement the functionality of managing breakpoint structures.
|
|
//
|
|
// Author:
|
|
// hrowley & ahmadab 12/05/01
|
|
//
|
|
//$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$
|
|
#include "common.h"
|
|
#include "volcanop.h"
|
|
|
|
// Make a copy of the points in a stroke. Used so that when we free
|
|
// the glyph we don't free the passed in points.
|
|
POINT *
|
|
DupPoints(POINT *pOldPoints, int nPoints)
|
|
{
|
|
int ii;
|
|
POINT *pPoints;
|
|
|
|
// Alloc space.
|
|
pPoints = (POINT *) ExternAlloc(nPoints * sizeof(POINT));
|
|
if (!pPoints) {
|
|
return (POINT *)0;
|
|
}
|
|
|
|
// Copy point data.
|
|
for (ii = 0; ii < nPoints; ++ii) {
|
|
pPoints[ii] = pOldPoints[ii];
|
|
}
|
|
|
|
// Return the new copy.
|
|
return pPoints;
|
|
}
|
|
|
|
// Build glyph structure from stroke array.
|
|
GLYPH *
|
|
GlyphFromStrokes(UINT cStrokes, STROKE *pStrokes)
|
|
{
|
|
int ii;
|
|
GLYPH *pGlyph;
|
|
|
|
// Convert strokes to GLYPHs and FRAMEs so that we can call the
|
|
// old code.
|
|
pGlyph = (GLYPH *)0;
|
|
for (ii = cStrokes - 1; ii >= 0; --ii) {
|
|
STROKE *pStroke;
|
|
GLYPH *pGlyphCur;
|
|
|
|
// Alloc glyph.
|
|
pGlyphCur = NewGLYPH();
|
|
if (!pGlyphCur) {
|
|
goto error;
|
|
}
|
|
|
|
// Add to list, and alloc frame
|
|
pGlyphCur->next = pGlyph;
|
|
pGlyph = pGlyphCur;
|
|
pGlyphCur->frame = NewFRAME();
|
|
if (!pGlyphCur->frame) {
|
|
goto error;
|
|
}
|
|
|
|
// Get stroke to process.
|
|
pStroke = pStrokes + ii;
|
|
|
|
// Fill in frame. We just fill in what we need, and ignore
|
|
// fields not used by Otter and Zilla, or are set by them.
|
|
pGlyphCur->frame->info.cPnt = pStroke->nInk;
|
|
pGlyphCur->frame->info.wPdk = PDK_TRANSITION | PDK_DOWN;
|
|
pGlyphCur->frame->rgrawxy = DupPoints(pStroke->pts, pStroke->nInk);
|
|
pGlyphCur->frame->rect = pStroke->bbox;
|
|
pGlyphCur->frame->iframe = ii;
|
|
|
|
if (pGlyphCur->frame->rgrawxy == NULL) {
|
|
goto error;
|
|
}
|
|
}
|
|
|
|
return pGlyph;
|
|
|
|
error:
|
|
// Cleanup glyphs on error.
|
|
if (pGlyph) {
|
|
DestroyFramesGLYPH(pGlyph);
|
|
DestroyGLYPH(pGlyph);
|
|
}
|
|
return (GLYPH *)0;
|
|
}
|