7
votes

SIGSEGV en canvas.clippath à la deuxième clippathe

J'ai un ASUS Nexus 7 exécutant Android 4.2.2 Mon application est génératrice d'un SIGSEGV dans SK_MALLOC_FLAGS lors de l'exécution du code suivant:

    I/DEBUG   (  124): signal 11 (SIGSEGV), code 1 (SEGV_MAPERR), fault addr deadbaad
    I/DEBUG   (  124):     r0 00000027  r1 deadbaad  r2 4017f258  r3 00000000
    I/DEBUG   (  124):     r4 00000000  r5 bed72434  r6 bed72508  r7 1be773bc
    I/DEBUG   (  124):     r8 1be730f9  r9 000042c3  sl 00000001  fp 67185010
    I/DEBUG   (  124):     ip 40443f3c  sp bed72430  lr 401522f9  pc 4014e992  cpsr 60000030
...
    I/DEBUG   (  124): backtrace:
    I/DEBUG   (  124):     #00  pc 0001a992  /system/lib/libc.so
    I/DEBUG   (  124):     #01  pc 00018070  /system/lib/libc.so (abort+4)
    I/DEBUG   (  124):     #02  pc 000be4b4  /system/lib/libskia.so (sk_malloc_flags(unsigned int, unsigned int)+28)
    I/DEBUG   (  124):     #03  pc 0008afc0  /system/lib/libskia.so (SkRegion::op(SkRegion const&, SkRegion const&, SkRegion::Op)+1716)
    I/DEBUG   (  124):     #04  pc 00089448  /system/lib/libskia.so (SkRasterClip::op(SkRasterClip const&, SkRegion::Op)+128)


3 commentaires

Que se passe-t-il, si vous ne laissez que canvas.clippath (FirstPath); , supprimer un appel pour quatrième ?


Essayez si vous mettez canvas.clippath (quatrième, région.op.replace); et voir si c'est la cause, sinon, alors que David Jashi a dit, essayez de supprimer l'appel pour voir si c'est le problème.


Une autre chose que je peux penser, c'est si vous les dessinez séparément: image image = nouvelle image (); Canvas canvas = image.beginRecording (12240, 15840); Canvas.clippath (FirstPath); image.endrecording (); canvas = image.beginrecording (12240, 15840); canvas.clippath (quatrième, région.op.op.op.Intersect); / * Vous pouvez également essayer sans région.op.intersect * / image.endrecording ();


3 Réponses :


0
votes

Il ressemble à Canvas.clippath () n'est pas pris en charge avec une accélération matérielle, au moins Doc affirme que: http://developer.android.com/Guide/topics/graphics /hardware-accel.html#unsupporté

La seule solution de contournement qui me vient à l'esprit consiste à désactiver l'accélération matérielle.

Vous pouvez le faire sur:


2 commentaires

Allumer ou désactiver l'accélération matérielle n'affecte pas l'accident. La toile n'est pas associée à une vue.


Est 12240 x 15840 pas un peu à gros pour une image? Avez-vous essayé avec des dimensions plus petites?



1
votes

OK, laissez-moi mettre ceci dans une réponse, car il a l'air assez logique pour moi:

Pour voir si le problème voit à partir des appels continus à Clippath (chemin) code>, essayez de supprimer l'appel au début ou à la mise en place canvas.clippath (quatrième, région.op.replace); code> à la place de Canvas.clippath (quatrième); code> et voir si c'est la cause . P>

Une autre chose que je peux penser, c'est si vous les dessinez séparément: P>

Picture picture = new Picture();
Canvas canvas = picture.beginRecording(12240, 15840);
canvas.clipPath(firstPath);
picture.endRecording();

canvas = picture.beginRecording(12240, 15840);
canvas.clipPath(fourthPath);
picture.endRecording();


0 commentaires

5
votes

Ceci ressemble à un boîtier de coin malade pour Clippath code> Manipulation.

Picture picture = new Picture();
Canvas canvas = picture.beginRecording(12240, 15840);
Path path = new Path();
path.moveTo(3058, 12365);
path.lineTo(8499, 3038);
path.lineTo(9494, 3619);
path.lineTo(4053, 12946);
path.close();
canvas.clipPath(path);
// do stuff with canvas
path.moveTo(3065, 12332);
path.lineTo(4053, 12926);
path.lineTo(9615, 3669);
path.lineTo(8628, 3075);
path.close();
canvas.clipPath(path, Region.Op.REPLACE);
// do more stuff with canvas
picture.endRecording();
return picture;


0 commentaires