--- plug-ins/common/psp.c.orig	2007-11-20 10:33:38.000000000 +0100
+++ plug-ins/common/psp.c	2008-04-18 23:32:22.000000000 +0200
@@ -121,18 +121,34 @@
 /* Block identifiers.
  */
 typedef enum {
-  PSP_IMAGE_BLOCK = 0,		/* General Image Attributes Block (main) */
-  PSP_CREATOR_BLOCK,		/* Creator Data Block (main) */
-  PSP_COLOR_BLOCK,		/* Color Palette Block (main and sub) */
-  PSP_LAYER_START_BLOCK,	/* Layer Bank Block (main) */
-  PSP_LAYER_BLOCK,		/* Layer Block (sub) */
-  PSP_CHANNEL_BLOCK,		/* Channel Block (sub) */
-  PSP_SELECTION_BLOCK,		/* Selection Block (main) */
-  PSP_ALPHA_BANK_BLOCK,		/* Alpha Bank Block (main) */
-  PSP_ALPHA_CHANNEL_BLOCK,	/* Alpha Channel Block (sub) */
-  PSP_THUMBNAIL_BLOCK,		/* Thumbnail Block (main) */
-  PSP_EXTENDED_DATA_BLOCK,	/* Extended Data Block (main) */
-  PSP_TUBE_BLOCK		/* Picture Tube Data Block (main) */
+  PSP_IMAGE_BLOCK = 0,			/* General Image Attributes Block (main) */
+  PSP_CREATOR_BLOCK,			/* Creator Data Block (main) */
+  PSP_COLOR_BLOCK,			/* Color Palette Block (main and sub) */
+  PSP_LAYER_START_BLOCK,		/* Layer Bank Block (main) */
+  PSP_LAYER_BLOCK,			/* Layer Block (sub) */
+  PSP_CHANNEL_BLOCK,			/* Channel Block (sub) */
+  PSP_SELECTION_BLOCK,			/* Selection Block (main) */
+  PSP_ALPHA_BANK_BLOCK,			/* Alpha Bank Block (main) */
+  PSP_ALPHA_CHANNEL_BLOCK,		/* Alpha Channel Block (sub) */
+  PSP_THUMBNAIL_BLOCK,			/* Thumbnail Block (main) */
+  PSP_EXTENDED_DATA_BLOCK,		/* Extended Data Block (main) */
+  PSP_TUBE_BLOCK,			/* Picture Tube Data Block (main) */
+  PSP_ADJUSTMENT_EXTENSION_BLOCK,	/* Adjustment Layer Extension Block (sub) (since PSP6)*/
+  PSP_VECTOR_EXTENSION_BLOCK,		/* Vector Layer Extension Block (sub) (since PSP6) */
+  PSP_SHAPE_BLOCK,			/* Vector Shape Block (sub) (since PSP6) */
+  PSP_PAINTSTYLE_BLOCK,			/* Paint Style Block (sub) (since PSP6) */
+  PSP_COMPOSITE_IMAGE_BANK_BLOCK,	/* Composite Image Bank (main) (since PSP6) */
+  PSP_COMPOSITE_ATTRIBUTES_BLOCK,	/* Composite Image Attributes (sub) (since PSP6) */
+  PSP_JPEG_BLOCK,			/* JPEG Image Block (sub) (since PSP6) */
+  PSP_LINESTYLE_BLOCK,			/* Line Style Block (sub) (since PSP7) */
+  PSP_TABLE_BANK_BLOCK,			/* Table Bank Block (main) (since PSP7) */
+  PSP_TABLE_BLOCK,			/* Table Block (sub) (since PSP7) */
+  PSP_PAPER_BLOCK,			/* Vector Table Paper Block (sub) (since PSP7) */
+  PSP_PATTERN_BLOCK,			/* Vector Table Pattern Block (sub) (since PSP7) */
+  PSP_GRADIENT_BLOCK,			/* Vector Table Gradient Block (not used) (since PSP8) */
+  PSP_GROUP_EXTENSION_BLOCK,		/* Group Layer Block (sub) (since PSP8) */
+  PSP_MASK_EXTENSION_BLOCK,		/* Mask Layer Block (sub) (since PSP8) */
+  PSP_BRUSH_BLOCK,			/* Brush Data Block (main) (since PSP8) */
 } PSPBlockID;
 
 /* Bitmap type.
@@ -143,9 +159,230 @@
   PSP_DIB_USER_MASK,		/* Layer user mask bitmap */
   PSP_DIB_SELECTION,		/* Selection mask bitmap */
   PSP_DIB_ALPHA_MASK,		/* Alpha channel mask bitmap */
