Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(619)

Side by Side Diff: src/ports/SkFontMgr_fontconfig.cpp

Issue 2343933002: Revert of SkFontData to use smart pointers. (Closed)
Patch Set: Created 4 years, 3 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « src/ports/SkFontMgr_custom.cpp ('k') | src/ports/SkFontMgr_win_dw.cpp » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 /* 1 /*
2 * Copyright 2014 Google Inc. 2 * Copyright 2014 Google Inc.
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 "SkDataTable.h" 9 #include "SkDataTable.h"
10 #include "SkFixed.h" 10 #include "SkFixed.h"
11 #include "SkFontDescriptor.h" 11 #include "SkFontDescriptor.h"
12 #include "SkFontHost_FreeType_common.h" 12 #include "SkFontHost_FreeType_common.h"
13 #include "SkFontMgr.h" 13 #include "SkFontMgr.h"
14 #include "SkFontStyle.h" 14 #include "SkFontStyle.h"
15 #include "SkMakeUnique.h"
16 #include "SkMath.h" 15 #include "SkMath.h"
17 #include "SkMutex.h" 16 #include "SkMutex.h"
18 #include "SkOSFile.h" 17 #include "SkOSFile.h"
19 #include "SkRefCnt.h" 18 #include "SkRefCnt.h"
20 #include "SkStream.h" 19 #include "SkStream.h"
21 #include "SkString.h" 20 #include "SkString.h"
22 #include "SkTDArray.h" 21 #include "SkTDArray.h"
23 #include "SkTemplates.h" 22 #include "SkTemplates.h"
24 #include "SkTypeface.h" 23 #include "SkTypeface.h"
25 #include "SkTypefaceCache.h" 24 #include "SkTypefaceCache.h"
(...skipping 373 matching lines...) Expand 10 before | Expand all | Expand 10 after
399 } 398 }
400 399
401 FcPatternAddInteger(pattern, FC_WEIGHT, weight); 400 FcPatternAddInteger(pattern, FC_WEIGHT, weight);
402 FcPatternAddInteger(pattern, FC_WIDTH , width); 401 FcPatternAddInteger(pattern, FC_WIDTH , width);
403 FcPatternAddInteger(pattern, FC_SLANT , slant); 402 FcPatternAddInteger(pattern, FC_SLANT , slant);
404 } 403 }
405 404
406 class SkTypeface_stream : public SkTypeface_FreeType { 405 class SkTypeface_stream : public SkTypeface_FreeType {
407 public: 406 public:
408 /** @param data takes ownership of the font data.*/ 407 /** @param data takes ownership of the font data.*/
409 SkTypeface_stream(std::unique_ptr<SkFontData> data, const SkFontStyle& style , bool fixedWidth) 408 SkTypeface_stream(SkFontData* data, const SkFontStyle& style, bool fixedWidt h)
410 : INHERITED(style, fixedWidth) 409 : INHERITED(style, fixedWidth)
411 , fData(std::move(data)) 410 , fData(data)
412 { }; 411 { };
413 412
414 void onGetFamilyName(SkString* familyName) const override { 413 void onGetFamilyName(SkString* familyName) const override {
415 familyName->reset(); 414 familyName->reset();
416 } 415 }
417 416
418 void onGetFontDescriptor(SkFontDescriptor* desc, bool* serialize) const over ride { 417 void onGetFontDescriptor(SkFontDescriptor* desc, bool* serialize) const over ride {
419 *serialize = true; 418 *serialize = true;
420 } 419 }
421 420
422 SkStreamAsset* onOpenStream(int* ttcIndex) const override { 421 SkStreamAsset* onOpenStream(int* ttcIndex) const override {
423 *ttcIndex = fData->getIndex(); 422 *ttcIndex = fData->getIndex();
424 return fData->getStream()->duplicate(); 423 return fData->duplicateStream();
425 } 424 }
426 425
427 std::unique_ptr<SkFontData> onMakeFontData() const override { 426 SkFontData* onCreateFontData() const override {
428 return skstd::make_unique<SkFontData>(*fData); 427 return new SkFontData(*fData.get());
429 } 428 }
430 429
431 private: 430 private:
432 const std::unique_ptr<const SkFontData> fData; 431 const SkAutoTDelete<const SkFontData> fData;
433 432
434 typedef SkTypeface_FreeType INHERITED; 433 typedef SkTypeface_FreeType INHERITED;
435 }; 434 };
436 435
437 class SkTypeface_fontconfig : public SkTypeface_FreeType { 436 class SkTypeface_fontconfig : public SkTypeface_FreeType {
438 public: 437 public:
439 /** @param pattern takes ownership of the reference. */ 438 /** @param pattern takes ownership of the reference. */
440 static SkTypeface_fontconfig* Create(FcPattern* pattern) { 439 static SkTypeface_fontconfig* Create(FcPattern* pattern) {
441 return new SkTypeface_fontconfig(pattern); 440 return new SkTypeface_fontconfig(pattern);
442 } 441 }
443 mutable SkAutoFcPattern fPattern; 442 mutable SkAutoFcPattern fPattern;
444 443
445 void onGetFamilyName(SkString* familyName) const override { 444 void onGetFamilyName(SkString* familyName) const override {
446 *familyName = get_string(fPattern, FC_FAMILY); 445 *familyName = get_string(fPattern, FC_FAMILY);
447 } 446 }
448 447
449 void onGetFontDescriptor(SkFontDescriptor* desc, bool* serialize) const over ride { 448 void onGetFontDescriptor(SkFontDescriptor* desc, bool* serialize) const over ride {
450 FCLocker lock; 449 FCLocker lock;
451 desc->setFamilyName(get_string(fPattern, FC_FAMILY)); 450 desc->setFamilyName(get_string(fPattern, FC_FAMILY));
452 desc->setFullName(get_string(fPattern, FC_FULLNAME)); 451 desc->setFullName(get_string(fPattern, FC_FULLNAME));
453 desc->setPostscriptName(get_string(fPattern, FC_POSTSCRIPT_NAME)); 452 desc->setPostscriptName(get_string(fPattern, FC_POSTSCRIPT_NAME));
454 desc->setStyle(this->fontStyle()); 453 desc->setStyle(this->fontStyle());
455 *serialize = false; 454 *serialize = false;
456 } 455 }
457 456
458 SkStreamAsset* onOpenStream(int* ttcIndex) const override { 457 SkStreamAsset* onOpenStream(int* ttcIndex) const override {
459 FCLocker lock; 458 FCLocker lock;
460 *ttcIndex = get_int(fPattern, FC_INDEX, 0); 459 *ttcIndex = get_int(fPattern, FC_INDEX, 0);
461 return SkStream::MakeFromFile(get_string(fPattern, FC_FILE)).release(); 460 return SkStream::NewFromFile(get_string(fPattern, FC_FILE));
462 } 461 }
463 462
464 void onFilterRec(SkScalerContextRec* rec) const override { 463 void onFilterRec(SkScalerContextRec* rec) const override {
465 const FcMatrix* fcMatrix = get_matrix(fPattern, FC_MATRIX); 464 const FcMatrix* fcMatrix = get_matrix(fPattern, FC_MATRIX);
466 if (fcMatrix) { 465 if (fcMatrix) {
467 // fPost2x2 is column-major, left handed (y down). 466 // fPost2x2 is column-major, left handed (y down).
468 // FcMatrix is column-major, right handed (y up). 467 // FcMatrix is column-major, right handed (y up).
469 SkMatrix fm; 468 SkMatrix fm;
470 fm.setAll(fcMatrix->xx,-fcMatrix->xy, 0, 469 fm.setAll(fcMatrix->xx,-fcMatrix->xy, 0,
471 -fcMatrix->yx, fcMatrix->yy, 0, 470 -fcMatrix->yx, fcMatrix->yy, 0,
(...skipping 400 matching lines...) Expand 10 before | Expand all | Expand 10 after
872 virtual SkTypeface* onMatchFaceStyle(const SkTypeface* typeface, 871 virtual SkTypeface* onMatchFaceStyle(const SkTypeface* typeface,
873 const SkFontStyle& style) const overrid e 872 const SkFontStyle& style) const overrid e
874 { 873 {
875 //TODO: should the SkTypeface_fontconfig know its family? 874 //TODO: should the SkTypeface_fontconfig know its family?
876 const SkTypeface_fontconfig* fcTypeface = 875 const SkTypeface_fontconfig* fcTypeface =
877 static_cast<const SkTypeface_fontconfig*>(typeface); 876 static_cast<const SkTypeface_fontconfig*>(typeface);
878 return this->matchFamilyStyle(get_string(fcTypeface->fPattern, FC_FAMILY ), style); 877 return this->matchFamilyStyle(get_string(fcTypeface->fPattern, FC_FAMILY ), style);
879 } 878 }
880 879
881 SkTypeface* onCreateFromStream(SkStreamAsset* bareStream, int ttcIndex) cons t override { 880 SkTypeface* onCreateFromStream(SkStreamAsset* bareStream, int ttcIndex) cons t override {
882 std::unique_ptr<SkStreamAsset> stream(bareStream); 881 SkAutoTDelete<SkStreamAsset> stream(bareStream);
883 const size_t length = stream->getLength(); 882 const size_t length = stream->getLength();
884 if (length <= 0 || (1u << 30) < length) { 883 if (length <= 0 || (1u << 30) < length) {
885 return nullptr; 884 return nullptr;
886 } 885 }
887 886
888 SkFontStyle style; 887 SkFontStyle style;
889 bool isFixedWidth = false; 888 bool isFixedWidth = false;
890 if (!fScanner.scanFont(stream.get(), ttcIndex, nullptr, &style, &isFixed Width, nullptr)) { 889 if (!fScanner.scanFont(stream, ttcIndex, nullptr, &style, &isFixedWidth, nullptr)) {
891 return nullptr; 890 return nullptr;
892 } 891 }
893 892
894 auto data = skstd::make_unique<SkFontData>(std::move(stream), ttcIndex, nullptr, 0); 893 return new SkTypeface_stream(new SkFontData(stream.release(), ttcIndex, nullptr, 0), style,
895 return new SkTypeface_stream(std::move(data), style, isFixedWidth); 894 isFixedWidth);
896 } 895 }
897 896
898 SkTypeface* onCreateFromStream(SkStreamAsset* s, const FontParameters& param s) const override { 897 SkTypeface* onCreateFromStream(SkStreamAsset* s, const FontParameters& param s) const override {
899 using Scanner = SkTypeface_FreeType::Scanner; 898 using Scanner = SkTypeface_FreeType::Scanner;
900 std::unique_ptr<SkStreamAsset> stream(s); 899 SkAutoTDelete<SkStreamAsset> stream(s);
901 bool isFixedPitch; 900 bool isFixedPitch;
902 SkFontStyle style; 901 SkFontStyle style;
903 SkString name; 902 SkString name;
904 Scanner::AxisDefinitions axisDefinitions; 903 Scanner::AxisDefinitions axisDefinitions;
905 if (!fScanner.scanFont(stream.get(), params.getCollectionIndex(), 904 if (!fScanner.scanFont(stream, params.getCollectionIndex(), &name, &styl e, &isFixedPitch,
906 &name, &style, &isFixedPitch, &axisDefinitions)) 905 &axisDefinitions))
907 { 906 {
908 return nullptr; 907 return nullptr;
909 } 908 }
910 909
911 int paramAxisCount; 910 int paramAxisCount;
912 const FontParameters::Axis* paramAxes = params.getAxes(&paramAxisCount); 911 const FontParameters::Axis* paramAxes = params.getAxes(&paramAxisCount);
913 SkAutoSTMalloc<4, SkFixed> axisValues(axisDefinitions.count()); 912 SkAutoSTMalloc<4, SkFixed> axisValues(axisDefinitions.count());
914 Scanner::computeAxisValues(axisDefinitions, paramAxes, paramAxisCount, a xisValues, name); 913 Scanner::computeAxisValues(axisDefinitions, paramAxes, paramAxisCount, a xisValues, name);
915 914
916 auto data = skstd::make_unique<SkFontData>(std::move(stream), params.get CollectionIndex(), 915 SkFontData* data(new SkFontData(stream.release(), params.getCollectionIn dex(),
917 axisValues.get(), axisDefinit ions.count()); 916 axisValues.get(), axisDefinitions.count( )));
918 return new SkTypeface_stream(std::move(data), style, isFixedPitch); 917 return new SkTypeface_stream(data, style, isFixedPitch);
919 } 918 }
920 919
921 SkTypeface* onCreateFromData(SkData* data, int ttcIndex) const override { 920 SkTypeface* onCreateFromData(SkData* data, int ttcIndex) const override {
922 return this->createFromStream(new SkMemoryStream(sk_ref_sp(data)), ttcIn dex); 921 return this->createFromStream(new SkMemoryStream(sk_ref_sp(data)), ttcIn dex);
923 } 922 }
924 923
925 SkTypeface* onCreateFromFile(const char path[], int ttcIndex) const override { 924 SkTypeface* onCreateFromFile(const char path[], int ttcIndex) const override {
926 return this->createFromStream(SkStream::MakeFromFile(path).release(), tt cIndex); 925 return this->createFromStream(SkStream::NewFromFile(path), ttcIndex);
927 } 926 }
928 927
929 SkTypeface* onCreateFromFontData(std::unique_ptr<SkFontData> fontData) const override { 928 SkTypeface* onCreateFromFontData(SkFontData* fontData) const override {
930 SkStreamAsset* stream(fontData->getStream()); 929 SkStreamAsset* stream(fontData->getStream());
931 const size_t length = stream->getLength(); 930 const size_t length = stream->getLength();
932 if (length <= 0 || (1u << 30) < length) { 931 if (length <= 0 || (1u << 30) < length) {
933 return nullptr; 932 return nullptr;
934 } 933 }
935 934
936 const int ttcIndex = fontData->getIndex(); 935 const int ttcIndex = fontData->getIndex();
937 SkFontStyle style; 936 SkFontStyle style;
938 bool isFixedWidth = false; 937 bool isFixedWidth = false;
939 if (!fScanner.scanFont(stream, ttcIndex, nullptr, &style, &isFixedWidth, nullptr)) { 938 if (!fScanner.scanFont(stream, ttcIndex, nullptr, &style, &isFixedWidth, nullptr)) {
940 return nullptr; 939 return nullptr;
941 } 940 }
942 941
943 return new SkTypeface_stream(std::move(fontData), style, isFixedWidth); 942 return new SkTypeface_stream(fontData, style, isFixedWidth);
944 } 943 }
945 944
946 SkTypeface* onLegacyCreateTypeface(const char familyName[], SkFontStyle styl e) const override { 945 SkTypeface* onLegacyCreateTypeface(const char familyName[], SkFontStyle styl e) const override {
947 SkAutoTUnref<SkTypeface> typeface(this->matchFamilyStyle(familyName, sty le)); 946 SkAutoTUnref<SkTypeface> typeface(this->matchFamilyStyle(familyName, sty le));
948 if (typeface.get()) { 947 if (typeface.get()) {
949 return typeface.release(); 948 return typeface.release();
950 } 949 }
951 950
952 return this->matchFamilyStyle(nullptr, style); 951 return this->matchFamilyStyle(nullptr, style);
953 } 952 }
954 }; 953 };
955 954
956 SK_API SkFontMgr* SkFontMgr_New_FontConfig(FcConfig* fc) { 955 SK_API SkFontMgr* SkFontMgr_New_FontConfig(FcConfig* fc) {
957 return new SkFontMgr_fontconfig(fc); 956 return new SkFontMgr_fontconfig(fc);
958 } 957 }
OLDNEW
« no previous file with comments | « src/ports/SkFontMgr_custom.cpp ('k') | src/ports/SkFontMgr_win_dw.cpp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698