15c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)/*
25c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Copyright (C) 2000 Lars Knoll (knoll@kde.org)
35c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *           (C) 2000 Antti Koivisto (koivisto@kde.org)
45c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *           (C) 2000 Dirk Mueller (mueller@kde.org)
55c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Copyright (C) 2003, 2005, 2006, 2007, 2008 Apple Inc. All rights reserved.
65c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *
75c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * This library is free software; you can redistribute it and/or
85c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * modify it under the terms of the GNU Library General Public
95c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * License as published by the Free Software Foundation; either
105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * version 2 of the License, or (at your option) any later version.
115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *
125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * This library is distributed in the hope that it will be useful,
135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * but WITHOUT ANY WARRANTY; without even the implied warranty of
145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Library General Public License for more details.
165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *
175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * You should have received a copy of the GNU Library General Public License
185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * along with this library; see the file COPYING.LIB.  If not, write to
195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Boston, MA 02110-1301, USA.
215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *
225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) */
235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#include "config.h"
2553e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/rendering/style/StyleGeneratedImage.h"
265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2753e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/css/CSSImageGeneratorValue.h"
2881a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles)#include "core/css/resolver/StyleResolver.h"
2953e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/rendering/RenderObject.h"
305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
31c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)namespace blink {
3202772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch
3309380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)StyleGeneratedImage::StyleGeneratedImage(PassRefPtrWillBeRawPtr<CSSImageGeneratorValue> value)
3402772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch    : m_imageGeneratorValue(value)
355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    , m_fixedSize(m_imageGeneratorValue->isFixedSize())
365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_isGeneratedImage = true;
385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
40d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)PassRefPtrWillBeRawPtr<CSSValue> StyleGeneratedImage::cssValue() const
415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
4209380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    return m_imageGeneratorValue.get();
435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)LayoutSize StyleGeneratedImage::imageSize(const RenderObject* renderer, float multiplier) const
465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (m_fixedSize) {
485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        IntSize fixedSize = m_imageGeneratorValue->fixedSize(renderer);
495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (multiplier == 1.0f)
505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            return fixedSize;
515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        LayoutUnit width = fixedSize.width() * multiplier;
535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        LayoutUnit height = fixedSize.height() * multiplier;
545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        // Don't let images that have a width/height >= 1 shrink below 1 when zoomed.
565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (fixedSize.width() > 0)
575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            width = max<LayoutUnit>(1, width);
585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (fixedSize.height() > 0)
605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            height = max<LayoutUnit>(1, height);
615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return LayoutSize(width, height);
635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
6402772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch
655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return m_containerSize;
665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void StyleGeneratedImage::computeIntrinsicDimensions(const RenderObject* renderer, Length& intrinsicWidth, Length& intrinsicHeight, FloatSize& intrinsicRatio)
695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // At a zoom level of 1 the image is guaranteed to have an integer size.
715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    IntSize size = flooredIntSize(imageSize(renderer, 1));
725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    intrinsicWidth = Length(size.width(), Fixed);
735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    intrinsicHeight = Length(size.height(), Fixed);
745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    intrinsicRatio = size;
755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void StyleGeneratedImage::addClient(RenderObject* renderer)
785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_imageGeneratorValue->addClient(renderer, IntSize());
805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void StyleGeneratedImage::removeClient(RenderObject* renderer)
835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_imageGeneratorValue->removeClient(renderer);
855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)PassRefPtr<Image> StyleGeneratedImage::image(RenderObject* renderer, const IntSize& size) const
885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return m_imageGeneratorValue->image(renderer, size);
905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
92926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)bool StyleGeneratedImage::knownToBeOpaque(const RenderObject* renderer) const
93926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles){
94926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    return m_imageGeneratorValue->knownToBeOpaque(renderer);
95926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)}
96926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
98