-  PSP_DIB_THUMBNAIL		/* Thumbnail bitmap */
+  PSP_DIB_THUMBNAIL,		/* Thumbnail bitmap */
+  PSP_DIB_THUMBNAIL_TRANS_MASK,	/* Thumbnail transparency mask (since PSP6) */
+  PSP_DIB_ADJUSTMENT_LAYER,	/* Adjustment layer bitmap (since PSP6) */
+  PSP_DIB_COMPOSITE,		/* Composite image bitmap (since PSP6) */
+  PSP_DIB_COMPOSITE_TRANS_MASK,	/* Composite image transparency (since PSP6) */
+  PSP_DIB_PAPER,		/* Paper bitmap (since PSP7) */
+  PSP_DIB_PATTERN,		/* Pattern bitmap (since PSP7) */
+  PSP_DIB_PATTERN_TRANS_MASK,	/* Pattern transparency mask (since PSP7) */
 } PSPDIBType;
 
+/* Type of image in the composite image bank block. (since PSP6)
+ */
+typedef enum {
+  PSP_IMAGE_COMPOSITE = 0,	/* Composite Image */
+  PSP_IMAGE_THUMBNAIL,		/* Thumbnail Image */
+} PSPCompositeImageType;
+
+/* Graphic contents flags. (since PSP6)
+ */
+typedef enum {
+  /* Layer types */
+  keGCRasterLayers     = 0x00000001,	/* At least one raster layer */
+  keGCVectorLayers     = 0x00000002,	/* At least one vector layer */
+  keGCAdjustmentLayers = 0x00000004,	/* At least one adjustment layer */
+
+  /* Additional attributes */
+  keGCThumbnail              = 0x01000000,	/* Has a thumbnail */
+  keGCThumbnailTransparency  = 0x02000000,	/* Thumbnail transp. */
+  keGCComposite              = 0x04000000,	/* Has a composite image */
+  keGCCompositeTransparency  = 0x08000000,	/* Composite transp. */
+  keGCFlatImage              = 0x10000000,	/* Just a background */
+  keGCSelection              = 0x20000000,	/* Has a selection */
+  keGCFloatingSelectionLayer = 0x40000000,	/* Has float. selection */
+  keGCAlphaChannels          = 0x80000000,	/* Has alpha channel(s) */
+} PSPGraphicContents;
+
+/* Character style flags. (since PSP6)
+ */
+typedef enum {
+  keStyleItalic      = 0x00000001,	/* Italic property bit */
+  keStyleStruck      = 0x00000002,	/* Strike­out property bit */
+  keStyleUnderlined  = 0x00000004,	/* Underlined property bit */
+  keStyleWarped      = 0x00000008,	/* Warped property bit (since PSP8) */
+  keStyleAntiAliased = 0x00000010,	/* Anti­aliased property bit (since PSP8) */
+} PSPCharacterProperties;
+
+/* Table type. (since PSP7)
+ */
+typedef enum {
+  keTTUndefined = 0,	 /* Undefined table type */
+  keTTGradientTable,	 /* Gradient table type */
+  keTTPaperTable,	 /* Paper table type */
+  keTTPatternTable	 /* Pattern table type */
+} PSPTableType;
+
+/* Layer flags. (since PSP6)
+ */
+typedef enum {
+  keVisibleFlag      = 0x00000001,	/* Layer is visible */
+  keMaskPresenceFlag = 0x00000002,	/* Layer has a mask */
+} PSPLayerProperties;
+
+/* Shape property flags. (since PSP6)
+ */
+typedef enum {
+  keShapeAntiAliased = 0x00000001,	/* Shape is anti­aliased */
+  keShapeSelected    = 0x00000002,	/* Shape is selected */
+  keShapeVisible     = 0x00000004,	/* Shape is visible */
+} PSPShapeProperties;
+
+/* Polyline node type flags. (since PSP7)
+ */
+typedef enum {
+  keNodeUnconstrained     = 0x0000,	/* Default node type */
+  keNodeSmooth            = 0x0001,	/* Node is smooth */
+  keNodeSymmetric         = 0x0002,	/* Node is symmetric */
+  keNodeAligned           = 0x0004,	/* Node is aligned */
+  keNodeActive            = 0x0008,	/* Node is active */
+  keNodeLocked            = 0x0010,	/* Node is locked */
+  keNodeSelected          = 0x0020,	/* Node is selected */
+  keNodeVisible           = 0x0040,	/* Node is visible */
+  keNodeClosed            = 0x0080,	/* Node is closed */
+
+  /* TODO: This might be a thinko in the spec document only or in the image
+   *       format itself. Need to investigate that later
+   */
+  keNodeLockedPSP6        = 0x0016,	/* Node is locked */
+  keNodeSelectedPSP6      = 0x0032,	/* Node is selected */
+  keNodeVisiblePSP6       = 0x0064,	/* Node is visible */
+  keNodeClosedPSP6        = 0x0128,	/* Node is closed */
+
+} PSPPolylineNodeTypes;
+
+/* Blend modes. (since PSP6)
+ */
+typedef enum {
+  LAYER_BLEND_NORMAL,
+  LAYER_BLEND_DARKEN,
+  LAYER_BLEND_LIGHTEN,
+  LAYER_BLEND_HUE,
+  LAYER_BLEND_SATURATION,
+  LAYER_BLEND_COLOR,
+  LAYER_BLEND_LUMINOSITY,
+  LAYER_BLEND_MULTIPLY,
+  LAYER_BLEND_SCREEN,
+  LAYER_BLEND_DISSOLVE,
+  LAYER_BLEND_OVERLAY,
+  LAYER_BLEND_HARD_LIGHT,
+  LAYER_BLEND_SOFT_LIGHT,
+  LAYER_BLEND_DIFFERENCE,
+  LAYER_BLEND_DODGE,
+  LAYER_BLEND_BURN,
+  LAYER_BLEND_EXCLUSION,
+  LAYER_BLEND_TRUE_HUE, /* since PSP8 */
+  LAYER_BLEND_TRUE_SATURATION, /* since PSP8 */
+  LAYER_BLEND_TRUE_COLOR, /* since PSP8 */
+  LAYER_BLEND_TRUE_LIGHTNESS, /* since PSP8 */
+  LAYER_BLEND_ADJUST = 255,
+} PSPBlendModes;
+
+/* Adjustment layer types. (since PSP6)
+ */
+typedef enum {
+  keAdjNone = 0,	/* Undefined adjustment layer type */
+  keAdjLevel,		/* Level adjustment */
+  keAdjCurve,		/* Curve adjustment */
+  keAdjBrightContrast,	/* Brightness­contrast adjustment */
+  keAdjColorBal,	/* Color balance adjustment */
+  keAdjHSL,		/* HSL adjustment */
+  keAdjChannelMixer,	/* Channel mixer adjustment */
+  keAdjInvert,		/* Invert adjustment */
+  keAdjThreshold,	/* Threshold adjustment */
+  keAdjPoster		/* Posterize adjustment */
+} PSPAdjustmentLayerType;
+
+/* Vector shape types. (since PSP6)
+ */
+typedef enum {
+  keVSTUnknown = 0,	/* Undefined vector type */
+  keVSTText,		/* Shape represents lines of text */
+  keVSTPolyline,	/* Shape represents a multiple segment line */
+  keVSTEllipse,		/* Shape represents an ellipse (or circle) */
+  keVSTPolygon,		/* Shape represents a closed polygon */
+  keVSTGroup,		/* Shape represents a group shape (since PSP7) */
+} PSPVectorShapeType;
+
+/* Text element types. (since PSP6)
+ */
+typedef enum {
+  keTextElemUnknown = 0,	/* Undefined text element type */
+  keTextElemChar,		/* A single character code */
+  keTextElemCharStyle,		/* A character style change */
+  keTextElemLineStyle		/* A line style change */
+} PSPTextElementType;
+
+/* Text alignment types. (since PSP6)
+ */
+typedef enum {
+  keTextAlignmentLeft = 0,	/* Left text alignment */
+  keTextAlignmentCenter,	/* Center text alignment */
+  keTextAlignmentRight		/* Right text alignment */
+} PSPTextAlignment;
+
+/* Paint style types. (since PSP6)
+ */
+typedef enum {
+  keStyleNone     = 0x0000,	/* No paint style info applies */
+  keStyleColor    = 0x0001,	/* Color paint style info */
+  keStyleGradient = 0x0002,	/* Gradient paint style info */
+  keStylePattern  = 0x0004,	/* Pattern paint style info (since PSP7) */
+  keStylePaper    = 0x0008,	/* Paper paint style info (since PSP7) */
+  keStylePen      = 0x0010,	/* Organic pen paint style info (since PSP7) */
+} PSPPaintStyleType;
+
+/* Gradient type. (since PSP7)
+ */
+typedef enum {
+  keSGTLinear = 0,	/* Linera gradient type */
+  keSGTRadial,		/* Radial gradient type */
+  keSGTRectangular,	/* Rectangulat gradient type */
+  keSGTSunburst		/* Sunburst gradient type */
+} PSPStyleGradientType;
+
+/* Paint Style Cap Type (Start & End). (since PSP7)
+ */
+typedef enum {
+  keSCTCapFlat = 0,		/* Flat cap type (was round in psp6) */
+  keSCTCapRound,		/* Round cap type (was square in psp6) */
+  keSCTCapSquare,		/* Square cap type (was flat in psp6) */
+  keSCTCapArrow,		/* Arrow cap type */
+  keSCTCapCadArrow,		/* Cad arrow cap type */
+  keSCTCapCurvedTipArrow,	/* Curved tip arrow cap type */
+  keSCTCapRingBaseArrow,	/* Ring base arrow cap type */
+  keSCTCapFluerDelis,		/* Fluer deLis cap type */
+  keSCTCapFootball,		/* Football cap type */
+  keSCTCapXr71Arrow,		/* Xr71 arrow cap type */
+  keSCTCapLilly,		/* Lilly cap type */
+  keSCTCapPinapple,		/* Pinapple cap type */
+  keSCTCapBall,			/* Ball cap type */
+  keSCTCapTulip			/* Tulip cap type */
+} PSPStyleCapType;
+
+/* Paint Style Join Type. (since PSP7)
+ */
+typedef enum {
+  keSJTJoinMiter = 0,
+  keSJTJoinRound,
+  keSJTJoinBevel
+} PSPStyleJoinType;
+
+/* Organic pen type. (since PSP7)
+ */
+typedef enum {
+  keSPTOrganicPenNone = 0,	/* Undefined pen type */
+  keSPTOrganicPenMesh,		/* Mesh pen type */
+  keSPTOrganicPenSand,		/* Sand pen type */
+  keSPTOrganicPenCurlicues,	/* Curlicues pen type */
+  keSPTOrganicPenRays,		/* Rays pen type */
+  keSPTOrganicPenRipple,	/* Ripple pen type */
+  keSPTOrganicPenWave,		/* Wave pen type */
+  keSPTOrganicPen		/* Generic pen type */
+} PSPStylePenType;
+
+
 /* Channel types.
  */
 typedef enum {
@@ -163,13 +400,13 @@
   PSP_METRIC_CM			/* Resolution is in centimeters */
 } PSP_METRIC;
 
