* external/libhpdf/Makefile
+ Enabled for all dos platforms (dos/watcom currently and
probably all dos builds done on MS-DOS hosts).
+ external/libhpdf/ori_dst
+ external/libhpdf/ori_src
+ external/libhpdf/cnv_hb2o.bat
+ external/libhpdf/cnv_o2hb.bat
- external/libhpdf/hpdf_annotation.c
- external/libhpdf/hpdf_annotation.h
- external/libhpdf/hpdf_array.c
- external/libhpdf/hpdf_binary.c
- external/libhpdf/hpdf_boolean.c
- external/libhpdf/hpdf_catalog.c
- external/libhpdf/hpdf_catalog.h
- external/libhpdf/hpdf_conf.h
- external/libhpdf/hpdf_config.h
- external/libhpdf/hpdf_consts.h
- external/libhpdf/hpdf_destination.c
- external/libhpdf/hpdf_destination.h
- external/libhpdf/hpdf_dict.c
- external/libhpdf/hpdf_doc.c
- external/libhpdf/hpdf_doc.h
- external/libhpdf/hpdf_doc_png.c
- external/libhpdf/hpdf_encoder.c
- external/libhpdf/hpdf_encoder.h
- external/libhpdf/hpdf_encoder_cns.c
- external/libhpdf/hpdf_encoder_cnt.c
- external/libhpdf/hpdf_encoder_jp.c
- external/libhpdf/hpdf_encoder_kr.c
- external/libhpdf/hpdf_encrypt.c
- external/libhpdf/hpdf_encrypt.h
- external/libhpdf/hpdf_encryptdict.c
- external/libhpdf/hpdf_encryptdict.h
- external/libhpdf/hpdf_error.c
- external/libhpdf/hpdf_error.h
- external/libhpdf/hpdf_ext_gstate.c
- external/libhpdf/hpdf_ext_gstate.h
- external/libhpdf/hpdf_font.c
- external/libhpdf/hpdf_font.h
- external/libhpdf/hpdf_font_cid.c
- external/libhpdf/hpdf_font_tt.c
- external/libhpdf/hpdf_font_type1.c
- external/libhpdf/hpdf_fontdef.c
- external/libhpdf/hpdf_fontdef.h
- external/libhpdf/hpdf_fontdef_base14.c
- external/libhpdf/hpdf_fontdef_cid.c
- external/libhpdf/hpdf_fontdef_cns.c
- external/libhpdf/hpdf_fontdef_cnt.c
- external/libhpdf/hpdf_fontdef_jp.c
- external/libhpdf/hpdf_fontdef_kr.c
- external/libhpdf/hpdf_fontdef_tt.c
- external/libhpdf/hpdf_fontdef_type1.c
- external/libhpdf/hpdf_gstate.c
- external/libhpdf/hpdf_gstate.h
- external/libhpdf/hpdf_image.c
- external/libhpdf/hpdf_image.h
- external/libhpdf/hpdf_image_png.c
- external/libhpdf/hpdf_info.c
- external/libhpdf/hpdf_info.h
- external/libhpdf/hpdf_list.c
- external/libhpdf/hpdf_list.h
- external/libhpdf/hpdf_mmgr.c
- external/libhpdf/hpdf_mmgr.h
- external/libhpdf/hpdf_name.c
- external/libhpdf/hpdf_null.c
- external/libhpdf/hpdf_number.c
- external/libhpdf/hpdf_objects.c
- external/libhpdf/hpdf_objects.h
- external/libhpdf/hpdf_outline.c
- external/libhpdf/hpdf_outline.h
- external/libhpdf/hpdf_page_label.c
- external/libhpdf/hpdf_page_label.h
- external/libhpdf/hpdf_page_operator.c
- external/libhpdf/hpdf_pages.c
- external/libhpdf/hpdf_pages.h
- external/libhpdf/hpdf_real.c
- external/libhpdf/hpdf_streams.c
- external/libhpdf/hpdf_streams.h
- external/libhpdf/hpdf_string.c
- external/libhpdf/hpdf_types.h
- external/libhpdf/hpdf_u3d.c
- external/libhpdf/hpdf_u3d.h
- external/libhpdf/hpdf_utils.c
- external/libhpdf/hpdf_utils.h
- external/libhpdf/hpdf_version.h
- external/libhpdf/hpdf_xref.c
+ external/libhpdf/hpdfanno.c
+ external/libhpdf/hpdfanno.h
+ external/libhpdf/hpdfarra.c
+ external/libhpdf/hpdfbina.c
+ external/libhpdf/hpdfbool.c
+ external/libhpdf/hpdfcata.c
+ external/libhpdf/hpdfcata.h
+ external/libhpdf/hpdfcfg.h
+ external/libhpdf/hpdfconf.h
+ external/libhpdf/hpdfcons.h
+ external/libhpdf/hpdfdest.c
+ external/libhpdf/hpdfdest.h
+ external/libhpdf/hpdfdict.c
+ external/libhpdf/hpdfdoc.c
+ external/libhpdf/hpdfdoc.h
+ external/libhpdf/hpdfdocp.c
+ external/libhpdf/hpdfecy.c
+ external/libhpdf/hpdfecyd.c
+ external/libhpdf/hpdfencc.c
+ external/libhpdf/hpdfencj.c
+ external/libhpdf/hpdfenck.c
+ external/libhpdf/hpdfencn.c
+ external/libhpdf/hpdfenco.c
+ external/libhpdf/hpdfenco.h
+ external/libhpdf/hpdfencr.h
+ external/libhpdf/hpdfency.h
+ external/libhpdf/hpdferro.c
+ external/libhpdf/hpdferro.h
+ external/libhpdf/hpdfextg.c
+ external/libhpdf/hpdfextg.h
+ external/libhpdf/hpdffdf.c
+ external/libhpdf/hpdffdf1.c
+ external/libhpdf/hpdffdfb.c
+ external/libhpdf/hpdffdfc.c
+ external/libhpdf/hpdffdfi.c
+ external/libhpdf/hpdffdfj.c
+ external/libhpdf/hpdffdfk.c
+ external/libhpdf/hpdffdfn.c
+ external/libhpdf/hpdffdft.c
+ external/libhpdf/hpdffon1.c
+ external/libhpdf/hpdffonc.c
+ external/libhpdf/hpdffond.h
+ external/libhpdf/hpdffont.c
+ external/libhpdf/hpdffont.h
+ external/libhpdf/hpdffott.c
+ external/libhpdf/hpdfgsta.c
+ external/libhpdf/hpdfgsta.h
+ external/libhpdf/hpdfimag.c
+ external/libhpdf/hpdfimag.h
+ external/libhpdf/hpdfimap.c
+ external/libhpdf/hpdfinfo.c
+ external/libhpdf/hpdfinfo.h
+ external/libhpdf/hpdflist.c
+ external/libhpdf/hpdflist.h
+ external/libhpdf/hpdfmmgr.c
+ external/libhpdf/hpdfmmgr.h
+ external/libhpdf/hpdfname.c
+ external/libhpdf/hpdfnull.c
+ external/libhpdf/hpdfnumb.c
+ external/libhpdf/hpdfobje.c
+ external/libhpdf/hpdfobje.h
+ external/libhpdf/hpdfoutl.c
+ external/libhpdf/hpdfoutl.h
+ external/libhpdf/hpdfpage.c
+ external/libhpdf/hpdfpage.h
+ external/libhpdf/hpdfpago.c
+ external/libhpdf/hpdfpags.c
+ external/libhpdf/hpdfpags.h
+ external/libhpdf/hpdfreal.c
+ external/libhpdf/hpdfstre.c
+ external/libhpdf/hpdfstre.h
+ external/libhpdf/hpdfstri.c
+ external/libhpdf/hpdftype.h
+ external/libhpdf/hpdfu3d.c
+ external/libhpdf/hpdfu3d.h
+ external/libhpdf/hpdfutil.c
+ external/libhpdf/hpdfutil.h
+ external/libhpdf/hpdfvers.h
+ external/libhpdf/hpdfxref.c
* external/libhpdf/hpdf.h
* external/libhpdf/Makefile
* Converted to short filenames. Added converted scripts.
* source/hbpcre/cnv_hb2o.bat
* source/hbpcre/cnv_o2hb.bat
! Fixed typo in prev.
* Removed PCRE references from comment texts.
717 lines
15 KiB
C
717 lines
15 KiB
C
/*
|
|
* << Haru Free PDF Library >> -- hpdf_u3d.c
|
|
*
|
|
* URL: http://libharu.org
|
|
*
|
|
* Copyright (c) 1999-2006 Takeshi Kanno <takeshi_kanno@est.hi-ho.ne.jp>
|
|
* Copyright (c) 2007-2008 Antony Dovgal <tony@daylessday.org>
|
|
*
|
|
* Permission to use, copy, modify, distribute and sell this software
|
|
* and its documentation for any purpose is hereby granted without fee,
|
|
* provided that the above copyright notice appear in all copies and
|
|
* that both that copyright notice and this permission notice appear
|
|
* in supporting documentation.
|
|
* It is provided "as is" without express or implied warranty.
|
|
*
|
|
*/
|
|
#include "hpdfconf.h"
|
|
#include "hpdfutil.h"
|
|
#include "hpdf.h"
|
|
|
|
#include <string.h>
|
|
|
|
HPDF_U3D
|
|
HPDF_U3D_LoadU3D (HPDF_MMgr mmgr,
|
|
HPDF_Stream u3d_data,
|
|
HPDF_Xref xref);
|
|
|
|
static const char u3d[] = "U3D";
|
|
static const char prc[] = "PRC";
|
|
|
|
static HPDF_STATUS Get3DStreamType (HPDF_Stream stream, const char **type)
|
|
{
|
|
HPDF_BYTE tag[4];
|
|
HPDF_UINT len;
|
|
|
|
HPDF_PTRACE ((" HPDF_U3D_Get3DStreamType\n"));
|
|
|
|
len = 4;
|
|
if (HPDF_Stream_Read (stream, tag, &len) != HPDF_OK) {
|
|
return HPDF_Error_GetCode (stream->error);
|
|
}
|
|
|
|
if (HPDF_Stream_Seek (stream, 0, HPDF_SEEK_SET) != HPDF_OK) {
|
|
return HPDF_Error_GetCode (stream->error);
|
|
}
|
|
|
|
if (HPDF_MemCmp(tag, (HPDF_BYTE *)u3d, 4/* yes, \0 is required */) == 0) {
|
|
*type = u3d;
|
|
return HPDF_OK;
|
|
}
|
|
|
|
if (HPDF_MemCmp(tag, (HPDF_BYTE *)prc, 3) == 0) {
|
|
*type = prc;
|
|
return HPDF_OK;
|
|
}
|
|
|
|
return HPDF_INVALID_U3D_DATA;
|
|
}
|
|
|
|
|
|
HPDF_U3D
|
|
HPDF_U3D_LoadU3DFromMem ( HPDF_MMgr mmgr,
|
|
const HPDF_BYTE *buf,
|
|
HPDF_UINT size,
|
|
HPDF_Xref xref )
|
|
{
|
|
HPDF_Dict image;
|
|
HPDF_STATUS ret = HPDF_OK;
|
|
|
|
HPDF_PTRACE ((" HPDF_U3D_LoadU3DFromMem\n"));
|
|
|
|
image = HPDF_DictStream_New (mmgr, xref);
|
|
if (!image) {
|
|
return NULL;
|
|
}
|
|
|
|
image->header.obj_class |= HPDF_OSUBCLASS_XOBJECT;
|
|
ret = HPDF_Dict_AddName (image, "Type", "XObject");
|
|
if (ret != HPDF_OK) {
|
|
HPDF_Dict_Free(image);
|
|
return NULL;
|
|
}
|
|
|
|
ret = HPDF_Dict_AddName (image, "Subtype", "Image");
|
|
if (ret != HPDF_OK) {
|
|
HPDF_Dict_Free(image);
|
|
return NULL;
|
|
}
|
|
|
|
if (HPDF_Stream_Write (image->stream, buf, size) != HPDF_OK) {
|
|
HPDF_Dict_Free(image);
|
|
return NULL;
|
|
}
|
|
|
|
return image;
|
|
}
|
|
|
|
|
|
HPDF_EXPORT(HPDF_Image)
|
|
HPDF_LoadU3DFromFile (HPDF_Doc pdf,
|
|
const char *filename)
|
|
{
|
|
HPDF_Stream imagedata;
|
|
HPDF_Image image;
|
|
|
|
HPDF_PTRACE ((" HPDF_LoadU3DFromFile\n"));
|
|
|
|
if (!HPDF_HasDoc (pdf)) {
|
|
return NULL;
|
|
}
|
|
|
|
/* create file stream */
|
|
imagedata = HPDF_FileReader_New (pdf->mmgr, filename);
|
|
|
|
if (HPDF_Stream_Validate (imagedata)) {
|
|
image = HPDF_U3D_LoadU3D (pdf->mmgr, imagedata, pdf->xref);
|
|
} else {
|
|
image = NULL;
|
|
}
|
|
|
|
/* destroy file stream */
|
|
HPDF_Stream_Free (imagedata);
|
|
|
|
if (!image) {
|
|
HPDF_CheckError (&pdf->error);
|
|
}
|
|
return image;
|
|
}
|
|
|
|
HPDF_U3D
|
|
HPDF_U3D_LoadU3D (HPDF_MMgr mmgr,
|
|
HPDF_Stream u3d_data,
|
|
HPDF_Xref xref)
|
|
{
|
|
HPDF_Dict u3d;
|
|
const char *type;
|
|
|
|
HPDF_PTRACE ((" HPDF_U3D_LoadU3D\n"));
|
|
|
|
u3d = HPDF_DictStream_New (mmgr, xref);
|
|
if (!u3d) {
|
|
return NULL;
|
|
}
|
|
|
|
u3d->header.obj_class |= HPDF_OSUBCLASS_XOBJECT;
|
|
|
|
/* add required elements */
|
|
u3d->filter = HPDF_STREAM_FILTER_NONE;
|
|
|
|
if (HPDF_Dict_AddName (u3d, "Type", "3D") != HPDF_OK) {
|
|
HPDF_Dict_Free(u3d);
|
|
return NULL;
|
|
}
|
|
|
|
if (Get3DStreamType (u3d_data, &type) != HPDF_OK) {
|
|
HPDF_Dict_Free(u3d);
|
|
return NULL;
|
|
}
|
|
|
|
if (HPDF_Dict_AddName (u3d, "Subtype", type) != HPDF_OK) {
|
|
HPDF_Dict_Free(u3d);
|
|
return NULL;
|
|
}
|
|
|
|
for (;;) {
|
|
HPDF_BYTE buf[HPDF_STREAM_BUF_SIZ];
|
|
HPDF_UINT len = HPDF_STREAM_BUF_SIZ;
|
|
HPDF_STATUS ret = HPDF_Stream_Read (u3d_data, buf, &len);
|
|
|
|
if (ret != HPDF_OK) {
|
|
if (ret == HPDF_STREAM_EOF) {
|
|
if (len > 0) {
|
|
ret = HPDF_Stream_Write (u3d->stream, buf, len);
|
|
if (ret != HPDF_OK) {
|
|
HPDF_Dict_Free(u3d);
|
|
return NULL;
|
|
}
|
|
}
|
|
break;
|
|
} else {
|
|
HPDF_Dict_Free(u3d);
|
|
return NULL;
|
|
}
|
|
}
|
|
|
|
if (HPDF_Stream_Write (u3d->stream, buf, len) != HPDF_OK) {
|
|
HPDF_Dict_Free(u3d);
|
|
return NULL;
|
|
}
|
|
}
|
|
|
|
return u3d;
|
|
}
|
|
|
|
HPDF_EXPORT(HPDF_Dict) HPDF_Create3DView(HPDF_MMgr mmgr, const char *name)
|
|
{
|
|
HPDF_STATUS ret = HPDF_OK;
|
|
HPDF_Dict view;
|
|
|
|
HPDF_PTRACE ((" HPDF_Create3DView\n"));
|
|
|
|
if (name == NULL || name[0] == '\0') {
|
|
return NULL;
|
|
}
|
|
|
|
view = HPDF_Dict_New (mmgr);
|
|
if (!view) {
|
|
return NULL;
|
|
}
|
|
|
|
ret = HPDF_Dict_AddName (view, "TYPE", "3DView");
|
|
if (ret != HPDF_OK) {
|
|
HPDF_Dict_Free (view);
|
|
return NULL;
|
|
}
|
|
|
|
ret = HPDF_Dict_Add (view, "XN", HPDF_String_New (mmgr, name, NULL));
|
|
if (ret != HPDF_OK) {
|
|
HPDF_Dict_Free (view);
|
|
return NULL;
|
|
}
|
|
|
|
ret = HPDF_Dict_Add (view, "IN", HPDF_String_New (mmgr, name, NULL));
|
|
if (ret != HPDF_OK) {
|
|
HPDF_Dict_Free (view);
|
|
return NULL;
|
|
}
|
|
|
|
return view;
|
|
}
|
|
|
|
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_EXPORT(HPDF_STATUS) HPDF_U3D_SetDefault3DView(HPDF_U3D u3d, const char *name)
|
|
{
|
|
HPDF_STATUS ret = HPDF_OK;
|
|
|
|
HPDF_PTRACE ((" HPDF_U3D_SetDefault3DView\n"));
|
|
|
|
if (u3d == NULL || name == NULL || name[0] == '\0') {
|
|
return HPDF_INVALID_U3D_DATA;
|
|
}
|
|
|
|
ret = HPDF_Dict_Add (u3d, "DV", HPDF_String_New (u3d->mmgr, name, NULL));
|
|
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;
|
|
}
|
|
|
|
HPDF_EXPORT(HPDF_STATUS) HPDF_3DView_SetLighting(HPDF_Dict view, const char *scheme)
|
|
{
|
|
HPDF_STATUS ret = HPDF_OK;
|
|
HPDF_Dict lighting;
|
|
int i;
|
|
static const char *schemes[] =
|
|
{ "Artwork", "None", "White", "Day", "Night", "Hard", "Primary", "Blue", "Red", "Cube", "CAD", "Headlamp" };
|
|
|
|
HPDF_PTRACE ((" HPDF_3DView_SetLighting\n"));
|
|
|
|
if (view == NULL || scheme == NULL || scheme[0] == '\0') {
|
|
return HPDF_INVALID_U3D_DATA;
|
|
}
|
|
|
|
for (i = 0; i < 12; i++) {
|
|
if (!strcmp(scheme, schemes[i])) {
|
|
break;
|
|
}
|
|
}
|
|
|
|
if (i == 12) {
|
|
return HPDF_INVALID_U3D_DATA;
|
|
}
|
|
|
|
lighting = HPDF_Dict_New (view->mmgr);
|
|
if (!lighting) {
|
|
return HPDF_Error_GetCode (view->error);
|
|
}
|
|
|
|
ret = HPDF_Dict_AddName (lighting, "Type", "3DLightingScheme");
|
|
if (ret != HPDF_OK) {
|
|
HPDF_Dict_Free (lighting);
|
|
return ret;
|
|
}
|
|
|
|
ret = HPDF_Dict_AddName (lighting, "Subtype", scheme);
|
|
if (ret != HPDF_OK) {
|
|
HPDF_Dict_Free (lighting);
|
|
return ret;
|
|
}
|
|
|
|
ret = HPDF_Dict_Add (view, "LS", lighting);
|
|
if (ret != HPDF_OK) {
|
|
HPDF_Dict_Free (lighting);
|
|
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_SetPerspectiveProjection(HPDF_Dict view, HPDF_REAL fov)
|
|
{
|
|
HPDF_STATUS ret = HPDF_OK;
|
|
HPDF_Dict projection;
|
|
|
|
HPDF_PTRACE ((" HPDF_3DView_SetPerspectiveProjection\n"));
|
|
|
|
if (view == NULL || fov < 0 || fov > 180) {
|
|
return HPDF_INVALID_U3D_DATA;
|
|
}
|
|
|
|
projection = HPDF_Dict_New (view->mmgr);
|
|
if (!projection) {
|
|
return HPDF_Error_GetCode (view->error);
|
|
}
|
|
|
|
ret = HPDF_Dict_AddName (projection, "Subtype", "P");
|
|
if (ret != HPDF_OK) {
|
|
HPDF_Dict_Free (projection);
|
|
return ret;
|
|
}
|
|
|
|
ret = HPDF_Dict_AddName (projection, "PS", "Min");
|
|
if (ret != HPDF_OK) {
|
|
HPDF_Dict_Free (projection);
|
|
return ret;
|
|
}
|
|
|
|
ret = HPDF_Dict_AddReal (projection, "FOV", fov);
|
|
if (ret != HPDF_OK) {
|
|
HPDF_Dict_Free (projection);
|
|
return ret;
|
|
}
|
|
|
|
ret = HPDF_Dict_Add (view, "P", projection);
|
|
if (ret != HPDF_OK) {
|
|
HPDF_Dict_Free (projection);
|
|
return ret;
|
|
}
|
|
return ret;
|
|
}
|
|
|
|
HPDF_EXPORT(HPDF_STATUS) HPDF_3DView_SetOrthogonalProjection(HPDF_Dict view, HPDF_REAL mag)
|
|
{
|
|
HPDF_STATUS ret = HPDF_OK;
|
|
HPDF_Dict projection;
|
|
|
|
HPDF_PTRACE ((" HPDF_3DView_SetOrthogonalProjection\n"));
|
|
|
|
if (view == NULL || mag <= 0) {
|
|
return HPDF_INVALID_U3D_DATA;
|
|
}
|
|
|
|
projection = HPDF_Dict_New (view->mmgr);
|
|
if (!projection) {
|
|
return HPDF_Error_GetCode (view->error);
|
|
}
|
|
|
|
ret = HPDF_Dict_AddName (projection, "Subtype", "O");
|
|
if (ret != HPDF_OK) {
|
|
HPDF_Dict_Free (projection);
|
|
return ret;
|
|
}
|
|
|
|
ret = HPDF_Dict_AddReal (projection, "OS", mag);
|
|
if (ret != HPDF_OK) {
|
|
HPDF_Dict_Free (projection);
|
|
return ret;
|
|
}
|
|
|
|
ret = HPDF_Dict_Add (view, "P", projection);
|
|
if (ret != HPDF_OK) {
|
|
HPDF_Dict_Free (projection);
|
|
return ret;
|
|
}
|
|
return ret;
|
|
}
|
|
|
|
#define normalize(x, y, z) \
|
|
{ \
|
|
HPDF_REAL modulo; \
|
|
modulo = sqrtf(x*x + y*y + z*z); \
|
|
if (modulo != 0.0) \
|
|
{ \
|
|
x = x/modulo; \
|
|
y = y/modulo; \
|
|
z = z/modulo; \
|
|
} \
|
|
}
|
|
|
|
/* building the transformation matrix*/
|
|
/* #1,#2,#3 centre of orbit coordinates (coo)*/
|
|
/* #4,#5,#6 centre of orbit to camera direction vector (c2c)*/
|
|
/* #7 orbital radius (roo)*/
|
|
/* #8 camera roll (roll)*/
|
|
|
|
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;
|
|
}
|
|
#undef normalize
|
|
|