diff options
author | halcanary <halcanary@google.com> | 2015-11-16 10:51:21 -0800 |
---|---|---|
committer | Commit bot <commit-bot@chromium.org> | 2015-11-16 10:51:21 -0800 |
commit | 05b48e2a24ae78312c80ed94195f0b705fdb0547 (patch) | |
tree | 88532e57dd04b5b2d43b0d58afa07218d42f207d /gm/skbug_257.cpp | |
parent | 540e95483d285b555e9b1a73d18c16e7d7c0deba (diff) |
SkPDF: fix large-number bug
Example:
https://fiddle.skia.org/c/db95a3f6c928017635c4f4ddf25f2a7b
BUG=skia:257
Review URL: https://codereview.chromium.org/1438503002
Diffstat (limited to 'gm/skbug_257.cpp')
-rw-r--r-- | gm/skbug_257.cpp | 135 |
1 files changed, 135 insertions, 0 deletions
diff --git a/gm/skbug_257.cpp b/gm/skbug_257.cpp new file mode 100644 index 0000000000..052884236a --- /dev/null +++ b/gm/skbug_257.cpp @@ -0,0 +1,135 @@ +/* + * Copyright 2015 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" +#include "SkImage.h" +#include "SkRRect.h" + +static void rotated_checkerboard_shader(SkPaint* paint, + SkColor c1, + SkColor c2, + int size) { + SkBitmap bm; + bm.allocN32Pixels(2 * size, 2 * size); + bm.eraseColor(c1); + bm.eraseArea(SkIRect::MakeLTRB(0, 0, size, size), c2); + bm.eraseArea(SkIRect::MakeLTRB(size, size, 2 * size, 2 * size), c2); + SkMatrix matrix; + matrix.setScale(0.75f, 0.75f); + matrix.preRotate(30.0f); + SkAutoTUnref<SkShader> shader( + SkShader::CreateBitmapShader(bm, SkShader::kRepeat_TileMode, + SkShader::kRepeat_TileMode, &matrix)); + paint->setShader(shader); +} + +static void exercise_draw_pos_text(SkCanvas* canvas, + const char* text, + SkScalar x, SkScalar y, + const SkPaint& paint) { + size_t textLen = strlen(text); + int count = paint.countText(text, textLen); + SkAutoTArray<SkScalar> widths(count); + paint.getTextWidths(text, textLen, &widths[0]); + SkAutoTArray<SkPoint> pos(count); + for (int i = 0; i < count; ++i) { + pos[i].set(x, y); + x += widths[i]; + } + canvas->drawPosText(text, textLen, &pos[0], paint); +} + +static void exercise_draw_pos_text_h(SkCanvas* canvas, + const char* text, + SkScalar x, SkScalar y, + const SkPaint& paint) { + size_t textLen = strlen(text); + int count = paint.countText(text, textLen); + SkAutoTArray<SkScalar> widths(count); + paint.getTextWidths(text, textLen, &widths[0]); + SkAutoTArray<SkScalar> pos(count); + for (int i = 0; i < count; ++i) { + pos[i] = x; + x += widths[i]; + } + canvas->drawPosTextH(text, textLen, &pos[0], y, paint); +} + +static void test_text(SkCanvas* canvas, SkScalar size, + SkColor color, SkScalar Y) { + SkPaint type; + type.setTextSize(24); + sk_tool_utils::set_portable_typeface(&type); + type.setColor(color); + const char text[] = "HELLO WORLD"; + canvas->drawText(text, strlen(text), 32, size / 2 + Y, type); + SkScalar lineSpacing = type.getFontSpacing(); + exercise_draw_pos_text(canvas, text, 32, size / 2 + Y + lineSpacing, type); + exercise_draw_pos_text_h(canvas, text, 32, + size / 2 + Y + 2 * lineSpacing, type); +} + +// If this GM works correctly, the cyan layer should be lined up with +// the objects below it. +DEF_SIMPLE_GM(skbug_257, canvas, 512, 512) { + const SkScalar size = 256; + SkAutoCanvasRestore autoCanvasRestore0(canvas, true); + const SkScalar scale = 1.00168f; + canvas->scale(scale, scale); + { + SkPaint checker; + rotated_checkerboard_shader(&checker, SK_ColorWHITE, SK_ColorBLACK, 16); + checker.setAntiAlias(true); + + SkAutoCanvasRestore autoCanvasRestore(canvas, true); + canvas->clear(0xFFCECFCE); + SkScalar translate = 225364.0f; + canvas->translate(0, -translate); + + // Test rects + SkRect rect = SkRect::MakeLTRB(8, 8 + translate, size - 8, + size - 8 + translate); + canvas->drawRect(rect, checker); + + // Test Paths + canvas->translate(size, 0); + SkRRect rrect; + SkVector radii[4] = {{40, 40}, {40, 40}, {40, 40}, {40, 40}}; + rrect.setRectRadii(rect, radii); + canvas->drawRRect(rrect, checker); + + // Test Points + canvas->translate(-size, size); + SkScalar delta = 1.0 / 64.0; + SkPoint points[8] = {{size / 2, 8 + translate}, + {size / 2, 8 + translate + delta}, + {8, size / 2 + translate}, + {8, size / 2 + translate + delta}, + {size / 2, size - 8 + translate}, + {size / 2, size - 8 + translate + delta}, + {size - 8, size / 2 + translate}, + {size - 8, size / 2 + translate + delta}}; + checker.setStyle(SkPaint::kStroke_Style); + checker.setStrokeWidth(8); + checker.setStrokeCap(SkPaint::kRound_Cap); + canvas->drawPoints(SkCanvas::kLines_PointMode, 8, points, checker); + + // Test Text + canvas->translate(size, 0); + test_text(canvas, size, SK_ColorBLACK, translate); + } + // reference points (without the huge translations). + SkPaint stroke; + stroke.setStyle(SkPaint::kStroke_Style); + stroke.setStrokeWidth(5); + stroke.setColor(SK_ColorCYAN); + canvas->drawCircle(size / 2, size / 2, size / 2 - 10, stroke); + canvas->drawCircle(3 * size / 2, size / 2, size / 2 - 10, stroke); + canvas->drawCircle(size / 2, 384, size / 2 - 10, stroke); + canvas->translate(size, size); + test_text(canvas, size, SK_ColorCYAN, 0.0f); +} |