-
 /* Possible types of compression.
  */
 typedef enum {
   PSP_COMP_NONE = 0,		/* No compression */
   PSP_COMP_RLE,			/* RLE compression */
-  PSP_COMP_LZ77			/* LZ77 compression */
+  PSP_COMP_LZ77,		/* LZ77 compression */
+  PSP_COMP_JPEG			/* JPEG compression (only used by thumbnail and composite image) (since PSP6) */
 } PSPCompression;
 
 /* Picture tube placement mode.
@@ -194,7 +431,10 @@
 /* Extended data field types.
  */
 typedef enum {
-  PSP_XDATA_TRNS_INDEX = 0	/* Transparency index field */
+  PSP_XDATA_TRNS_INDEX = 0,	/* Transparency index field */
+  PSP_XDATA_GRID,		/* Image grid information (since PSP7) */
+  PSP_XDATA_GUIDE,		/* Image guide information (since PSP7) */
+  PSP_XDATA_EXIF,		/* Image EXIF information (since PSP8) */
 } PSPExtendedDataID;
 
 /* Creator field types.
@@ -210,6 +450,21 @@
   PSP_CRTR_FLD_APP_VER		/* Creating app version field */
 } PSPCreatorFieldID;
 
+/* Grid units type. (since PSP7)
+ */
+typedef enum {
+  keGridUnitsPixels = 0,	/* Grid units is pixels */
+  keGridUnitsInches,		/* Grid units is inches */
+  keGridUnitsCentimeters	/* Grid units is centimeters */
+} PSPGridUnitsType;
+
+/* Guide orientation type. (since PSP7)
+ */
+typedef enum  {
+  keHorizontalGuide = 0,
+  keVerticalGuide
+} PSPGuideOrientationType;
+
 /* Creator application identifiers.
  */
 typedef enum {
@@ -222,7 +477,19 @@
 typedef enum {
   PSP_LAYER_NORMAL = 0,		/* Normal layer */
   PSP_LAYER_FLOATING_SELECTION	/* Floating selection layer */
-} PSPLayerType;
+} PSPLayerTypePSP5;
+
+/* Layer types. (since PSP6)
+ */
+typedef enum {
+  keGLTUndefined = 0,		/* Undefined layer type */
+  keGLTRaster,			/* Standard raster layer */
+  keGLTFloatingRasterSelection,	/* Floating selection (raster layer) */
+  keGLTVector,			/* Vector layer */
+  keGLTAdjustment,		/* Adjustment layer */
+  keGLTMask			/* Mask layer (since PSP8) */
+} PSPLayerTypePSP6;
+
 
 /* Truth values.
  */
