/*
 * Copyright (C) 2004, 2005, 2006, 2008, 2010, 2013 Apple Inc. All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions
 * are met:
 * 1. Redistributions of source code must retain the above copyright
 *    notice, this list of conditions and the following disclaimer.
 * 2. Redistributions in binary form must reproduce the above copyright
 *    notice, this list of conditions and the following disclaimer in the
 *    documentation and/or other materials provided with the distribution.
 *
 * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
 * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE INC. OR
 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
 * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
 * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 
 */

#import "config.h"
#import "DataTransfer.h"

#if PLATFORM(MAC)

#import "CachedImage.h"
#import "Document.h"
#import "DragImage.h"
#import "Element.h"
#import "FrameDestructionObserverInlines.h"

namespace WebCore {

// FIXME: Need to refactor and figure out how to handle the flipping in a more sensible way so we can
// use the default DataTransfer::dragImage from DataTransfer.cpp. Note also that this handles cases that
// DataTransfer::dragImage in DataTransfer.cpp does not handle correctly, so must resolve that as well.
DragImageRef DataTransfer::createDragImage(IntPoint& location) const
{
    DragImageRef result = nil;
    if (m_dragImageElement) {
        if (Frame* frame = m_dragImageElement->document().frame()) {
            IntRect imageRect;
            IntRect elementRect;
            result = createDragImageForImage(*frame, *m_dragImageElement, imageRect, elementRect);
            // Client specifies point relative to element, not the whole image, which may include child
            // layers spread out all over the place.
            location.setX(elementRect.x() - imageRect.x() + m_dragLocation.x());
            location.setY(imageRect.height() - (elementRect.y() - imageRect.y() + m_dragLocation.y()));
        }
    } else if (m_dragImage) {
        result = m_dragImage->image()->snapshotNSImage();
        
        location = m_dragLocation;
        location.setY([result size].height - location.y());
    }
    return result;
}

}

#endif // PLATFORM(MAC)
