Alpha channel problem

Mar 19, 2014 at 7:45 AM
Edited Mar 19, 2014 at 8:17 AM
I modified alpha channel directory. but i got strange result

caseA : Modified by WriteableBitmapEx drawing function -> OK (half side completely transparent)
caseB : Modified alpha channel directory (WriteableBitmapEx) -> NG (half side not completely transparent)
caseC : Modified alpha channel directory (Normal WriteableBitmap) ->OK (half side completely transparent)

Image

what happned ?
WriteableBitmapEx vertion is 1.0.12.0
    public partial class MainWindow : Window {
        WriteableBitmap chessBoard;
        WriteableBitmap bitmap1;
        WriteableBitmap bitmap2;
        WriteableBitmap bitmap3;
        public MainWindow() {
            InitializeComponent();
            chessBoard = MakeChessBordBitmap(100, 100, 5);
            bitmap1 = BitmapFactory.New(100, 100);
            bitmap2 = BitmapFactory.New(100, 100);
            bitmap3 = new WriteableBitmap(100, 100, 72, 72, PixelFormats.Pbgra32, null);

            using (bitmap1.GetBitmapContext()) {
                bitmap1.Clear(Color.FromArgb(255, 255, 0, 0));
                bitmap1.FillRectangle(0, 0, 100, 50, Color.FromArgb(0, 0, 0, 0));
            }
            using (bitmap2.GetBitmapContext()) {
                bitmap2.Clear(Color.FromArgb(255, 0, 255, 0));
            }
            unsafe {
                bitmap2.Lock();
                for (int y = 0; y < 50; y++) {
                    for (int x = 0; x < 100; x++) {
                        byte* p = (byte*)bitmap2.BackBuffer + bitmap2.BackBufferStride * y + x * 4;
                        *(p + 3) = 0; // Alpha
                    }
                }
                bitmap2.AddDirtyRect(new Int32Rect(0, 0, 100, 100));
                bitmap2.Unlock();
            }

            unsafe {
                bitmap3.Lock();
                for (int y = 0; y < 100; y++) {
                    for (int x = 0; x < 100; x++) {
                        byte* p = (byte*)bitmap3.BackBuffer + bitmap3.BackBufferStride * y + x * 4;
                        if (y < 50) {
                            *(p++) = 0; // B
                            *(p++) = 0; // G
                            *(p++) = 0; // R
                            *(p++) = 0; // Alpha
                        }
                        else {
                            *(p++) = 255; // B
                            *(p++) = 0; // G
                            *(p++) = 0; // R
                            *(p++) = 255; // Alpha
                        }
                    }
                }
                bitmap3.AddDirtyRect(new Int32Rect(0, 0, 100, 100));
                bitmap3.Unlock();
            }
            caseA1.Source = chessBoard;
            caseA2.Source = bitmap1;

            caseB1.Source = chessBoard;
            caseB2.Source = bitmap2;

            caseC1.Source = chessBoard;
            caseC2.Source = bitmap3;
        }
        // ChessBord
        WriteableBitmap MakeChessBordBitmap(int w, int h, int n) {
            WriteableBitmap bitmap = BitmapFactory.New(w, h);
            int cx = w / n;
            int cy = h / n;
            int i, j;
            int x2, y2;
            using (bitmap.GetBitmapContext()) {
                bitmap.Clear(Colors.White);
                for (i = 0; i < n; i++) {
                    for (j = 0; j < n; j++) {
                        if ((i + j) % 2 == 0) {
                            y2 = Math.Min(cy * i + cy - 1, h - 1);
                            x2 = Math.Min(cx * j + cx - 1, w - 1);
                            bitmap.FillRectangle(j * cx, i * cy, x2, y2, Colors.Gray);
                        }
                    }
                }
            }
            return bitmap;

        }
    }
<Window x:Class="AlphaBug.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="350" Width="640">
    <StackPanel Orientation="Horizontal">
        <Viewbox Width="200" Height="200">
            <Grid>
                <Image x:Name="caseA1"/>
                <Image x:Name="caseA2"/>
            </Grid>
        </Viewbox>
        <Viewbox Width="200" Height="200" Margin="10,0,0,0">
            <Grid>
                <Image x:Name="caseB1"/>
                <Image x:Name="caseB2"/>
            </Grid>
        </Viewbox>
        <Viewbox Width="200" Height="200" Margin="10,0,0,0">
            <Grid>
                <Image x:Name="caseC1"/>
                <Image x:Name="caseC2"/>
            </Grid>
        </Viewbox>
    </StackPanel>
</Window>