Сбой памяти при рисовании со ски на сотах - PullRequest
2 голосов
/ 19 апреля 2011

У меня есть функция, которая создает экземпляр объекта "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
...