OLD | NEW |
1 /* | 1 /* |
2 * Copyright 2011 The Android Open Source Project | 2 * Copyright 2011 The Android Open Source Project |
3 * | 3 * |
4 * Use of this source code is governed by a BSD-style license that can be | 4 * Use of this source code is governed by a BSD-style license that can be |
5 * found in the LICENSE file. | 5 * found in the LICENSE file. |
6 */ | 6 */ |
7 | 7 |
8 #include "SkAdvancedTypefaceMetrics.h" | 8 #include "SkAdvancedTypefaceMetrics.h" |
9 #include "SkEndian.h" | 9 #include "SkEndian.h" |
10 #include "SkFontDescriptor.h" | 10 #include "SkFontDescriptor.h" |
(...skipping 260 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
271 if (os2table.version.v2.fsType.field.NoSubsetting) { | 271 if (os2table.version.v2.fsType.field.NoSubsetting) { |
272 result->fFlags = SkTBitOr<SkAdvancedTypefaceMetrics::FontFlags>( | 272 result->fFlags = SkTBitOr<SkAdvancedTypefaceMetrics::FontFlags>( |
273 result->fFlags, | 273 result->fFlags, |
274 SkAdvancedTypefaceMetrics::kNotSubsettable_FontFlag); | 274 SkAdvancedTypefaceMetrics::kNotSubsettable_FontFlag); |
275 } | 275 } |
276 } | 276 } |
277 } | 277 } |
278 return result; | 278 return result; |
279 } | 279 } |
280 | 280 |
281 /////////////////////////////////////////////////////////////////////////////// | |
282 | |
283 bool SkTypeface::onGetKerningPairAdjustments(const uint16_t glyphs[], int count, | 281 bool SkTypeface::onGetKerningPairAdjustments(const uint16_t glyphs[], int count, |
284 int32_t adjustments[]) const { | 282 int32_t adjustments[]) const { |
285 return false; | 283 return false; |
286 } | 284 } |
| 285 |
| 286 /////////////////////////////////////////////////////////////////////////////// |
| 287 |
| 288 #include "SkDescriptor.h" |
| 289 #include "SkPaint.h" |
| 290 |
| 291 struct SkTypeface::BoundsComputer { |
| 292 const SkTypeface& fTypeface; |
| 293 |
| 294 BoundsComputer(const SkTypeface& tf) : fTypeface(tf) {} |
| 295 |
| 296 SkRect* operator()() const { |
| 297 SkRect* rect = SkNEW(SkRect); |
| 298 if (!fTypeface.onComputeBounds(rect)) { |
| 299 rect->setEmpty(); |
| 300 } |
| 301 return rect; |
| 302 } |
| 303 }; |
| 304 |
| 305 SkRect SkTypeface::getBounds() const { |
| 306 return *fLazyBounds.get(BoundsComputer(*this)); |
| 307 } |
| 308 |
| 309 bool SkTypeface::onComputeBounds(SkRect* bounds) const { |
| 310 // we use a big size to ensure lots of significant bits from the scalerconte
xt. |
| 311 // then we scale back down to return our final answer (at 1-pt) |
| 312 const SkScalar textSize = 2048; |
| 313 const SkScalar invTextSize = 1 / textSize; |
| 314 |
| 315 SkPaint paint; |
| 316 paint.setTypeface(const_cast<SkTypeface*>(this)); |
| 317 paint.setTextSize(textSize); |
| 318 paint.setLinearText(true); |
| 319 |
| 320 SkScalerContext::Rec rec; |
| 321 SkScalerContext::MakeRec(paint, NULL, NULL, &rec); |
| 322 |
| 323 SkAutoDescriptor ad(sizeof(rec) + SkDescriptor::ComputeOverhead(1)); |
| 324 SkDescriptor* desc = ad.getDesc(); |
| 325 desc->init(); |
| 326 desc->addEntry(kRec_SkDescriptorTag, sizeof(rec), &rec); |
| 327 |
| 328 SkAutoTDelete<SkScalerContext> ctx(this->createScalerContext(desc, true)); |
| 329 if (ctx.get()) { |
| 330 SkPaint::FontMetrics fm; |
| 331 ctx->getFontMetrics(&fm); |
| 332 bounds->set(fm.fXMin * invTextSize, fm.fTop * invTextSize, |
| 333 fm.fXMax * invTextSize, fm.fBottom * invTextSize); |
| 334 return true; |
| 335 } |
| 336 return false; |
| 337 } |
| 338 |
OLD | NEW |