1 /* 2 * Copyright (C) 2006, 2009 Apple Inc. All rights reserved. 3 * 4 * Redistribution and use in source and binary forms, with or without 5 * modification, are permitted provided that the following conditions 6 * are met: 7 * 8 * 1. Redistributions of source code must retain the above copyright 9 * notice, this list of conditions and the following disclaimer. 10 * 2. Redistributions in binary form must reproduce the above copyright 11 * notice, this list of conditions and the following disclaimer in the 12 * documentation and/or other materials provided with the distribution. 13 * 3. Neither the name of Apple Computer, Inc. ("Apple") nor the names of 14 * its contributors may be used to endorse or promote products derived 15 * from this software without specific prior written permission. 16 * 17 * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY 18 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED 19 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE 20 * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY 21 * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES 22 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; 23 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND 24 * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 25 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF 26 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 27 */ 28 29 #ifndef GlyphWidthMap_h 30 #define GlyphWidthMap_h 31 32 #include <wtf/HashMap.h> 33 #include <wtf/OwnPtr.h> 34 #include <wtf/unicode/Unicode.h> 35 36 namespace WebCore { 37 38 typedef unsigned short Glyph; 39 40 const float cGlyphWidthUnknown = -1; 41 42 class GlyphWidthMap : public Noncopyable { 43 public: GlyphWidthMap()44 GlyphWidthMap() : m_filledPrimaryPage(false) { } ~GlyphWidthMap()45 ~GlyphWidthMap() { if (m_pages) { deleteAllValues(*m_pages); } } 46 widthForGlyph(Glyph glyph)47 float widthForGlyph(Glyph glyph) 48 { 49 return locatePage(glyph / GlyphWidthPage::size)->widthForGlyph(glyph); 50 } 51 setWidthForGlyph(Glyph glyph,float width)52 void setWidthForGlyph(Glyph glyph, float width) 53 { 54 locatePage(glyph / GlyphWidthPage::size)->setWidthForGlyph(glyph, width); 55 } 56 57 private: 58 struct GlyphWidthPage { 59 static const size_t size = 256; // Usually covers Latin-1 in a single page. 60 float m_widths[size]; 61 widthForGlyphGlyphWidthPage62 float widthForGlyph(Glyph glyph) const { return m_widths[glyph % size]; } setWidthForGlyphGlyphWidthPage63 void setWidthForGlyph(Glyph glyph, float width) 64 { 65 setWidthForIndex(glyph % size, width); 66 } setWidthForIndexGlyphWidthPage67 void setWidthForIndex(unsigned index, float width) 68 { 69 m_widths[index] = width; 70 } 71 }; 72 locatePage(unsigned pageNumber)73 GlyphWidthPage* locatePage(unsigned pageNumber) 74 { 75 if (!pageNumber && m_filledPrimaryPage) 76 return &m_primaryPage; 77 return locatePageSlowCase(pageNumber); 78 } 79 80 GlyphWidthPage* locatePageSlowCase(unsigned pageNumber); 81 82 bool m_filledPrimaryPage; 83 GlyphWidthPage m_primaryPage; // We optimize for the page that contains glyph indices 0-255. 84 OwnPtr<HashMap<int, GlyphWidthPage*> > m_pages; 85 }; 86 87 } 88 89 #endif 90