18e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project/* 28e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * Copyright (C) 2007 Apple Computer, Kevin Ollivier. All rights reserved. 38e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * 48e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * Redistribution and use in source and binary forms, with or without 58e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * modification, are permitted provided that the following conditions 68e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * are met: 78e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * 1. Redistributions of source code must retain the above copyright 88e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * notice, this list of conditions and the following disclaimer. 98e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * 2. Redistributions in binary form must reproduce the above copyright 108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * notice, this list of conditions and the following disclaimer in the 118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * documentation and/or other materials provided with the distribution. 128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * 138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS'' AND ANY 148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE COMPUTER, INC. OR 178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, 188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, 198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR 208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY 218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project */ 258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "config.h" 278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "Image.h" 288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 298a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block#include "AffineTransform.h" 308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "BitmapImage.h" 315f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian#include "FloatConversion.h" 328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "FloatRect.h" 338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "GraphicsContext.h" 345f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian#include "ImageObserver.h" 35231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block#include "NotImplemented.h" 36dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block#include "SharedBuffer.h" 378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include <math.h> 398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include <stdio.h> 408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include <wx/defs.h> 428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include <wx/bitmap.h> 438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include <wx/dc.h> 448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include <wx/dcmemory.h> 458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include <wx/dcgraph.h> 468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include <wx/graphics.h> 478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include <wx/image.h> 488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include <wx/thread.h> 498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectnamespace WebCore { 518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// this is in GraphicsContextWx.cpp 538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectint getWxCompositingOperation(CompositeOperator op, bool hasAlpha); 548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 55635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Projectbool FrameData::clear(bool clearMetadata) 568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 57635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project if (clearMetadata) 58635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project m_haveMetadata = false; 59635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (m_frame) { 618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project delete m_frame; 628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_frame = 0; 63635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project return true; 648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 65635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project return false; 668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// ================================================ 698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// Image Class 708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// ================================================ 718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectPassRefPtr<Image> Image::loadPlatformResource(const char *name) 738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 74231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block // FIXME: We need to have some 'placeholder' graphics for things like missing 75231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block // plugins or broken images. 76231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block Vector<char> arr; 778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project RefPtr<Image> img = BitmapImage::create(); 788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project RefPtr<SharedBuffer> buffer = SharedBuffer::create(arr.data(), arr.size()); 798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project img->setData(buffer, true); 808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return img.release(); 818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid BitmapImage::initPlatformData() 848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // FIXME: NYI 868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// Drawing Routines 898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 90643ca7872b450ea4efacab6188849e5aac2ba161Steve Blockvoid BitmapImage::draw(GraphicsContext* ctxt, const FloatRect& dst, const FloatRect& src, ColorSpace styleColorSpace, CompositeOperator op) 918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (!m_source.initialized()) 938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return; 948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (mayFillWithSolidColor()) { 96643ca7872b450ea4efacab6188849e5aac2ba161Steve Block fillWithSolidColor(ctxt, dst, solidColor(), styleColorSpace, op); 978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return; 988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#if USE(WXGC) 1018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project wxGCDC* context = (wxGCDC*)ctxt->platformContext(); 102635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project wxGraphicsContext* gc = context->GetGraphicsContext(); 1035f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian wxGraphicsBitmap* bitmap = frameAtIndex(m_currentFrame); 1048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#else 1058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project wxWindowDC* context = ctxt->platformContext(); 1065f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian wxBitmap* bitmap = frameAtIndex(m_currentFrame); 1078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#endif 1088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project startAnimation(); 1108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (!bitmap) // If it's too early we won't have an image yet. 1118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return; 1128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // If we're drawing a sub portion of the image or scaling then create 1148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // a pattern transformation on the image and draw the transformed pattern. 1158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // Test using example site at http://www.meyerweb.com/eric/css/edge/complexspiral/demo.html 1168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // FIXME: NYI 1178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project ctxt->save(); 1198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // Set the compositing operation. 1218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project ctxt->setCompositeOperation(op); 122635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 123635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project#if USE(WXGC) 124635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project float scaleX = src.width() / dst.width(); 125635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project float scaleY = src.height() / dst.height(); 1268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 127635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project FloatRect adjustedDestRect = dst; 128635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project FloatSize selfSize = currentFrameSize(); 129635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 130635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project if (src.size() != selfSize) { 131635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project adjustedDestRect.setLocation(FloatPoint(dst.x() - src.x() / scaleX, dst.y() - src.y() / scaleY)); 132635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project adjustedDestRect.setSize(FloatSize(selfSize.width() / scaleX, selfSize.height() / scaleY)); 133635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project } 134635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 135635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project gc->Clip(dst.x(), dst.y(), dst.width(), dst.height()); 1365f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian#if wxCHECK_VERSION(2,9,0) 137635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project gc->DrawBitmap(*bitmap, adjustedDestRect.x(), adjustedDestRect.y(), adjustedDestRect.width(), adjustedDestRect.height()); 138635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project#else 1395f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian gc->DrawGraphicsBitmap(*bitmap, adjustedDestRect.x(), adjustedDestRect.y(), adjustedDestRect.width(), adjustedDestRect.height()); 1405f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian#endif 1415f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian 1425f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian#else // USE(WXGC) 1438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project IntRect srcIntRect(src); 1448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project IntRect dstIntRect(dst); 1458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project bool rescaling = false; 1468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if ((dstIntRect.width() != srcIntRect.width()) || (dstIntRect.height() != srcIntRect.height())) 1478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project { 1488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project rescaling = true; 1498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project wxImage img = bitmap->ConvertToImage(); 1508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project img.Rescale(dstIntRect.width(), dstIntRect.height()); 1518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project bitmap = new wxBitmap(img); 152635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project } 153635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 1548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project wxMemoryDC mydc; 1558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project ASSERT(bitmap->GetRefData()); 1568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project mydc.SelectObject(*bitmap); 1578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project context->Blit((wxCoord)dstIntRect.x(),(wxCoord)dstIntRect.y(), (wxCoord)dstIntRect.width(), (wxCoord)dstIntRect.height(), &mydc, 1598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project (wxCoord)srcIntRect.x(), (wxCoord)srcIntRect.y(), wxCOPY, true); 1608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project mydc.SelectObject(wxNullBitmap); 1618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // NB: delete is causing crashes during page load, but not during the deletion 1638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // itself. It occurs later on when a valid bitmap created in frameAtIndex 1648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // suddenly becomes invalid after returning. It's possible these errors deal 1658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // with reentrancy and threding problems. 1668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project //delete bitmap; 1678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (rescaling) 1688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project { 1698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project delete bitmap; 1708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project bitmap = NULL; 1718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 172635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project#endif 173635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 1748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project ctxt->restore(); 1755f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian 1765f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian if (ImageObserver* observer = imageObserver()) 1775f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian observer->didDraw(this); 1788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 1798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1808a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Blockvoid Image::drawPattern(GraphicsContext* ctxt, const FloatRect& srcRect, const AffineTransform& patternTransform, const FloatPoint& phase, ColorSpace, CompositeOperator, const FloatRect& dstRect) 1818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 1828a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block 1838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#if USE(WXGC) 1858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project wxGCDC* context = (wxGCDC*)ctxt->platformContext(); 1868a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block wxGraphicsBitmap* bitmap = nativeImageForCurrentFrame(); 1878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#else 1888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project wxWindowDC* context = ctxt->platformContext(); 1898a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block wxBitmap* bitmap = nativeImageForCurrentFrame(); 1908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#endif 1918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (!bitmap) // If it's too early we won't have an image yet. 1938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return; 1945f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian 1955f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian ctxt->save(); 1965f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian ctxt->clip(IntRect(dstRect.x(), dstRect.y(), dstRect.width(), dstRect.height())); 1978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project float currentW = 0; 1998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project float currentH = 0; 2008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#if USE(WXGC) 2028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project wxGraphicsContext* gc = context->GetGraphicsContext(); 2035f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian 2045f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian float adjustedX = phase.x() + srcRect.x() * 2055f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian narrowPrecisionToFloat(patternTransform.a()); 2065f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian float adjustedY = phase.y() + srcRect.y() * 2075f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian narrowPrecisionToFloat(patternTransform.d()); 2085f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian 2098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project gc->ConcatTransform(patternTransform); 210635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project#else 2118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project wxMemoryDC mydc; 2128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project mydc.SelectObject(*bitmap); 213635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project#endif 2148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 215635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project wxPoint origin(context->GetDeviceOrigin()); 216635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project wxSize clientSize(context->GetSize()); 217635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 218635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project while ( currentW < dstRect.width() && currentW < clientSize.x - origin.x ) { 219635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project while ( currentH < dstRect.height() && currentH < clientSize.y - origin.y) { 220635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project#if USE(WXGC) 2215f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian#if wxCHECK_VERSION(2,9,0) 2225f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian gc->DrawBitmap(*bitmap, adjustedX + currentW, adjustedY + currentH, (wxDouble)srcRect.width(), (wxDouble)srcRect.height()); 2235f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian#else 2245f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian gc->DrawGraphicsBitmap(*bitmap, adjustedX + currentW, adjustedY + currentH, (wxDouble)srcRect.width(), (wxDouble)srcRect.height()); 2255f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian#endif 226635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project#else 2278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project context->Blit((wxCoord)dstRect.x() + currentW, (wxCoord)dstRect.y() + currentH, 2288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project (wxCoord)srcRect.width(), (wxCoord)srcRect.height(), &mydc, 2298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project (wxCoord)srcRect.x(), (wxCoord)srcRect.y(), wxCOPY, true); 230635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project#endif 2318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project currentH += srcRect.height(); 2328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 2338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project currentW += srcRect.width(); 2348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project currentH = 0; 2358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 2368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project ctxt->restore(); 237635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 238635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project#if !USE(WXGC) 2398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project mydc.SelectObject(wxNullBitmap); 240635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project#endif 2418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // NB: delete is causing crashes during page load, but not during the deletion 2438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // itself. It occurs later on when a valid bitmap created in frameAtIndex 2448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // suddenly becomes invalid after returning. It's possible these errors deal 2458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // with reentrancy and threding problems. 2468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project //delete bitmap; 2478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project startAnimation(); 2498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2505f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian if (ImageObserver* observer = imageObserver()) 2515f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian observer->didDraw(this); 2528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 2538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid BitmapImage::checkForSolidColor() 2558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 2568f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian m_checkedForSolidColor = true; 2578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 2588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid BitmapImage::invalidatePlatformData() 2608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 2618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 2638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 265