| OLD | NEW |
| 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 #ifndef SkTextureCompressor_Blitter_DEFINED | 8 #ifndef SkTextureCompressor_Blitter_DEFINED |
| 9 #define SkTextureCompressor_Blitter_DEFINED | 9 #define SkTextureCompressor_Blitter_DEFINED |
| 10 | 10 |
| (...skipping 67 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 78 , fHeight(height) | 78 , fHeight(height) |
| 79 , fBuffer(compressedBuffer) | 79 , fBuffer(compressedBuffer) |
| 80 { | 80 { |
| 81 SkASSERT((width % BlockDim) == 0); | 81 SkASSERT((width % BlockDim) == 0); |
| 82 SkASSERT((height % BlockDim) == 0); | 82 SkASSERT((height % BlockDim) == 0); |
| 83 } | 83 } |
| 84 | 84 |
| 85 virtual ~SkTCompressedAlphaBlitter() { this->flushRuns(); } | 85 virtual ~SkTCompressedAlphaBlitter() { this->flushRuns(); } |
| 86 | 86 |
| 87 // Blit a horizontal run of one or more pixels. | 87 // Blit a horizontal run of one or more pixels. |
| 88 virtual void blitH(int x, int y, int width) SK_OVERRIDE { | 88 void blitH(int x, int y, int width) SK_OVERRIDE { |
| 89 // This function is intended to be called from any standard RGB | 89 // This function is intended to be called from any standard RGB |
| 90 // buffer, so we should never encounter it. However, if some code | 90 // buffer, so we should never encounter it. However, if some code |
| 91 // path does end up here, then this needs to be investigated. | 91 // path does end up here, then this needs to be investigated. |
| 92 SkFAIL("Not implemented!"); | 92 SkFAIL("Not implemented!"); |
| 93 } | 93 } |
| 94 | 94 |
| 95 // Blit a horizontal run of antialiased pixels; runs[] is a *sparse* | 95 // Blit a horizontal run of antialiased pixels; runs[] is a *sparse* |
| 96 // zero-terminated run-length encoding of spans of constant alpha values. | 96 // zero-terminated run-length encoding of spans of constant alpha values. |
| 97 virtual void blitAntiH(int x, int y, | 97 virtual void blitAntiH(int x, int y, |
| 98 const SkAlpha antialias[], | 98 const SkAlpha antialias[], |
| (...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 134 fBufferedRuns[fNextRun].fY = y; | 134 fBufferedRuns[fNextRun].fY = y; |
| 135 | 135 |
| 136 // If we've output a block of scanlines in a row that don't violate our | 136 // If we've output a block of scanlines in a row that don't violate our |
| 137 // assumptions, then it's time to flush them... | 137 // assumptions, then it's time to flush them... |
| 138 if (BlockDim == ++fNextRun) { | 138 if (BlockDim == ++fNextRun) { |
| 139 this->flushRuns(); | 139 this->flushRuns(); |
| 140 } | 140 } |
| 141 } | 141 } |
| 142 | 142 |
| 143 // Blit a vertical run of pixels with a constant alpha value. | 143 // Blit a vertical run of pixels with a constant alpha value. |
| 144 virtual void blitV(int x, int y, int height, SkAlpha alpha) SK_OVERRIDE { | 144 void blitV(int x, int y, int height, SkAlpha alpha) SK_OVERRIDE { |
| 145 // This function is currently not implemented. It is not explicitly | 145 // This function is currently not implemented. It is not explicitly |
| 146 // required by the contract, but if at some time a code path runs into | 146 // required by the contract, but if at some time a code path runs into |
| 147 // this function (which is entirely possible), it needs to be implemente
d. | 147 // this function (which is entirely possible), it needs to be implemente
d. |
| 148 // | 148 // |
| 149 // TODO (krajcevski): | 149 // TODO (krajcevski): |
| 150 // This function will be most easily implemented in one of two ways: | 150 // This function will be most easily implemented in one of two ways: |
| 151 // 1. Buffer each vertical column value and then construct a list | 151 // 1. Buffer each vertical column value and then construct a list |
| 152 // of alpha values and output all of the blocks at once. This only | 152 // of alpha values and output all of the blocks at once. This only |
| 153 // requires a write to the compressed buffer | 153 // requires a write to the compressed buffer |
| 154 // 2. Replace the indices of each block with the proper indices based | 154 // 2. Replace the indices of each block with the proper indices based |
| 155 // on the alpha value. This requires a read and write of the compress
ed | 155 // on the alpha value. This requires a read and write of the compress
ed |
| 156 // buffer, but much less overhead. | 156 // buffer, but much less overhead. |
| 157 SkFAIL("Not implemented!"); | 157 SkFAIL("Not implemented!"); |
| 158 } | 158 } |
| 159 | 159 |
| 160 // Blit a solid rectangle one or more pixels wide. It's assumed that blitRec
t | 160 // Blit a solid rectangle one or more pixels wide. It's assumed that blitRec
t |
| 161 // is called as a way to bracket blitAntiH where above and below the path th
e | 161 // is called as a way to bracket blitAntiH where above and below the path th
e |
| 162 // called path just needs a solid rectangle to fill in the mask. | 162 // called path just needs a solid rectangle to fill in the mask. |
| 163 #ifdef SK_DEBUG | 163 #ifdef SK_DEBUG |
| 164 bool fCalledOnceWithNonzeroY; | 164 bool fCalledOnceWithNonzeroY; |
| 165 #endif | 165 #endif |
| 166 virtual void blitRect(int x, int y, int width, int height) SK_OVERRIDE { | 166 void blitRect(int x, int y, int width, int height) SK_OVERRIDE { |
| 167 | 167 |
| 168 // Assumptions: | 168 // Assumptions: |
| 169 SkASSERT(0 == x); | 169 SkASSERT(0 == x); |
| 170 SkASSERT(width <= fWidth); | 170 SkASSERT(width <= fWidth); |
| 171 | 171 |
| 172 // Make sure that we're only ever bracketing calls to blitAntiH. | 172 // Make sure that we're only ever bracketing calls to blitAntiH. |
| 173 SkASSERT((0 == y) || (!fCalledOnceWithNonzeroY && (fCalledOnceWithNonzer
oY = true))); | 173 SkASSERT((0 == y) || (!fCalledOnceWithNonzeroY && (fCalledOnceWithNonzer
oY = true))); |
| 174 | 174 |
| 175 #if !(PEDANTIC_BLIT_RECT) | 175 #if !(PEDANTIC_BLIT_RECT) |
| 176 for (int i = 0; i < height; ++i) { | 176 for (int i = 0; i < height; ++i) { |
| (...skipping 122 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 299 // Blit a pattern of pixels defined by a rectangle-clipped mask; We make an | 299 // Blit a pattern of pixels defined by a rectangle-clipped mask; We make an |
| 300 // assumption here that if this function gets called, then it will replace a
ll | 300 // assumption here that if this function gets called, then it will replace a
ll |
| 301 // of the compressed texture blocks that it touches. Hence, two separate cal
ls | 301 // of the compressed texture blocks that it touches. Hence, two separate cal
ls |
| 302 // to blitMask that have clips next to one another will cause artifacts. Mos
t | 302 // to blitMask that have clips next to one another will cause artifacts. Mos
t |
| 303 // of the time, however, this function gets called because constructing the
mask | 303 // of the time, however, this function gets called because constructing the
mask |
| 304 // was faster than constructing the RLE for blitAntiH, and this function wil
l | 304 // was faster than constructing the RLE for blitAntiH, and this function wil
l |
| 305 // only be called once. | 305 // only be called once. |
| 306 #ifdef SK_DEBUG | 306 #ifdef SK_DEBUG |
| 307 bool fBlitMaskCalled; | 307 bool fBlitMaskCalled; |
| 308 #endif | 308 #endif |
| 309 virtual void blitMask(const SkMask& mask, const SkIRect& clip) SK_OVERRIDE { | 309 void blitMask(const SkMask& mask, const SkIRect& clip) SK_OVERRIDE { |
| 310 | 310 |
| 311 // Assumptions: | 311 // Assumptions: |
| 312 SkASSERT(!fBlitMaskCalled); | 312 SkASSERT(!fBlitMaskCalled); |
| 313 SkDEBUGCODE(fBlitMaskCalled = true); | 313 SkDEBUGCODE(fBlitMaskCalled = true); |
| 314 SkASSERT(SkMask::kA8_Format == mask.fFormat); | 314 SkASSERT(SkMask::kA8_Format == mask.fFormat); |
| 315 SkASSERT(mask.fBounds.contains(clip)); | 315 SkASSERT(mask.fBounds.contains(clip)); |
| 316 | 316 |
| 317 // Start from largest block boundary less than the clip boundaries. | 317 // Start from largest block boundary less than the clip boundaries. |
| 318 const int startI = BlockDim * (clip.left() / BlockDim); | 318 const int startI = BlockDim * (clip.left() / BlockDim); |
| 319 const int startJ = BlockDim * (clip.top() / BlockDim); | 319 const int startJ = BlockDim * (clip.top() / BlockDim); |
| (...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 361 } | 361 } |
| 362 | 362 |
| 363 dst += EncodedBlockSize; | 363 dst += EncodedBlockSize; |
| 364 } | 364 } |
| 365 } | 365 } |
| 366 } | 366 } |
| 367 | 367 |
| 368 // If the blitter just sets a single value for each pixel, return the | 368 // If the blitter just sets a single value for each pixel, return the |
| 369 // bitmap it draws into, and assign value. If not, return NULL and ignore | 369 // bitmap it draws into, and assign value. If not, return NULL and ignore |
| 370 // the value parameter. | 370 // the value parameter. |
| 371 virtual const SkBitmap* justAnOpaqueColor(uint32_t* value) SK_OVERRIDE { | 371 const SkBitmap* justAnOpaqueColor(uint32_t* value) SK_OVERRIDE { |
| 372 return NULL; | 372 return NULL; |
| 373 } | 373 } |
| 374 | 374 |
| 375 /** | 375 /** |
| 376 * Compressed texture blitters only really work correctly if they get | 376 * Compressed texture blitters only really work correctly if they get |
| 377 * BlockDim rows at a time. That being said, this blitter tries it's best | 377 * BlockDim rows at a time. That being said, this blitter tries it's best |
| 378 * to preserve semantics if blitAntiH doesn't get called in too many | 378 * to preserve semantics if blitAntiH doesn't get called in too many |
| 379 * weird ways... | 379 * weird ways... |
| 380 */ | 380 */ |
| 381 virtual int requestRowsPreserved() const SK_OVERRIDE { return BlockDim; } | 381 int requestRowsPreserved() const SK_OVERRIDE { return BlockDim; } |
| 382 | 382 |
| 383 private: | 383 private: |
| 384 static const int kPixelsPerBlock = BlockDim * BlockDim; | 384 static const int kPixelsPerBlock = BlockDim * BlockDim; |
| 385 | 385 |
| 386 // The longest possible run of pixels that this blitter will receive. | 386 // The longest possible run of pixels that this blitter will receive. |
| 387 // This is initialized in the constructor to 0x7FFE, which is one less | 387 // This is initialized in the constructor to 0x7FFE, which is one less |
| 388 // than the largest positive 16-bit integer. We make sure that it's one | 388 // than the largest positive 16-bit integer. We make sure that it's one |
| 389 // less for debugging purposes. We also don't make this variable static | 389 // less for debugging purposes. We also don't make this variable static |
| 390 // in order to make sure that we can construct a valid pointer to it. | 390 // in order to make sure that we can construct a valid pointer to it. |
| 391 const int16_t kLongestRun; | 391 const int16_t kLongestRun; |
| (...skipping 332 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 724 mask, BlockDim, mask); | 724 mask, BlockDim, mask); |
| 725 } | 725 } |
| 726 } | 726 } |
| 727 #endif // PEDANTIC_BLIT_RECT | 727 #endif // PEDANTIC_BLIT_RECT |
| 728 | 728 |
| 729 }; | 729 }; |
| 730 | 730 |
| 731 } // namespace SkTextureCompressor | 731 } // namespace SkTextureCompressor |
| 732 | 732 |
| 733 #endif // SkTextureCompressor_Blitter_DEFINED | 733 #endif // SkTextureCompressor_Blitter_DEFINED |
| OLD | NEW |