2

我有一个在堆栈上实例化“SkPath”对象的函数。之后,我调用了一些函数,例如“moveTo”、“lineTo”、“cubicTo”(它只是在 SkPath 对象的内部数组中添加新点)。然后我也在堆栈上实例化“SkPaint”类的对象。

然后我调用“SkCanvas”对象的“drawPath”函数并将 SkPath 和 SkPaint 对象作为参数传递,它崩溃了。

我做了一些调查。事实证明,SkPath 中的数组不再有效,因为 SkPaint 的构造函数通过调用 ("memset" to 0 for "pointer" with size of "*pointer") 将其(SkPaint's)对象 sk_bzero(this, sizeof(*this));清空)这样做它也以某种方式清理指向属于先前声明的 SkPath 对象的数组的指针。

我已经在 SkPath 之前通过实例化 SkPaint 修复了它,但问题仍然存在,因为我还有一些与此类似的问题,而且……我想了解发生了什么。相同的代码在 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
4

0 回答 0