--- ghostscript-9.00/base/gdevpdfm.c	2010-10-26 14:40:08.000000000 +0200
+++ ghostscript-9.00/base/gdevpdfm.c.new	2010-10-26 14:39:52.000000000 +0200
@@ -22,6 +22,7 @@
 #include "gdevpdfo.h"
 #include "szlibx.h"
 #include "slzwx.h"
+#include <stdlib.h>
 
 /* GC descriptors */
 private_st_pdf_article();
@@ -1552,6 +1553,37 @@
 /* ---------------- Named object pdfmarks ---------------- */
 
 /* [ /BBox [llx lly urx ury] /_objdef {obj} /BP pdfmark */
+
+typedef struct nodeResXObj
+{
+    int resCnt; /*counter for resources used in current context */
+    cos_dict_t *pDictResXObj; /* pointer to the /XObject resource dictionary */
+    struct nodeResXObj *next;
+} nodeResXObj;
+
+static nodeResXObj* pushItem(nodeResXObj*, cos_dict_t*);
+static nodeResXObj * pushItem(nodeResXObj *top, cos_dict_t *pDRXObj)
+{
+    static nodeResXObj* newTop;
+    
+    newTop = (nodeResXObj*) malloc(sizeof(nodeResXObj));
+    newTop->resCnt = 0;
+    newTop->pDictResXObj = pDRXObj;
+    newTop->next = top;
+    
+    return newTop;
+}
+
+static nodeResXObj* popItem(nodeResXObj *);
+static nodeResXObj* popItem(nodeResXObj *oldTop)
+{
+    nodeResXObj* newTop=oldTop->next;
+    free(oldTop);
+    return newTop;
+}
+
+static nodeResXObj* pDictResXObjTop=NULL;
+
 static int
 pdfmark_BP(gx_device_pdf * pdev, gs_param_string * pairs, uint count,
 	   const gs_matrix * pctm, const gs_param_string * objname)
@@ -1565,6 +1597,8 @@
     int bbox_str_len, matrix_str_len;
     stream s;
 
+    pDictResXObjTop = pushItem(pDictResXObjTop, cos_dict_alloc(pdev, "pdfmark_BP(XObject)"));
+
     if (objname == 0 || count != 2 || !pdf_key_eq(&pairs[0], "/BBox"))
 	return_error(gs_error_rangecheck);
     code = gs_matrix_invert(pctm, &ictm);
@@ -1626,9 +1660,17 @@
 	   const gs_matrix * pctm, const gs_param_string * no_objname)
 {
     int code;
+
     pdf_resource_t *pres = pdev->accumulating_substream_resource;
     gs_const_string objname = pdev->objname;
 
+    if(pDictResXObjTop->resCnt) {
+        code = cos_dict_put_c_key_object(pdev->substream_Resources, "/XObject",
+                   COS_OBJECT(pDictResXObjTop->pDictResXObj));
+        if(code<0) return code;
+    }
+    pDictResXObjTop=popItem(pDictResXObjTop);
+
     code = pdf_add_procsets(pdev->substream_Resources, pdev->procsets);
     if (code < 0)
 	return code;
@@ -1649,6 +1691,7 @@
 {
     cos_object_t *pco;		/* stream */
     int code;
+    char key[MAX_REF_CHARS+3], val[MAX_REF_CHARS+5];
 
     if (count != 1)
 	return_error(gs_error_rangecheck);
@@ -1661,6 +1704,14 @@
 	return code;
     pdf_put_matrix(pdev, "q ", pctm, "cm");
     pprintld1(pdev->strm, "/R%ld Do Q\n", pco->id);
+
+    if(pDictResXObjTop!=NULL) { /* SP inside BP/EP */
+        sprintf(key, "/R%ld", pco->id);
+        sprintf(val, "%ld 0 R", pco->id);
+        cos_dict_put_string(pDictResXObjTop->pDictResXObj, (byte*)key, strlen(key), (byte*)val, strlen(val));
+        pDictResXObjTop->resCnt++;
+    }
+
     pco->pres->where_used |= pdev->used_mask;
     return 0;
 }
