10bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch/*
20bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch * Copyright (C) 2006 Apple Computer, Inc.  All rights reserved.
38a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block * Copyright (C) 2010 Stephan Aßmus, <superstippi@gmx.de>
40bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch *
50bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch * Redistribution and use in source and binary forms, with or without
60bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch * modification, are permitted provided that the following conditions
70bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch * are met:
80bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch * 1. Redistributions of source code must retain the above copyright
90bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch *    notice, this list of conditions and the following disclaimer.
100bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch * 2. Redistributions in binary form must reproduce the above copyright
110bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch *    notice, this list of conditions and the following disclaimer in the
120bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch *    documentation and/or other materials provided with the distribution.
130bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch *
140bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch * THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS'' AND ANY
150bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
160bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
170bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE COMPUTER, INC. OR
180bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
190bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
200bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
210bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
220bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
230bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
240bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
250bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch */
260bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
270bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch#include "config.h"
280bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch#include "ImageDecoder.h"
290bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
300bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch#include <Bitmap.h>
310bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
320bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdochnamespace WebCore {
330bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
3465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben MurdochNativeImagePtr ImageFrame::asNewNativeImage() const
350bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch{
368a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block    int bytesPerRow = width() * sizeof(PixelData);
378a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block    OwnPtr<BBitmap> bitmap(new BBitmap(BRect(0, 0, width() - 1, height() - 1), 0, B_RGBA32, bytesPerRow));
388a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block
39e14391e94c850b8bd03680c23b38978db68687a8John Reck    const uint8* source = reinterpret_cast<const uint8*>(m_bytes);
408a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block    uint8* destination = reinterpret_cast<uint8*>(bitmap->Bits());
418a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block    int h = height();
428a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block    int w = width();
438a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block    for (int y = 0; y < h; y++) {
448a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block#if 0
458a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block// FIXME: Enable this conversion once Haiku has B_RGBA32P[remultiplied]...
468a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block        memcpy(dst, source, bytesPerRow);
478a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block#else
488a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block        const uint8* sourceHandle = source;
498a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block        uint8* destinationHandle = destination;
508a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block        for (int x = 0; x < w; x++) {
518a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block            if (sourceHandle[3] == 255 || !sourceHandle[3]) {
528a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block                destinationHandle[0] = sourceHandle[0];
538a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block                destinationHandle[1] = sourceHandle[1];
548a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block                destinationHandle[2] = sourceHandle[2];
558a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block                destinationHandle[3] = sourceHandle[3];
568a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block            } else {
578a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block                destinationHandle[0] = static_cast<uint16>(sourceHandle[0]) * 255 / sourceHandle[3];
588a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block                destinationHandle[1] = static_cast<uint16>(sourceHandle[1]) * 255 / sourceHandle[3];
598a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block                destinationHandle[2] = static_cast<uint16>(sourceHandle[2]) * 255 / sourceHandle[3];
608a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block                destinationHandle[3] = sourceHandle[3];
618a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block            }
628a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block            destinationHandle += 4;
638a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block            sourceHandle += 4;
648a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block        }
658a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block#endif
668a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block        destination += bytesPerRow;
678a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block        source += bytesPerRow;
688a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block    }
698a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block
708a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block    return bitmap.release();
710bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch}
720bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
730bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch} // namespace WebCore
740bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
75