@@ -237,32 +504,6 @@
 
 /* End of cut&paste from psp spec */
 
-/* The following have been reverse engineered.
- * If a new version of the spec becomes available,
- * change to use the type and constant names from it.
- */
-typedef enum {
-  PSP_BLEND_NORMAL = 0,
-  PSP_BLEND_DARKEN,
-  PSP_BLEND_LIGHTEN,
-  PSP_BLEND_HUE,
-  PSP_BLEND_SATURATION,
-  PSP_BLEND_COLOR,
-  PSP_BLEND_LUMINANCE,
-  PSP_BLEND_MULTIPLY,
-  PSP_BLEND_SCREEN,
-  PSP_BLEND_DISSOLVE,
-  PSP_BLEND_OVERLAY,
-  PSP_BLEND_HARD_LIGHT,
-  PSP_BLEND_SOFT_LIGHT,
-  PSP_BLEND_DIFFERENCE,
-  PSP_BLEND_DODGE,
-  PSP_BLEND_BURN,
-  PSP_BLEND_EXCLUSION
-} PSPLayerBlendModes;
-
-/* End of reverse engineered types */
-
 /* We store the various PSP data in own structures.
  * We cannot use structs intended to be direct copies of the file block
  * headers because of struct alignment issues.
@@ -362,7 +603,7 @@
 
   gimp_register_file_handler_mime (LOAD_PROC, "image/x-psp");
   gimp_register_magic_load_handler (LOAD_PROC,
-				    "psp,tub",
+				    "psp,tub,pspimage",
 				    "",
 				    "0,string,Paint\\040Shop\\040Pro\\040Image\\040File\n\032");
 
@@ -435,6 +676,9 @@
   return run;
 }
 
+/* This helper method is used to get the name of the block for the known block
+ * types. The enum PSPBlockID must cover the input values.
+ */
 static gchar *
 block_name (gint id)
 {
@@ -451,11 +695,18 @@
     "ALPHA_CHANNEL",
     "THUMBNAIL",
     "EXTENDED_DATA",
-    "TUBE"
+    "TUBE",
+    "ADJUSTMENT_EXTENSION",
+    "VECTOR_EXTENSION_BLOCK",
+    "SHAPE_BLOCK",
+    "PAINTSTYLE_BLOCK",
+    "COMPOSITE_IMAGE_BANK_BLOCK",
+    "COMPOSITE_ATTRIBUTES_BLOCK",
+    "JPEG_BLOCK",
   };
   static gchar *err_name = NULL;
 
