Home | History | Annotate | Download | only in skia
      1 /*
      2  * Copyright (C) 2007 Apple Computer, Inc.
      3  * Copyright (c) 2007, 2008, 2009, Google Inc. All rights reserved.
      4  * Copyright (C) 2010 Company 100, Inc.
      5  *
      6  * Redistribution and use in source and binary forms, with or without
      7  * modification, are permitted provided that the following conditions are
      8  * met:
      9  *
     10  *     * Redistributions of source code must retain the above copyright
     11  * notice, this list of conditions and the following disclaimer.
     12  *     * Redistributions in binary form must reproduce the above
     13  * copyright notice, this list of conditions and the following disclaimer
     14  * in the documentation and/or other materials provided with the
     15  * distribution.
     16  *     * Neither the name of Google Inc. nor the names of its
     17  * contributors may be used to endorse or promote products derived from
     18  * this software without specific prior written permission.
     19  *
     20  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
     21  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
     22  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
     23  * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
     24  * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
     25  * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
     26  * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
     27  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
     28  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
     29  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
     30  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
     31  */
     32 
     33 #include "config.h"
     34 #include "platform/fonts/FontCustomPlatformData.h"
     35 
     36 #include "platform/LayoutTestSupport.h"
     37 #include "platform/SharedBuffer.h"
     38 #include "platform/fonts/FontCache.h"
     39 #include "platform/fonts/FontPlatformData.h"
     40 #include "platform/fonts/opentype/OpenTypeSanitizer.h"
     41 #include "third_party/skia/include/core/SkStream.h"
     42 #include "third_party/skia/include/core/SkTypeface.h"
     43 #include "wtf/PassOwnPtr.h"
     44 
     45 namespace blink {
     46 
     47 FontCustomPlatformData::FontCustomPlatformData(PassRefPtr<SkTypeface> typeface)
     48     : m_typeface(typeface)
     49 {
     50 }
     51 
     52 FontCustomPlatformData::~FontCustomPlatformData()
     53 {
     54 }
     55 
     56 FontPlatformData FontCustomPlatformData::fontPlatformData(float size, bool bold, bool italic, FontOrientation orientation, FontWidthVariant)
     57 {
     58     ASSERT(m_typeface);
     59 #if OS(WIN)
     60     if (!FontCache::useDirectWrite()) {
     61         // FIXME: Skia currently renders synthetic bold and italics with
     62         // hinting and without linear metrics on the windows GDI backend
     63         // while the DirectWrite backend does the right thing. Using
     64         // CreateFromName and specifying the bold/italics style allows
     65         // for proper rendering of synthetic style. Once Skia has been
     66         // updated this workaround will no longer be needed.
     67         // http://crbug.com/332958
     68         bool syntheticBold = bold && !m_typeface->isBold();
     69         bool syntheticItalic = italic && !m_typeface->isItalic();
     70         if (syntheticBold || syntheticItalic) {
     71             SkString name;
     72             m_typeface->getFamilyName(&name);
     73 
     74             int style = SkTypeface::kNormal;
     75             if (syntheticBold)
     76                 style |= SkTypeface::kBold;
     77             if (syntheticItalic)
     78                 style |= SkTypeface::kItalic;
     79 
     80             RefPtr<SkTypeface> typeface = adoptRef(FontCache::fontCache()->fontManager()->legacyCreateTypeface(name.c_str(), static_cast<SkTypeface::Style>(style)));
     81             syntheticBold = false;
     82             syntheticItalic = false;
     83             return FontPlatformData(typeface.release(), "", size, syntheticBold, syntheticItalic, orientation);
     84         }
     85     }
     86 #endif
     87     return FontPlatformData(m_typeface.get(), "", size, bold && !m_typeface->isBold(), italic && !m_typeface->isItalic(), orientation);
     88 }
     89 
     90 PassOwnPtr<FontCustomPlatformData> FontCustomPlatformData::create(SharedBuffer* buffer)
     91 {
     92     ASSERT_ARG(buffer, buffer);
     93 
     94     OpenTypeSanitizer sanitizer(buffer);
     95     RefPtr<SharedBuffer> transcodeBuffer = sanitizer.sanitize();
     96     if (!transcodeBuffer)
     97         return nullptr; // validation failed.
     98     buffer = transcodeBuffer.get();
     99 
    100     RefPtr<SkMemoryStream> stream = adoptRef(new SkMemoryStream(buffer->getAsSkData().get()));
    101 #if OS(WIN)
    102     RefPtr<SkTypeface> typeface = adoptRef(FontCache::fontCache()->fontManager()->createFromStream(stream.get()));
    103 #else
    104     RefPtr<SkTypeface> typeface = adoptRef(SkTypeface::CreateFromStream(stream.get()));
    105 #endif
    106     if (!typeface)
    107         return nullptr;
    108 
    109     return adoptPtr(new FontCustomPlatformData(typeface.release()));
    110 }
    111 
    112 bool FontCustomPlatformData::supportsFormat(const String& format)
    113 {
    114     return equalIgnoringCase(format, "truetype") || equalIgnoringCase(format, "opentype") || OpenTypeSanitizer::supportsFormat(format);
    115 }
    116 
    117 } // namespace blink
    118