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