anchor.diff:  
     AdvX := 0;
     PrevX := 0;
  -  LastSpace := -1;
  +  LastWrappable := -1;
  +  LastWrappableIsSpace := False;
     CharSpacing := fFontData[aFont].CharSpacing; //Spacing between letters, this varies between fonts
   
     I := 1;
     while I <= Length(aText) do
     begin
  +    //Chinese/Japanese characters (not punctuation) can always be wrapped before
  +    //Check this before we update AdvX since we are allowing wrapping before this char
  +    if ((Ord(aText[I]) >= 19968) and (Ord(aText[I]) <= 40870))
  +    or ((Ord(aText[I]) >= $3040) and (Ord(aText[I]) <= $30ff)) then
  +    begin
  +      LastWrappable := I;
  +      PrevX := AdvX; //AdvX does not include this char yet, since we are wrapping before it
  +      LastWrappableIsSpace := False;
  +    end;
  +
       //Ignore color markups [$FFFFFF][]
       if (aText[I]='[') and (I+1 <= Length(aText)) and (aText[I+1]=']') then
         inc(I) //Skip past this markup
  
positive.code:   for I := 1 to Length(aText) do
    begin
      if aText[I] = #32 then Inc(AdvX, fFontData[aFont].WordSpacing)
                        else Inc(AdvX, fFontData[aFont].Letters[byte(aText[I])].Width + CharSpacing);
  
      if (AdvX > aMaxPxWidth) then
      begin
  
negative.code:   INDENT = '   ';
  var
    I: Integer;
    CharSpacing, LastWrappable: Integer;
    LastWrappableIsSpace: Boolean;
    AdvX, PrevX: Integer;
    TmpColor: Integer;
  begin
  