| OLD | NEW |
| 1 | 1 |
| 2 /* | 2 /* |
| 3 * Copyright 2011 Google Inc. | 3 * Copyright 2011 Google Inc. |
| 4 * | 4 * |
| 5 * Use of this source code is governed by a BSD-style license that can be | 5 * Use of this source code is governed by a BSD-style license that can be |
| 6 * found in the LICENSE file. | 6 * found in the LICENSE file. |
| 7 */ | 7 */ |
| 8 #include "SkBitmap.h" | 8 #include "SkBitmap.h" |
| 9 #include "SkRegion.h" | 9 #include "SkRegion.h" |
| 10 | 10 |
| 11 bool SkBitmap::scrollRect(const SkIRect* subset, int dx, int dy, | 11 bool SkBitmap::scrollRect(const SkIRect* subset, int dx, int dy, |
| 12 SkRegion* inval) const | 12 SkRegion* inval) const |
| 13 { | 13 { |
| 14 if (this->isImmutable()) { | 14 if (this->isImmutable() || kUnknown_SkColorType == this->colorType()) { |
| 15 return false; | 15 return false; |
| 16 } | 16 } |
| 17 | 17 |
| 18 if (NULL != subset) { | 18 if (NULL != subset) { |
| 19 SkBitmap tmp; | 19 SkBitmap tmp; |
| 20 | 20 |
| 21 return this->extractSubset(&tmp, *subset) && | 21 return this->extractSubset(&tmp, *subset) && |
| 22 // now call again with no rectangle | 22 // now call again with no rectangle |
| 23 tmp.scrollRect(NULL, dx, dy, inval); | 23 tmp.scrollRect(NULL, dx, dy, inval); |
| 24 } | 24 } |
| 25 | 25 |
| 26 int shift; | 26 int shift = this->bytesPerPixel() >> 1; |
| 27 | |
| 28 switch (this->config()) { | |
| 29 case kIndex8_Config: | |
| 30 case kA8_Config: | |
| 31 shift = 0; | |
| 32 break; | |
| 33 case kARGB_4444_Config: | |
| 34 case kRGB_565_Config: | |
| 35 shift = 1; | |
| 36 break; | |
| 37 case kARGB_8888_Config: | |
| 38 shift = 2; | |
| 39 break; | |
| 40 default: | |
| 41 // can't scroll this config | |
| 42 return false; | |
| 43 } | |
| 44 | |
| 45 int width = this->width(); | 27 int width = this->width(); |
| 46 int height = this->height(); | 28 int height = this->height(); |
| 47 | 29 |
| 48 // check if there's nothing to do | 30 // check if there's nothing to do |
| 49 if ((dx | dy) == 0 || width <= 0 || height <= 0) { | 31 if ((dx | dy) == 0 || width <= 0 || height <= 0) { |
| 50 if (NULL != inval) { | 32 if (NULL != inval) { |
| 51 inval->setEmpty(); | 33 inval->setEmpty(); |
| 52 } | 34 } |
| 53 return true; | 35 return true; |
| 54 } | 36 } |
| (...skipping 59 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 114 width <<= shift; // now width is the number of bytes to move per line | 96 width <<= shift; // now width is the number of bytes to move per line |
| 115 while (--height >= 0) { | 97 while (--height >= 0) { |
| 116 memmove(dst, src, width); | 98 memmove(dst, src, width); |
| 117 dst += rowBytes; | 99 dst += rowBytes; |
| 118 src += rowBytes; | 100 src += rowBytes; |
| 119 } | 101 } |
| 120 | 102 |
| 121 this->notifyPixelsChanged(); | 103 this->notifyPixelsChanged(); |
| 122 return true; | 104 return true; |
| 123 } | 105 } |
| OLD | NEW |