65
65
if (index < NUM_RESOURCE_TYPES * NUM_RESOURCE_CHAINS)
66
66
ENUM_RETURN(pdev->resources[index / NUM_RESOURCE_CHAINS].chains[index % NUM_RESOURCE_CHAINS]);
67
67
index -= NUM_RESOURCE_TYPES * NUM_RESOURCE_CHAINS;
68
if (index <= pdev->outline_depth)
68
if (index <= pdev->outline_depth && pdev->outline_levels)
69
69
ENUM_RETURN(pdev->outline_levels[index].first.action);
70
70
index -= pdev->outline_depth + 1;
71
if (index <= pdev->outline_depth)
71
if (index <= pdev->outline_depth && pdev->outline_levels)
72
72
ENUM_RETURN(pdev->outline_levels[index].last.action);
73
73
index -= pdev->outline_depth + 1;
74
74
ENUM_PREFIX(st_device_psdf, 0);
102
102
for (i = 0; i < NUM_RESOURCE_TYPES; ++i)
103
103
for (j = 0; j < NUM_RESOURCE_CHAINS; ++j)
104
104
RELOC_PTR(gx_device_pdf, resources[i].chains[j]);
105
for (i = 0; i <= pdev->outline_depth; ++i) {
106
RELOC_PTR(gx_device_pdf, outline_levels[i].first.action);
107
RELOC_PTR(gx_device_pdf, outline_levels[i].last.action);
105
if (pdev->outline_levels) {
106
for (i = 0; i <= pdev->outline_depth; ++i) {
107
RELOC_PTR(gx_device_pdf, outline_levels[i].first.action);
108
RELOC_PTR(gx_device_pdf, outline_levels[i].last.action);
149
152
#define PDF_DEVICE_IDENT gs_ps2write_device
150
153
#define PDF_DEVICE_MaxInlineImageSize max_long
151
154
#define PDF_FOR_OPDFREAD 1
153
#include "gdevpdfb.h"
155
#undef PDF_DEVICE_NAME
156
#undef PDF_DEVICE_IDENT
157
#undef PDF_DEVICE_MaxInlineImageSize
158
#undef PDF_FOR_OPDFREAD
155
#define PDF_FOR_EPS2WRITE 0
157
#include "gdevpdfb.h"
159
#undef PDF_DEVICE_NAME
160
#undef PDF_DEVICE_IDENT
161
#undef PDF_DEVICE_MaxInlineImageSize
162
#undef PDF_FOR_OPDFREAD
163
#undef PDF_FOR_EPS2WRITE
165
#define PDF_DEVICE_NAME "eps2write"
166
#define PDF_DEVICE_IDENT gs_eps2write_device
167
#define PDF_DEVICE_MaxInlineImageSize max_long
168
#define PDF_FOR_OPDFREAD 1
169
#define PDF_FOR_EPS2WRITE 1
171
#include "gdevpdfb.h"
173
#undef PDF_DEVICE_NAME
174
#undef PDF_DEVICE_IDENT
175
#undef PDF_DEVICE_MaxInlineImageSize
176
#undef PDF_FOR_OPDFREAD
177
#undef PDF_FOR_EPS2WRITE
159
178
/* ---------------- Device open/close ---------------- */
161
180
/* Close and remove temporary files. */
689
707
for (j = 0; j < NUM_RESOURCE_CHAINS; ++j)
690
708
pdev->resources[i].chains[j] = 0;
710
pdev->outline_levels = (pdf_outline_level_t *)gs_alloc_bytes(mem, INITIAL_MAX_OUTLINE_DEPTH * sizeof(pdf_outline_level_t), "outline_levels array");
711
memset(pdev->outline_levels, 0x00, INITIAL_MAX_OUTLINE_DEPTH * sizeof(pdf_outline_level_t));
712
pdev->max_outline_depth = INITIAL_MAX_OUTLINE_DEPTH;
692
713
pdev->outline_levels[0].first.id = 0;
693
714
pdev->outline_levels[0].left = max_int;
694
715
pdev->outline_levels[0].first.action = 0;
866
/* Save viewer's memory with cleaning resources. */
868
#ifdef DEPRECATED_906
869
if (pdev->MaxViewerMemorySize < 10000000) {
870
/* fixme: the condition above and the cleaning algorithm
871
may be improved with counting stored resource size
872
and creating multiple streams per page. */
874
if (pdev->ForOPDFRead) {
875
pdf_resource_t *pres = pdf_find_resource_by_resource_id(pdev, resourcePage, pdev->contents_id);
878
code = cos_dict_put_c_strings((cos_dict_t *)pres->object, "/.CleanResources", "/All");
883
code = pdf_close_text_document(pdev);
886
code = pdf_write_and_free_all_resource_objects(pdev);
892
886
/* Close use of text on the page. */
894
888
pdf_close_text_page(pdev);
953
947
const cos_value_t *v_artbox = cos_dict_find_c_key(page->Page, "/ArtBox");
954
948
const cos_value_t *v_cropbox = cos_dict_find_c_key(page->Page, "/CropBox");
955
949
const cos_value_t *v_bleedbox = cos_dict_find_c_key(page->Page, "/BleedBox");
956
floatp trimbox[4] = {0, 0}, bleedbox[4] = {0, 0};
950
double trimbox[4] = {0, 0}, bleedbox[4] = {0, 0};
957
951
bool print_bleedbox = false;
959
953
trimbox[2] = bleedbox[2] = mediabox[2];
1807
1805
linear_params->PageHintHeader.MostSharedObjects = hint->NumSharedObjects;
1810
write_hint_stream(linear_params, (unsigned int *)&linear_params->PageHintHeader.LeastObjectsPerPage, 32);
1811
write_hint_stream(linear_params, (unsigned int *)&pdev->ResourceUsage[pdev->pages[0].Page->id].LinearisedOffset, 32);
1808
write_hint_stream(linear_params, (gs_offset_t)linear_params->PageHintHeader.LeastObjectsPerPage, 32);
1809
write_hint_stream(linear_params, (gs_offset_t)pdev->ResourceUsage[pdev->pages[0].Page->id].LinearisedOffset, 32);
1812
1810
i = (linear_params->PageHintHeader.MostObjectsPerPage - linear_params->PageHintHeader.MostObjectsPerPage + 1);
1818
1816
linear_params->PageHintHeader.ObjectNumBits = j;
1819
write_hint_stream(linear_params, (unsigned int *)&linear_params->PageHintHeader.ObjectNumBits, 16);
1820
write_hint_stream(linear_params, (unsigned int *)&linear_params->PageHintHeader.LeastPageLength, 32);
1817
write_hint_stream(linear_params, (gs_offset_t)linear_params->PageHintHeader.ObjectNumBits, 16);
1818
write_hint_stream(linear_params, (gs_offset_t)linear_params->PageHintHeader.LeastPageLength, 32);
1821
1819
i = (linear_params->PageHintHeader.MostPageLength - linear_params->PageHintHeader.LeastPageLength + 1);
1827
1825
linear_params->PageHintHeader.PageLengthNumBits = j;
1828
write_hint_stream(linear_params, (unsigned int *)&linear_params->PageHintHeader.PageLengthNumBits, 16);
1829
write_hint_stream(linear_params, (unsigned int *)&linear_params->PageHintHeader.LeastPageOffset, 32);
1826
write_hint_stream(linear_params, (gs_offset_t)linear_params->PageHintHeader.PageLengthNumBits, 16);
1827
write_hint_stream(linear_params, (gs_offset_t)linear_params->PageHintHeader.LeastPageOffset, 32);
1830
1828
i = (linear_params->PageHintHeader.MostPageOffset - linear_params->PageHintHeader.LeastPageOffset + 1);
1836
1834
linear_params->PageHintHeader.PageOffsetNumBits = j;
1837
write_hint_stream(linear_params, (unsigned int *)&linear_params->PageHintHeader.PageOffsetNumBits, 16);
1838
write_hint_stream(linear_params, (unsigned int *)&linear_params->PageHintHeader.LeastContentLength, 32);
1835
write_hint_stream(linear_params, (gs_offset_t)linear_params->PageHintHeader.PageOffsetNumBits, 16);
1836
write_hint_stream(linear_params, (gs_offset_t)linear_params->PageHintHeader.LeastContentLength, 32);
1839
1837
i = (linear_params->PageHintHeader.MostContentLength - linear_params->PageHintHeader.LeastContentLength + 1);
1845
1843
linear_params->PageHintHeader.ContentLengthNumBits = j;
1846
write_hint_stream(linear_params, (unsigned int *)&linear_params->PageHintHeader.ContentLengthNumBits, 16);
1847
write_hint_stream(linear_params, (unsigned int *)&linear_params->PageHintHeader.MostSharedObjects, 16);
1844
write_hint_stream(linear_params, (gs_offset_t)linear_params->PageHintHeader.ContentLengthNumBits, 16);
1845
write_hint_stream(linear_params, (gs_offset_t)linear_params->PageHintHeader.MostSharedObjects, 16);
1848
1846
i = (linear_params->PageHintHeader.LargestSharedObject + 1);
1854
1852
linear_params->PageHintHeader.SharedObjectNumBits = j;
1855
write_hint_stream(linear_params, (unsigned int *)&linear_params->PageHintHeader.SharedObjectNumBits, 16);
1853
write_hint_stream(linear_params, (gs_offset_t)linear_params->PageHintHeader.SharedObjectNumBits, 16);
1857
write_hint_stream(linear_params, (unsigned int *)&j, 16);
1858
write_hint_stream(linear_params, (unsigned int *)&j, 16);
1855
write_hint_stream(linear_params, (gs_offset_t)j, 16);
1856
write_hint_stream(linear_params, (gs_offset_t)j, 16);
1860
1858
#ifdef LINEAR_DEBUGGING
1861
1859
dmprintf1(pdev->pdf_memory, "LeastObjectsPerPage %d\n", linear_params->PageHintHeader.LeastObjectsPerPage);
1862
dmprintf1(pdev->pdf_memory, "Page 1 Offset %ld\n", pdev->ResourceUsage[pdev->pages[0].Page->id].LinearisedOffset);
1860
dmprintf1(pdev->pdf_memory, "Page 1 Offset %"PRId64"\n", pdev->ResourceUsage[pdev->pages[0].Page->id].LinearisedOffset);
1863
1861
dmprintf1(pdev->pdf_memory, "ObjectNumBits %d\n", linear_params->PageHintHeader.ObjectNumBits);
1864
1862
dmprintf1(pdev->pdf_memory, "LeastPageLength %d\n", linear_params->PageHintHeader.LeastPageLength);
1865
1863
dmprintf1(pdev->pdf_memory, "MostPagelength %d\n", linear_params->PageHintHeader.MostPageLength);
1884
1882
Num = hint->NumUniqueObjects - linear_params->PageHintHeader.LeastObjectsPerPage;
1885
write_hint_stream(linear_params, (unsigned int *)&Num, linear_params->PageHintHeader.ObjectNumBits);
1883
write_hint_stream(linear_params, (gs_offset_t)Num, linear_params->PageHintHeader.ObjectNumBits);
1886
1884
dmprintf2(pdev->pdf_memory, "Page %d NumUniqueObjects %d\n", i, Num);
1888
1886
for (i=0;i < pdev->next_page;i++) {
1892
1890
Num = hint->PageLength - linear_params->PageHintHeader.LeastPageLength;
1893
write_hint_stream(linear_params, (unsigned int *)&Num, linear_params->PageHintHeader.PageLengthNumBits);
1891
write_hint_stream(linear_params, (gs_offset_t)Num, linear_params->PageHintHeader.PageLengthNumBits);
1894
1892
dmprintf2(pdev->pdf_memory, "Page %d PageLength %d\n", i, Num);
1896
1894
for (i=0;i < pdev->next_page;i++) {
1897
1895
page_hint_stream_t *hint = &linear_params->PageHints[i];
1900
write_hint_stream(linear_params, (unsigned int *)&i, linear_params->PageHintHeader.SharedObjectNumBits);
1898
write_hint_stream(linear_params, (gs_offset_t)i, linear_params->PageHintHeader.SharedObjectNumBits);
1901
1899
dmprintf2(pdev->pdf_memory, "Page %d NumSharedObjects %d\n", i, 1);
1904
write_hint_stream(linear_params, (unsigned int *)&hint->NumSharedObjects, linear_params->PageHintHeader.SharedObjectNumBits);
1902
write_hint_stream(linear_params, (gs_offset_t)hint->NumSharedObjects, linear_params->PageHintHeader.SharedObjectNumBits);
1905
1903
dmprintf2(pdev->pdf_memory, "Page %d NumSharedObjects %d\n", i, hint->NumSharedObjects);
1909
1907
page_hint_stream_t *hint = &linear_params->PageHints[i];
1911
1909
for (j=0;j < hint->NumSharedObjects;j++) {
1912
write_hint_stream(linear_params, (unsigned int *)&hint->SharedObjectRef[j], linear_params->PageHintHeader.SharedObjectNumBits);
1910
write_hint_stream(linear_params, (gs_offset_t)hint->SharedObjectRef[j], linear_params->PageHintHeader.SharedObjectNumBits);
1913
1911
dmprintf3(pdev->pdf_memory, "Page %d SharedObject %d ObjectRef %d\n", i, j, hint->SharedObjectRef[j]);
1917
1915
for (i=0;i < pdev->next_page;i++) {
1918
1916
page_hint_stream_t *hint = &linear_params->PageHints[i];
1920
1918
for (j=0;j < hint->NumSharedObjects;j++) {
1921
write_hint_stream(linear_params, (unsigned int *)&j, 1);
1919
write_hint_stream(linear_params, (gs_offset_t)j, 1);
1922
1920
dmprintf2(pdev->pdf_memory, "Page %d SharedObject %d Position Numerator 1\n", i, j);
1929
1927
Num = hint->ContentOffset - linear_params->PageHintHeader.LeastPageOffset;
1930
write_hint_stream(linear_params, (unsigned int *)&Num, linear_params->PageHintHeader.PageOffsetNumBits);
1928
write_hint_stream(linear_params, (gs_offset_t)Num, linear_params->PageHintHeader.PageOffsetNumBits);
1931
1929
dmprintf2(pdev->pdf_memory, "Page %d ContentStreamOffset %d\n", i, Num);
1933
1931
for (i=1;i < pdev->next_page;i++) {
1937
1935
Num = hint->ContentLength - linear_params->PageHintHeader.LeastContentLength;
1938
write_hint_stream(linear_params, (unsigned int *)&Num, linear_params->PageHintHeader.ContentLengthNumBits);
1936
write_hint_stream(linear_params, (gs_offset_t)Num, linear_params->PageHintHeader.ContentLengthNumBits);
1939
1937
dmprintf2(pdev->pdf_memory, "Page %d ContentStreamLength %d\n", i, Num);
1941
1939
flush_hint_stream(linear_params);
1951
1949
linear_params->SharedHintHeader.FirstObjectOffset = linear_params->SharedHints[1].ObjectOffset;
1953
1951
if (linear_params->SharedHints[i].ObjectLength < linear_params->SharedHintHeader.LeastObjectLength) {
1954
linear_params->SharedHints[i].ObjectLength = linear_params->SharedHintHeader.LeastObjectLength;
1952
linear_params->SharedHintHeader.LeastObjectLength = linear_params->SharedHints[i].ObjectLength;
1956
1954
if (linear_params->SharedHints[i].ObjectLength > linear_params->SharedHintHeader.MostObjectLength) {
1957
linear_params->SharedHints[i].ObjectLength = linear_params->SharedHintHeader.MostObjectLength;
1955
linear_params->SharedHintHeader.MostObjectLength = linear_params->SharedHints[i].ObjectLength;
1961
1959
linear_params->SharedHintHeader.FirstPageEntries = linear_params->NumPage1Resources;
1962
1960
linear_params->SharedHintHeader.NumSharedObjects = linear_params->NumSharedResources + linear_params->SharedHintHeader.FirstPageEntries;
1964
write_hint_stream(linear_params, (unsigned int *)&linear_params->SharedHintHeader.FirstSharedObject, 32);
1962
write_hint_stream(linear_params, (gs_offset_t)linear_params->SharedHintHeader.FirstSharedObject, 32);
1965
1963
dmprintf1(pdev->pdf_memory, "\nFirstSharedObject %d\n", linear_params->SharedHintHeader.FirstSharedObject);
1966
write_hint_stream(linear_params, (unsigned int *)&linear_params->SharedHintHeader.FirstObjectOffset, 32);
1967
dmprintf1(pdev->pdf_memory, "FirstObjectOffset %ld\n", linear_params->SharedHintHeader.FirstObjectOffset);
1968
write_hint_stream(linear_params, (unsigned int *)&linear_params->SharedHintHeader.FirstPageEntries, 32);
1964
write_hint_stream(linear_params, (gs_offset_t)linear_params->SharedHintHeader.FirstObjectOffset, 32);
1965
dmprintf1(pdev->pdf_memory, "FirstObjectOffset %"PRId64"\n", linear_params->SharedHintHeader.FirstObjectOffset);
1966
write_hint_stream(linear_params, (gs_offset_t)linear_params->SharedHintHeader.FirstPageEntries, 32);
1969
1967
dmprintf1(pdev->pdf_memory, "FirstPageEntries %d\n", linear_params->SharedHintHeader.FirstPageEntries);
1970
write_hint_stream(linear_params, (unsigned int *)&linear_params->SharedHintHeader.NumSharedObjects, 32);
1968
write_hint_stream(linear_params, (gs_offset_t)linear_params->SharedHintHeader.NumSharedObjects, 32);
1971
1969
dmprintf1(pdev->pdf_memory, "NumSharedObjects %d\n", linear_params->SharedHintHeader.NumSharedObjects);
1973
write_hint_stream(linear_params, (unsigned int *)&j, 32);
1971
write_hint_stream(linear_params, (gs_offset_t)j, 32);
1974
1972
dmprintf(pdev->pdf_memory, "GreatestObjectsNumBits 1\n");
1975
write_hint_stream(linear_params, (unsigned int *)&linear_params->SharedHintHeader.FirstObjectOffset, 16);
1976
dmprintf1(pdev->pdf_memory, "FirstObjectOffset %ld\n", linear_params->SharedHintHeader.FirstObjectOffset);
1977
write_hint_stream(linear_params, (unsigned int *)&linear_params->SharedHintHeader.LeastObjectLength, 32);
1973
write_hint_stream(linear_params, (gs_offset_t)linear_params->SharedHintHeader.FirstObjectOffset, 16);
1974
dmprintf1(pdev->pdf_memory, "FirstObjectOffset %"PRId64"\n", linear_params->SharedHintHeader.FirstObjectOffset);
1975
write_hint_stream(linear_params, (gs_offset_t)linear_params->SharedHintHeader.LeastObjectLength, 32);
1978
1976
dmprintf1(pdev->pdf_memory, "LeastObjectLength %d\n", linear_params->SharedHintHeader.LeastObjectLength);
1980
1978
i = (linear_params->SharedHintHeader.MostObjectLength - linear_params->SharedHintHeader.LeastObjectLength + 1) / 2;
1986
1984
linear_params->SharedHintHeader.LengthNumBits = j + 1;
1987
write_hint_stream(linear_params, (unsigned int *)&linear_params->SharedHintHeader.LengthNumBits, 16);
1985
write_hint_stream(linear_params, (gs_offset_t)linear_params->SharedHintHeader.LengthNumBits, 16);
1989
1987
for (i = 0; i< linear_params->NumSharedHints; i++) {
1990
1988
unsigned int Length = linear_params->SharedHints[i].ObjectLength - linear_params->SharedHintHeader.LeastObjectLength;
1992
write_hint_stream(linear_params, (unsigned int *)&Length, linear_params->SharedHintHeader.LengthNumBits);
1990
write_hint_stream(linear_params, (gs_offset_t)Length, linear_params->SharedHintHeader.LengthNumBits);
1993
1991
dmprintf2(pdev->pdf_memory, "Shared Object group %d, Length %d\n", i, Length);
1997
1995
for (i = 0; i< linear_params->NumSharedHints; i++) {
1998
write_hint_stream(linear_params, (unsigned int *)&j, 1);
1996
write_hint_stream(linear_params, (gs_offset_t)j, 1);
1999
1997
dmprintf1(pdev->pdf_memory, "Shared Object group %d, SignatureFlag false\n", i);
2001
1999
for (i = 0; i< linear_params->NumSharedHints; i++) {
2002
write_hint_stream(linear_params, (unsigned int *)&j, 1);
2000
write_hint_stream(linear_params, (gs_offset_t)j, 1);
2003
2001
dmprintf1(pdev->pdf_memory, "Shared Object group %d, NumObjects 1\n", i);
2049
2047
for (i = 1;i < LDictObj; i++) {
2050
2048
for (j = 0; j < pdev->ResourceUsageSize;j++) {
2051
2049
if (pdev->ResourceUsage[j].NewObjectNumber == i) {
2052
gs_sprintf(Header, "%010ld 00000 n \n", pdev->ResourceUsage[j].LinearisedOffset + HintStreamLen);
2050
gs_sprintf(Header, "%010"PRId64" 00000 n \n", pdev->ResourceUsage[j].LinearisedOffset + HintStreamLen);
2053
2051
fwrite(Header, 20, 1, linear_params->sfile);
2058
gs_sprintf(LDict, "trailer\n<</Size %d>>\nstartxref\n%ld\n%%%%EOF\n",
2056
gs_sprintf(LDict, "trailer\n<</Size %d>>\nstartxref\n%"PRId64"\n%%%%EOF\n",
2059
2057
LDictObj, linear_params->FirstxrefOffset);
2060
2058
fwrite(LDict, strlen(LDict), 1, linear_params->sfile);
2071
2069
gp_fseek_64(linear_params->sfile, linear_params->LDictOffset, SEEK_SET);
2072
gs_sprintf(LDict, "%d 0 obj\n<</Linearized 1/L %ld/H[ ", LDictObj, linear_params->FileLength);
2070
gs_sprintf(LDict, "%d 0 obj\n<</Linearized 1/L %"PRId64"/H[ ", LDictObj, linear_params->FileLength);
2073
2071
fwrite(LDict, strlen(LDict), 1, linear_params->sfile);
2075
gs_sprintf(LDict, "%ld", pdev->ResourceUsage[HintStreamObj].LinearisedOffset);
2073
gs_sprintf(LDict, "%"PRId64"", pdev->ResourceUsage[HintStreamObj].LinearisedOffset);
2076
2074
fwrite(LDict, strlen(LDict), 1, linear_params->sfile);
2077
gs_sprintf(LDict, " %ld]", HintStreamLen);
2075
gs_sprintf(LDict, " %"PRId64"]", HintStreamLen);
2078
2076
fwrite(LDict, strlen(LDict), 1, linear_params->sfile);
2079
2077
/* Implementation Note 180 in hte PDF Reference 1.7 says that Acrobat
2080
2078
* gets the 'E' value wrong. So its probably not important....
2082
gs_sprintf(LDict, "/O %d/E %ld",pdev->ResourceUsage[pdev->pages[0].Page->id].NewObjectNumber, linear_params->E);
2080
gs_sprintf(LDict, "/O %d/E %"PRId64"",pdev->ResourceUsage[pdev->pages[0].Page->id].NewObjectNumber, linear_params->E);
2083
2081
fwrite(LDict, strlen(LDict), 1, linear_params->sfile);
2084
gs_sprintf(LDict, "/N %d/T %ld>>\nendobj\n", pdev->next_page, linear_params->T);
2082
gs_sprintf(LDict, "/N %d/T %"PRId64">>\nendobj\n", pdev->next_page, linear_params->T);
2085
2083
fwrite(LDict, strlen(LDict), 1, linear_params->sfile);
2087
2085
/* Return to the secondary xref and write it again filling
2094
2092
for (i = LDictObj;i <= linear_params->LastResource + 2; i++) {
2095
2093
for (j = 0; j < pdev->ResourceUsageSize;j++) {
2096
2094
if (pdev->ResourceUsage[j].NewObjectNumber == i) {
2097
gs_sprintf(Header, "%010ld 00000 n \n", pdev->ResourceUsage[j].LinearisedOffset);
2095
gs_sprintf(Header, "%010"PRId64" 00000 n \n", pdev->ResourceUsage[j].LinearisedOffset);
2098
2096
fwrite(Header, 20, 1, linear_params->sfile);
2104
2102
* in the missing values.
2106
2104
code = gp_fseek_64(linear_params->sfile, linear_params->FirsttrailerOffset, SEEK_SET);
2107
gs_sprintf(LDict, "\ntrailer\n<</Size %ld/Info %d 0 R/Root %d 0 R/ID[%s%s]/Prev %ld>>\nstartxref\r\n0\n%%%%EOF\n",
2108
linear_params->LastResource + 3, pdev->ResourceUsage[linear_params->Info_id].NewObjectNumber, pdev->ResourceUsage[linear_params->Catalog_id].NewObjectNumber, fileID, fileID, (unsigned long)mainxref);
2105
gs_sprintf(LDict, "\ntrailer\n<</Size %ld/Info %d 0 R/Root %d 0 R/ID[%s%s]/Prev %"PRId64">>\nstartxref\r\n0\n%%%%EOF\n",
2106
linear_params->LastResource + 3, pdev->ResourceUsage[linear_params->Info_id].NewObjectNumber, pdev->ResourceUsage[linear_params->Catalog_id].NewObjectNumber, fileID, fileID, mainxref);
2109
2107
fwrite(LDict, strlen(LDict), 1, linear_params->sfile);
2111
2109
code = gp_fseek_64(linear_params->sfile, pdev->ResourceUsage[HintStreamObj].LinearisedOffset, SEEK_SET);
2112
gs_sprintf(LDict, "%d 0 obj\n<</Length %10ld", HintStreamObj, HintLength);
2110
gs_sprintf(LDict, "%d 0 obj\n<</Length %10"PRId64"", HintStreamObj, HintLength);
2113
2111
fwrite(LDict, strlen(LDict), 1, linear_params->sfile);
2114
gs_sprintf(LDict, "\n/S %10ld>>\nstream\n", SharedHintOffset);
2112
gs_sprintf(LDict, "\n/S %10"PRId64">>\nstream\n", SharedHintOffset);
2115
2113
fwrite(LDict, strlen(LDict), 1, linear_params->sfile);
2224
2222
long Catalog_id = pdev->Catalog->id, Info_id = pdev->Info->id,
2225
2223
Pages_id = pdev->Pages->id, Encrypt_id = 0;
2226
2224
long Threads_id = 0;
2225
bool partial_page = (pdev->contents_id != 0 && pdev->next_page != 0);
2227
2226
int code = 0, code1, pagecount=0;
2228
2227
int64_t start_section, end_section;
2230
2231
pdf_linearisation_t linear_params;
2231
2232
memset(&linear_params, 0x00, sizeof(linear_params));
2243
2244
if (pdev->next_page == 0) {
2245
/* If we didn't get called from pdf_output_page, and we are doign file-per-page
2246
* output, then the call from close_device will leave an empty file which we don't
2247
* want. So here we delete teh file.
2249
if (!pdev->InOutputPage && gx_outputfile_is_separate_pages(pdev->fname, pdev->memory)) {
2250
code = gdev_vector_close_file((gx_device_vector *) pdev);
2253
code = gx_device_delete_output_file((const gx_device *)pdev, pdev->fname);
2255
return gs_note_error(gs_error_ioerror);
2244
2258
code = pdf_open_page(pdev, PDF_IN_STREAM);
2392
2404
/* Write named destinations. (We can't free them yet.) */
2395
pdf_record_usage(pdev, pdev->Dests->id, resource_usage_part9_structure);
2396
COS_WRITE_OBJECT(pdev->Dests, pdev, resourceDests);
2406
if (pdev->CompatibilityLevel < 1.2) {
2408
pdf_record_usage(pdev, pdev->Dests->id, resource_usage_part9_structure);
2409
COS_WRITE_OBJECT(pdev->Dests, pdev, resourceDests);
2413
pdf_record_usage(pdev, pdev->Dests->id, resource_usage_part9_structure);
2414
cos_write_dict_as_ordered_array((cos_object_t *)pdev->Dests, pdev, resourceDests);
2416
/* Write Embedded files. (We can't free them yet.) */
2418
if (pdev->EmbeddedFiles) {
2419
pdf_record_usage(pdev, pdev->EmbeddedFiles->id, resource_usage_part9_structure);
2420
cos_write_dict_as_ordered_array((cos_object_t *)pdev->EmbeddedFiles, pdev, resourceEmbeddedFiles);
2399
2424
/* Write the PageLabel array */
2442
2467
pprintld1(s, "/Threads %ld 0 R\n", Threads_id);
2443
2468
pdf_record_usage(pdev, Threads_id, resource_usage_part1_structure);
2446
pprintld1(s, "/Dests %ld 0 R\n", pdev->Dests->id);
2470
if (pdev->CompatibilityLevel < 1.2) {
2472
pprintld1(s, "/Dests %ld 0 R\n", pdev->Dests->id);
2474
if (pdev->Dests || pdev->EmbeddedFiles) {
2475
stream_puts(s, "/Names <<\n");
2477
pprintld1(s, "/Dests <</Kids [%ld 0 R]>>\n", pdev->Dests->id);
2478
if (pdev->EmbeddedFiles)
2479
pprintld1(s, "/EmbeddedFiles << /Kids [%ld 0 R]>>\n", pdev->EmbeddedFiles->id);
2480
stream_puts(s, ">>\n");
2447
2483
if (pdev->PageLabels)
2448
2484
pprintld1(s, "/PageLabels << /Nums %ld 0 R >>\n",
2449
2485
pdev->PageLabels->id);
2511
2551
/* All resources and procsets written, end the prolog */
2512
2552
stream_puts(pdev->strm, "%%EndProlog\n");
2554
if (pdev->params.PSDocOptions.data) {
2556
char *p = (char *)pdev->params.PSDocOptions.data;
2558
stream_puts(pdev->strm, "%%BeginSetup\n");
2559
for (i=0;i<pdev->params.PSDocOptions.size;i++)
2560
stream_putc(s, *p++);
2561
stream_puts(pdev->strm, "\n");
2562
stream_puts(pdev->strm, "\n%%EndSetup\n");
2514
2565
if (pdev->ResourcesBeforeUsage)
2515
2566
pdf_reverse_resource_chain(pdev, resourcePage);
2516
2567
for (j = 0; j < NUM_RESOURCE_CHAINS && code >= 0; ++j) {
2524
2575
pprintd2(pdev->strm, "%%%%Page: %d %d\n",
2525
2576
pagecount, pagecount);
2526
pprintd2(pdev->strm, "%%%%PageBoundingBox: 0 0 %d %d\n", (int)page->MediaBox.x, (int)page->MediaBox.y);
2577
if (!pdev->Eps2Write)
2578
pprintd2(pdev->strm, "%%%%PageBoundingBox: 0 0 %d %d\n", (int)page->MediaBox.x, (int)page->MediaBox.y);
2527
2579
stream_puts(pdev->strm, "%%BeginPageSetup\n");
2528
2580
stream_puts(pdev->strm, "/pagesave save def\n");
2582
if (pdev->params.PSPageOptions.size) {
2583
int i, index = (pagecount - 1) % pdev->params.PSPageOptions.size;
2584
char *p = (char *)pdev->params.PSPageOptions.data[index].data;
2586
for (i=0;i<pdev->params.PSPageOptions.data[index].size;i++)
2587
stream_putc(s, *p++);
2588
stream_puts(pdev->strm, "\n");
2529
2591
pdf_write_page(pdev, pagecount++);
2530
2593
stream_puts(pdev->strm, "%%EndPageSetup\n");
2531
2594
pprintld1(pdev->strm, "%ld 0 obj\n", pres->object->id);
2532
2595
code = cos_write(pres->object, pdev, pres->object->id);
2580
2643
if (pdev->Linearise)
2581
2644
linear_params.xref = xref;
2583
if (pdev->FirstObjectNumber == 1)
2584
pprintld1(s, "xref\n0 %ld\n0000000000 65535 f \n",
2646
if (pdev->FirstObjectNumber == 1) {
2647
gs_sprintf(str, "xref\n0 %"PRId64"\n0000000000 65535 f \n",
2587
pprintld2(s, "xref\n0 1\n0000000000 65535 f \n%ld %ld\n",
2649
stream_puts(s, str);
2652
gs_sprintf(str, "xref\n0 1\n0000000000 65535 f \n%"PRId64" %"PRId64"\n",
2589
2654
end_section - start_section);
2655
stream_puts(s, str);
2592
2659
write_xref_section(pdev, tfile, start_section, end_section, resource_pos, linear_params.Offsets);
2880
2954
gs_free_object(mem, pdev->Pages, "Free Pages dict");
2881
2955
pdev->Pages = 0;
2883
cos_release((cos_object_t *)pdev->NI_stack, "Release Name Index stack");
2884
gs_free_object(mem, pdev->NI_stack, "Free Name Index stack");
2959
for (i=0;i < pdev->vgstack_depth;i++)
2960
gs_free_object(pdev->memory->non_gc_memory, pdev->vgstack[i].dash_pattern, "pdfwrite final free stored dash in gstate");
2887
2962
gs_free_object(pdev->pdf_memory, pdev->vgstack, "pdf_close(graphics state stack)");
2889
2964
cos_release((cos_object_t *)pdev->Namespace_stack, "release Name space stack");