Home | History | Annotate | Download | only in chromium
      1 /*
      2  * Copyright (C) 2006, 2007 Apple Computer, Inc.
      3  * Copyright (c) 2006, 2007, 2008, 2009, 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 FontPlatformDataChromiumWin_h
     33 #define FontPlatformDataChromiumWin_h
     34 
     35 #include "config.h"
     36 
     37 #include "FontOrientation.h"
     38 #include <wtf/Forward.h>
     39 #include <wtf/PassRefPtr.h>
     40 #include <wtf/RefCounted.h>
     41 #include <wtf/text/StringImpl.h>
     42 
     43 #include <usp10.h>
     44 
     45 typedef struct HFONT__ *HFONT;
     46 
     47 namespace WebCore {
     48 
     49 class FontDescription;
     50 
     51 class FontPlatformData {
     52 public:
     53     // Used for deleted values in the font cache's hash tables. The hash table
     54     // will create us with this structure, and it will compare other values
     55     // to this "Deleted" one. It expects the Deleted one to be differentiable
     56     // from the NULL one (created with the empty constructor), so we can't just
     57     // set everything to NULL.
     58     FontPlatformData(WTF::HashTableDeletedValueType);
     59     FontPlatformData();
     60     FontPlatformData(HFONT, float size);
     61     FontPlatformData(float size, bool bold, bool oblique);
     62     FontPlatformData(const FontPlatformData&);
     63 
     64     FontPlatformData& operator=(const FontPlatformData&);
     65 
     66     bool isHashTableDeletedValue() const { return m_font == hashTableDeletedFontValue(); }
     67 
     68     ~FontPlatformData();
     69 
     70     HFONT hfont() const { return m_font ? m_font->hfont() : 0; }
     71     float size() const { return m_size; }
     72 
     73     FontOrientation orientation() const { return Horizontal; } // FIXME: Implement.
     74     void setOrientation(FontOrientation) { } // FIXME: Implement.
     75 
     76     unsigned hash() const
     77     {
     78         return m_font ? m_font->hash() : NULL;
     79     }
     80 
     81     bool operator==(const FontPlatformData& other) const
     82     {
     83         return m_font == other.m_font && m_size == other.m_size;
     84     }
     85 
     86 #ifndef NDEBUG
     87     String description() const;
     88 #endif
     89 
     90     SCRIPT_FONTPROPERTIES* scriptFontProperties() const;
     91     SCRIPT_CACHE* scriptCache() const { return &m_scriptCache; }
     92 
     93 private:
     94     // We refcount the internal HFONT so that FontPlatformData can be
     95     // efficiently copied. WebKit depends on being able to copy it, and we
     96     // don't really want to re-create the HFONT.
     97     class RefCountedHFONT : public RefCounted<RefCountedHFONT> {
     98     public:
     99         static PassRefPtr<RefCountedHFONT> create(HFONT hfont)
    100         {
    101             return adoptRef(new RefCountedHFONT(hfont));
    102         }
    103 
    104         ~RefCountedHFONT();
    105 
    106         HFONT hfont() const { return m_hfont; }
    107         unsigned hash() const
    108         {
    109             return StringHasher::hashMemory<sizeof(HFONT)>(&m_hfont);
    110         }
    111 
    112         bool operator==(const RefCountedHFONT& other) const
    113         {
    114             return m_hfont == other.m_hfont;
    115         }
    116 
    117     private:
    118         // The create() function assumes there is already a refcount of one
    119         // so it can do adoptRef.
    120         RefCountedHFONT(HFONT hfont) : m_hfont(hfont)
    121         {
    122         }
    123 
    124         HFONT m_hfont;
    125     };
    126 
    127     static RefCountedHFONT* hashTableDeletedFontValue();
    128 
    129     RefPtr<RefCountedHFONT> m_font;
    130     float m_size;  // Point size of the font in pixels.
    131 
    132     mutable SCRIPT_CACHE m_scriptCache;
    133     mutable SCRIPT_FONTPROPERTIES* m_scriptFontProperties;
    134 };
    135 
    136 } // WebCore
    137 
    138 #endif // FontPlatformDataChromiumWin_h
    139