Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 /* | 1 /* |
| 2 * Copyright 2015 Google Inc. | 2 * Copyright 2015 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 "SkLazyPtr.h" | 8 #include "SkLazyPtr.h" |
| 9 #include "SkPDFCanon.h" | 9 #include "SkPDFCanon.h" |
| 10 #include "SkPDFFont.h" | 10 #include "SkPDFFont.h" |
| (...skipping 19 matching lines...) Expand all Loading... | |
| 30 SkPDFCanon& SkPDFCanon::GetCanon() { return *singleton.get(); } | 30 SkPDFCanon& SkPDFCanon::GetCanon() { return *singleton.get(); } |
| 31 | 31 |
| 32 //////////////////////////////////////////////////////////////////////////////// | 32 //////////////////////////////////////////////////////////////////////////////// |
| 33 | 33 |
| 34 static void assert_mutex_held(const SkPDFCanon* canon, SkBaseMutex& mutex) { | 34 static void assert_mutex_held(const SkPDFCanon* canon, SkBaseMutex& mutex) { |
| 35 if (canon == singleton.get()) { | 35 if (canon == singleton.get()) { |
| 36 mutex.assertHeld(); | 36 mutex.assertHeld(); |
| 37 } | 37 } |
| 38 } | 38 } |
| 39 | 39 |
| 40 template <class T> T* assert_ptr(T* p) { SkASSERT(p); return p; } | |
| 41 | |
| 42 // TODO(halcanary): add this method to SkTDArray. | |
|
mtklein
2015/01/23 14:16:11
I'm on board with a ? at the end.
Generally I don
| |
| 43 template <typename T> | |
| 44 bool remove_item(SkTDArray<T>* array, const T& elem) { | |
| 45 int i = array->find(elem); | |
| 46 if (i >= 0) { | |
| 47 array->removeShuffle(i); | |
| 48 return true; | |
| 49 } | |
| 50 return false; | |
| 51 } | |
| 52 | |
| 53 // requires `bool T::equals(const U&) const` | |
| 54 template <typename T, typename U> | |
| 55 T* find_item(const SkTDArray<T*>& ptrArray, const U& object) { | |
|
mtklein
2015/01/23 14:16:11
consider object -> key ?
| |
| 56 for (int i = 0; i < ptrArray.count(); ++i) { | |
| 57 if (ptrArray[i]->equals(object)) { | |
| 58 return ptrArray[i]; | |
| 59 } | |
| 60 } | |
| 61 return NULL; | |
| 62 } | |
| 63 | |
| 64 //////////////////////////////////////////////////////////////////////////////// | |
| 65 | |
| 40 SkPDFFont* SkPDFCanon::findFont(uint32_t fontID, | 66 SkPDFFont* SkPDFCanon::findFont(uint32_t fontID, |
| 41 uint16_t glyphID, | 67 uint16_t glyphID, |
| 42 SkPDFFont** relatedFontPtr) const { | 68 SkPDFFont** relatedFontPtr) const { |
| 43 assert_mutex_held(this, gSkPDFCanonFontMutex); | 69 assert_mutex_held(this, gSkPDFCanonFontMutex); |
| 44 SkASSERT(relatedFontPtr); | 70 SkASSERT(relatedFontPtr); |
| 45 | 71 |
| 46 SkPDFFont* relatedFont = NULL; | 72 SkPDFFont* relatedFont = NULL; |
| 47 for (int i = 0; i < fFontRecords.count(); ++i) { | 73 for (int i = 0; i < fFontRecords.count(); ++i) { |
| 48 SkPDFFont::Match match = SkPDFFont::IsMatch( | 74 SkPDFFont::Match match = SkPDFFont::IsMatch( |
| 49 fFontRecords[i].fFont, fFontRecords[i].fFontID, | 75 fFontRecords[i].fFont, fFontRecords[i].fFontID, |
| (...skipping 22 matching lines...) Expand all Loading... | |
| 72 if (fFontRecords[i].fFont == pdfFont) { | 98 if (fFontRecords[i].fFont == pdfFont) { |
| 73 fFontRecords.removeShuffle(i); | 99 fFontRecords.removeShuffle(i); |
| 74 return; | 100 return; |
| 75 } | 101 } |
| 76 } | 102 } |
| 77 // Not all SkPDFFonts are added to the Canon. | 103 // Not all SkPDFFonts are added to the Canon. |
| 78 } | 104 } |
| 79 | 105 |
| 80 //////////////////////////////////////////////////////////////////////////////// | 106 //////////////////////////////////////////////////////////////////////////////// |
| 81 | 107 |
| 82 SkPDFShader* SkPDFCanon::findShader(const SkPDFShader::State& state) const { | 108 SkPDFFunctionShader* SkPDFCanon::findFunctionShader( |
| 109 const SkPDFShader::State& state) const { | |
| 83 assert_mutex_held(this, gSkPDFCanonShaderMutex); | 110 assert_mutex_held(this, gSkPDFCanonShaderMutex); |
| 84 for (int i = 0; i < fShaderRecords.count(); ++i) { | 111 return find_item(fFunctionShaderRecords, state); |
| 85 if (fShaderRecords[i]->equals(state)) { | 112 } |
| 86 return fShaderRecords[i]; | 113 void SkPDFCanon::addFunctionShader(SkPDFFunctionShader* pdfShader) { |
| 87 } | 114 assert_mutex_held(this, gSkPDFCanonShaderMutex); |
| 88 } | 115 fFunctionShaderRecords.push(assert_ptr(pdfShader)); |
| 89 return NULL; | 116 } |
| 117 void SkPDFCanon::removeFunctionShader(SkPDFFunctionShader* pdfShader) { | |
| 118 assert_mutex_held(this, gSkPDFCanonShaderMutex); | |
| 119 SkAssertResult(remove_item(&fFunctionShaderRecords, pdfShader)); | |
| 90 } | 120 } |
| 91 | 121 |
| 92 void SkPDFCanon::addShader(SkPDFShader* shader) { | 122 //////////////////////////////////////////////////////////////////////////////// |
| 123 | |
| 124 SkPDFAlphaFunctionShader* SkPDFCanon::findAlphaShader( | |
| 125 const SkPDFShader::State& state) const { | |
| 93 assert_mutex_held(this, gSkPDFCanonShaderMutex); | 126 assert_mutex_held(this, gSkPDFCanonShaderMutex); |
| 94 SkASSERT(shader); | 127 return find_item(fAlphaShaderRecords, state); |
| 95 fShaderRecords.push(shader); | 128 } |
| 129 void SkPDFCanon::addAlphaShader(SkPDFAlphaFunctionShader* pdfShader) { | |
| 130 assert_mutex_held(this, gSkPDFCanonShaderMutex); | |
| 131 fAlphaShaderRecords.push(assert_ptr(pdfShader)); | |
| 132 } | |
| 133 void SkPDFCanon::removeAlphaShader(SkPDFAlphaFunctionShader* pdfShader) { | |
| 134 assert_mutex_held(this, gSkPDFCanonShaderMutex); | |
| 135 SkAssertResult(remove_item(&fAlphaShaderRecords, pdfShader)); | |
| 96 } | 136 } |
| 97 | 137 |
| 98 void SkPDFCanon::removeShader(SkPDFShader* pdfShader) { | 138 //////////////////////////////////////////////////////////////////////////////// |
| 139 | |
| 140 SkPDFImageShader* SkPDFCanon::findImageShader( | |
| 141 const SkPDFShader::State& state) const { | |
| 99 assert_mutex_held(this, gSkPDFCanonShaderMutex); | 142 assert_mutex_held(this, gSkPDFCanonShaderMutex); |
| 100 for (int i = 0; i < fShaderRecords.count(); ++i) { | 143 return find_item(fImageShaderRecords, state); |
| 101 if (fShaderRecords[i] == pdfShader) { | 144 } |
| 102 fShaderRecords.removeShuffle(i); | 145 |
| 103 return; | 146 void SkPDFCanon::addImageShader(SkPDFImageShader* pdfShader) { |
| 104 } | 147 assert_mutex_held(this, gSkPDFCanonShaderMutex); |
| 105 } | 148 fImageShaderRecords.push(assert_ptr(pdfShader)); |
| 106 SkDEBUGFAIL("pdfShader not found"); | 149 } |
| 150 | |
| 151 void SkPDFCanon::removeImageShader(SkPDFImageShader* pdfShader) { | |
| 152 assert_mutex_held(this, gSkPDFCanonShaderMutex); | |
| 153 SkAssertResult(remove_item(&fImageShaderRecords, pdfShader)); | |
| 107 } | 154 } |
| 108 | 155 |
| 109 //////////////////////////////////////////////////////////////////////////////// | 156 //////////////////////////////////////////////////////////////////////////////// |
| 110 | 157 |
| 111 SkPDFGraphicState* SkPDFCanon::findGraphicState(const SkPaint& paint) const { | 158 SkPDFGraphicState* SkPDFCanon::findGraphicState(const SkPaint& paint) const { |
| 112 assert_mutex_held(this, gSkPDFCanonPaintMutex); | 159 assert_mutex_held(this, gSkPDFCanonPaintMutex); |
| 113 for (int i = 0; i < fGraphicStateRecords.count(); ++i) { | 160 return find_item(fGraphicStateRecords, paint); |
| 114 if (fGraphicStateRecords[i]->equals(paint)) { | |
| 115 return fGraphicStateRecords[i]; | |
| 116 } | |
| 117 } | |
| 118 return NULL; | |
| 119 } | 161 } |
| 120 | 162 |
| 121 void SkPDFCanon::addGraphicState(SkPDFGraphicState* state) { | 163 void SkPDFCanon::addGraphicState(SkPDFGraphicState* state) { |
| 122 assert_mutex_held(this, gSkPDFCanonPaintMutex); | 164 assert_mutex_held(this, gSkPDFCanonPaintMutex); |
| 123 SkASSERT(state); | 165 fGraphicStateRecords.push(assert_ptr(state)); |
| 124 fGraphicStateRecords.push(state); | |
| 125 } | 166 } |
| 126 | 167 |
| 127 void SkPDFCanon::removeGraphicState(SkPDFGraphicState* pdfGraphicState) { | 168 void SkPDFCanon::removeGraphicState(SkPDFGraphicState* pdfGraphicState) { |
| 128 assert_mutex_held(this, gSkPDFCanonPaintMutex); | 169 assert_mutex_held(this, gSkPDFCanonPaintMutex); |
| 129 for (int i = 0; i < fGraphicStateRecords.count(); ++i) { | 170 SkAssertResult(remove_item(&fGraphicStateRecords, pdfGraphicState)); |
| 130 if (fGraphicStateRecords[i] == pdfGraphicState) { | |
| 131 fGraphicStateRecords.removeShuffle(i); | |
| 132 return; | |
| 133 } | |
| 134 } | |
| 135 SkDEBUGFAIL("pdfGraphicState not found"); | |
| 136 } | 171 } |
| OLD | NEW |