diff -ur gimp-2.1.2.orig/modules/cdisplay_proof.c gimp-2.1.2.current/modules/cdisplay_proof.c
--- gimp-2.1.2.orig/modules/cdisplay_proof.c	2004-08-13 00:02:25.000000000 +0100
+++ gimp-2.1.2.current/modules/cdisplay_proof.c	2004-08-05 00:39:28.000000000 +0100
@@ -69,7 +69,9 @@
 
   gint              intent;
   gboolean          bpc;
-  gchar            *profile;
+  gchar            *srcprofile;
+  gchar            *dstprofile;
+  gchar            *proofprofile;
 
   cmsHTRANSFORM     transform;
 
@@ -89,7 +91,9 @@
   PROP_0,
   PROP_INTENT,
   PROP_BPC,
-  PROP_PROFILE
+  PROP_SOURCEPROFILE,
+  PROP_DESTINATIONPROFILE,
+  PROP_PROOFPROFILE
 };
 
 
@@ -128,7 +132,13 @@
                                                      CdisplayProof    *proof);
 static void               proof_bpc_callback        (GtkWidget        *widget,
                                                      CdisplayProof    *proof);
-static void               proof_file_callback       (GtkWidget        *widget,
+static void               proof_file_src_callback       (GtkWidget        *widget,
+                                                     CdisplayProof    *proof);
+
+static void               proof_file_dst_callback       (GtkWidget        *widget,
+                                                     CdisplayProof    *proof);
+
+static void               proof_file_proof_callback       (GtkWidget        *widget,
                                                      CdisplayProof    *proof);
 
 
@@ -136,10 +146,10 @@
 {
   GIMP_MODULE_ABI_VERSION,
   N_("Color proof filter using ICC color profile"),
-  "Banlu Kemiyatorn <id@project-ile.net>",
-  "v0.1",
-  "(c) 2002-2003, released under the GPL",
-  "November 14, 2003"
+  "Banlu Kemiyatorn <id@project-ile.net> and Alastair M. Robinson <blackfive@fakenhamweb.co.uk>",
+  "v0.2",
+  "(c) 2002-2004, released under the GPL",
+  "August 4, 2004"
 };
 
 static GType                  cdisplay_proof_type        = 0;
@@ -228,8 +238,22 @@
                                                          G_PARAM_CONSTRUCT |
                                                          GIMP_MODULE_PARAM_SERIALIZE));
 