-  if (id >= 0 && id <= PSP_TUBE_BLOCK)
+  if (id >= 0 && id <= PSP_JPEG_BLOCK)
     return block_names[id];
 
   g_free (err_name);
@@ -464,6 +715,9 @@
   return err_name;
 }
 
+/* This helper method is used during loading. It verifies the block we are
+ * reading has a valid header. Fills the variables init_len and total_len
+ */
 static gint
 read_block_header (FILE    *f,
 		   guint32 *init_len,
@@ -512,6 +766,7 @@
   return GUINT16_FROM_LE (id);
 }
 
+/* Read the PSP_IMAGE_BLOCK */
 static gint
 read_general_image_attribute_block (FILE     *f,
 				    guint     init_len,
@@ -520,6 +775,7 @@
 {
   gchar buf[6];
   guint64 res;
+  gchar graphics_content[4];
 
   if (init_len < 38 || total_len < 38)
     {
@@ -528,7 +784,14 @@
     }
 
   if (psp_ver_major >= 4)
-    fseek (f, 4, SEEK_CUR);
+    {
+      /* TODO: This causes the chunk size to be ignored. Better verify if it is
+       *       valid since it might create read offset problems with the
+       *       "expansion field" (which follows after the "graphics content" and
+       *       is of unkown size).
+       */
+      fseek (f, 4, SEEK_CUR);
+    }
 
   if (fread (&ia->width, 4, 1, f) < 1
       || fread (&ia->height, 4, 1, f) < 1
@@ -540,7 +803,8 @@
       || fread (&ia->greyscale, 1, 1, f) < 1
       || fread (buf, 4, 1, f) < 1 /* Skip total image size */
       || fread (&ia->active_layer, 4, 1, f) < 1
-      || fread (&ia->layer_count, 2, 1, f) < 1)
+      || fread (&ia->layer_count, 2, 1, f) < 1
+      || (psp_ver_major >= 4 && fread (graphics_content, 4, 1, f) < 1))
     {
       g_message ("Error reading general image attribute block");
       return -1;
@@ -588,6 +852,41 @@
 }
 
 static gint
+read_extended_data_block (FILE     *f,
+		          gint      image_ID,
+		          guint     total_len,
+		          PSPimage *ia)
+{
+  long data_start;
+  guchar buf[4];
+  guint16 keyword;
+  guint32 length;
+
+  data_start = ftell (f);
+
+  while (ftell (f) < data_start + total_len)
+    {
+      if (fread (buf, 4, 1, f) < 1
+	  || fread (&keyword, 2, 1, f) < 1
+	  || fread (&length, 4, 1, f) < 1)
+	{
+	  g_message ("Error reading extended data chunk");
+	  return -1;
+	}
+      if (memcmp (buf, "~FL\0", 4) != 0)
+	{
+	  g_message ("Invalid extended data chunk header");
+	  return -1;
+	}
+      /* TODO Read keyword and assign it to PSPExtendedDataID */
+    }
+
+  return 0;
+}
+
+
+
+static gint
 read_creator_block (FILE     *f,
 		    gint      image_ID,
 		    guint     total_len,
@@ -729,47 +1028,60 @@
 }
 
 static GimpLayerModeEffects
-gimp_layer_mode_from_psp_blend_mode (PSPLayerBlendModes mode)
+gimp_layer_mode_from_psp_blend_mode (PSPBlendModes mode)
 {
   switch (mode)
     {
-    case PSP_BLEND_NORMAL:
+    case LAYER_BLEND_NORMAL:
       return GIMP_NORMAL_MODE;
-    case PSP_BLEND_DARKEN:
+    case LAYER_BLEND_DARKEN:
       return GIMP_DARKEN_ONLY_MODE;
-    case PSP_BLEND_LIGHTEN:
+    case LAYER_BLEND_LIGHTEN:
       return GIMP_LIGHTEN_ONLY_MODE;
-    case PSP_BLEND_HUE:
+    case LAYER_BLEND_HUE:
       return GIMP_HUE_MODE;
-    case PSP_BLEND_SATURATION:
+    case LAYER_BLEND_SATURATION:
       return GIMP_SATURATION_MODE;
-    case PSP_BLEND_COLOR:
+    case LAYER_BLEND_COLOR:
       return GIMP_COLOR_MODE;
-    case PSP_BLEND_LUMINANCE:
+    case LAYER_BLEND_LUMINOSITY:
       return GIMP_VALUE_MODE;	/* ??? */
-    case PSP_BLEND_MULTIPLY:
+    case LAYER_BLEND_MULTIPLY:
       return GIMP_MULTIPLY_MODE;
-    case PSP_BLEND_SCREEN:
+    case LAYER_BLEND_SCREEN:
       return GIMP_SCREEN_MODE;
-    case PSP_BLEND_DISSOLVE:
+    case LAYER_BLEND_DISSOLVE:
       return GIMP_DISSOLVE_MODE;
-    case PSP_BLEND_OVERLAY:
+    case LAYER_BLEND_OVERLAY:
       return GIMP_OVERLAY_MODE;
-    case PSP_BLEND_HARD_LIGHT:
-    case PSP_BLEND_SOFT_LIGHT:
-      return -1;
-    case PSP_BLEND_DIFFERENCE:
+    case LAYER_BLEND_HARD_LIGHT:
+      return GIMP_HARDLIGHT_MODE;
+    case LAYER_BLEND_SOFT_LIGHT:
+      return GIMP_SOFTLIGHT_MODE;
+    case LAYER_BLEND_DIFFERENCE:
       return GIMP_DIFFERENCE_MODE;
-    case PSP_BLEND_DODGE:
-    case PSP_BLEND_BURN:
-    case PSP_BLEND_EXCLUSION:
+    case LAYER_BLEND_DODGE:
+      return GIMP_DODGE_MODE;
+    case LAYER_BLEND_BURN:
+      return GIMP_BURN_MODE;
+    case LAYER_BLEND_EXCLUSION:
+      return -1;		/* ??? */
+    case LAYER_BLEND_ADJUST:
+      return -1;		/* ??? */
+    case LAYER_BLEND_TRUE_HUE:
+      return -1;		/* ??? */
+    case LAYER_BLEND_TRUE_SATURATION:
+      return -1;		/* ??? */
+    case LAYER_BLEND_TRUE_COLOR:
+      return -1;		/* ??? */
+    case LAYER_BLEND_TRUE_LIGHTNESS:
       return -1;		/* ??? */
     }
   return -1;
 }
 
 static gchar *
-blend_mode_name (PSPLayerBlendModes mode)
+blend_mode_name (PSPBlendModes mode)
 {
   static gchar *blend_mode_names[] =
   {
@@ -779,7 +1091,7 @@
     "HUE",
     "SATURATION",
     "COLOR",
-    "LUMINANCE",
+    "LUMINOSITY",
     "MULTIPLY",
     "SCREEN",
     "DISSOLVE",
@@ -793,7 +1105,8 @@
   };
   static gchar *err_name = NULL;
 
-  if (mode >= 0 && mode <= PSP_BLEND_EXCLUSION)
+  /* TODO: what about LAYER_BLEND_ADJUST? */
+  if (mode >= 0 && mode <= LAYER_BLEND_EXCLUSION)
     return blend_mode_names[mode];
 
   g_free (err_name);
@@ -1409,6 +1722,8 @@
   return NULL;
 }
 
+/* The main function for loading PSP-images
+ */
 static gint32
 load_image (const gchar *filename)
 {
@@ -1434,7 +1749,7 @@
       return -1;
     }
 
-  /* Read thePSP File Header */
+  /* Read the PSP File Header and determine file version */
   if (fread (buf, 32, 1, f) < 1
       || fread (&psp_ver_major, 2, 1, f) < 1
       || fread (&psp_ver_minor, 2, 1, f) < 1)
@@ -1464,13 +1779,11 @@
 		 psp_ver_major, psp_ver_minor);
       goto error;
     }
