10bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch/*
20bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch * Copyright (C) 2006 Apple Computer, Inc.  All rights reserved.
30bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch *
40bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch * Redistribution and use in source and binary forms, with or without
50bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch * modification, are permitted provided that the following conditions
60bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch * are met:
70bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch * 1. Redistributions of source code must retain the above copyright
80bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch *    notice, this list of conditions and the following disclaimer.
90bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch * 2. Redistributions in binary form must reproduce the above copyright
100bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch *    notice, this list of conditions and the following disclaimer in the
110bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch *    documentation and/or other materials provided with the distribution.
120bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch *
130bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch * THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS'' AND ANY
140bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
150bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
160bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE COMPUTER, INC. OR
170bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
180bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
190bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
200bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
210bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
220bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
230bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
240bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch */
250bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
260bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch#include "config.h"
270bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch#include "ImageDecoder.h"
280bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
290bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch// FIXME: Are all these needed?
300bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch#include <wx/defs.h>
310bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch#include <wx/bitmap.h>
320bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch#if USE(WXGC)
330bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch#include <wx/graphics.h>
340bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch#endif
350bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch#include <wx/image.h>
360bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch#include <wx/rawbmp.h>
370bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
380bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdochnamespace WebCore {
390bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
4065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben MurdochNativeImagePtr ImageFrame::asNewNativeImage() const
410bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch{
420bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    wxBitmap* bmp = new wxBitmap(width(), height(), 32);
43643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
44643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    {
45643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        typedef wxPixelData<wxBitmap, wxAlphaPixelFormat> WxPixelData;
46643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        WxPixelData data(*bmp);
470bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
48643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        // NB: It appears that the data is in BGRA format instead of RGBA format.
49643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        // This code works properly on both ppc and intel, meaning the issue is
50643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        // likely not an issue of byte order getting mixed up on different archs.
51e14391e94c850b8bd03680c23b38978db68687a8John Reck        const unsigned char* bytes = (const unsigned char*)m_bytes;
52643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        int rowCounter = 0;
53643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        long pixelCounter = 0;
54643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        WxPixelData::Iterator p(data);
55643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        WxPixelData::Iterator rowStart = p;
56e14391e94c850b8bd03680c23b38978db68687a8John Reck        for (size_t i = 0; i < m_size.width() * m_size.height() * sizeof(PixelData); i += sizeof(PixelData)) {
57643ca7872b450ea4efacab6188849e5aac2ba161Steve Block                p.Red() = bytes[i + 2];
58643ca7872b450ea4efacab6188849e5aac2ba161Steve Block                p.Green() = bytes[i + 1];
59643ca7872b450ea4efacab6188849e5aac2ba161Steve Block                p.Blue() = bytes[i + 0];
60643ca7872b450ea4efacab6188849e5aac2ba161Steve Block                p.Alpha() = bytes[i + 3];
61643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
62643ca7872b450ea4efacab6188849e5aac2ba161Steve Block            p++;
630bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
64643ca7872b450ea4efacab6188849e5aac2ba161Steve Block            pixelCounter++;
65643ca7872b450ea4efacab6188849e5aac2ba161Steve Block            if ((pixelCounter % width()) == 0) {
66643ca7872b450ea4efacab6188849e5aac2ba161Steve Block                rowCounter++;
67643ca7872b450ea4efacab6188849e5aac2ba161Steve Block                p = rowStart;
68643ca7872b450ea4efacab6188849e5aac2ba161Steve Block                p.MoveTo(data, 0, rowCounter);
69643ca7872b450ea4efacab6188849e5aac2ba161Steve Block            }
700bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        }
710bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch#if !wxCHECK_VERSION(2,9,0)
72643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        bmp->UseAlpha();
730bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch#endif
74643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    } // ensure that WxPixelData is destroyed as it unlocks the bitmap data in
75643ca7872b450ea4efacab6188849e5aac2ba161Steve Block      // its dtor and we can't access it (notably in CreateBitmap() below)
76643ca7872b450ea4efacab6188849e5aac2ba161Steve Block      // before this is done
77643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
780bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    ASSERT(bmp->IsOk());
790bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
800bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch#if USE(WXGC)
81231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    wxGraphicsBitmap* bitmap = new wxGraphicsBitmap(wxGraphicsRenderer::GetDefaultRenderer()->CreateBitmap(*bmp));
820bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    delete bmp;
830bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    return bitmap;
840bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch#else
850bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    return bmp;
860bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch#endif
870bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch}
880bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
890bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch} // namespace WebCore
90