static const drawfile_error_type atErrors[] = {
{ DRAWFILE_OBJECT_TOO_SMALL, "Object too small"},
{ DRAWFILE_NO_TEXT, "Text object without text"},
{ DRAWFILE_BAD_CHARACTER, "Bad character in string"},
{ DRAWFILE_SMALL_MEMORY, "Not enough memory reserved"},
{ DRAWFILE_PATH_WITHOUT_LINES, "This path has no lines"},
{ DRAWFILE_BAD_PATH_TYPE, "Bad path-type in path"},
{ DRAWFILE_PATH_WITHOUT_END, "No end of path seen"},
{ DRAWFILE_BAD_SPRITE_SIZE, "Bad sprite size"},
{ DRAWFILE_BAD_JPEG_SIZE, "Bad jpeg size"},
{ DRAWFILE_TOO_SMALL, "Too small to be a drawfile"},
{ DRAWFILE_NOT_A_DRAWFILE, "Not a drawfile"},
{ DRAWFILE_OBJECT_SIZE, "Object with incorrect size"},
{ DRAWFILE_MANY_FONTTABLES, "More than one font table"},
{ DRAWFILE_TEXT_NO_FONT, "Text, but no font table seen"},
{ DRAWFILE_OBJECT_UNEXPECTED, "Unexpected object type"},
{ DRAWFILE_SIZE_ERROR, "Sizes don't match"},
};
if (tMemorySize < offsetof(drawfile_diagram, objects)) {
return pFillError(DRAWFILE_SMALL_MEMORY);
}
pDiag = (drawfile_diagram *)pInfo->data;
strncpy(pDiag->tag, "Draw", 4);
pDiag->major_version = 201;
pDiag->minor_version = 0;
strncpy(pDiag->source, szCreator, sizeof(pDiag->source));
pDiag->bbox = tBbox;
/* Memory in use */
pInfo->length = offsetof(drawfile_diagram, objects);
return NULL;
} /* end of Drawfile_CreateDiagram */
/*
* Drawfile_AppendObject - append an object to a diagram
*/
os_error *
Drawfile_AppendObject(drawfile_info *pInfo, size_t tMemorySize,
const drawfile_object *pObject, BOOL bRebind)
{
wimp_box *pMainBbox;
const wimp_box *pBbox;
byte *pAfter;
if (tMemorySize < pInfo->length + pObject->size) {
return pFillError(DRAWFILE_OBJECT_TOO_SMALL);
}
/* After the last object */
pAfter = (byte *)pInfo->data + pInfo->length;
/* Copy in the new data */
memcpy(pAfter, pObject, pObject->size);
/* Rebind if needed */
if (bRebind) {
pMainBbox = &((drawfile_diagram *)pInfo->data)->bbox;
switch (pObject->type) {
case drawfile_TYPE_FONT_TABLE:
pBbox = NULL;
break;
case drawfile_TYPE_TEXT:
pBbox = &pObject->data.text.bbox;
break;
case drawfile_TYPE_PATH:
pBbox = &pObject->data.path.bbox;
break;
case drawfile_TYPE_SPRITE:
pBbox = &pObject->data.sprite.bbox;
break;
case drawfile_TYPE_GROUP:
pBbox = &pObject->data.group.bbox;
break;
case drawfile_TYPE_TAGGED:
pBbox = &pObject->data.tagged.bbox;
break;
case drawfile_TYPE_TEXT_AREA:
pBbox = &pObject->data.text_area.bbox;
break;
case drawfile_TYPE_TEXT_COLUMN:
pBbox = NULL;
break;
case drawfile_TYPE_OPTIONS:
pBbox = &pObject->data.options.bbox;
break;
case drawfile_TYPE_TRFM_TEXT:
pBbox = &pObject->data.trfm_text.bbox;
break;
case drawfile_TYPE_TRFM_SPRITE:
pBbox = &pObject->data.trfm_sprite.bbox;
break;
case drawfile_TYPE_JPEG:
pBbox = &pObject->data.jpeg.bbox;
break;
default:
pBbox = NULL;
break;
}
if (pBbox != NULL) {
if (pBbox->min.x < pMainBbox->min.x) {
pMainBbox->min.x = pBbox->min.x;
}
if (pBbox->min.y < pMainBbox->min.y) {
pMainBbox->min.y = pBbox->min.y;
}
if (pBbox->max.x > pMainBbox->max.x) {
pMainBbox->max.x = pBbox->max.x;
}
if (pBbox->max.y > pMainBbox->max.y) {
pMainBbox->max.y = pBbox->max.y;
}
}
}
/* Memory in use */
pInfo->length += pObject->size;
return NULL;
} /* end of Drawfile_AppendObject */
/*
* Replaces the draw_render_diag function from RISC_OSLib
*/
os_error *
Drawfile_RenderDiagram(drawfile_info *pInfo, window_redrawblock *pRedraw,
double dScale)
{
int aiTransform[6];