-  g_object_class_install_property (object_class, PROP_PROFILE,
-                                   g_param_spec_string ("profile", NULL, NULL,
+  g_object_class_install_property (object_class, PROP_SOURCEPROFILE,
+                                   g_param_spec_string ("sourceprofile", NULL, NULL,
+                                                        FALSE,
+                                                        G_PARAM_READWRITE |
+                                                        G_PARAM_CONSTRUCT |
+                                                        GIMP_MODULE_PARAM_SERIALIZE));
+
+  g_object_class_install_property (object_class, PROP_DESTINATIONPROFILE,
+                                   g_param_spec_string ("destinationprofile", NULL, NULL,
+                                                        FALSE,
+                                                        G_PARAM_READWRITE |
+                                                        G_PARAM_CONSTRUCT |
+                                                        GIMP_MODULE_PARAM_SERIALIZE));
+
+  g_object_class_install_property (object_class, PROP_PROOFPROFILE,
+                                   g_param_spec_string ("proofprofile", NULL, NULL,
                                                         FALSE,
                                                         G_PARAM_READWRITE |
                                                         G_PARAM_CONSTRUCT |
@@ -252,7 +276,9 @@
 cdisplay_proof_init (CdisplayProof *proof)
 {
   proof->transform = NULL;
-  proof->profile   = NULL;
+  proof->srcprofile   = NULL;
+  proof->dstprofile   = NULL;
+  proof->proofprofile   = NULL;
   proof->table     = NULL;
 }
 
@@ -272,10 +298,20 @@
 {
   CdisplayProof *proof = CDISPLAY_PROOF (object);
 
-  if (proof->profile)
+  if (proof->srcprofile)
+    {
+      g_free (proof->srcprofile);
+      proof->srcprofile = NULL;
+    }
+  if (proof->dstprofile)
     {
-      g_free (proof->profile);
-      proof->profile = NULL;
+      g_free (proof->dstprofile);
+      proof->dstprofile = NULL;
+    }
+  if (proof->proofprofile)
+    {
+      g_free (proof->proofprofile);
+      proof->proofprofile = NULL;
     }
   if (proof->transform)
     {
@@ -302,8 +338,14 @@
     case PROP_BPC:
       g_value_set_boolean (value, proof->bpc);
       break;
-    case PROP_PROFILE:
-      g_value_set_string (value, proof->profile);
+    case PROP_SOURCEPROFILE:
+      g_value_set_string (value, proof->srcprofile);
+      break;
+    case PROP_DESTINATIONPROFILE:
+      g_value_set_string (value, proof->dstprofile);
+      break;
+    case PROP_PROOFPROFILE:
+      g_value_set_string (value, proof->proofprofile);
       break;
     default:
       G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
@@ -327,9 +369,17 @@
     case PROP_BPC:
       proof->bpc = g_value_get_boolean (value);
       break;
-    case PROP_PROFILE:
-      g_free (proof->profile);
-      proof->profile = g_value_dup_string (value);
+    case PROP_SOURCEPROFILE:
+      g_free (proof->srcprofile);
+      proof->srcprofile = g_value_dup_string (value);
+      break;
+    case PROP_DESTINATIONPROFILE:
+      g_free (proof->dstprofile);
+      proof->dstprofile = g_value_dup_string (value);
+      break;
+    case PROP_PROOFPROFILE:
+      g_free (proof->proofprofile);
+      proof->proofprofile = g_value_dup_string (value);
       break;
     default:
       G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
@@ -348,7 +398,9 @@
   copy = CDISPLAY_PROOF (gimp_color_display_new (G_TYPE_FROM_INSTANCE (proof)));
   copy->intent  = proof->intent;
   copy->bpc     = proof->bpc;
-  copy->profile = g_strdup (proof->profile);
+  copy->srcprofile = g_strdup (proof->srcprofile);
+  copy->dstprofile = g_strdup (proof->dstprofile);
+  copy->proofprofile = g_strdup (proof->proofprofile);
 
   return GIMP_COLOR_DISPLAY (copy);
 }
@@ -387,12 +439,14 @@
     {
       gchar **tokens = g_strsplit (str, ",", 3);
 
-      if (tokens[0] && tokens[1] && tokens[2])
+      if (tokens[0] && tokens[1] && tokens[2] && tokens[3] && tokens[4])
         {
           g_object_set (proof,
                         "intent",                   atoi (tokens[0]),
                         "black-point-compensation", atoi (tokens[1]),
-                        "profile",                  tokens[2],
+                        "sourceprofile",            tokens[2],
+                        "destinationprofile",       tokens[3],
+                        "proofprofile",             tokens[4],
                         NULL);
         }
 
@@ -407,10 +461,12 @@
   GimpParasite  *state;
   gchar         *str;
 
-  str = g_strdup_printf ("%d,%d,%s",
+  str = g_strdup_printf ("%d,%d,%s,%s,%s",
                          proof->intent,
                          proof->bpc,
-                         proof->profile ? proof->profile : "");
+                         proof->srcprofile ? proof->srcprofile : "",
+                         proof->dstprofile ? proof->dstprofile : "",
+                         proof->proofprofile ? proof->proofprofile : "");
 
   state = gimp_parasite_new ("Display/Proof", GIMP_PARASITE_PERSISTENT,
                              strlen (str) + 1, str);
@@ -429,7 +485,7 @@
   if (proof->table)
     gtk_widget_destroy (proof->table);
 
-  proof->table = gtk_table_new (3, 2, FALSE);
+  proof->table = gtk_table_new (6, 2, FALSE);
   gtk_table_set_col_spacings (GTK_TABLE (proof->table), 6);
   gtk_table_set_row_spacings (GTK_TABLE (proof->table), 6);
 
@@ -458,20 +514,42 @@
                              proof->combo, 1, FALSE);
 
   entry = gimp_file_entry_new (_("Choose an ICC Color Profile"),
-                               proof->profile, FALSE, FALSE);
+                               proof->srcprofile, FALSE, FALSE);
   gimp_table_attach_aligned (GTK_TABLE (proof->table), 0, 1,
-                             _("_Profile:"), 0.0, 0.5,
+                             _("_Image Profile:"), 0.0, 0.5,
+                             entry, 1, FALSE);
+
+  g_signal_connect (entry, "filename-changed",
+                    G_CALLBACK (proof_file_src_callback),
+                    proof);
+
+
+  entry = gimp_file_entry_new (_("Choose an ICC Color Profile"),
+                               proof->dstprofile, FALSE, FALSE);
+  gimp_table_attach_aligned (GTK_TABLE (proof->table), 0, 2,
+                             _("_Monitor Profile:"), 0.0, 0.5,
+                             entry, 1, FALSE);
+
+  g_signal_connect (entry, "filename-changed",
+                    G_CALLBACK (proof_file_dst_callback),
+                    proof);
+
+
+  entry = gimp_file_entry_new (_("Choose an ICC Color Profile"),
+                               proof->proofprofile, FALSE, FALSE);
+  gimp_table_attach_aligned (GTK_TABLE (proof->table), 0, 3,
+                             _("_Proof Profile:"), 0.0, 0.5,
                              entry, 1, FALSE);
 
   g_signal_connect (entry, "filename-changed",
-                    G_CALLBACK (proof_file_callback),
+                    G_CALLBACK (proof_file_proof_callback),
                     proof);
 
   proof->toggle =
     gtk_check_button_new_with_mnemonic (_("_Black Point Compensation"));
   gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (proof->toggle), proof->bpc);
   gtk_table_attach_defaults (GTK_TABLE (proof->table),
-                             proof->toggle, 1, 2, 2, 3);
+                             proof->toggle, 1, 2, 4, 5);
   gtk_widget_show (proof->toggle);
 
   g_signal_connect (proof->toggle, "clicked",
@@ -504,8 +582,9 @@
 cdisplay_proof_changed (GimpColorDisplay *display)
 {
   CdisplayProof *proof = CDISPLAY_PROOF (display);
-  cmsHPROFILE    rgbProfile;
-  cmsHPROFILE    proofProfile;
+  cmsHPROFILE    srcProfile=NULL;
+  cmsHPROFILE    dstProfile=NULL;
+  cmsHPROFILE    proofProfile=NULL;
 
   if (proof->transform)
     {
@@ -513,32 +592,54 @@
       proof->transform = NULL;
     }
 
-  if (! proof->profile)
+  if(proof->dstprofile)
+    printf("Dest profile exists\n");
+
+  if (! proof->dstprofile)
     return;
 
   /*  This should be read from the global parasite pool.
    *  For now, just use the built-in sRGB profile.
    */
-  rgbProfile = cmsCreate_sRGBProfile ();
+  if(proof->srcprofile)
+    srcProfile = cmsOpenProfileFromFile (proof->srcprofile,"r");
+  if(!srcProfile)
+  {
+	printf("Falling back to sRGB source profile!\n");
+    srcProfile = cmsCreate_sRGBProfile();
+  }
+  dstProfile = cmsOpenProfileFromFile (proof->dstprofile,"r");
 
-  proofProfile = cmsOpenProfileFromFile (proof->profile, "r");
+  if(proof->proofprofile)
+    proofProfile = cmsOpenProfileFromFile (proof->proofprofile, "r");
 
   if (proofProfile)
     {
-      proof->transform = cmsCreateProofingTransform (rgbProfile,
-                                                     TYPE_RGB_8,
-                                                     rgbProfile, TYPE_RGB_8,
+      printf("Using proofing transform\n");
+      proof->transform = cmsCreateProofingTransform (srcProfile, TYPE_RGB_8,
+                                                     dstProfile, TYPE_RGB_8,
                                                      proofProfile,
                                                      proof->intent,
                                                      proof->intent,
                                                      cmsFLAGS_SOFTPROOFING |
                                                      (proof->bpc ?
                                                       cmsFLAGS_WHITEBLACKCOMPENSATION : 0));
-
       cmsCloseProfile (proofProfile);
     }
+  else
+    {
+      printf("Using normal transform\n");
+      proof->transform = cmsCreateTransform (srcProfile,
+                                             TYPE_RGB_8,
+                                             dstProfile,
+                                             TYPE_RGB_8,
+                                             proof->intent,
+                                             (proof->bpc ?
+                                               cmsFLAGS_WHITEBLACKCOMPENSATION : 0));
+    }
 
-  cmsCloseProfile (rgbProfile);
+  cmsCloseProfile (srcProfile);
+  cmsCloseProfile (dstProfile);
 }
 
 static void
@@ -568,14 +669,47 @@
 }
 
 static void
-proof_file_callback (GtkWidget     *widget,
+proof_file_src_callback (GtkWidget     *widget,
                      CdisplayProof *proof)
 {
   gchar *filename = gimp_file_entry_get_filename (GIMP_FILE_ENTRY (widget));
 
+  printf("New source profile: %s\n",filename);
+
   g_object_set (proof,
-                "profile", filename,
+                "sourceprofile", filename,
                 NULL);
 
   g_free (filename);
 }
+
+static void
+proof_file_dst_callback (GtkWidget     *widget,
+                     CdisplayProof *proof)
+{
+  gchar *filename = gimp_file_entry_get_filename (GIMP_FILE_ENTRY (widget));
+
+  printf("New dest profile: %s\n",filename);
+
+  g_object_set (proof,
+                "destinationprofile", filename,
+                NULL);
+
+  g_free (filename);
+}
+
+static void
+proof_file_proof_callback (GtkWidget     *widget,
+                     CdisplayProof *proof)
+{
+  gchar *filename = gimp_file_entry_get_filename (GIMP_FILE_ENTRY (widget));
+
+  printf("New proof profile: %s\n",filename);
+
+  g_object_set (proof,
+                "proofprofile", filename,
+                NULL);
+
+  g_free (filename);
+}
+
