1 /* 2 Copyright 2010 Google Inc. 3 4 Licensed under the Apache License, Version 2.0 (the "License"); 5 you may not use this file except in compliance with the License. 6 You may obtain a copy of the License at 7 8 http://www.apache.org/licenses/LICENSE-2.0 9 10 Unless required by applicable law or agreed to in writing, software 11 distributed under the License is distributed on an "AS IS" BASIS, 12 WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 See the License for the specific language governing permissions and 14 limitations under the License. 15 */ 16 17 18 #ifndef GrGlyph_DEFINED 19 #define GrGlyph_DEFINED 20 21 #include "GrPath.h" 22 #include "GrRect.h" 23 24 class GrAtlas; 25 26 /* Need this to be quad-state: 27 - complete w/ image 28 - just metrics 29 - failed to get image, but has metrics 30 - failed to get metrics 31 */ 32 struct GrGlyph { 33 typedef uint32_t PackedID; 34 35 GrAtlas* fAtlas; 36 GrPath* fPath; 37 PackedID fPackedID; 38 GrIRect16 fBounds; 39 GrIPoint16 fAtlasLocation; 40 41 void init(GrGlyph::PackedID packed, const GrIRect& bounds) { 42 fAtlas = NULL; 43 fPath = NULL; 44 fPackedID = packed; 45 fBounds.set(bounds); 46 fAtlasLocation.set(0, 0); 47 } 48 49 void free() { 50 if (fPath) { 51 delete fPath; 52 fPath = NULL; 53 } 54 } 55 56 int width() const { return fBounds.width(); } 57 int height() const { return fBounds.height(); } 58 bool isEmpty() const { return fBounds.isEmpty(); } 59 uint16_t glyphID() const { return UnpackID(fPackedID); } 60 61 /////////////////////////////////////////////////////////////////////////// 62 63 static inline unsigned ExtractSubPixelBitsFromFixed(GrFixed pos) { 64 // two most significant fraction bits from fixed-point 65 return (pos >> 14) & 3; 66 } 67 68 static inline PackedID Pack(uint16_t glyphID, GrFixed x, GrFixed y) { 69 x = ExtractSubPixelBitsFromFixed(x); 70 y = ExtractSubPixelBitsFromFixed(y); 71 return (x << 18) | (y << 16) | glyphID; 72 } 73 74 static inline GrFixed UnpackFixedX(PackedID packed) { 75 return ((packed >> 18) & 3) << 14; 76 } 77 78 static inline GrFixed UnpackFixedY(PackedID packed) { 79 return ((packed >> 16) & 3) << 14; 80 } 81 82 static inline uint16_t UnpackID(PackedID packed) { 83 return (uint16_t)packed; 84 } 85 }; 86 87 88 #endif 89 90