15c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)/*
25c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Copyright (C) 2012 Koji Ishii <kojiishi@gmail.com>
35c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *
45c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Redistribution and use in source and binary forms, with or without
55c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * modification, are permitted provided that the following conditions
65c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * are met:
75c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * 1.  Redistributions of source code must retain the above copyright
85c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *     notice, this list of conditions and the following disclaimer.
95c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * 2.  Redistributions in binary form must reproduce the above copyright
105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *     notice, this list of conditions and the following disclaimer in the
115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *     documentation and/or other materials provided with the distribution.
125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *
135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS'' AND ANY
145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS BE LIABLE FOR ANY
175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) */
245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#ifndef OpenTypeTypes_h
265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#define OpenTypeTypes_h
275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
281e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)#include "platform/SharedBuffer.h"
299bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)#include "wtf/ByteOrder.h"
305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
31c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)namespace blink {
325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)namespace OpenType {
335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
349bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)struct Int16 {
359bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)    Int16(int16_t u) : v(htons(static_cast<uint16_t>(u))) { }
369bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)    operator int16_t() const { return static_cast<int16_t>(ntohs(v)); }
379bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)    uint16_t v; // in BigEndian
385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)};
395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
409bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)struct UInt16 {
419bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)    UInt16(uint16_t u) : v(htons(u)) { }
429bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)    operator uint16_t() const { return ntohs(v); }
439bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)    uint16_t v; // in BigEndian
445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)};
455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
469bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)struct Int32 {
479bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)    Int32(int32_t u) : v(htonl(static_cast<uint32_t>(u))) { }
489bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)    operator int32_t() const { return static_cast<int32_t>(ntohl(v)); }
499bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)    uint32_t v; // in BigEndian
505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)};
515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
529bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)struct UInt32 {
539bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)    UInt32(uint32_t u) : v(htonl(u)) { }
549bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)    operator uint32_t() const { return ntohl(v); }
559bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)    uint32_t v; // in BigEndian
565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)};
575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)typedef UInt32 Fixed;
595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)typedef UInt16 Offset;
605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)typedef UInt16 GlyphID;
615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// OTTag is native because it's only compared against constants, so we don't
635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// do endian conversion here but make sure constants are in big-endian order.
645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// Note that multi-character literal is implementation-defined in C++0x.
655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)typedef uint32_t Tag;
665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#define OT_MAKE_TAG(ch1, ch2, ch3, ch4) ((((uint32_t)(ch4)) << 24) | (((uint32_t)(ch3)) << 16) | (((uint32_t)(ch2)) << 8) | ((uint32_t)(ch1)))
675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)template <typename T> static const T* validateTable(const RefPtr<SharedBuffer>& buffer, size_t count = 1)
695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!buffer || buffer->size() < sizeof(T) * count)
715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return 0;
725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return reinterpret_cast<const T*>(buffer->data());
735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)struct TableBase {
765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)protected:
775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    static bool isValidEnd(const SharedBuffer& buffer, const void* position)
785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (position < buffer.data())
805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            return false;
815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        size_t offset = reinterpret_cast<const char*>(position) - buffer.data();
825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return offset <= buffer.size(); // "<=" because end is included as valid
835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    template <typename T> static const T* validatePtr(const SharedBuffer& buffer, const void* position)
865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        const T* casted = reinterpret_cast<const T*>(position);
885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (!isValidEnd(buffer, &casted[1]))
895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            return 0;
905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return casted;
915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    template <typename T> const T* validateOffset(const SharedBuffer& buffer, uint16_t offset) const
945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return validatePtr<T>(buffer, reinterpret_cast<const int8_t*>(this) + offset);
965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)};
985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} // namespace OpenType
100c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)} // namespace blink
1015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#endif // OpenTypeTypes_h
102