/*
 * Copyright 2016 Google Inc.
 *
 * Use of this source code is governed by a BSD-style license that can be
 * found in the LICENSE file.
 */

#include "gm.h"

// https://bugs.skia.org/5321
// two strings should draw the same.  PDF did not.
DEF_SIMPLE_GM(skbug_5321, canvas, 128, 128) {
    SkPaint paint;
    paint.setStyle(SkPaint::kFill_Style);
    paint.setTextSize(30);

    paint.setTextEncoding(SkPaint::kUTF8_TextEncoding);
    const char text[] = "x\314\200y";  // utf8(u"x\u0300y")
    SkScalar x = 20, y = 45;
    size_t byteLength = strlen(text);
    canvas->drawText(text, byteLength, x, y, paint);

    int glyph_count = paint.countText(text, byteLength);
    SkAutoTMalloc<SkScalar> widths(glyph_count);
    (void)paint.getTextWidths(text, byteLength, &widths[0]);
    for (int i = 0; i < glyph_count; ++i) {
        SkScalar w = widths[i];
        widths[i] = x;
        x += w;
    }
    y += paint.getFontMetrics(nullptr);
    canvas->drawPosTextH(text, byteLength, &widths[0], y, paint);
}
