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