Files
core/ASCOfficePDFWriter/PdfWriterLib/Pages.cpp
Elen.Subbotina 2276da418e правки под Linux после исправлений под iOs . BOOL -> bool (TRUE->true, FALSE->false)
git-svn-id: svn://fileserver/activex/AVS/Sources/TeamlabOffice/trunk/ServerComponents@62078 954022d7-b5bf-4e40-9824-e11837661b57
2016-05-20 23:57:10 +03:00

1170 lines
30 KiB
C++
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#include "Pages.h"
//--- Определения функий из PageOperations.h------
unsigned long PageEndPath (Page pPage);
unsigned long PageEndText (Page pPage);
unsigned long PageGRestore(Page pPage);
//------------------------------------------------
static unsigned int GetPageCount (Dict pPages)
{
unsigned int nCount = 0;
Array oKids = (Array)DictGetItem( pPages, "Kids", OCLASS_ARRAY);
if ( !oKids )
return 0;
for (unsigned int nIndex = 0; nIndex < oKids->pList->nCount; nIndex++)
{
void *pObj = ArrayGetItem( oKids, nIndex, OCLASS_DICT);
ObjHeader *pHeader = (ObjHeader *)pObj;
if ( pHeader->nObjClass == (OCLASS_DICT | OSUBCLASS_PAGES) )
nCount += GetPageCount( (Dict)pObj );
else if ( pHeader->nObjClass == (OCLASS_DICT | OSUBCLASS_PAGE) )
nCount += 1;
}
return nCount;
}
static unsigned long PagesBeforeWrite(Dict pObj)
{
Array oKids = (Array )DictGetItem( pObj, "Kids", OCLASS_ARRAY );
Number oCount = (Number)DictGetItem( pObj, "Count", OCLASS_NUMBER);
unsigned long nRet = OK;
if ( !oKids )
return SetError( pObj->oError, AVS_OFFICEPDFWRITER_ERROR_PAGES_MISSING_KIDS_ENTRY, 0 );
if ( oCount )
oCount->nValue = GetPageCount( pObj );
else
{
oCount = NumberNew( pObj->oMMgr, GetPageCount( pObj ) );
if ( !oCount )
return ErrorGetCode( pObj->oError );
if ( OK != ( nRet = DictAdd( pObj, "Count", oCount ) ) )
return nRet;
}
return OK;
}
static unsigned long PageBeforeWrite (Dict pObj)
{
unsigned long nRet = OK;
Page pPage = (Page)pObj;
PageAttr pAttr = (PageAttr)pObj->pAttr;
if ( GMODE_PATH_OBJECT == pAttr->nGMode )
{
if ( OK != ( nRet = PageEndPath( pPage ) ) )
return nRet;
}
if ( GMODE_TEXT_OBJECT == pAttr->nGMode )
{
if ( OK != ( nRet = PageEndText( pPage ) ) )
return nRet;
}
if ( pAttr->pGState )
while ( pAttr->pGState->pPrev )
{
if ( OK != ( nRet = PageGRestore( pPage ) ) )
return nRet;
}
return OK;
}
static void PageOnFree (Dict pObj)
{
PageAttr pAttr = (PageAttr)pObj->pAttr;
if (pAttr)
{
if (pAttr->pGState)
GStateFree( pObj->oMMgr, pAttr->pGState);
FreeMem( pObj->oMMgr, pAttr);
}
}
static unsigned long AddResource (Page pPage)
{
unsigned long nRet = OK;
Dict pResource = DictNew( pPage->oMMgr );
Array oProcset;
if ( !pResource )
return ErrorGetCode( pPage->oError );
// Не смотря на то, что ProcSet - устаревший объект, добавляем
// его для совместимости
nRet += DictAdd( pPage, "Resources", pResource );
oProcset = ArrayNew( pPage->oMMgr );
if ( !oProcset )
return ErrorGetCode( pPage->oError );
nRet += DictAdd( pResource, "ProcSet", oProcset );
nRet += ArrayAdd( oProcset, NameNew( pPage->oMMgr, "PDF" ) );
nRet += ArrayAdd( oProcset, NameNew( pPage->oMMgr, "Text" ) );
nRet += ArrayAdd( oProcset, NameNew( pPage->oMMgr, "ImageB" ) );
nRet += ArrayAdd( oProcset, NameNew( pPage->oMMgr, "ImageC" ) );
nRet += ArrayAdd( oProcset, NameNew( pPage->oMMgr, "ImageI" ) );
return nRet;
}
static unsigned long AddAnnotation (Page pPage, Annotation pAnnot)
{
Array oArray;
unsigned long nRet = OK;
// ищем вхождение "Annots"
oArray = (Array)DictGetItem( pPage, "Annots", OCLASS_ARRAY );
if ( !oArray )
{
oArray = ArrayNew( pPage->oMMgr );
if ( !oArray )
return ErrorGetCode( pPage->oError );
nRet = DictAdd( pPage, "Annots", oArray );
if ( OK != nRet )
return nRet;
}
return ArrayAdd( oArray, pAnnot );
}
//----- PagesObject -----------------------------------------------------------
unsigned long PagesAddKids (Pages pParent, Dict pKid)
{
Array oKids;
unsigned long nRet = OK;
if ( DictGetItem( pKid, "Parent", OCLASS_DICT ) )
return SetError( pParent->oError, AVS_OFFICEPDFWRITER_ERROR_PAGE_CANNOT_SET_PARENT, 0);
if ( OK != ( nRet = DictAdd( pKid, "Parent", pParent ) ) )
return nRet;
oKids = (Array)DictGetItem( pParent, "Kids", OCLASS_ARRAY );
if ( !oKids )
return SetError( pParent->oError, AVS_OFFICEPDFWRITER_ERROR_PAGES_MISSING_KIDS_ENTRY, 0 );
if ( pKid->pHeader.nObjClass == (OCLASS_DICT | OSUBCLASS_PAGE) )
{
PageAttr pAttr = (PageAttr)pKid->pAttr;
pAttr->pParent = pParent;
}
return ArrayAdd( oKids, pKid );
}
Pages PagesNew (MMgr oMMgr, Pages pParent, Xref pXref)
{
unsigned long nRet = OK;
Pages pPages = (Pages)DictNew( oMMgr );
if ( !pPages )
return NULL;
pPages->pHeader.nObjClass |= OSUBCLASS_PAGES;
pPages->pBeforeWriteFn = PagesBeforeWrite;
if ( OK != XrefAdd( pXref, pPages ) )
return NULL;
// добавляем необходимые элементы
nRet += DictAddName( pPages, "Type", "Pages" );
nRet += DictAdd( pPages, "Kids", ArrayNew( pPages->oMMgr ) );
nRet += DictAdd( pPages, "Count", NumberNew( pPages->oMMgr, 0 ) );
if ( OK == nRet && pParent )
nRet += PagesAddKids( pParent, pPages );
if ( OK != nRet )
return NULL;
return pPages;
}
bool PagesValidate (Pages pPages)
{
ObjHeader *pHeader = (ObjHeader *)pPages;
if ( !pPages || pHeader->nObjClass != (OCLASS_DICT | OSUBCLASS_PAGES) )
return false;
return true;
}
unsigned long PageInsertBefore (Page pPage, Page pTarget)
{
Page pParent = NULL;
Array oKids = NULL;
unsigned long nRet = OK;
PageAttr pAttr = (PageAttr )pTarget->pAttr;
pParent = pAttr->pParent;
if ( !pParent )
return SetError( pParent->oError, AVS_OFFICEPDFWRITER_ERROR_PAGE_CANNOT_SET_PARENT, 0 );
if ( DictGetItem( pPage, "Parent", OCLASS_DICT ) )
return SetError( pParent->oError, AVS_OFFICEPDFWRITER_ERROR_PAGE_CANNOT_SET_PARENT, 0 );
if ( OK != ( nRet = DictAdd( pPage, "Parent", pParent ) ) )
return nRet;
oKids = (Array )DictGetItem( pParent, "Kids", OCLASS_ARRAY );
if ( !oKids )
return SetError( pParent->oError, AVS_OFFICEPDFWRITER_ERROR_PAGES_MISSING_KIDS_ENTRY, 0 );
pAttr = (PageAttr)pPage->pAttr;
pAttr->pParent = pParent;
return ArrayInsert( oKids, pTarget, pPage);
}
//----- PageObject ------------------------------------------------------------
bool PageValidate (Page pPage)
{
ObjHeader *pHeader = (ObjHeader *)pPage;
if ( !pPage || !pPage->pAttr)
return false;
if ( pHeader->nObjClass != (OCLASS_DICT | OSUBCLASS_PAGE) )
return false;
return true;
}
Page PageNew (MMgr oMMgr, Xref pXref)
{
unsigned long nRet = OK;
PageAttr pAttr = NULL;
Page pPage = NULL;
pPage = DictNew( oMMgr );
if ( !pPage )
return NULL;
pPage->pHeader.nObjClass |= OSUBCLASS_PAGE;
pPage->pFreeFn = PageOnFree;
pPage->pBeforeWriteFn = PageBeforeWrite;
pAttr = (PageAttr)GetMem( pPage->oMMgr, sizeof(PageAttrRec) );
if ( !pAttr )
{
DictFree( pPage );
return NULL;
}
pPage->pAttr = pAttr;
UtilsMemSet( pAttr, 0, sizeof(PageAttrRec) );
pAttr->nGMode = GMODE_PAGE_DESCRIPTION;
pAttr->oCurPos = ToPoint( 0, 0);
pAttr->oTextPos = ToPoint( 0, 0);
nRet = XrefAdd( pXref, pPage);
if ( OK != nRet )
return NULL;
pAttr->pGState = GStateNew( pPage->oMMgr, NULL );
pAttr->pContents = DictStreamNew( pPage->oMMgr, pXref );
if ( !pAttr->pGState || !pAttr->pContents )
return NULL;
pAttr->pStream = pAttr->pContents->pStream;
pAttr->pXref = pXref;
// добавляем необходимые элементы
nRet += DictAddName( pPage, "Type", "Page");
nRet += DictAdd( pPage, "MediaBox", BoxArrayNew( pPage->oMMgr, ToBox( 0, 0, DEF_PAGE_WIDTH, DEF_PAGE_HEIGHT ) ) );
nRet += DictAdd( pPage, "Contents", pAttr->pContents );
nRet += AddResource ( pPage );
if ( OK != nRet )
return NULL;
return pPage;
}
void* PageGetInheritableItem (Page pPage, const char *sKey, unsigned short nObjClass)
{
bool bCheck = false;
int nIndex = 0;
void * pObj = NULL;
// проверяем поле sKey
while ( c_asInheritableEntries[nIndex] )
{
if ( UtilsStrCmp( sKey, c_asInheritableEntries[nIndex] ) == 0 )
{
bCheck = true;
break;
}
nIndex++;
}
// значение sKey не допустимо
if ( true != bCheck )
{
SetError( pPage->oError, AVS_OFFICEPDFWRITER_ERROR_INVALID_PARAMETER, 0);
return NULL;
}
pObj = DictGetItem( pPage, sKey, nObjClass );
// Если объект Resources нулевой, тогда ищем Resources у родительского объекта рекурсивно
if ( !pObj )
{
Pages pPages = (Pages)DictGetItem( pPage, "Parent", OCLASS_DICT);
while ( pPages )
{
pObj = DictGetItem( pPage, sKey, nObjClass);
if ( pObj )
break;
pPages = (Pages)DictGetItem( pPages, "Parent", OCLASS_DICT);
}
}
return pObj;
}
const char* PageGetXObjectName (Page pPage, XObject pXobj)
{
PageAttr pAttr = (PageAttr)pPage->pAttr;
const char *sKey;
if ( !pAttr->pXObjects )
{
Dict pResources = (Dict)PageGetInheritableItem( pPage, "Resources", OCLASS_DICT);
Dict pXobjects = NULL;
if ( !pResources )
return NULL;
pXobjects = DictNew( pPage->oMMgr );
if ( !pXobjects )
return NULL;
if ( OK != DictAdd( pResources, "XObject", pXobjects) )
return NULL;
pAttr->pXObjects = pXobjects;
}
// ищем объект xobject из xobject-resource
sKey = DictGetKeyByObj( pAttr->pXObjects, pXobj );
if ( !sKey)
{
// Если xobject не зарегистрирован в xobject-resource, регистрируем
// xobject в xobject-resource.
char sXObjName[LIMIT_MAX_NAME_LEN + 1];
char *pPointer;
char *pEndPointer = sXObjName + LIMIT_MAX_NAME_LEN;
pPointer = (char*)UtilsStrCpy( sXObjName, "X", pEndPointer);
UtilsIToA( pPointer, pAttr->pXObjects->pList->nCount + 1, pEndPointer);
if ( OK != DictAdd( pAttr->pXObjects, sXObjName, pXobj ) )
return NULL;
sKey = DictGetKeyByObj( pAttr->pXObjects, pXobj );
}
return sKey;
}
const char* PageGetLocalFontName (Page pPage, FontDict pFont)
{
PageAttr pAttr = (PageAttr)pPage->pAttr;
const char *sKey = NULL;
// проверяем существует ли объект font-resources, если нет, то создаем его
if ( !pAttr->pFonts )
{
Dict pResources = (Dict)PageGetInheritableItem( pPage, "Resources", OCLASS_DICT );
if ( !pResources )
return NULL;
Dict pFonts = DictNew( pPage->oMMgr );
if ( !pFonts )
return NULL;
if ( OK != DictAdd( pResources, "Font", pFonts ) )
return NULL;
pAttr->pFonts = pFonts;
}
// ищем объект font в font-resource
sKey = DictGetKeyByObj( pAttr->pFonts, pFont );
if ( !sKey )
{
// если фонт не зарегистрирован в ресурсах, тогда регистрируем его
char sFontName[LIMIT_MAX_NAME_LEN + 1];
char *pPointer = NULL;
char *pEndPointer = sFontName + LIMIT_MAX_NAME_LEN;
pPointer = (char*)UtilsStrCpy( sFontName, "F", pEndPointer);
UtilsIToA( pPointer, pAttr->pFonts->pList->nCount + 1, pEndPointer);
if ( OK != DictAdd( pAttr->pFonts, sFontName, pFont ) )
return NULL;
sKey = DictGetKeyByObj( pAttr->pFonts, pFont );
}
return sKey;
}
const char* PageGetExtGStateName (Page pPage, ExtGState pState)
{
PageAttr pAttr = (PageAttr)pPage->pAttr;
const char *sKey;
if ( !pAttr->pExtGStates )
{
Dict pResources = NULL;
Dict pExtGStates = NULL;
pResources = (Dict)PageGetInheritableItem( pPage, "Resources", OCLASS_DICT);
if ( !pResources )
return NULL;
pExtGStates = DictNew( pPage->oMMgr );
if ( !pExtGStates )
return NULL;
if ( OK != DictAdd( pResources, "ExtGState", pExtGStates ) )
return NULL;
pAttr->pExtGStates = pExtGStates;
}
// ищем объект ext_gstate в ext_gstate-resource
sKey = DictGetKeyByObj( pAttr->pExtGStates, pState);
if ( !sKey )
{
// Если ext_gstate не зарегистрирован в ext_gstate-resource, регистрируем
// ext_gstate в ext_gstate-resource.
char sExtGStateName[LIMIT_MAX_NAME_LEN + 1];
char *pPointer;
char *pEndPointer = sExtGStateName + LIMIT_MAX_NAME_LEN;
pPointer = (char*)UtilsStrCpy( sExtGStateName, "E", pEndPointer);
UtilsIToA( pPointer, pAttr->pExtGStates->pList->nCount + 1, pEndPointer);
if ( OK != DictAdd( pAttr->pExtGStates, sExtGStateName, pState) )
return NULL;
sKey = DictGetKeyByObj( pAttr->pExtGStates, pState);
}
return sKey;
}
Box PageGetMediaBox (Page pPage)
{
Box oMediaBox = {0, 0, 0, 0};
if ( PageValidate( pPage ) )
{
Array oArray = (Array)PageGetInheritableItem( pPage, "MediaBox", OCLASS_ARRAY);
if ( oArray )
{
Real oTemp;
oTemp = (Real)ArrayGetItem( oArray, 0, OCLASS_REAL );
if ( oTemp )
oMediaBox.fLeft = oTemp->fValue;
oTemp = (Real)ArrayGetItem( oArray, 1, OCLASS_REAL );
if ( oTemp )
oMediaBox.fBottom = oTemp->fValue;
oTemp = (Real)ArrayGetItem( oArray, 2, OCLASS_REAL );
if ( oTemp )
oMediaBox.fRight = oTemp->fValue;
oTemp = (Real)ArrayGetItem( oArray, 3, OCLASS_REAL );
if ( oTemp )
oMediaBox.fTop = oTemp->fValue;
CheckError( pPage->oError );
}
else
RaiseError( pPage->oError, AVS_OFFICEPDFWRITER_ERROR_PAGE_CANNOT_FIND_OBJECT, 0 );
}
return oMediaBox;
}
unsigned long PageSetBoxValue (Page pPage, const char *sName, unsigned int nIndex, float fValue)
{
Real oReal;
Array oArray;
if ( !PageValidate( pPage ) )
return AVS_OFFICEPDFWRITER_ERROR_INVALID_PAGE;
oArray = (Array)PageGetInheritableItem( pPage, sName, OCLASS_ARRAY);
if ( !oArray )
return SetError( pPage->oError, AVS_OFFICEPDFWRITER_ERROR_PAGE_CANNOT_FIND_OBJECT, 0);
oReal = (Real)ArrayGetItem( oArray, nIndex, OCLASS_REAL);
if ( !oReal )
return SetError( pPage->oError, AVS_OFFICEPDFWRITER_ERROR_PAGE_INVALID_INDEX, 0);
oReal->fValue = fValue;
return OK;
}
void PageSetFilter (Page pPage, unsigned int nFilter)
{
PageAttr pAttr = (PageAttr)pPage->pAttr;
pAttr->pContents->nFilter = nFilter;
}
unsigned long PageCheckState (Page pPage, unsigned int nMode)
{
if ( !pPage )
return AVS_OFFICEPDFWRITER_ERROR_INVALID_OBJECT;
if ( pPage->pHeader.nObjClass != (OSUBCLASS_PAGE | OCLASS_DICT) )
return AVS_OFFICEPDFWRITER_ERROR_INVALID_PAGE;
if ( !( ((PageAttr)pPage->pAttr)->nGMode & nMode ) )
return RaiseError( pPage->oError, AVS_OFFICEPDFWRITER_ERROR_PAGE_INVALID_GMODE, 0 );
return OK;
}
//------ Внешние функции ------------------------------------------------------
float PageTextWidth (Page pPage, const BYTE *sText, unsigned int nLen, unsigned int *pCIDs, unsigned int nLenCID)
{
//unsigned int nLen = UtilsStrLen( sText, LIMIT_MAX_STRING_LEN + 1 );
if ( !PageValidate( pPage ) || 0 == nLen )
return 0;
PageAttr pAttr = (PageAttr)pPage->pAttr;
TextWidth oTextWidth;
float fRes = 0;
if ( !pAttr->pGState->pFont )
{
RaiseError( pPage->oError, AVS_OFFICEPDFWRITER_ERROR_PAGE_FONT_NOT_FOUND, 0);
return 0;
}
oTextWidth = FontTextWidth( pAttr->pGState->pFont, (BYTE*)sText, nLen, pCIDs, nLenCID);
fRes += pAttr->pGState->fWordSpace * oTextWidth.nNumspace;
fRes += oTextWidth.nWidth * pAttr->pGState->fFontSize / 1000;
fRes += pAttr->pGState->fCharSpace * oTextWidth.nNumchars;
CheckError( pPage->oError );
return fRes;
}
unsigned int PageMeasureText (Page pPage, const char *sText, unsigned int *pCIDs, unsigned int nLenCID, float fWidth, bool bWordWrap, float *fRealWidth)
{
unsigned int nLen = UtilsStrLen( sText, LIMIT_MAX_STRING_LEN + 1 );
if ( !PageValidate( pPage ) || 0 == nLen )
return 0;
PageAttr pAttr = (PageAttr)pPage->pAttr;
unsigned int nRet = 0;
if ( !pAttr->pGState->pFont )
{
RaiseError( pPage->oError, AVS_OFFICEPDFWRITER_ERROR_PAGE_FONT_NOT_FOUND, 0);
return 0;
}
nRet = FontMeasureText( pAttr->pGState->pFont, (BYTE*)sText, nLen, pCIDs, nLenCID, fWidth, pAttr->pGState->fFontSize, pAttr->pGState->fCharSpace, pAttr->pGState->fWordSpace, bWordWrap, fRealWidth);
CheckError( pPage->oError );
return nRet;
}
float PageGetWidth (Page pPage)
{
return PageGetMediaBox( pPage ).fRight;
}
float PageGetHeight (Page pPage)
{
return PageGetMediaBox( pPage ).fTop;
}
FontDict PageGetCurrentFont (Page pPage)
{
if ( PageValidate( pPage ) )
{
PageAttr pAttr = (PageAttr)pPage->pAttr;
return pAttr->pGState->pFont;
}
else
return NULL;
}
float PageGetCurrentFontSize (Page pPage)
{
if ( PageValidate( pPage ) )
{
PageAttr pAttr = (PageAttr)pPage->pAttr;
return ( pAttr->pGState->pFont ) ? pAttr->pGState->fFontSize : 0;
}
else
return 0;
}
TransMatrix PageGetTransMatrix (Page pPage)
{
TransMatrix oDefaultMatrix = {1, 0, 0, 1, 0, 0};
if ( PageValidate( pPage ) )
{
PageAttr pAttr = (PageAttr)pPage->pAttr;
return pAttr->pGState->oTransMatrix;
}
else
return oDefaultMatrix;
}
float PageGetLineWidth (Page pPage)
{
if ( PageValidate( pPage ) )
{
PageAttr pAttr = (PageAttr)pPage->pAttr;
return pAttr->pGState->fLineWidth;
}
else
return DEF_LINEWIDTH;
}
LineCapStyle PageGetLineCap (Page pPage)
{
if ( PageValidate( pPage ) )
{
PageAttr pAttr = (PageAttr)pPage->pAttr;
return pAttr->pGState->eLineCap;
}
else
return DEF_LINECAP;
}
LineJoinStyle PageGetLineJoin (Page pPage)
{
if ( PageValidate( pPage ) )
{
PageAttr pAttr = (PageAttr)pPage->pAttr;
return pAttr->pGState->eLineJoin;
}
else
return DEF_LINEJOIN;
}
float PageGetMiterLimit (Page pPage)
{
if ( PageValidate( pPage ) )
{
PageAttr pAttr = (PageAttr)pPage->pAttr;
return pAttr->pGState->fMiterLimit;
}
else
return DEF_MITERLIMIT;
}
DashMode PageGetDash (Page pPage)
{
DashMode oMode = {{0, 0, 0, 0, 0, 0, 0, 0}, 0, 0};
if ( PageValidate( pPage ) )
{
PageAttr pAttr = (PageAttr)pPage->pAttr;
oMode = pAttr->pGState->oDashMode;
}
return oMode;
}
float PageGetFlat (Page pPage)
{
if ( PageValidate( pPage ) )
{
PageAttr pAttr = (PageAttr)pPage->pAttr;
return pAttr->pGState->fFlatness;
}
else
return DEF_FLATNESS;
}
float PageGetWordSpace (Page pPage)
{
if ( PageValidate( pPage ) )
{
PageAttr pAttr = (PageAttr)pPage->pAttr;
return pAttr->pGState->fWordSpace;
}
else
return DEF_WORDSPACE;
}
float PageGetCharSpace (Page pPage)
{
if ( PageValidate( pPage ) )
{
PageAttr pAttr = (PageAttr)pPage->pAttr;
return pAttr->pGState->fCharSpace;
}
else
return DEF_CHARSPACE;
}
float PageGetHorizontalScalling(Page pPage)
{
if ( PageValidate( pPage ) )
{
PageAttr pAttr = (PageAttr)pPage->pAttr;
return pAttr->pGState->fHScalling;
}
else
return DEF_HSCALING;
}
float PageGetTextLeading (Page pPage)
{
if ( PageValidate( pPage ) )
{
PageAttr pAttr = (PageAttr)pPage->pAttr;
return pAttr->pGState->fTextLeading;
}
else
return DEF_LEADING;
}
TextRenderingMode PageGetTextRenderingMode (Page pPage)
{
if ( PageValidate( pPage ) )
{
PageAttr pAttr = (PageAttr)pPage->pAttr;
return pAttr->pGState->eRenderingMode;
}
else
return DEF_RENDERING_MODE;
}
float PageGetTextRise (Page pPage)
{
if ( PageValidate( pPage ) )
{
PageAttr pAttr = (PageAttr)pPage->pAttr;
return pAttr->pGState->fTextRise;
}
else
return DEF_RISE;
}
RGBColor PageGetRGBFill (Page pPage)
{
RGBColor oDefaultRGBColor = {0, 0, 0};
if ( PageValidate( pPage ) )
{
PageAttr pAttr = (PageAttr)pPage->pAttr;
if ( CSDeviceRGB == pAttr->pGState->eCSFill )
return pAttr->pGState->oRGBFill;
}
return oDefaultRGBColor;
}
RGBColor PageGetRGBStroke (Page pPage)
{
RGBColor oDefaultRGBColor = {0, 0, 0};
if ( PageValidate( pPage ) )
{
PageAttr pAttr = (PageAttr)pPage->pAttr;
if ( CSDeviceRGB == pAttr->pGState->eCSStroke )
return pAttr->pGState->oRGBStroke;
}
return oDefaultRGBColor;
}
CMYKColor PageGetCMYKFill (Page pPage)
{
CMYKColor oDefaultCMYKColor = {0, 0, 0, 0};
if ( PageValidate( pPage ) )
{
PageAttr pAttr = (PageAttr)pPage->pAttr;
if ( CSDeviceCMYK == pAttr->pGState->eCSFill )
return pAttr->pGState->oCMYKFill;
}
return oDefaultCMYKColor;
}
CMYKColor PageGetCMYKStroke (Page pPage)
{
CMYKColor oDefaultCMYKColor = {0, 0, 0, 0};
if ( PageValidate( pPage ) )
{
PageAttr pAttr = (PageAttr)pPage->pAttr;
if ( CSDeviceCMYK == pAttr->pGState->eCSStroke )
return pAttr->pGState->oCMYKStroke;
}
return oDefaultCMYKColor;
}
float PageGetGrayFill (Page pPage)
{
if ( PageValidate( pPage ) )
{
PageAttr pAttr = (PageAttr)pPage->pAttr;
if ( CSDeviceGray == pAttr->pGState->eCSFill )
return pAttr->pGState->fGrayFill;
}
return 0;
}
float PageGetGrayStroke (Page pPage)
{
if ( PageValidate( pPage ) )
{
PageAttr pAttr = (PageAttr)pPage->pAttr;
if ( CSDeviceGray == pAttr->pGState->eCSStroke )
return pAttr->pGState->fGrayStroke;
}
return 0;
}
ColorSpace PageGetStrokingColorSpace(Page pPage)
{
if ( PageValidate( pPage ) )
return ( (PageAttr)pPage->pAttr)->pGState->eCSStroke;
return CSEOF;
}
ColorSpace PageGetFillingColorSpace (Page pPage)
{
if ( PageValidate( pPage ) )
return ( (PageAttr)pPage->pAttr)->pGState->eCSFill;
return CSEOF;
}
TransMatrix PageGetTextMatrix (Page pPage)
{
TransMatrix oDefaultMatrix = {1, 0, 0, 1, 0, 0};
if ( PageValidate( pPage ) )
{
PageAttr pAttr = (PageAttr)pPage->pAttr;
return pAttr->oTextMatrix;
}
else
return oDefaultMatrix;
}
unsigned int PageGetGStateDepth (Page pPage)
{
if ( PageValidate( pPage ) )
{
PageAttr pAttr = (PageAttr)pPage->pAttr;
return pAttr->pGState->nDepth;
}
else
return 0;
}
unsigned short PageGetGMode (Page pPage)
{
if ( PageValidate( pPage ) )
return ( (PageAttr)pPage->pAttr)->nGMode;
return 0;
}
TPoint PageGetCurrentPos (Page pPage)
{
TPoint oPos = {0, 0};
if ( PageValidate( pPage ) )
{
PageAttr pAttr = (PageAttr)pPage->pAttr;
if ( pAttr->nGMode & GMODE_PATH_OBJECT )
oPos = pAttr->oCurPos;
}
return oPos;
}
unsigned long PageGetCurrentPos2 (Page pPage, TPoint *poPos)
{
if ( !PageValidate( pPage ) )
return AVS_OFFICEPDFWRITER_ERROR_INVALID_PAGE;
PageAttr pAttr = (PageAttr)pPage->pAttr;
poPos->fX = 0;
poPos->fY = 0;
if ( pAttr->nGMode & GMODE_PATH_OBJECT )
*poPos = pAttr->oCurPos;
return OK;
}
TPoint PageGetCurrentTextPos (Page pPage)
{
TPoint oPos = {0, 0};
if ( PageValidate( pPage ) )
{
PageAttr pAttr = (PageAttr)pPage->pAttr;
if ( pAttr->nGMode & GMODE_TEXT_OBJECT )
oPos = pAttr->oTextPos;
}
return oPos;
}
unsigned long PageGetCurrentTextPos2 (Page pPage, TPoint *poPos)
{
if ( !PageValidate( pPage ))
return AVS_OFFICEPDFWRITER_ERROR_INVALID_PAGE;
PageAttr pAttr = (PageAttr)pPage->pAttr;
poPos->fX = 0;
poPos->fY = 0;
if ( pAttr->nGMode & GMODE_TEXT_OBJECT )
*poPos = pAttr->oTextPos;
return OK;
}
unsigned long PageSetRotate (Page pPage, unsigned short nAngle)
{
Number oNumber = NULL;
unsigned long nRet = OK;
if ( !PageValidate( pPage ))
return AVS_OFFICEPDFWRITER_ERROR_INVALID_PAGE;
if ( 0 != nAngle % 90 )
return RaiseError( pPage->oError, AVS_OFFICEPDFWRITER_ERROR_PAGE_INVALID_ROTATE_VALUE, (unsigned long)nAngle);
oNumber = (Number)PageGetInheritableItem( pPage, "Rotate", OCLASS_NUMBER );
if ( !oNumber )
nRet = DictAddNumber( pPage, "Rotate", nAngle );
else
oNumber->nValue = nAngle;
return nRet;
}
unsigned long PageSetWidth (Page pPage, float fValue)
{
if ( fValue < 1 || fValue > 14400 )
return RaiseError( pPage->oError, AVS_OFFICEPDFWRITER_ERROR_PAGE_INVALID_SIZE, 0);
if ( OK != PageSetBoxValue( pPage, "MediaBox", 2, fValue) )
return CheckError( pPage->oError );
return OK;
}
unsigned long PageSetHeight (Page pPage, float fValue)
{
if ( fValue < 1 || fValue > 14400 )
return RaiseError( pPage->oError, AVS_OFFICEPDFWRITER_ERROR_PAGE_INVALID_SIZE, 0);
if ( OK != PageSetBoxValue( pPage, "MediaBox", 3, fValue) )
return CheckError( pPage->oError);
return OK;
}
unsigned long PageSetSize (Page pPage, PageSizes eSize, PageDirection eDirection)
{
unsigned long nRet = OK;
if ( !PageValidate( pPage ))
return AVS_OFFICEPDFWRITER_ERROR_INVALID_PAGE;
if ( eSize < 0 || eSize >= PageSizeEOF )
return RaiseError( pPage->oError, AVS_OFFICEPDFWRITER_ERROR_PAGE_INVALID_SIZE, (unsigned long)eSize );
if ( PageLandscape == eDirection )
{
nRet += PageSetHeight( pPage, c_asPredefinedPageSizes[ (unsigned int)eSize ].fX );
nRet += PageSetWidth ( pPage, c_asPredefinedPageSizes[ (unsigned int)eSize ].fY );
}
else if ( PagePortrait == eDirection )
{
nRet += PageSetHeight( pPage, c_asPredefinedPageSizes[ (unsigned int)eSize ].fY );
nRet += PageSetWidth ( pPage, c_asPredefinedPageSizes[ (unsigned int)eSize ].fX );
}
else
nRet = SetError( pPage->oError, AVS_OFFICEPDFWRITER_ERROR_PAGE_INVALID_DIRECTION, (unsigned long)eDirection );
if ( OK != nRet )
return CheckError( pPage->oError );
return OK;
}
Destination PageCreateDestination (Page pPage)
{
if ( !PageValidate( pPage ) )
return NULL;
PageAttr pAttr = (PageAttr)pPage->pAttr;
Destination pDest = DestinationNew( pPage->oMMgr, pPage, pAttr->pXref );
if ( !pDest )
CheckError( pPage->oError );
return pDest;
}
Annotation PageCreateTextAnnot (Page pPage, TRect oRect, const char *sText, EncoderRecPtr pEncoder)
{
if ( !PageValidate( pPage ) )
return NULL;
PageAttr pAttr = (PageAttr)pPage->pAttr;
if ( pEncoder && !EncoderValidate( pEncoder ) )
{
RaiseError( pPage->oError, AVS_OFFICEPDFWRITER_ERROR_INVALID_ENCODER, 0);
return NULL;
}
Annotation pAnnot = TextAnnotNew( pPage->oMMgr, pAttr->pXref, oRect, sText, pEncoder);
if ( pAnnot )
{
if ( OK != AddAnnotation( pPage, pAnnot ) )
{
CheckError( pPage->oError );
pAnnot = NULL;
}
}
else
CheckError( pPage->oError );
return pAnnot;
}
Annotation PageCreateLinkAnnot (Page pPage, TRect oRect, Destination pDest)
{
if ( !PageValidate( pPage ) )
return NULL;
PageAttr pAttr = (PageAttr)pPage->pAttr;
if ( !DestinationValidate( pDest ) )
{
RaiseError( pPage->oError, AVS_OFFICEPDFWRITER_ERROR_INVALID_DESTINATION, 0);
return NULL;
}
Annotation pAnnot = LinkAnnotNew( pPage->oMMgr, pAttr->pXref, oRect, pDest );
if ( pAnnot )
{
if ( OK != AddAnnotation( pPage, pAnnot ) )
{
CheckError( pPage->oError );
pAnnot = NULL;
}
}
else
CheckError( pPage->oError );
return pAnnot;
}
Annotation PageCreateUriLinkAnnot (Page pPage, TRect oRect, const char *sUri)
{
if ( !PageValidate( pPage ) )
return NULL;
PageAttr pAttr = (PageAttr)pPage->pAttr;
if ( UtilsStrLen( sUri, LIMIT_MAX_STRING_LEN ) <= 0 )
{
RaiseError( pPage->oError, AVS_OFFICEPDFWRITER_ERROR_INVALID_URL, 0);
return NULL;
}
Annotation pAnnot = URILinkAnnotNew( pPage->oMMgr, pAttr->pXref, oRect, sUri);
if ( pAnnot )
{
if ( OK != AddAnnotation( pPage, pAnnot) )
{
CheckError( pPage->oError );
pAnnot = NULL;
}
}
else
CheckError( pPage->oError );
return pAnnot;
}