OLD | NEW |
1 /* | 1 /* |
2 * Copyright 2006 The Android Open Source Project | 2 * Copyright 2006 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 #define __STDC_LIMIT_MACROS | 7 #define __STDC_LIMIT_MACROS |
8 | 8 |
9 #include "SkDraw.h" | 9 #include "SkDraw.h" |
10 #include "SkBlitter.h" | 10 #include "SkBlitter.h" |
(...skipping 1138 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1149 } | 1149 } |
1150 | 1150 |
1151 void SkDraw::drawBitmapAsMask(const SkBitmap& bitmap, | 1151 void SkDraw::drawBitmapAsMask(const SkBitmap& bitmap, |
1152 const SkPaint& paint) const { | 1152 const SkPaint& paint) const { |
1153 SkASSERT(bitmap.colorType() == kAlpha_8_SkColorType); | 1153 SkASSERT(bitmap.colorType() == kAlpha_8_SkColorType); |
1154 | 1154 |
1155 if (just_translate(*fMatrix, bitmap)) { | 1155 if (just_translate(*fMatrix, bitmap)) { |
1156 int ix = SkScalarRoundToInt(fMatrix->getTranslateX()); | 1156 int ix = SkScalarRoundToInt(fMatrix->getTranslateX()); |
1157 int iy = SkScalarRoundToInt(fMatrix->getTranslateY()); | 1157 int iy = SkScalarRoundToInt(fMatrix->getTranslateY()); |
1158 | 1158 |
1159 SkAutoLockPixels alp(bitmap); | 1159 SkAutoPixmapUnlock result; |
1160 if (!bitmap.readyToDraw()) { | 1160 if (!bitmap.requestLock(&result)) { |
1161 return; | 1161 return; |
1162 } | 1162 } |
1163 | 1163 const SkPixmap& pmap = result.pixmap(); |
1164 SkMask mask; | 1164 SkMask mask; |
1165 mask.fBounds.set(ix, iy, ix + bitmap.width(), iy + bitmap.height()); | 1165 mask.fBounds.set(ix, iy, ix + pmap.width(), iy + pmap.height()); |
1166 mask.fFormat = SkMask::kA8_Format; | 1166 mask.fFormat = SkMask::kA8_Format; |
1167 mask.fRowBytes = SkToU32(bitmap.rowBytes()); | 1167 mask.fRowBytes = SkToU32(pmap.rowBytes()); |
1168 mask.fImage = bitmap.getAddr8(0, 0); | 1168 // fImage is typed as writable, but in this case it is used read-only |
| 1169 mask.fImage = (uint8_t*)pmap.addr8(0, 0); |
1169 | 1170 |
1170 this->drawDevMask(mask, paint); | 1171 this->drawDevMask(mask, paint); |
1171 } else { // need to xform the bitmap first | 1172 } else { // need to xform the bitmap first |
1172 SkRect r; | 1173 SkRect r; |
1173 SkMask mask; | 1174 SkMask mask; |
1174 | 1175 |
1175 r.set(0, 0, | 1176 r.set(0, 0, |
1176 SkIntToScalar(bitmap.width()), SkIntToScalar(bitmap.height())); | 1177 SkIntToScalar(bitmap.width()), SkIntToScalar(bitmap.height())); |
1177 fMatrix->mapRect(&r); | 1178 fMatrix->mapRect(&r); |
1178 r.round(&mask.fBounds); | 1179 r.round(&mask.fBounds); |
(...skipping 1088 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2267 mask->fImage = SkMask::AllocImage(size); | 2268 mask->fImage = SkMask::AllocImage(size); |
2268 memset(mask->fImage, 0, mask->computeImageSize()); | 2269 memset(mask->fImage, 0, mask->computeImageSize()); |
2269 } | 2270 } |
2270 | 2271 |
2271 if (SkMask::kJustComputeBounds_CreateMode != mode) { | 2272 if (SkMask::kJustComputeBounds_CreateMode != mode) { |
2272 draw_into_mask(*mask, devPath, style); | 2273 draw_into_mask(*mask, devPath, style); |
2273 } | 2274 } |
2274 | 2275 |
2275 return true; | 2276 return true; |
2276 } | 2277 } |
OLD | NEW |