/* * Copyright 2010 Google Inc. * * Use of this source code is governed by a BSD-style license that can be * found in the LICENSE file. */ #ifndef GrGlyph_DEFINED #define GrGlyph_DEFINED #include "GrPath.h" #include "GrRect.h" class GrAtlas; /* Need this to be quad-state: - complete w/ image - just metrics - failed to get image, but has metrics - failed to get metrics */ struct GrGlyph { typedef uint32_t PackedID; GrAtlas* fAtlas; GrPath* fPath; PackedID fPackedID; GrIRect16 fBounds; GrIPoint16 fAtlasLocation; void init(GrGlyph::PackedID packed, const GrIRect& bounds) { fAtlas = NULL; fPath = NULL; fPackedID = packed; fBounds.set(bounds); fAtlasLocation.set(0, 0); } void free() { if (fPath) { delete fPath; fPath = NULL; } } int width() const { return fBounds.width(); } int height() const { return fBounds.height(); } bool isEmpty() const { return fBounds.isEmpty(); } uint16_t glyphID() const { return UnpackID(fPackedID); } /////////////////////////////////////////////////////////////////////////// static inline unsigned ExtractSubPixelBitsFromFixed(GrFixed pos) { // two most significant fraction bits from fixed-point return (pos >> 14) & 3; } static inline PackedID Pack(uint16_t glyphID, GrFixed x, GrFixed y) { x = ExtractSubPixelBitsFromFixed(x); y = ExtractSubPixelBitsFromFixed(y); return (x << 18) | (y << 16) | glyphID; } static inline GrFixed UnpackFixedX(PackedID packed) { return ((packed >> 18) & 3) << 14; } static inline GrFixed UnpackFixedY(PackedID packed) { return ((packed >> 16) & 3) << 14; } static inline uint16_t UnpackID(PackedID packed) { return (uint16_t)packed; } }; #endif