From mboxrd@z Thu Jan 1 00:00:00 1970 MIME-Version: 1.0 In-Reply-To: <49B01A8D.6040308@proweb.co.uk> References: <49B01A8D.6040308@proweb.co.uk> Date: Wed, 4 Mar 2009 14:18:15 -0700 Message-ID: <14ec7b180903041318r63d40ef5g4d0fc8a712e759f8@mail.gmail.com> From: andrey mirtchovski To: Fans of the OS Plan 9 from Bell Labs <9fans@9fans.net> Content-Type: multipart/mixed; boundary=000e0cd1870e06a61f046451977e Subject: Re: [9fans] Porter-Duff alpha blending Topicbox-Message-UUID: b1eb97fc-ead4-11e9-9d60-3106f5b1d025 --000e0cd1870e06a61f046451977e Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 7bit that's quite interesting, and i suspect you've discovered a bug. actually two bugs, maybe. one has to deal with drawing alpha-blended images, the other with drawing using RGBA32... the simplest way to trigger the second bug, which may or may not be related to the first, is to draw using black, RGBA32 channel and full alpha: the following draws fine on the screen: b = allocimage(display, Rect(0, 0, Dx(screen->r), Dy(screen->r)), ARGB32, 0, DBlack); draw(screen, screen->r, b, nil, ZP); but the following draws incorrectly as blue: allocimage(display, Rect(0, 0, Dx(screen->r), Dy(screen->r)), RGBA32, 0, DBlack); draw(screen, screen->r, b, nil, ZP); at this point i would suspect an endianness issue. setalpha doesn't care about endianness, but libmemdraw does. to add a bit more information i've taken the liberty of modifying your program. the code attached exhibits all sorts of issues with alpha blending and illustrates them more fully (i've also used a few of the tricks in /sys/src/libdraw/arith.c to show the correct usage of Pt(), ZP, color names and the like) in this example everything is drawn over a black screen image to avoid any effects of conversion to the real bpp of the screen. the base image's channel type is fixed at ABGR32 because this particular channel does not exhibit the behaviour of switching from black to blue described at the beginning of this email. i've included a screencap with the black image using RGBA32 so you can see the difference. the program shows 4 different columns of 256 lines with varying levels of alpha-blendedness (from 0xFF on top to 0x00 on bottom). the first column draws white, second red, third green and fourth blue. below the column a single line is drawn twice: once on the black screen and once on the display screen directly. in the two attached snapshots the line (created with ARGB23) is drawn correctly both on the black image and on the display when the black image is ARGB32, but if we switch to RGBA32 for the black image the first line gets mangled when the whole image is displayed. i'll leave the bit/byte swap analysis to the readers :) ps: are you using this on native terminal? it would be very interesting to test the program there for different values of ARGB32, RGBA32 and ABGR32 (there's no BGRA32) and possibly under display depth of 32bpp. i only have 9vx and drawterm to test with, unfortunately, although i will try with osx's drawterm when i get home: that one runs in 32bpp at all times. cheers! --000e0cd1870e06a61f046451977e Content-Type: text/x-csrc; charset=US-ASCII; name="t.c" Content-Disposition: attachment; filename="t.c" Content-Transfer-Encoding: base64 X-Attachment-Id: f_frwiaefb0 I2luY2x1ZGUgPHUuaD4KI2luY2x1ZGUgPGxpYmMuaD4KI2luY2x1ZGUgPGRyYXcuaD4KI2luY2x1 ZGUgPGN1cnNvci5oPgoKSW1hZ2UgKmNvbDsKSW1hZ2UgKmJsYWNrOwoKdm9pZAptYWluKHZvaWQp IHsKCWludCBpOwoJdWxvbmcgdHlwZSA9IEFSR0IzMjsKCgluZXd3aW5kb3coIi1yIDAgMCA4MDAg NDAwIik7CglpZihpbml0ZHJhdyhuaWwsIG5pbCwgInRyaSIpIDwgMCkKCQlleGl0cygiaW5pdGRy YXciKTsKCglibGFjayA9IGFsbG9jaW1hZ2UoZGlzcGxheSwgUmVjdCgwLCAwLCBEeChzY3JlZW4t PnIpLCBEeShzY3JlZW4tPnIpKSwgQVJHQjMyLCAwLCBEQmxhY2spOwoKCWZvcihpID0gMDsgaSA8 IDB4ZmY7IGkrKykgewoJCWNvbCA9IGFsbG9jaW1hZ2UoZGlzcGxheSwgUmVjdCgwLDAsMSwxKSwg dHlwZSwgMSwgc2V0YWxwaGEoRFdoaXRlLCAweGZmLWkpKTsKCQlkcmF3KGJsYWNrLCBSZWN0KDAs aSwyMDAsaSsxKSwgY29sLCBuaWwsIFpQKTsKCQlmcmVlaW1hZ2UoY29sKTsKCgkJY29sID0gYWxs b2NpbWFnZShkaXNwbGF5LCBSZWN0KDAsMCwxLDEpLCB0eXBlLCAxLCBzZXRhbHBoYShEUmVkLCAw eGZmLWkpKTsKCQlkcmF3KGJsYWNrLCBSZWN0KDIwMCxpLDQwMCxpKzEpLCBjb2wsIG5pbCwgWlAp OwoJCWZyZWVpbWFnZShjb2wpOwoJCWNvbCA9IGFsbG9jaW1hZ2UoZGlzcGxheSwgUmVjdCgwLDAs MSwxKSwgdHlwZSwgMSwgc2V0YWxwaGEoREdyZWVuLCAweGZmLWkpKTsKCQlkcmF3KGJsYWNrLCBS ZWN0KDQwMCxpLDYwMCxpKzEpLCBjb2wsIG5pbCwgWlApOwoJCWZyZWVpbWFnZShjb2wpOwoJCWNv bCA9IGFsbG9jaW1hZ2UoZGlzcGxheSwgUmVjdCgwLDAsMSwxKSwgdHlwZSwgMSwgc2V0YWxwaGEo REJsdWUsIDB4ZmYtaSkpOwoJCWRyYXcoYmxhY2ssIFJlY3QoNjAwLGksODAwLGkrMSksIGNvbCwg bmlsLCBaUCk7CgkJZnJlZWltYWdlKGNvbCk7CQoJfQoJY29sID0gYWxsb2NpbWFnZShkaXNwbGF5 LCBSZWN0KDAsIDAsIDEsIDEpLCB0eXBlLCAxLCBEQmxhY2spOwoJZHJhdyhibGFjaywgUmVjdCgw LCAyNjAsIDgwMCwgMzAwKSwgY29sLCBuaWwsIFpQKTsKCWRyYXcoc2NyZWVuLCBzY3JlZW4tPnIs IGJsYWNrLCBuaWwsIFpQKTsKCglkcmF3KHNjcmVlbiwgUmVjdCgwLCAzNjAsIDgwMCwgNDAwKSwg Y29sLCBuaWwsIFpQKTsKCgoJZmx1c2hpbWFnZShkaXNwbGF5LCAxKTsKCXNsZWVwKDEwMDAwKTsK CWNsb3NlZGlzcGxheShkaXNwbGF5KTsKfQo= --000e0cd1870e06a61f046451977e Content-Type: image/png; name="RGBA32.png" Content-Disposition: attachment; filename="RGBA32.png" Content-Transfer-Encoding: base64 X-Attachment-Id: f_frwiafcm1 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 SUVORK5CYII= --000e0cd1870e06a61f046451977e Content-Type: image/png; name="ARGB32.png" Content-Disposition: attachment; filename="ARGB32.png" Content-Transfer-Encoding: base64 X-Attachment-Id: f_frwiafxi2 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 AACIEwAAAHECAACIEwAAAHECAACIEwAAAHECAACIEwAAAHECAACIEwAAAHECAACIEwAAAHECAACI EwAAAHECAACIEwAAAHECAACIEwAAAHECAACIEwAAAHECAACIEwAAAHECAACIEwAAAHECAACIEwAA AHECAACIEwAAAHECAACIEwAAAHECAAAgTgAAAHECAAAgTgAAAHECAAAgTgAAAHECAAAgTgAAAHEC AAAgTgAAAHECAAAgTgAAAHECAAAgTgAAAHECAAAgTgAAAHECAAAgTgAAAHECAAAgTgAAAHECAAAg TgAAAHECAAAgTgAAAHECAAAgTgAAAHECAAAgTgAAAHECAAAgTgAAAHECAAAgTgAAAMQJAAAgTgAA AMQJAAAgTgAAAMQJAAAgTgAAAMQJAAAgTgAAAMQJAAAgTgAAAMQJAAAgTgAAAMQJAAAgTgAAAMQJ AAAgTgAAAMQJAAAgTgAAAMQJAAAgTgAAAMQJAAAgTgAAAMQJAAAgTgAAAMQJAAAgTgAAAMQJAAAg TgAAAMQJAAAgTgAAAMQJAAAgTgAAAMQJAACAOAEAAMQJAACAOAEAAMQJAACAOAEAAMQJAADAisO1 P+z63loAAMCP8eUEAACowge89PvNPiELTQAAAABJRU5ErkJggg== --000e0cd1870e06a61f046451977e--