Skip to content

Commit 71e5bfc

Browse files
FOP-3268: Add option to move AFP triplet to the resource
1 parent 12e38b0 commit 71e5bfc

14 files changed

+124
-18
lines changed

fop-core/src/main/java/org/apache/fop/afp/AFPDataObjectFactory.java

Lines changed: 15 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -73,7 +73,7 @@ public ObjectContainer createObjectContainer(AFPDataObjectInfo dataObjectInfo) {
7373
AFPResourceInfo resourceInfo = dataObjectInfo.getResourceInfo();
7474
AFPResourceLevel resourceLevel = resourceInfo.getLevel();
7575
final boolean dataInContainer = true;
76-
final boolean containerHasOEG = resourceLevel.isInline();
76+
final boolean containerHasOEG = dataObjectInfo.isMetadataInObjectContainer() || resourceLevel.isInline();
7777
final boolean dataInOCD = true;
7878
objectContainer.setObjectClassification(
7979
ObjectClassificationTriplet.CLASS_TIME_INVARIANT_PAGINATED_PRESENTATION_OBJECT,
@@ -214,7 +214,7 @@ public IncludeObject createInclude(String includeName, AFPDataObjectInfo dataObj
214214
if (objectType != null) {
215215
// set object classification
216216
final boolean dataInContainer = true;
217-
final boolean containerHasOEG = false; // environment parameters set in include
217+
final boolean containerHasOEG = dataObjectInfo.isMetadataInObjectContainer();
218218
final boolean dataInOCD = true;
219219
includeObj.setObjectClassification(
220220
// object scope not defined
@@ -232,19 +232,19 @@ public IncludeObject createInclude(String includeName, AFPDataObjectInfo dataObj
232232
int yOffset = objectAreaInfo.getY();
233233
includeObj.setObjectAreaOffset(xOffset, yOffset);
234234

235-
int width = objectAreaInfo.getWidth();
236-
int height = objectAreaInfo.getHeight();
237-
includeObj.setObjectAreaSize(width, height);
238-
239235
int rotation = objectAreaInfo.getRotation();
240236
includeObj.setObjectAreaOrientation(rotation);
241237

242-
int widthRes = objectAreaInfo.getWidthRes();
243-
int heightRes = objectAreaInfo.getHeightRes();
244-
includeObj.setMeasurementUnits(widthRes, heightRes);
245-
246-
includeObj.setMappingOption(MappingOptionTriplet.SCALE_TO_FIT);
238+
if (!dataObjectInfo.isMetadataInObjectContainer()) {
239+
int width = objectAreaInfo.getWidth();
240+
int height = objectAreaInfo.getHeight();
241+
includeObj.setObjectAreaSize(width, height);
247242

243+
int widthRes = objectAreaInfo.getWidthRes();
244+
int heightRes = objectAreaInfo.getHeightRes();
245+
includeObj.setMeasurementUnits(widthRes, heightRes);
246+
includeObj.setMappingOption(MappingOptionTriplet.SCALE_TO_FIT);
247+
}
248248
return includeObj;
249249
}
250250

@@ -254,10 +254,11 @@ public IncludeObject createInclude(String includeName, AFPDataObjectInfo dataObj
254254
* @param namedObj an named object
255255
* @param resourceInfo resource information
256256
* @param objectType the object type
257+
* @param dataObjectInfo
257258
* @return a new resource object wrapper
258259
*/
259-
public ResourceObject createResource(AbstractNamedAFPObject namedObj,
260-
AFPResourceInfo resourceInfo, Registry.ObjectType objectType) {
260+
public ResourceObject createResource(AbstractNamedAFPObject namedObj, AFPResourceInfo resourceInfo,
261+
Registry.ObjectType objectType, AFPDataObjectInfo dataObjectInfo) {
261262
ResourceObject resourceObj = null;
262263
String resourceName = resourceInfo.getName();
263264
if (resourceName != null) {
@@ -279,7 +280,7 @@ public ResourceObject createResource(AbstractNamedAFPObject namedObj,
279280

280281
// set object classification
281282
final boolean dataInContainer = true;
282-
final boolean containerHasOEG = false; // must be included
283+
final boolean containerHasOEG = dataObjectInfo.isMetadataInObjectContainer();
283284
final boolean dataInOCD = true;
284285
// mandatory triplet for object container
285286
resourceObj.setObjectClassification(

fop-core/src/main/java/org/apache/fop/afp/AFPDataObjectInfo.java

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -72,6 +72,16 @@ public class AFPDataObjectInfo {
7272
public AFPDataObjectInfo() {
7373
}
7474

75+
private AFPPaintingState paintingState;
76+
77+
public void setPaintingState(AFPPaintingState paintingState) {
78+
this.paintingState = paintingState;
79+
}
80+
81+
public boolean isMetadataInObjectContainer() {
82+
return paintingState != null && paintingState.isMetadataInObjectContainer();
83+
}
84+
7585
/**
7686
* Sets the image mime type
7787
*

fop-core/src/main/java/org/apache/fop/afp/AFPPaintingState.java

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -103,6 +103,7 @@ public class AFPPaintingState extends org.apache.fop.util.AbstractPaintingState
103103
/** use FS45 images*/
104104
private boolean fs45;
105105
private boolean maskEnabled;
106+
private boolean metadataInObjectContainer;
106107

107108
/** the current page */
108109
private transient AFPPagePaintingState pagePaintingState;
@@ -456,6 +457,14 @@ public void setWrapGocaPSeg(boolean pSeg) {
456457
this.gocaPSeg = pSeg;
457458
}
458459

460+
public boolean isMetadataInObjectContainer() {
461+
return metadataInObjectContainer;
462+
}
463+
464+
public void setMetadataInObjectContainer(boolean metadataInObjectContainer) {
465+
this.metadataInObjectContainer = metadataInObjectContainer;
466+
}
467+
459468
/**
460469
* gets whether images should be FS45
461470
* @return true iff images should be FS45

fop-core/src/main/java/org/apache/fop/afp/AFPResourceManager.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -203,7 +203,7 @@ public void createObject(AFPDataObjectInfo dataObjectInfo) throws IOException {
203203
}
204204

205205
// wrap newly created data object in a resource object
206-
namedObj = dataObjectFactory.createResource(namedObj, resourceInfo, objectType);
206+
namedObj = dataObjectFactory.createResource(namedObj, resourceInfo, objectType, dataObjectInfo);
207207
}
208208

209209
// add data object into its resource group destination

fop-core/src/main/java/org/apache/fop/afp/modca/ObjectContainer.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -91,7 +91,7 @@ public void setViewport(AFPDataObjectInfo dataObjectInfo) {
9191
AFPResourceLevel resourceLevel = resourceInfo.getLevel();
9292

9393
// only need to set MCD and CDD when OC when is inlined (pre-2000 apps)
94-
if (resourceLevel.isInline()) {
94+
if (dataObjectInfo.isMetadataInObjectContainer() || resourceLevel.isInline()) {
9595
super.setViewport(dataObjectInfo);
9696

9797
MapContainerData mapContainerData

fop-core/src/main/java/org/apache/fop/afp/parser/UnparsedStructuredField.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -102,7 +102,7 @@ private String getTypeCodeAsString() {
102102
* Returns category code function name for this field.
103103
* @return the category code function name
104104
*/
105-
private String getCategoryCodeAsString() {
105+
public String getCategoryCodeAsString() {
106106
switch (getSfCategoryCode() & 0xFF) {
107107
case 0x5F: return "Page Segment";
108108
case 0x6B: return "Object Area";

fop-core/src/main/java/org/apache/fop/render/afp/AFPDocumentHandler.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -519,6 +519,10 @@ public void setLineWidthCorrection(float correction) {
519519
paintingState.setLineWidthCorrection(correction);
520520
}
521521

522+
public void setMetadataInObjectContainer(boolean metadataInObjectContainer) {
523+
paintingState.setMetadataInObjectContainer(metadataInObjectContainer);
524+
}
525+
522526
/** {@inheritDoc} */
523527
public int getResolution() {
524528
return paintingState.getResolution();

fop-core/src/main/java/org/apache/fop/render/afp/AFPRendererConfig.java

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -63,6 +63,7 @@
6363
import static org.apache.fop.render.afp.AFPRendererOption.JPEG_BITMAP_ENCODING_QUALITY;
6464
import static org.apache.fop.render.afp.AFPRendererOption.JPEG_USE_IOCA_IMAGES;
6565
import static org.apache.fop.render.afp.AFPRendererOption.LINE_WIDTH_CORRECTION;
66+
import static org.apache.fop.render.afp.AFPRendererOption.METADATA_IN_OBJECT_CONTAINER;
6667
import static org.apache.fop.render.afp.AFPRendererOption.RENDERER_RESOLUTION;
6768
import static org.apache.fop.render.afp.AFPRendererOption.RESOURCE_GROUP_URI;
6869
import static org.apache.fop.render.afp.AFPRendererOption.SHADING;
@@ -198,6 +199,10 @@ public Boolean isUseIocaImages() {
198199
return getParam(JPEG_USE_IOCA_IMAGES, Boolean.class);
199200
}
200201

202+
public Boolean isMetadataInObjectContainer() {
203+
return getParam(METADATA_IN_OBJECT_CONTAINER, Boolean.class);
204+
}
205+
201206
public Float getLineWidthCorrection() {
202207
return getParam(LINE_WIDTH_CORRECTION, Float.class);
203208
}
@@ -336,6 +341,8 @@ private void configureImages() throws ConfigurationException, FOPException {
336341
} else {
337342
setParam(IMAGES_MAPPING_OPTION, AFPDataObjectInfo.DEFAULT_MAPPING_OPTION);
338343
}
344+
setParam(METADATA_IN_OBJECT_CONTAINER,
345+
imagesCfg.getAttributeAsBoolean(METADATA_IN_OBJECT_CONTAINER.getName(), false));
339346
configureJpegImages(imagesCfg);
340347
}
341348

fop-core/src/main/java/org/apache/fop/render/afp/AFPRendererConfigurator.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -126,6 +126,9 @@ private void configure(AFPDocumentHandler documentHandler, AFPRendererConfig con
126126
if (config.getDefaultResourceGroupUri() != null) {
127127
documentHandler.setDefaultResourceGroupUri(config.getDefaultResourceGroupUri());
128128
}
129+
if (config.isMetadataInObjectContainer() != null) {
130+
documentHandler.setMetadataInObjectContainer(config.isMetadataInObjectContainer());
131+
}
129132
AFPResourceLevelDefaults resourceLevelDefaults = config.getResourceLevelDefaults();
130133
if (resourceLevelDefaults != null) {
131134
documentHandler.setResourceLevelDefaults(resourceLevelDefaults);

fop-core/src/main/java/org/apache/fop/render/afp/AFPRendererOption.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,8 @@ public enum AFPRendererOption implements RendererConfigOption {
4646
LINE_WIDTH_CORRECTION("line-width-correction", Float.class),
4747
GOCA("goca", Boolean.class),
4848
GOCA_WRAP_PSEG("pseg", Boolean.class),
49-
GOCA_TEXT("text", Boolean.class);
49+
GOCA_TEXT("text", Boolean.class),
50+
METADATA_IN_OBJECT_CONTAINER("metadata-in-object-container", Boolean.class);
5051

5152
private final String name;
5253

0 commit comments

Comments
 (0)