Commit 8ab52fa55808541a25dffa15532dd19b2e3084b0

Authored by Jay Berkenbilt
1 parent 9f60a864

Combine writePCLm with writeStandard

Reduce code duplication
include/qpdf/QPDFWriter.hh
@@ -425,9 +425,10 @@ class QPDFWriter @@ -425,9 +425,10 @@ class QPDFWriter
425 void closeObject(int objid); 425 void closeObject(int objid);
426 QPDFObjectHandle getTrimmedTrailer(); 426 QPDFObjectHandle getTrimmedTrailer();
427 void prepareFileForWrite(); 427 void prepareFileForWrite();
  428 + void enqueueObjectsStandard();
  429 + void enqueueObjectsPCLm();
428 void writeStandard(); 430 void writeStandard();
429 void writeLinearized(); 431 void writeLinearized();
430 - void writePCLm();  
431 void enqueuePart(std::vector<QPDFObjectHandle>& part); 432 void enqueuePart(std::vector<QPDFObjectHandle>& part);
432 void writeEncryptionDictionary(); 433 void writeEncryptionDictionary();
433 void writeHeader(); 434 void writeHeader();
libqpdf/QPDFWriter.cc
@@ -2449,10 +2449,6 @@ QPDFWriter::write() @@ -2449,10 +2449,6 @@ QPDFWriter::write()
2449 { 2449 {
2450 writeLinearized(); 2450 writeLinearized();
2451 } 2451 }
2452 - else if (this->pclm)  
2453 - {  
2454 - writePCLm();  
2455 - }  
2456 else 2452 else
2457 { 2453 {
2458 writeStandard(); 2454 writeStandard();
@@ -3160,18 +3156,8 @@ QPDFWriter::writeLinearized() @@ -3160,18 +3156,8 @@ QPDFWriter::writeLinearized()
3160 } 3156 }
3161 3157
3162 void 3158 void
3163 -QPDFWriter::writeStandard() 3159 +QPDFWriter::enqueueObjectsStandard()
3164 { 3160 {
3165 - if (this->deterministic_id)  
3166 - {  
3167 - pushMD5Pipeline();  
3168 - }  
3169 -  
3170 - // Start writing  
3171 -  
3172 - writeHeader();  
3173 - writeString(this->extra_header_text);  
3174 -  
3175 if (this->preserve_unreferenced_objects) 3161 if (this->preserve_unreferenced_objects)
3176 { 3162 {
3177 QTC::TC("qpdf", "QPDFWriter preserve unreferenced standard"); 3163 QTC::TC("qpdf", "QPDFWriter preserve unreferenced standard");
@@ -3197,61 +3183,11 @@ QPDFWriter::writeStandard() @@ -3197,61 +3183,11 @@ QPDFWriter::writeStandard()
3197 { 3183 {
3198 enqueueObject(trailer.getKey(*iter)); 3184 enqueueObject(trailer.getKey(*iter));
3199 } 3185 }
3200 -  
3201 - // Now start walking queue, output each object  
3202 - while (this->object_queue.size())  
3203 - {  
3204 - QPDFObjectHandle cur_object = this->object_queue.front();  
3205 - this->object_queue.pop_front();  
3206 - writeObject(cur_object);  
3207 - }  
3208 -  
3209 - // Write out the encryption dictionary, if any  
3210 - if (this->encrypted)  
3211 - {  
3212 - writeEncryptionDictionary();  
3213 - }  
3214 -  
3215 - // Now write out xref. next_objid is now the number of objects.  
3216 - qpdf_offset_t xref_offset = this->pipeline->getCount();  
3217 - if (this->object_stream_to_objects.empty())  
3218 - {  
3219 - // Write regular cross-reference table  
3220 - writeXRefTable(t_normal, 0, this->next_objid - 1, this->next_objid);  
3221 - }  
3222 - else  
3223 - {  
3224 - // Write cross-reference stream.  
3225 - int xref_id = this->next_objid++;  
3226 - writeXRefStream(xref_id, xref_id, xref_offset, t_normal,  
3227 - 0, this->next_objid - 1, this->next_objid);  
3228 - }  
3229 - writeString("startxref\n");  
3230 - writeString(QUtil::int_to_string(xref_offset));  
3231 - writeString("\n%%EOF\n");  
3232 -  
3233 - if (this->deterministic_id)  
3234 - {  
3235 - QTC::TC("qpdf", "QPDFWriter standard deterministic ID",  
3236 - this->object_stream_to_objects.empty() ? 0 : 1);  
3237 - popPipelineStack();  
3238 - assert(this->md5_pipeline == 0);  
3239 - }  
3240 } 3186 }
3241 3187
3242 void 3188 void
3243 -QPDFWriter::writePCLm() 3189 +QPDFWriter::enqueueObjectsPCLm()
3244 { 3190 {
3245 - if (this->deterministic_id)  
3246 - {  
3247 - pushMD5Pipeline();  
3248 - }  
3249 -  
3250 - // Start writing  
3251 -  
3252 - writeHeader();  
3253 - writeString(this->extra_header_text);  
3254 -  
3255 // Image transform stream content for page strip images. 3191 // Image transform stream content for page strip images.
3256 // Each of this new stream has to come after every page image 3192 // Each of this new stream has to come after every page image
3257 // strip written in the pclm file. 3193 // strip written in the pclm file.
@@ -3260,7 +3196,7 @@ QPDFWriter::writePCLm() @@ -3260,7 +3196,7 @@ QPDFWriter::writePCLm()
3260 // enqueue all pages first 3196 // enqueue all pages first
3261 std::vector<QPDFObjectHandle> all = this->pdf.getAllPages(); 3197 std::vector<QPDFObjectHandle> all = this->pdf.getAllPages();
3262 for (std::vector<QPDFObjectHandle>::iterator iter = all.begin(); 3198 for (std::vector<QPDFObjectHandle>::iterator iter = all.begin();
3263 - iter != all.end(); ++iter) 3199 + iter != all.end(); ++iter)
3264 { 3200 {
3265 // enqueue page 3201 // enqueue page
3266 enqueueObject(*iter); 3202 enqueueObject(*iter);
@@ -3273,7 +3209,7 @@ QPDFWriter::writePCLm() @@ -3273,7 +3209,7 @@ QPDFWriter::writePCLm()
3273 (*iter).getKey("/Resources").getKey("/XObject"); 3209 (*iter).getKey("/Resources").getKey("/XObject");
3274 std::set<std::string> keys = strips.getKeys(); 3210 std::set<std::string> keys = strips.getKeys();
3275 for (std::set<std::string>::iterator image = keys.begin(); 3211 for (std::set<std::string>::iterator image = keys.begin();
3276 - image != keys.end(); ++image) 3212 + image != keys.end(); ++image)
3277 { 3213 {
3278 enqueueObject(strips.getKey(*image)); 3214 enqueueObject(strips.getKey(*image));
3279 enqueueObject(QPDFObjectHandle::newStream( 3215 enqueueObject(QPDFObjectHandle::newStream(
@@ -3284,28 +3220,59 @@ QPDFWriter::writePCLm() @@ -3284,28 +3220,59 @@ QPDFWriter::writePCLm()
3284 // Put root in queue. 3220 // Put root in queue.
3285 QPDFObjectHandle trailer = getTrimmedTrailer(); 3221 QPDFObjectHandle trailer = getTrimmedTrailer();
3286 enqueueObject(trailer.getKey("/Root")); 3222 enqueueObject(trailer.getKey("/Root"));
  3223 +}
  3224 +
  3225 +void
  3226 +QPDFWriter::writeStandard()
  3227 +{
  3228 + if (this->deterministic_id)
  3229 + {
  3230 + pushMD5Pipeline();
  3231 + }
  3232 +
  3233 + // Start writing
  3234 +
  3235 + writeHeader();
  3236 + writeString(this->extra_header_text);
3287 3237
3288 - // Now start walking queue, output each object 3238 + if (this->pclm)
  3239 + {
  3240 + enqueueObjectsPCLm();
  3241 + }
  3242 + else
  3243 + {
  3244 + enqueueObjectsStandard();
  3245 + }
  3246 +
  3247 + // Now start walking queue, outputing each object. There shouldn't
  3248 + // really be any here, but this will catch anything that somehow
  3249 + // got missed.
3289 while (this->object_queue.size()) 3250 while (this->object_queue.size())
3290 { 3251 {
3291 - QPDFObjectHandle cur_object = this->object_queue.front();  
3292 - this->object_queue.pop_front();  
3293 - writeObject(cur_object); 3252 + QPDFObjectHandle cur_object = this->object_queue.front();
  3253 + this->object_queue.pop_front();
  3254 + writeObject(cur_object);
  3255 + }
  3256 +
  3257 + // Write out the encryption dictionary, if any
  3258 + if (this->encrypted)
  3259 + {
  3260 + writeEncryptionDictionary();
3294 } 3261 }
3295 3262
3296 // Now write out xref. next_objid is now the number of objects. 3263 // Now write out xref. next_objid is now the number of objects.
3297 qpdf_offset_t xref_offset = this->pipeline->getCount(); 3264 qpdf_offset_t xref_offset = this->pipeline->getCount();
3298 if (this->object_stream_to_objects.empty()) 3265 if (this->object_stream_to_objects.empty())
3299 { 3266 {
3300 - // Write regular cross-reference table  
3301 - writeXRefTable(t_normal, 0, this->next_objid - 1, this->next_objid); 3267 + // Write regular cross-reference table
  3268 + writeXRefTable(t_normal, 0, this->next_objid - 1, this->next_objid);
3302 } 3269 }
3303 else 3270 else
3304 { 3271 {
3305 - // Write cross-reference stream.  
3306 - int xref_id = this->next_objid++;  
3307 - writeXRefStream(xref_id, xref_id, xref_offset, t_normal,  
3308 - 0, this->next_objid - 1, this->next_objid); 3272 + // Write cross-reference stream.
  3273 + int xref_id = this->next_objid++;
  3274 + writeXRefStream(xref_id, xref_id, xref_offset, t_normal,
  3275 + 0, this->next_objid - 1, this->next_objid);
3309 } 3276 }
3310 writeString("startxref\n"); 3277 writeString("startxref\n");
3311 writeString(QUtil::int_to_string(xref_offset)); 3278 writeString(QUtil::int_to_string(xref_offset));
@@ -3313,6 +3280,8 @@ QPDFWriter::writePCLm() @@ -3313,6 +3280,8 @@ QPDFWriter::writePCLm()
3313 3280
3314 if (this->deterministic_id) 3281 if (this->deterministic_id)
3315 { 3282 {
  3283 + QTC::TC("qpdf", "QPDFWriter standard deterministic ID",
  3284 + this->object_stream_to_objects.empty() ? 0 : 1);
3316 popPipelineStack(); 3285 popPipelineStack();
3317 assert(this->md5_pipeline == 0); 3286 assert(this->md5_pipeline == 0);
3318 } 3287 }