-  else if (psp_ver_major == 3)
+  else if ((psp_ver_major == 3)
+        || (psp_ver_major == 4)
+        || (psp_ver_major == 5)
+        || (psp_ver_major == 6))
     ; /* OK */
-  else if (psp_ver_major == 4 && psp_ver_minor == 0)
-    g_message ("Warning: PSP file format version "
-	       "4.0. Support for this format version "
-	       "is based on reverse engineering, "
-	       "as no documentation has been made available");
   else
     {
       g_message ("Unsupported PSP file format version %d.%d",
@@ -1557,9 +1870,18 @@
 		goto error;
 	      break;
 
+	    case PSP_COMPOSITE_IMAGE_BANK_BLOCK:
+	      break;		/* Not yet implemented */
+
 	    case PSP_LAYER_BLOCK:
 	    case PSP_CHANNEL_BLOCK:
 	    case PSP_ALPHA_CHANNEL_BLOCK:
+	    case PSP_ADJUSTMENT_EXTENSION_BLOCK:
+	    case PSP_VECTOR_EXTENSION_BLOCK:
+	    case PSP_SHAPE_BLOCK:
+	    case PSP_PAINTSTYLE_BLOCK:
+	    case PSP_COMPOSITE_ATTRIBUTES_BLOCK:
+	    case PSP_JPEG_BLOCK:
 	      g_message ("Sub-block %s should not occur "
 			 "at main level of file",
 			 block_name (id));
