У меня есть функция, которая создает экземпляр объекта "SkPath" в стеке.После этого я вызываю несколько функций, таких как «moveTo», «lineTo», «cubicTo» (которые просто добавляют новые точки во внутренний массив внутри объекта SkPath).Затем я создаю экземпляр объекта класса "SkPaint" также в стеке.
Затем я вызываю функцию "drawPath" объекта "SkCanvas" и передаю объекты SkPath и SkPaint в качестве аргументов, и происходит сбой.
Я провел некоторое расследование.Оказывается, что массив внутри SkPath больше не является допустимым, потому что конструктор SkPaint обнуляет свой объект (SkPaint), вызывая sk_bzero(this, sizeof(*this));
("memset" в 0 для "pointer" с размером "* pointer"), делая этотакже каким-то образом очищает указатель на массив, который принадлежит ранее объявленному объекту SkPath.
Я исправил это путем создания экземпляра SkPaint перед SkPath, но проблема все еще остается, поскольку у меня есть еще несколько проблем, похожих на этот, и хорошо ... Я хочу понять, что происходит.Тот же код отлично работает на Android 2.2.
Я не использую аппаратное ускорение.
SkPath skPath;
skPath.setFillType(fillType);
skPath.moveTo(x1, y1);
skPath.cubicTo(x1, y1, x2, y2, x3, y3);
skPath.lineTo(x1, y1);
skPath.close();
SkPaint paint; //<- will call constructor that cleans up pointer to array
paint.setAntiAlias(true);
GfxRGB rgb;
state->getFillRGB(&rgb);
paint.setColor(GfxRGB2SkColor(rgb));
paint.setStyle(SkPaint::kFill_Style);
paint.setAlpha((U8CPU) (state->getFillOpacity() * 255));
canvas->drawPath(skPath, paint); // <- will crash here