1 /* 2 * Copyright (C) 2013 Apple Inc. All rights reserved. 3 * Copyright (C) 2013 Google Inc. All rights reserved. 4 * 5 * Redistribution and use in source and binary forms, with or without 6 * modification, are permitted provided that the following conditions are 7 * met: 8 * 9 * * Redistributions of source code must retain the above copyright 10 * notice, this list of conditions and the following disclaimer. 11 * * Redistributions in binary form must reproduce the above 12 * copyright notice, this list of conditions and the following disclaimer 13 * in the documentation and/or other materials provided with the 14 * distribution. 15 * * Neither the name of Google Inc. nor the names of its 16 * contributors may be used to endorse or promote products derived from 17 * this software without specific prior written permission. 18 * 19 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 20 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 21 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 22 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 23 * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 24 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 25 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 26 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 27 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 28 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 29 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 30 */ 31 32 #ifndef HTMLSrcsetParser_h 33 #define HTMLSrcsetParser_h 34 35 #include "wtf/text/WTFString.h" 36 37 namespace blink { 38 39 enum { UninitializedDescriptor = -1 }; 40 41 class DescriptorParsingResult { 42 public: 43 DescriptorParsingResult() 44 : m_density(UninitializedDescriptor) 45 , m_resourceWidth(UninitializedDescriptor) 46 , m_resourceHeight(UninitializedDescriptor) 47 { 48 } 49 50 bool hasDensity() const { return m_density >= 0; } 51 bool hasWidth() const { return m_resourceWidth >= 0; } 52 bool hasHeight() const { return m_resourceHeight >= 0; } 53 54 float density() const { ASSERT(hasDensity()); return m_density; } 55 unsigned resourceWidth() const { ASSERT(hasWidth()); return m_resourceWidth; } 56 unsigned resourceHeight() const { ASSERT(hasHeight()); return m_resourceHeight; } 57 58 void setResourceWidth(int width) { ASSERT(width >= 0); m_resourceWidth = (unsigned)width; } 59 void setResourceHeight(int height) { ASSERT(height >= 0); m_resourceHeight = (unsigned)height; } 60 void setDensity(float densityToSet) { ASSERT(densityToSet >= 0); m_density = densityToSet; } 61 62 private: 63 float m_density; 64 int m_resourceWidth; 65 int m_resourceHeight; 66 }; 67 68 class ImageCandidate { 69 public: 70 enum OriginAttribute { 71 SrcsetOrigin, 72 SrcOrigin 73 }; 74 75 ImageCandidate() 76 : m_density(1.0) 77 , m_resourceWidth(UninitializedDescriptor) 78 , m_originAttribute(SrcsetOrigin) 79 { 80 } 81 82 ImageCandidate(const String& source, unsigned start, unsigned length, const DescriptorParsingResult& result, OriginAttribute originAttribute) 83 : m_string(source.createView(start, length)) 84 , m_density(result.hasDensity()?result.density():UninitializedDescriptor) 85 , m_resourceWidth(result.hasWidth()?result.resourceWidth():UninitializedDescriptor) 86 , m_originAttribute(originAttribute) 87 { 88 } 89 90 String toString() const 91 { 92 return String(m_string.toString()); 93 } 94 95 AtomicString url() const 96 { 97 return AtomicString(m_string.toString()); 98 } 99 100 void setDensity(float factor) 101 { 102 m_density = factor; 103 } 104 105 float density() const 106 { 107 return m_density; 108 } 109 110 int resourceWidth() const 111 { 112 return m_resourceWidth; 113 } 114 115 bool srcOrigin() const 116 { 117 return (m_originAttribute == SrcOrigin); 118 } 119 120 inline bool isEmpty() const 121 { 122 return m_string.isEmpty(); 123 } 124 125 private: 126 StringView m_string; 127 float m_density; 128 int m_resourceWidth; 129 OriginAttribute m_originAttribute; 130 }; 131 132 ImageCandidate bestFitSourceForSrcsetAttribute(float deviceScaleFactor, unsigned sourceSize, const String& srcsetAttribute); 133 134 ImageCandidate bestFitSourceForImageAttributes(float deviceScaleFactor, unsigned sourceSize, const String& srcAttribute, const String& srcsetAttribute); 135 136 String bestFitSourceForImageAttributes(float deviceScaleFactor, unsigned sourceSize, const String& srcAttribute, ImageCandidate& srcsetImageCandidate); 137 138 } 139 140 #endif 141