void HPDF_Obj_ForceFree (HPDF_MMgr mmgr, void *obj) { HPDF_Obj_Header *header; HPDF_PTRACE((" HPDF_Obj_ForceFree\n")); if (!obj) return; header = (HPDF_Obj_Header *)obj; HPDF_PTRACE((" HPDF_Obj_ForceFree obj=0x%08X obj_id=0x%08X " "obj_class=0x%08X\n", (HPDF_UINT)obj, (HPDF_UINT)(header->obj_id), (HPDF_UINT)(header->obj_class))); switch (header->obj_class & HPDF_OCLASS_ANY) { case HPDF_OCLASS_STRING: HPDF_String_Free (obj); break; case HPDF_OCLASS_BINARY: HPDF_Binary_Free (obj); break; case HPDF_OCLASS_ARRAY: HPDF_Array_Free (obj); break; case HPDF_OCLASS_DICT: HPDF_Dict_Free (obj); break; default: HPDF_FreeMem (mmgr, obj); } }
HPDF_EXPORT(HPDF_STATUS) HPDF_U3D_Add3DView(HPDF_U3D u3d, HPDF_Dict view) { HPDF_Array views = NULL; HPDF_STATUS ret = HPDF_OK; HPDF_PTRACE ((" HPDF_Add3DView\n")); if (u3d == NULL || view == NULL) { return HPDF_INVALID_U3D_DATA; } views = (HPDF_Array)HPDF_Dict_GetItem (u3d, "VA", HPDF_OCLASS_ARRAY); if (views == NULL) { views = HPDF_Array_New (u3d->mmgr); if (!views) { return HPDF_Error_GetCode (u3d->error); } ret = HPDF_Dict_Add (u3d, "VA", views); if (ret == HPDF_OK) { ret = HPDF_Dict_AddNumber (u3d, "DV", 0); } else { HPDF_Array_Free (views); return ret; } } if (ret == HPDF_OK) { ret = HPDF_Array_Add( views, view); } return ret; }
HPDF_Array HPDF_Box_Array_New (HPDF_MMgr mmgr, HPDF_Box box) { HPDF_Array obj; HPDF_STATUS ret = HPDF_OK; HPDF_PTRACE((" HPDF_Box_Array_New\n")); obj = HPDF_Array_New (mmgr); if (!obj) return NULL; ret += HPDF_Array_Add (obj, HPDF_Real_New (mmgr, box.left)); ret += HPDF_Array_Add (obj, HPDF_Real_New (mmgr, box.bottom)); ret += HPDF_Array_Add (obj, HPDF_Real_New (mmgr, box.right)); ret += HPDF_Array_Add (obj, HPDF_Real_New (mmgr, box.top)); if (ret != HPDF_OK) { HPDF_Array_Free (obj); return NULL; } return obj; }
HPDF_EXPORT(HPDF_STATUS) HPDF_3DView_SetCamera(HPDF_Dict view, HPDF_REAL coox, HPDF_REAL cooy, HPDF_REAL cooz, HPDF_REAL c2cx, HPDF_REAL c2cy, HPDF_REAL c2cz, HPDF_REAL roo, HPDF_REAL roll) { HPDF_REAL viewx, viewy, viewz; HPDF_REAL leftx, lefty, leftz; HPDF_REAL upx, upy, upz; HPDF_REAL transx, transy, transz; HPDF_Array matrix; HPDF_STATUS ret = HPDF_OK; HPDF_PTRACE ((" HPDF_3DView_SetCamera\n")); if (view == NULL) { return HPDF_INVALID_U3D_DATA; } /* view vector (opposite to c2c) */ viewx = -c2cx; viewy = -c2cy; viewz = -c2cz; /* c2c = (0, -1, 0) by default */ if (viewx == 0.0 && viewy == 0.0 && viewz == 0.0) { viewy = 1.0; } /* normalize view vector */ normalize(viewx, viewy, viewz); /* rotation matrix */ /* top and bottom views */ leftx = -1.0f; lefty = 0.0f; leftz = 0.0f; /* up-vector */ if (viewz < 0.0) /* top view*/ { upx = 0.0f; upy = 1.0f; upz = 0.0f; } else /* bottom view*/ { upx = 0.0f; upy =-1.0f; upz = 0.0f; } if ( fabs(viewx) + fabs(viewy) != 0.0f) /* other views than top and bottom*/ { /* up-vector = up_world - (up_world dot view) view*/ upx = -viewz*viewx; upy = -viewz*viewy; upz = -viewz*viewz + 1.0f; /* normalize up-vector*/ normalize(upx, upy, upz); /* left vector = up x view*/ leftx = viewz*upy - viewy*upz; lefty = viewx*upz - viewz*upx; leftz = viewy*upx - viewx*upy; /* normalize left vector*/ normalize(leftx, lefty, leftz); } /* apply camera roll*/ { HPDF_REAL leftxprime, leftyprime, leftzprime; HPDF_REAL upxprime, upyprime, upzprime; HPDF_REAL sinroll, cosroll; sinroll = sin((roll/180.0f)*M_PI); cosroll = cos((roll/180.0f)*M_PI); leftxprime = leftx*cosroll + upx*sinroll; leftyprime = lefty*cosroll + upy*sinroll; leftzprime = leftz*cosroll + upz*sinroll; upxprime = upx*cosroll + leftx*sinroll; upyprime = upy*cosroll + lefty*sinroll; upzprime = upz*cosroll + leftz*sinroll; leftx = leftxprime; lefty = leftyprime; leftz = leftzprime; upx = upxprime; upy = upyprime; upz = upzprime; } /* translation vector*/ roo = fabs(roo); if (roo == 0.0) { roo = 0.000000000000000001; } transx = coox - roo*viewx; transy = cooy - roo*viewy; transz = cooz - roo*viewz; /* transformation matrix*/ matrix = HPDF_Array_New (view->mmgr); if (!matrix) { return HPDF_Error_GetCode (view->error); } ret = HPDF_Array_AddReal (matrix, leftx); if (ret != HPDF_OK) goto failed; ret = HPDF_Array_AddReal (matrix, lefty); if (ret != HPDF_OK) goto failed; ret = HPDF_Array_AddReal (matrix, leftz); if (ret != HPDF_OK) goto failed; ret = HPDF_Array_AddReal (matrix, upx); if (ret != HPDF_OK) goto failed; ret = HPDF_Array_AddReal (matrix, upy); if (ret != HPDF_OK) goto failed; ret = HPDF_Array_AddReal (matrix, upz); if (ret != HPDF_OK) goto failed; ret = HPDF_Array_AddReal (matrix, viewx); if (ret != HPDF_OK) goto failed; ret = HPDF_Array_AddReal (matrix, viewy); if (ret != HPDF_OK) goto failed; ret = HPDF_Array_AddReal (matrix, viewz); if (ret != HPDF_OK) goto failed; ret = HPDF_Array_AddReal (matrix, transx); if (ret != HPDF_OK) goto failed; ret = HPDF_Array_AddReal (matrix, transy); if (ret != HPDF_OK) goto failed; ret = HPDF_Array_AddReal (matrix, transz); if (ret != HPDF_OK) goto failed; ret = HPDF_Dict_AddName (view, "MS", "M"); if (ret != HPDF_OK) goto failed; ret = HPDF_Dict_Add (view, "C2W", matrix); if (ret != HPDF_OK) goto failed; ret = HPDF_Dict_AddNumber (view, "CO", roo); failed: if (ret != HPDF_OK) { HPDF_Array_Free (matrix); return ret; } return ret; }
HPDF_EXPORT(HPDF_STATUS) HPDF_3DView_SetBackgroundColor(HPDF_Dict view, HPDF_REAL r, HPDF_REAL g, HPDF_REAL b) { HPDF_Array color; HPDF_STATUS ret = HPDF_OK; HPDF_Dict background; HPDF_PTRACE ((" HPDF_3DView_SetBackgroundColor\n")); if (view == NULL || r < 0 || r > 1 || g < 0 || g > 1 || b < 0 || b > 1) { return HPDF_INVALID_U3D_DATA; } background = HPDF_Dict_New (view->mmgr); if (!background) { return HPDF_Error_GetCode (view->error); } color = HPDF_Array_New (view->mmgr); if (!color) { HPDF_Dict_Free (background); return HPDF_Error_GetCode (view->error); } ret = HPDF_Array_AddReal (color, r); if (ret != HPDF_OK) { HPDF_Array_Free (color); HPDF_Dict_Free (background); return ret; } ret = HPDF_Array_AddReal (color, g); if (ret != HPDF_OK) { HPDF_Array_Free (color); HPDF_Dict_Free (background); return ret; } ret = HPDF_Array_AddReal (color, b); if (ret != HPDF_OK) { HPDF_Array_Free (color); HPDF_Dict_Free (background); return ret; } ret = HPDF_Dict_AddName (background, "Type", "3DBG"); if (ret != HPDF_OK) { HPDF_Array_Free (color); HPDF_Dict_Free (background); return ret; } ret = HPDF_Dict_Add (background, "C", color); if (ret != HPDF_OK) { HPDF_Array_Free (color); HPDF_Dict_Free (background); return ret; } ret = HPDF_Dict_Add (view, "BG", background); if (ret != HPDF_OK) { HPDF_Array_Free (color); HPDF_Dict_Free (background); return ret; } return ret; }
HPDF_EXPORT(HPDF_STATUS) HPDF_3DView_AddNode(HPDF_Dict view, const char *name, HPDF_REAL opacity, HPDF_BOOL visible) { HPDF_Array nodes = NULL; HPDF_Dict node; HPDF_STATUS ret = HPDF_OK; HPDF_PTRACE ((" HPDF_3DView_AddNode\n")); if (view == NULL || opacity < 0 || opacity > 1 || name == NULL || name[0] == '\0') { return HPDF_INVALID_U3D_DATA; } nodes = (HPDF_Array)HPDF_Dict_GetItem (view, "NA", HPDF_OCLASS_ARRAY); if (nodes == NULL) { nodes = HPDF_Array_New (view->mmgr); if (!nodes) { return HPDF_Error_GetCode (view->error); } ret = HPDF_Dict_Add (view, "NA", nodes); if (ret != HPDF_OK) { HPDF_Array_Free (nodes); return ret; } } node = HPDF_Dict_New (view->mmgr); if (!node) { HPDF_Array_Free (nodes); return HPDF_Error_GetCode (view->error); } ret = HPDF_Dict_AddName (node, "Type", "3DNode"); if (ret != HPDF_OK) { HPDF_Array_Free (nodes); HPDF_Dict_Free (node); return ret; } ret = HPDF_Dict_Add (node, "N", HPDF_String_New (view->mmgr, name, NULL)); if (ret != HPDF_OK) { HPDF_Array_Free (nodes); HPDF_Dict_Free (node); return ret; } ret = HPDF_Dict_AddReal (node, "O", opacity); if (ret != HPDF_OK) { HPDF_Array_Free (nodes); HPDF_Dict_Free (node); return ret; } ret = HPDF_Dict_AddBoolean (node, "V", visible); if (ret != HPDF_OK) { HPDF_Dict_Free (node); HPDF_Array_Free (nodes); return ret; } ret = HPDF_Array_Add(nodes, node); if (ret != HPDF_OK) { HPDF_Dict_Free (node); HPDF_Array_Free (nodes); return ret; } return ret; }