Index: pango/pangofc-fontmap.cI
===================================================================
RCS file: /cvs/gnome/pango/pango/pangofc-fontmap.cI,v
retrieving revision 1.5
diff -u -p -r1.5 pangofc-fontmap.cI
--- pango/pangofc-fontmap.cI	7 Dec 2002 06:08:39 -0000	1.5
+++ pango/pangofc-fontmap.cI	17 Dec 2002 00:53:21 -0000
@@ -806,6 +806,18 @@ _pango_fc_font_map_get_coverage (PangoFo
 	    }
 	}
     }
+  
+  /* Awful hack so Hangul Tone marks get rendered with the same
+   * font and in the same run as other Hangul characters. If a font
+   * covers the first composed Hangul glyph, then it is declared to cover
+   * the Hangul tone marks. This hack probably needs to be formalized
+   * by choosing fonts for scripts rather than individual code points.
+   */
+  if (pango_coverage_get (coverage, 0xac00) == PANGO_COVERAGE_EXACT)
+    {
+      pango_coverage_set (coverage, 0x302e, PANGO_COVERAGE_EXACT);
+      pango_coverage_set (coverage, 0x302f, PANGO_COVERAGE_EXACT);
+    }
 
   pango_fc_font_map_set_coverage (fcfontmap, &key, coverage);
  
Index: modules/hangul/hangul-xft.c
===================================================================
RCS file: /cvs/gnome/pango/modules/hangul/hangul-xft.c,v
retrieving revision 1.7
diff -u -p -r1.7 hangul-xft.c
--- modules/hangul/hangul-xft.c	3 Nov 2002 19:56:24 -0000	1.7
+++ modules/hangul/hangul-xft.c	17 Dec 2002 00:53:21 -0000
@@ -147,11 +147,38 @@ render_tone (PangoFont *font, gunichar t
         }
       else 
         set_glyph (font, glyphs, *n_glyphs, cluster_offset,
-                   pango_xft_font_get_unknown_glyph (font, index));
+                   pango_xft_font_get_unknown_glyph (font, tone));
     }
   (*n_glyphs)++;
 }
 
+/* This is a fallback for when we get a tone mark not preceded
+ * by a syllable.
+ */
+static void
+render_isolated_tone (PangoFont *font, gunichar tone, PangoGlyphString *glyphs,
+		      int *n_glyphs, int cluster_offset)
+{
+  /* Find a base character to render the mark on
+   */
+  int index = find_char (font, 0x25cc);	/* DOTTED CIRCLE */
+  if (!index)
+    index = find_char (font, 0x25cb);   /* WHITE CIRCLE, in KSC-5601 */
+  if (!index)
+    index = find_char (font, ' ');      /* Space */
+  if (!index)			        /* Unknown glyph box with 0000 in it */
+    index = find_char (font, pango_xft_font_get_unknown_glyph (font, 0));
+
+  /* Add the base character
+   */
+  pango_glyph_string_set_size (glyphs, *n_glyphs + 1);
+  set_glyph (font, glyphs, *n_glyphs, cluster_offset, index);
+  (*n_glyphs)++;
+
+  /* And the tone mrak
+   */
+  render_tone(font, tone, glyphs, n_glyphs, cluster_offset);
+}
 
 static void
 render_syllable (PangoFont *font, gunichar *text, int length,
@@ -307,7 +334,11 @@ hangul_engine_shape (PangoFont        *f
 	    jamos[n_jamos++] = T_FROM_S (wc);
 	}
       else if (IS_M (wc) && !n_jamos)
-	;			/* ignore M's which do not follow syllables  */
+	{
+	  /* Tone mark not following syllable */
+	  render_isolated_tone (font, wc, glyphs, &n_glyphs, start - text);
+	  start = g_utf8_next_char (p);
+	}
       else
 	jamos[n_jamos++] = wc;
       p = g_utf8_next_char (p);
