| 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 1154 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1165 SkDEBUGFAIL("unknown paint cap type"); | 1165 SkDEBUGFAIL("unknown paint cap type"); |
| 1166 } | 1166 } |
| 1167 #ifdef SK_SUPPORT_LEGACY_HAIR_IGNORES_CAPS | 1167 #ifdef SK_SUPPORT_LEGACY_HAIR_IGNORES_CAPS |
| 1168 proc = SkScan::HairPath; | 1168 proc = SkScan::HairPath; |
| 1169 #endif | 1169 #endif |
| 1170 } | 1170 } |
| 1171 } | 1171 } |
| 1172 proc(*devPathPtr, *fRC, blitter); | 1172 proc(*devPathPtr, *fRC, blitter); |
| 1173 } | 1173 } |
| 1174 | 1174 |
| 1175 /** For the purposes of drawing bitmaps, if a matrix is "almost" translate |
| 1176 go ahead and treat it as if it were, so that subsequent code can go fast. |
| 1177 */ |
| 1178 static bool just_translate(const SkMatrix& matrix, const SkBitmap& bitmap) { |
| 1179 unsigned bits = 0; // TODO: find a way to allow the caller to tell us to |
| 1180 // respect filtering. |
| 1181 return SkTreatAsSprite(matrix, bitmap.width(), bitmap.height(), bits); |
| 1182 } |
| 1183 |
| 1175 void SkDraw::drawBitmapAsMask(const SkBitmap& bitmap, | 1184 void SkDraw::drawBitmapAsMask(const SkBitmap& bitmap, |
| 1176 const SkPaint& paint) const { | 1185 const SkPaint& paint) const { |
| 1177 SkASSERT(bitmap.colorType() == kAlpha_8_SkColorType); | 1186 SkASSERT(bitmap.colorType() == kAlpha_8_SkColorType); |
| 1178 | 1187 |
| 1179 if (SkTreatAsSprite(*fMatrix, bitmap.dimensions(), paint)) { | 1188 if (just_translate(*fMatrix, bitmap)) { |
| 1180 int ix = SkScalarRoundToInt(fMatrix->getTranslateX()); | 1189 int ix = SkScalarRoundToInt(fMatrix->getTranslateX()); |
| 1181 int iy = SkScalarRoundToInt(fMatrix->getTranslateY()); | 1190 int iy = SkScalarRoundToInt(fMatrix->getTranslateY()); |
| 1182 | 1191 |
| 1183 SkAutoPixmapUnlock result; | 1192 SkAutoPixmapUnlock result; |
| 1184 if (!bitmap.requestLock(&result)) { | 1193 if (!bitmap.requestLock(&result)) { |
| 1185 return; | 1194 return; |
| 1186 } | 1195 } |
| 1187 const SkPixmap& pmap = result.pixmap(); | 1196 const SkPixmap& pmap = result.pixmap(); |
| 1188 SkMask mask; | 1197 SkMask mask; |
| 1189 mask.fBounds.set(ix, iy, ix + pmap.width(), iy + pmap.height()); | 1198 mask.fBounds.set(ix, iy, ix + pmap.width(), iy + pmap.height()); |
| (...skipping 94 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1284 SkPaint paint(origPaint); | 1293 SkPaint paint(origPaint); |
| 1285 paint.setStyle(SkPaint::kFill_Style); | 1294 paint.setStyle(SkPaint::kFill_Style); |
| 1286 | 1295 |
| 1287 SkMatrix matrix; | 1296 SkMatrix matrix; |
| 1288 matrix.setConcat(*fMatrix, prematrix); | 1297 matrix.setConcat(*fMatrix, prematrix); |
| 1289 | 1298 |
| 1290 if (clipped_out(matrix, *fRC, bitmap.width(), bitmap.height())) { | 1299 if (clipped_out(matrix, *fRC, bitmap.width(), bitmap.height())) { |
| 1291 return; | 1300 return; |
| 1292 } | 1301 } |
| 1293 | 1302 |
| 1294 if (bitmap.colorType() != kAlpha_8_SkColorType | 1303 if (bitmap.colorType() != kAlpha_8_SkColorType && just_translate(matrix, bit
map)) { |
| 1295 && SkTreatAsSprite(matrix, bitmap.dimensions(), paint)) { | |
| 1296 // | 1304 // |
| 1297 // It is safe to call lock pixels now, since we know the matrix is | 1305 // It is safe to call lock pixels now, since we know the matrix is |
| 1298 // (more or less) identity. | 1306 // (more or less) identity. |
| 1299 // | 1307 // |
| 1300 SkAutoPixmapUnlock unlocker; | 1308 SkAutoPixmapUnlock unlocker; |
| 1301 if (!bitmap.requestLock(&unlocker)) { | 1309 if (!bitmap.requestLock(&unlocker)) { |
| 1302 return; | 1310 return; |
| 1303 } | 1311 } |
| 1304 const SkPixmap& pmap = unlocker.pixmap(); | 1312 const SkPixmap& pmap = unlocker.pixmap(); |
| 1305 int ix = SkScalarRoundToInt(matrix.getTranslateX()); | 1313 int ix = SkScalarRoundToInt(matrix.getTranslateX()); |
| (...skipping 762 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2068 mask->fImage = SkMask::AllocImage(size); | 2076 mask->fImage = SkMask::AllocImage(size); |
| 2069 memset(mask->fImage, 0, mask->computeImageSize()); | 2077 memset(mask->fImage, 0, mask->computeImageSize()); |
| 2070 } | 2078 } |
| 2071 | 2079 |
| 2072 if (SkMask::kJustComputeBounds_CreateMode != mode) { | 2080 if (SkMask::kJustComputeBounds_CreateMode != mode) { |
| 2073 draw_into_mask(*mask, devPath, style); | 2081 draw_into_mask(*mask, devPath, style); |
| 2074 } | 2082 } |
| 2075 | 2083 |
| 2076 return true; | 2084 return true; |
| 2077 } | 2085 } |
| OLD | NEW |