diff --git a/android/src/org/ppsspp/ppsspp/TextRenderer.java b/android/src/org/ppsspp/ppsspp/TextRenderer.java index 87a9ca1be38e..8c794a56a8c8 100644 --- a/android/src/org/ppsspp/ppsspp/TextRenderer.java +++ b/android/src/org/ppsspp/ppsspp/TextRenderer.java @@ -25,7 +25,7 @@ public static void init(Context ctx) { Log.e(TAG, "Failed to load Roboto Condensed"); } } - private static Point measure(String string, double textSize) { + private static Point measureLine(String string, double textSize) { p.setTextSize((float)textSize); int w = (int)p.measureText(string); int h = (int)(p.descent() - p.ascent() + 2.0f); @@ -37,6 +37,17 @@ private static Point measure(String string, double textSize) { p.y = h; return p; } + private static Point measure(String string, double textSize) { + String lines[] = string.replaceAll("\\r", "").split("\n"); + Point total = new Point(); + total.x = 0; + for (String line : lines) { + Point sz = measureLine(line, textSize); + total.x = Math.max(sz.x, total.x); + } + total.y = (int)(p.descent() - p.ascent()) * lines.length + 2; + return total; + } public static int measureText(String string, double textSize) { Point s = measure(string, textSize); return (s.x << 16) | s.y; @@ -50,8 +61,13 @@ public static int[] renderText(String string, double textSize) { Bitmap bmp = Bitmap.createBitmap(w, h, Bitmap.Config.ARGB_8888); Canvas canvas = new Canvas(bmp); canvas.drawRect(0.0f, 0.0f, w, h, bg); - p.setColor(Color.WHITE); - canvas.drawText(string, 1, -p.ascent() + 1, p); + + String lines[] = string.replaceAll("\\r", "").split("\n"); + float y = 1.0f; + for (String line : lines) { + canvas.drawText(line, 1, -p.ascent() + y, p); + y += p.descent() - p.ascent(); + } int [] pixels = new int[w * h]; bmp.getPixels(pixels, 0, w, 0, 0, w, h); diff --git a/ext/native/util/text/wrap_text.cpp b/ext/native/util/text/wrap_text.cpp index 70754b4aa180..ca95b23fbf50 100644 --- a/ext/native/util/text/wrap_text.cpp +++ b/ext/native/util/text/wrap_text.cpp @@ -97,9 +97,9 @@ void WordWrapper::AppendWord(int endIndex, bool addNewline) { lastLineStart_ = (int)out_.size(); } else { // We may have appended a newline - check. - size_t pos = out_.find_last_of("\n", lastLineStart_); + size_t pos = out_.substr(lastLineStart_).find_last_of("\n"); if (pos != out_.npos) { - lastLineStart_ = (int)pos; + lastLineStart_ += (int)pos; } } lastIndex_ = endIndex; @@ -132,13 +132,8 @@ void WordWrapper::Wrap() { continue; } - float newWordWidth = 0.0f; - if (c == '\n') { - newWordWidth = wordWidth_; - } else { - // Measure the entire word for kerning purposes. May not be 100% perfect. - newWordWidth = MeasureWidth(str_ + lastIndex_, afterIndex - lastIndex_); - } + // Measure the entire word for kerning purposes. May not be 100% perfect. + float newWordWidth = MeasureWidth(str_ + lastIndex_, afterIndex - lastIndex_); // Is this the end of a word (space)? if (wordWidth_ > 0.0f && IsSpace(c)) {