Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 /* | 1 /* |
| 2 * Copyright 2016 Google Inc. | 2 * Copyright 2016 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 "SkCanvas.h" | 8 #include "SkCanvas.h" |
| 9 #include "SkData.h" | 9 #include "SkData.h" |
| 10 #include "SkImageFilter.h" | 10 #include "SkImageFilter.h" |
| (...skipping 74 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 85 int optimizeFor(GrContext*) { sk_throw(); return 0;} | 85 int optimizeFor(GrContext*) { sk_throw(); return 0;} |
| 86 int makeThreadsafe() { sk_throw(); return 0;} | 86 int makeThreadsafe() { sk_throw(); return 0;} |
| 87 | 87 |
| 88 uint32_t type : 8; | 88 uint32_t type : 8; |
| 89 uint32_t skip : 24; | 89 uint32_t skip : 24; |
| 90 }; | 90 }; |
| 91 static_assert(sizeof(Op) == 4, ""); | 91 static_assert(sizeof(Op) == 4, ""); |
| 92 | 92 |
| 93 struct Save final : Op { | 93 struct Save final : Op { |
| 94 static const auto kType = Type::Save; | 94 static const auto kType = Type::Save; |
| 95 void draw(SkCanvas* c) { c->save(); } | 95 void draw(SkCanvas* c, const SkMatrix&) { c->save(); } |
| 96 }; | 96 }; |
| 97 struct Restore final : Op { | 97 struct Restore final : Op { |
| 98 static const auto kType = Type::Restore; | 98 static const auto kType = Type::Restore; |
| 99 void draw(SkCanvas* c) { c->restore(); } | 99 void draw(SkCanvas* c, const SkMatrix&) { c->restore(); } |
| 100 }; | 100 }; |
| 101 struct SaveLayer final : Op { | 101 struct SaveLayer final : Op { |
| 102 static const auto kType = Type::SaveLayer; | 102 static const auto kType = Type::SaveLayer; |
| 103 SaveLayer(const SkRect* bounds, const SkPaint* paint, | 103 SaveLayer(const SkRect* bounds, const SkPaint* paint, |
| 104 const SkImageFilter* backdrop, SkCanvas::SaveLayerFlags flags) { | 104 const SkImageFilter* backdrop, SkCanvas::SaveLayerFlags flags) { |
| 105 if (bounds) { this->bounds = *bounds; } | 105 if (bounds) { this->bounds = *bounds; } |
| 106 if (paint) { this->paint = *paint; } | 106 if (paint) { this->paint = *paint; } |
| 107 this->backdrop = sk_ref_sp(backdrop); | 107 this->backdrop = sk_ref_sp(backdrop); |
| 108 this->flags = flags; | 108 this->flags = flags; |
| 109 } | 109 } |
| 110 SkRect bounds = kUnset; | 110 SkRect bounds = kUnset; |
| 111 SkPaint paint; | 111 SkPaint paint; |
| 112 sk_sp<const SkImageFilter> backdrop; | 112 sk_sp<const SkImageFilter> backdrop; |
| 113 SkCanvas::SaveLayerFlags flags; | 113 SkCanvas::SaveLayerFlags flags; |
| 114 void draw(SkCanvas* c) { | 114 void draw(SkCanvas* c, const SkMatrix&) { |
| 115 c->saveLayer({ maybe_unset(bounds), &paint, backdrop.get(), flags }) ; | 115 c->saveLayer({ maybe_unset(bounds), &paint, backdrop.get(), flags }) ; |
| 116 } | 116 } |
| 117 void optimizeFor(GrContext* ctx) { optimize_for(ctx, &paint); } | 117 void optimizeFor(GrContext* ctx) { optimize_for(ctx, &paint); } |
| 118 }; | 118 }; |
| 119 | 119 |
| 120 struct Concat final : Op { | 120 struct Concat final : Op { |
| 121 static const auto kType = Type::Concat; | 121 static const auto kType = Type::Concat; |
| 122 Concat(const SkMatrix& matrix) : matrix(matrix) {} | 122 Concat(const SkMatrix& matrix) : matrix(matrix) {} |
| 123 SkMatrix matrix; | 123 SkMatrix matrix; |
| 124 void draw(SkCanvas* c) { c->concat(matrix); } | 124 void draw(SkCanvas* c, const SkMatrix&) { c->concat(matrix); } |
| 125 void makeThreadsafe() { make_threadsafe(nullptr, &matrix); } | 125 void makeThreadsafe() { make_threadsafe(nullptr, &matrix); } |
| 126 }; | 126 }; |
| 127 struct SetMatrix final : Op { | 127 struct SetMatrix final : Op { |
| 128 static const auto kType = Type::SetMatrix; | 128 static const auto kType = Type::SetMatrix; |
| 129 SetMatrix(const SkMatrix& matrix) : matrix(matrix) {} | 129 SetMatrix(const SkMatrix& matrix) : matrix(matrix) {} |
| 130 SkMatrix matrix; | 130 SkMatrix matrix; |
| 131 void draw(SkCanvas* c) { c->setMatrix(matrix); } | 131 void draw(SkCanvas* c, const SkMatrix& original) { |
|
reed1
2016/08/16 23:31:50
Crazy idea (to avoid having to pass 2 params to ev
| |
| 132 c->setMatrix(SkMatrix::Concat(original, matrix)); | |
| 133 } | |
| 132 void makeThreadsafe() { make_threadsafe(nullptr, &matrix); } | 134 void makeThreadsafe() { make_threadsafe(nullptr, &matrix); } |
| 133 }; | 135 }; |
| 134 struct TranslateZ final : Op { | 136 struct TranslateZ final : Op { |
| 135 static const auto kType = Type::TranslateZ; | 137 static const auto kType = Type::TranslateZ; |
| 136 TranslateZ(SkScalar dz) : dz(dz) {} | 138 TranslateZ(SkScalar dz) : dz(dz) {} |
| 137 SkScalar dz; | 139 SkScalar dz; |
| 138 void draw(SkCanvas* c) { | 140 void draw(SkCanvas* c, const SkMatrix&) { |
| 139 #ifdef SK_EXPERIMENTAL_SHADOWING | 141 #ifdef SK_EXPERIMENTAL_SHADOWING |
| 140 c->translateZ(dz); | 142 c->translateZ(dz); |
| 141 #endif | 143 #endif |
| 142 } | 144 } |
| 143 }; | 145 }; |
| 144 | 146 |
| 145 struct ClipPath final : Op { | 147 struct ClipPath final : Op { |
| 146 static const auto kType = Type::ClipPath; | 148 static const auto kType = Type::ClipPath; |
| 147 ClipPath(const SkPath& path, SkRegion::Op op, bool aa) : path(path), op( op), aa(aa) {} | 149 ClipPath(const SkPath& path, SkRegion::Op op, bool aa) : path(path), op( op), aa(aa) {} |
| 148 SkPath path; | 150 SkPath path; |
| 149 SkRegion::Op op; | 151 SkRegion::Op op; |
| 150 bool aa; | 152 bool aa; |
| 151 void draw(SkCanvas* c) { c->clipPath(path, op, aa); } | 153 void draw(SkCanvas* c, const SkMatrix&) { c->clipPath(path, op, aa); } |
| 152 void makeThreadsafe() { make_threadsafe(&path, nullptr); } | 154 void makeThreadsafe() { make_threadsafe(&path, nullptr); } |
| 153 }; | 155 }; |
| 154 struct ClipRect final : Op { | 156 struct ClipRect final : Op { |
| 155 static const auto kType = Type::ClipRect; | 157 static const auto kType = Type::ClipRect; |
| 156 ClipRect(const SkRect& rect, SkRegion::Op op, bool aa) : rect(rect), op( op), aa(aa) {} | 158 ClipRect(const SkRect& rect, SkRegion::Op op, bool aa) : rect(rect), op( op), aa(aa) {} |
| 157 SkRect rect; | 159 SkRect rect; |
| 158 SkRegion::Op op; | 160 SkRegion::Op op; |
| 159 bool aa; | 161 bool aa; |
| 160 void draw(SkCanvas* c) { c->clipRect(rect, op, aa); } | 162 void draw(SkCanvas* c, const SkMatrix&) { c->clipRect(rect, op, aa); } |
| 161 }; | 163 }; |
| 162 struct ClipRRect final : Op { | 164 struct ClipRRect final : Op { |
| 163 static const auto kType = Type::ClipRRect; | 165 static const auto kType = Type::ClipRRect; |
| 164 ClipRRect(const SkRRect& rrect, SkRegion::Op op, bool aa) : rrect(rrect) , op(op), aa(aa) {} | 166 ClipRRect(const SkRRect& rrect, SkRegion::Op op, bool aa) : rrect(rrect) , op(op), aa(aa) {} |
| 165 SkRRect rrect; | 167 SkRRect rrect; |
| 166 SkRegion::Op op; | 168 SkRegion::Op op; |
| 167 bool aa; | 169 bool aa; |
| 168 void draw(SkCanvas* c) { c->clipRRect(rrect, op, aa); } | 170 void draw(SkCanvas* c, const SkMatrix&) { c->clipRRect(rrect, op, aa); } |
| 169 }; | 171 }; |
| 170 struct ClipRegion final : Op { | 172 struct ClipRegion final : Op { |
| 171 static const auto kType = Type::ClipRegion; | 173 static const auto kType = Type::ClipRegion; |
| 172 ClipRegion(const SkRegion& region, SkRegion::Op op) : region(region), op (op) {} | 174 ClipRegion(const SkRegion& region, SkRegion::Op op) : region(region), op (op) {} |
| 173 SkRegion region; | 175 SkRegion region; |
| 174 SkRegion::Op op; | 176 SkRegion::Op op; |
| 175 void draw(SkCanvas* c) { c->clipRegion(region, op); } | 177 void draw(SkCanvas* c, const SkMatrix&) { c->clipRegion(region, op); } |
| 176 }; | 178 }; |
| 177 | 179 |
| 178 struct DrawPaint final : Op { | 180 struct DrawPaint final : Op { |
| 179 static const auto kType = Type::DrawPaint; | 181 static const auto kType = Type::DrawPaint; |
| 180 DrawPaint(const SkPaint& paint) : paint(paint) {} | 182 DrawPaint(const SkPaint& paint) : paint(paint) {} |
| 181 SkPaint paint; | 183 SkPaint paint; |
| 182 void draw(SkCanvas* c) { c->drawPaint(paint); } | 184 void draw(SkCanvas* c, const SkMatrix&) { c->drawPaint(paint); } |
| 183 void optimizeFor(GrContext* ctx) { optimize_for(ctx, &paint); } | 185 void optimizeFor(GrContext* ctx) { optimize_for(ctx, &paint); } |
| 184 }; | 186 }; |
| 185 struct DrawPath final : Op { | 187 struct DrawPath final : Op { |
| 186 static const auto kType = Type::DrawPath; | 188 static const auto kType = Type::DrawPath; |
| 187 DrawPath(const SkPath& path, const SkPaint& paint) : path(path), paint(p aint) {} | 189 DrawPath(const SkPath& path, const SkPaint& paint) : path(path), paint(p aint) {} |
| 188 SkPath path; | 190 SkPath path; |
| 189 SkPaint paint; | 191 SkPaint paint; |
| 190 void draw(SkCanvas* c) { c->drawPath(path, paint); } | 192 void draw(SkCanvas* c, const SkMatrix&) { c->drawPath(path, paint); } |
| 191 void optimizeFor(GrContext* ctx) { optimize_for(ctx, &paint); } | 193 void optimizeFor(GrContext* ctx) { optimize_for(ctx, &paint); } |
| 192 void makeThreadsafe() { make_threadsafe(&path, nullptr); } | 194 void makeThreadsafe() { make_threadsafe(&path, nullptr); } |
| 193 }; | 195 }; |
| 194 struct DrawRect final : Op { | 196 struct DrawRect final : Op { |
| 195 static const auto kType = Type::DrawRect; | 197 static const auto kType = Type::DrawRect; |
| 196 DrawRect(const SkRect& rect, const SkPaint& paint) : rect(rect), paint(p aint) {} | 198 DrawRect(const SkRect& rect, const SkPaint& paint) : rect(rect), paint(p aint) {} |
| 197 SkRect rect; | 199 SkRect rect; |
| 198 SkPaint paint; | 200 SkPaint paint; |
| 199 void draw(SkCanvas* c) { c->drawRect(rect, paint); } | 201 void draw(SkCanvas* c, const SkMatrix&) { c->drawRect(rect, paint); } |
| 200 void optimizeFor(GrContext* ctx) { optimize_for(ctx, &paint); } | 202 void optimizeFor(GrContext* ctx) { optimize_for(ctx, &paint); } |
| 201 }; | 203 }; |
| 202 struct DrawOval final : Op { | 204 struct DrawOval final : Op { |
| 203 static const auto kType = Type::DrawOval; | 205 static const auto kType = Type::DrawOval; |
| 204 DrawOval(const SkRect& oval, const SkPaint& paint) : oval(oval), paint(p aint) {} | 206 DrawOval(const SkRect& oval, const SkPaint& paint) : oval(oval), paint(p aint) {} |
| 205 SkRect oval; | 207 SkRect oval; |
| 206 SkPaint paint; | 208 SkPaint paint; |
| 207 void draw(SkCanvas* c) { c->drawOval(oval, paint); } | 209 void draw(SkCanvas* c, const SkMatrix&) { c->drawOval(oval, paint); } |
| 208 void optimizeFor(GrContext* ctx) { optimize_for(ctx, &paint); } | 210 void optimizeFor(GrContext* ctx) { optimize_for(ctx, &paint); } |
| 209 }; | 211 }; |
| 210 struct DrawRRect final : Op { | 212 struct DrawRRect final : Op { |
| 211 static const auto kType = Type::DrawRRect; | 213 static const auto kType = Type::DrawRRect; |
| 212 DrawRRect(const SkRRect& rrect, const SkPaint& paint) : rrect(rrect), pa int(paint) {} | 214 DrawRRect(const SkRRect& rrect, const SkPaint& paint) : rrect(rrect), pa int(paint) {} |
| 213 SkRRect rrect; | 215 SkRRect rrect; |
| 214 SkPaint paint; | 216 SkPaint paint; |
| 215 void draw(SkCanvas* c) { c->drawRRect(rrect, paint); } | 217 void draw(SkCanvas* c, const SkMatrix&) { c->drawRRect(rrect, paint); } |
| 216 void optimizeFor(GrContext* ctx) { optimize_for(ctx, &paint); } | 218 void optimizeFor(GrContext* ctx) { optimize_for(ctx, &paint); } |
| 217 }; | 219 }; |
| 218 struct DrawDRRect final : Op { | 220 struct DrawDRRect final : Op { |
| 219 static const auto kType = Type::DrawDRRect; | 221 static const auto kType = Type::DrawDRRect; |
| 220 DrawDRRect(const SkRRect& outer, const SkRRect& inner, const SkPaint& pa int) | 222 DrawDRRect(const SkRRect& outer, const SkRRect& inner, const SkPaint& pa int) |
| 221 : outer(outer), inner(inner), paint(paint) {} | 223 : outer(outer), inner(inner), paint(paint) {} |
| 222 SkRRect outer, inner; | 224 SkRRect outer, inner; |
| 223 SkPaint paint; | 225 SkPaint paint; |
| 224 void draw(SkCanvas* c) { c->drawDRRect(outer, inner, paint); } | 226 void draw(SkCanvas* c, const SkMatrix&) { c->drawDRRect(outer, inner, pa int); } |
| 225 void optimizeFor(GrContext* ctx) { optimize_for(ctx, &paint); } | 227 void optimizeFor(GrContext* ctx) { optimize_for(ctx, &paint); } |
| 226 }; | 228 }; |
| 227 | 229 |
| 228 struct DrawAnnotation final : Op { | 230 struct DrawAnnotation final : Op { |
| 229 static const auto kType = Type::DrawAnnotation; | 231 static const auto kType = Type::DrawAnnotation; |
| 230 DrawAnnotation(const SkRect& rect, SkData* value) : rect(rect), value(sk _ref_sp(value)) {} | 232 DrawAnnotation(const SkRect& rect, SkData* value) : rect(rect), value(sk _ref_sp(value)) {} |
| 231 SkRect rect; | 233 SkRect rect; |
| 232 sk_sp<SkData> value; | 234 sk_sp<SkData> value; |
| 233 void draw(SkCanvas* c) { c->drawAnnotation(rect, pod<char>(this), value. get()); } | 235 void draw(SkCanvas* c, const SkMatrix&) { |
| 236 c->drawAnnotation(rect, pod<char>(this), value.get()); | |
| 237 } | |
| 234 }; | 238 }; |
| 235 struct DrawDrawable final : Op { | 239 struct DrawDrawable final : Op { |
| 236 static const auto kType = Type::DrawDrawable; | 240 static const auto kType = Type::DrawDrawable; |
| 237 DrawDrawable(SkDrawable* drawable, const SkMatrix* matrix) : drawable(sk _ref_sp(drawable)) { | 241 DrawDrawable(SkDrawable* drawable, const SkMatrix* matrix) : drawable(sk _ref_sp(drawable)) { |
| 238 if (matrix) { this->matrix = *matrix; } | 242 if (matrix) { this->matrix = *matrix; } |
| 239 } | 243 } |
| 240 sk_sp<SkDrawable> drawable; | 244 sk_sp<SkDrawable> drawable; |
| 241 sk_sp<const SkPicture> snapped; | 245 sk_sp<const SkPicture> snapped; |
| 242 SkMatrix matrix = SkMatrix::I(); | 246 SkMatrix matrix = SkMatrix::I(); |
| 243 void draw(SkCanvas* c) { | 247 void draw(SkCanvas* c, const SkMatrix&) { |
| 244 snapped ? c->drawPicture(snapped.get(), &matrix, nullptr) | 248 snapped ? c->drawPicture(snapped.get(), &matrix, nullptr) |
| 245 : c->drawDrawable(drawable.get(), &matrix); | 249 : c->drawDrawable(drawable.get(), &matrix); |
| 246 } | 250 } |
| 247 void makeThreadsafe() { | 251 void makeThreadsafe() { |
| 248 snapped.reset(drawable->newPictureSnapshot()); | 252 snapped.reset(drawable->newPictureSnapshot()); |
| 249 make_threadsafe(nullptr, &matrix); | 253 make_threadsafe(nullptr, &matrix); |
| 250 } | 254 } |
| 251 }; | 255 }; |
| 252 struct DrawPicture final : Op { | 256 struct DrawPicture final : Op { |
| 253 static const auto kType = Type::DrawPicture; | 257 static const auto kType = Type::DrawPicture; |
| 254 DrawPicture(const SkPicture* picture, const SkMatrix* matrix, const SkPa int* paint) | 258 DrawPicture(const SkPicture* picture, const SkMatrix* matrix, const SkPa int* paint) |
| 255 : picture(sk_ref_sp(picture)) { | 259 : picture(sk_ref_sp(picture)) { |
| 256 if (matrix) { this->matrix = *matrix; } | 260 if (matrix) { this->matrix = *matrix; } |
| 257 if (paint) { this->paint = *paint; has_paint = true; } | 261 if (paint) { this->paint = *paint; has_paint = true; } |
| 258 } | 262 } |
| 259 sk_sp<const SkPicture> picture; | 263 sk_sp<const SkPicture> picture; |
| 260 SkMatrix matrix = SkMatrix::I(); | 264 SkMatrix matrix = SkMatrix::I(); |
| 261 SkPaint paint; | 265 SkPaint paint; |
| 262 bool has_paint = false; // TODO: why is a default pai nt not the same? | 266 bool has_paint = false; // TODO: why is a default pai nt not the same? |
| 263 void draw(SkCanvas* c) { | 267 void draw(SkCanvas* c, const SkMatrix&) { |
| 264 c->drawPicture(picture.get(), &matrix, has_paint ? &paint : nullptr) ; | 268 c->drawPicture(picture.get(), &matrix, has_paint ? &paint : nullptr) ; |
| 265 } | 269 } |
| 266 void optimizeFor(GrContext* ctx) { optimize_for(ctx, &paint); } | 270 void optimizeFor(GrContext* ctx) { optimize_for(ctx, &paint); } |
| 267 void makeThreadsafe() { make_threadsafe(nullptr, &matrix); } | 271 void makeThreadsafe() { make_threadsafe(nullptr, &matrix); } |
| 268 }; | 272 }; |
| 269 struct DrawShadowedPicture final : Op { | 273 struct DrawShadowedPicture final : Op { |
| 270 static const auto kType = Type::DrawShadowedPicture; | 274 static const auto kType = Type::DrawShadowedPicture; |
| 271 DrawShadowedPicture(const SkPicture* picture, const SkMatrix* matrix, co nst SkPaint* paint) | 275 DrawShadowedPicture(const SkPicture* picture, const SkMatrix* matrix, co nst SkPaint* paint) |
| 272 : picture(sk_ref_sp(picture)) { | 276 : picture(sk_ref_sp(picture)) { |
| 273 if (matrix) { this->matrix = *matrix; } | 277 if (matrix) { this->matrix = *matrix; } |
| 274 if (paint) { this->paint = *paint; } | 278 if (paint) { this->paint = *paint; } |
| 275 } | 279 } |
| 276 sk_sp<const SkPicture> picture; | 280 sk_sp<const SkPicture> picture; |
| 277 SkMatrix matrix = SkMatrix::I(); | 281 SkMatrix matrix = SkMatrix::I(); |
| 278 SkPaint paint; | 282 SkPaint paint; |
| 279 void draw(SkCanvas* c) { | 283 void draw(SkCanvas* c, const SkMatrix&) { |
| 280 #ifdef SK_EXPERIMENTAL_SHADOWING | 284 #ifdef SK_EXPERIMENTAL_SHADOWING |
| 281 c->drawShadowedPicture(picture.get(), &matrix, &paint); | 285 c->drawShadowedPicture(picture.get(), &matrix, &paint); |
| 282 #endif | 286 #endif |
| 283 } | 287 } |
| 284 void optimizeFor(GrContext* ctx) { optimize_for(ctx, &paint); } | 288 void optimizeFor(GrContext* ctx) { optimize_for(ctx, &paint); } |
| 285 void makeThreadsafe() { make_threadsafe(nullptr, &matrix); } | 289 void makeThreadsafe() { make_threadsafe(nullptr, &matrix); } |
| 286 }; | 290 }; |
| 287 | 291 |
| 288 struct DrawImage final : Op { | 292 struct DrawImage final : Op { |
| 289 static const auto kType = Type::DrawImage; | 293 static const auto kType = Type::DrawImage; |
| 290 DrawImage(sk_sp<const SkImage>&& image, SkScalar x, SkScalar y, const Sk Paint* paint) | 294 DrawImage(sk_sp<const SkImage>&& image, SkScalar x, SkScalar y, const Sk Paint* paint) |
| 291 : image(std::move(image)), x(x), y(y) { | 295 : image(std::move(image)), x(x), y(y) { |
| 292 if (paint) { this->paint = *paint; } | 296 if (paint) { this->paint = *paint; } |
| 293 } | 297 } |
| 294 sk_sp<const SkImage> image; | 298 sk_sp<const SkImage> image; |
| 295 SkScalar x,y; | 299 SkScalar x,y; |
| 296 SkPaint paint; | 300 SkPaint paint; |
| 297 void draw(SkCanvas* c) { c->drawImage(image.get(), x,y, &paint); } | 301 void draw(SkCanvas* c, const SkMatrix&) { c->drawImage(image.get(), x,y, &paint); } |
| 298 void optimizeFor(GrContext* ctx) { optimize_for(ctx, &paint, &image); } | 302 void optimizeFor(GrContext* ctx) { optimize_for(ctx, &paint, &image); } |
| 299 }; | 303 }; |
| 300 struct DrawImageNine final : Op { | 304 struct DrawImageNine final : Op { |
| 301 static const auto kType = Type::DrawImageNine; | 305 static const auto kType = Type::DrawImageNine; |
| 302 DrawImageNine(sk_sp<const SkImage>&& image, | 306 DrawImageNine(sk_sp<const SkImage>&& image, |
| 303 const SkIRect& center, const SkRect& dst, const SkPaint* p aint) | 307 const SkIRect& center, const SkRect& dst, const SkPaint* p aint) |
| 304 : image(std::move(image)), center(center), dst(dst) { | 308 : image(std::move(image)), center(center), dst(dst) { |
| 305 if (paint) { this->paint = *paint; } | 309 if (paint) { this->paint = *paint; } |
| 306 } | 310 } |
| 307 sk_sp<const SkImage> image; | 311 sk_sp<const SkImage> image; |
| 308 SkIRect center; | 312 SkIRect center; |
| 309 SkRect dst; | 313 SkRect dst; |
| 310 SkPaint paint; | 314 SkPaint paint; |
| 311 void draw(SkCanvas* c) { c->drawImageNine(image.get(), center, dst, &pai nt); } | 315 void draw(SkCanvas* c, const SkMatrix&) { |
| 316 c->drawImageNine(image.get(), center, dst, &paint); | |
| 317 } | |
| 312 void optimizeFor(GrContext* ctx) { optimize_for(ctx, &paint, &image); } | 318 void optimizeFor(GrContext* ctx) { optimize_for(ctx, &paint, &image); } |
| 313 }; | 319 }; |
| 314 struct DrawImageRect final : Op { | 320 struct DrawImageRect final : Op { |
| 315 static const auto kType = Type::DrawImageRect; | 321 static const auto kType = Type::DrawImageRect; |
| 316 DrawImageRect(sk_sp<const SkImage>&& image, const SkRect* src, const SkR ect& dst, | 322 DrawImageRect(sk_sp<const SkImage>&& image, const SkRect* src, const SkR ect& dst, |
| 317 const SkPaint* paint, SkCanvas::SrcRectConstraint constrai nt) | 323 const SkPaint* paint, SkCanvas::SrcRectConstraint constrai nt) |
| 318 : image(std::move(image)), dst(dst), constraint(constraint) { | 324 : image(std::move(image)), dst(dst), constraint(constraint) { |
| 319 this->src = src ? *src : SkRect::MakeIWH(image->width(), image->heig ht()); | 325 this->src = src ? *src : SkRect::MakeIWH(image->width(), image->heig ht()); |
| 320 if (paint) { this->paint = *paint; } | 326 if (paint) { this->paint = *paint; } |
| 321 } | 327 } |
| 322 sk_sp<const SkImage> image; | 328 sk_sp<const SkImage> image; |
| 323 SkRect src, dst; | 329 SkRect src, dst; |
| 324 SkPaint paint; | 330 SkPaint paint; |
| 325 SkCanvas::SrcRectConstraint constraint; | 331 SkCanvas::SrcRectConstraint constraint; |
| 326 void draw(SkCanvas* c) { | 332 void draw(SkCanvas* c, const SkMatrix&) { |
| 327 c->drawImageRect(image.get(), src, dst, &paint, constraint); | 333 c->drawImageRect(image.get(), src, dst, &paint, constraint); |
| 328 } | 334 } |
| 329 void optimizeFor(GrContext* ctx) { optimize_for(ctx, &paint, &image); } | 335 void optimizeFor(GrContext* ctx) { optimize_for(ctx, &paint, &image); } |
| 330 }; | 336 }; |
| 331 struct DrawImageLattice final : Op { | 337 struct DrawImageLattice final : Op { |
| 332 static const auto kType = Type::DrawImageLattice; | 338 static const auto kType = Type::DrawImageLattice; |
| 333 DrawImageLattice(sk_sp<const SkImage>&& image, int xs, int ys, | 339 DrawImageLattice(sk_sp<const SkImage>&& image, int xs, int ys, |
| 334 const SkRect& dst, const SkPaint* paint) | 340 const SkRect& dst, const SkPaint* paint) |
| 335 : image(std::move(image)), xs(xs), ys(ys), dst(dst) { | 341 : image(std::move(image)), xs(xs), ys(ys), dst(dst) { |
| 336 if (paint) { this->paint = *paint; } | 342 if (paint) { this->paint = *paint; } |
| 337 } | 343 } |
| 338 sk_sp<const SkImage> image; | 344 sk_sp<const SkImage> image; |
| 339 int xs, ys; | 345 int xs, ys; |
| 340 SkRect dst; | 346 SkRect dst; |
| 341 SkPaint paint; | 347 SkPaint paint; |
| 342 void draw(SkCanvas* c) { | 348 void draw(SkCanvas* c, const SkMatrix&) { |
| 343 auto xdivs = pod<int>(this, 0), | 349 auto xdivs = pod<int>(this, 0), |
| 344 ydivs = pod<int>(this, xs*sizeof(int)); | 350 ydivs = pod<int>(this, xs*sizeof(int)); |
| 345 c->drawImageLattice(image.get(), {xdivs, xs, ydivs, ys}, dst, &paint ); | 351 c->drawImageLattice(image.get(), {xdivs, xs, ydivs, ys}, dst, &paint ); |
| 346 } | 352 } |
| 347 void optimizeFor(GrContext* ctx) { optimize_for(ctx, &paint, &image); } | 353 void optimizeFor(GrContext* ctx) { optimize_for(ctx, &paint, &image); } |
| 348 }; | 354 }; |
| 349 | 355 |
| 350 struct DrawText final : Op { | 356 struct DrawText final : Op { |
| 351 static const auto kType = Type::DrawText; | 357 static const auto kType = Type::DrawText; |
| 352 DrawText(size_t bytes, SkScalar x, SkScalar y, const SkPaint& paint) | 358 DrawText(size_t bytes, SkScalar x, SkScalar y, const SkPaint& paint) |
| 353 : bytes(bytes), x(x), y(y), paint(paint) {} | 359 : bytes(bytes), x(x), y(y), paint(paint) {} |
| 354 size_t bytes; | 360 size_t bytes; |
| 355 SkScalar x,y; | 361 SkScalar x,y; |
| 356 SkPaint paint; | 362 SkPaint paint; |
| 357 void draw(SkCanvas* c) { c->drawText(pod<void>(this), bytes, x,y, paint) ; } | 363 void draw(SkCanvas* c, const SkMatrix&) { |
| 364 c->drawText(pod<void>(this), bytes, x,y, paint); | |
| 365 } | |
| 358 void optimizeFor(GrContext* ctx) { optimize_for(ctx, &paint); } | 366 void optimizeFor(GrContext* ctx) { optimize_for(ctx, &paint); } |
| 359 }; | 367 }; |
| 360 struct DrawPosText final : Op { | 368 struct DrawPosText final : Op { |
| 361 static const auto kType = Type::DrawPosText; | 369 static const auto kType = Type::DrawPosText; |
| 362 DrawPosText(size_t bytes, const SkPaint& paint, int n) | 370 DrawPosText(size_t bytes, const SkPaint& paint, int n) |
| 363 : bytes(bytes), paint(paint), n(n) {} | 371 : bytes(bytes), paint(paint), n(n) {} |
| 364 size_t bytes; | 372 size_t bytes; |
| 365 SkPaint paint; | 373 SkPaint paint; |
| 366 int n; | 374 int n; |
| 367 void draw(SkCanvas* c) { | 375 void draw(SkCanvas* c, const SkMatrix&) { |
| 368 auto points = pod<SkPoint>(this); | 376 auto points = pod<SkPoint>(this); |
| 369 auto text = pod<void>(this, n*sizeof(SkPoint)); | 377 auto text = pod<void>(this, n*sizeof(SkPoint)); |
| 370 c->drawPosText(text, bytes, points, paint); | 378 c->drawPosText(text, bytes, points, paint); |
| 371 } | 379 } |
| 372 void optimizeFor(GrContext* ctx) { optimize_for(ctx, &paint); } | 380 void optimizeFor(GrContext* ctx) { optimize_for(ctx, &paint); } |
| 373 }; | 381 }; |
| 374 struct DrawPosTextH final : Op { | 382 struct DrawPosTextH final : Op { |
| 375 static const auto kType = Type::DrawPosTextH; | 383 static const auto kType = Type::DrawPosTextH; |
| 376 DrawPosTextH(size_t bytes, SkScalar y, const SkPaint& paint, int n) | 384 DrawPosTextH(size_t bytes, SkScalar y, const SkPaint& paint, int n) |
| 377 : bytes(bytes), y(y), paint(paint), n(n) {} | 385 : bytes(bytes), y(y), paint(paint), n(n) {} |
| 378 size_t bytes; | 386 size_t bytes; |
| 379 SkScalar y; | 387 SkScalar y; |
| 380 SkPaint paint; | 388 SkPaint paint; |
| 381 int n; | 389 int n; |
| 382 void draw(SkCanvas* c) { | 390 void draw(SkCanvas* c, const SkMatrix&) { |
| 383 auto xs = pod<SkScalar>(this); | 391 auto xs = pod<SkScalar>(this); |
| 384 auto text = pod<void>(this, n*sizeof(SkScalar)); | 392 auto text = pod<void>(this, n*sizeof(SkScalar)); |
| 385 c->drawPosTextH(text, bytes, xs, y, paint); | 393 c->drawPosTextH(text, bytes, xs, y, paint); |
| 386 } | 394 } |
| 387 void optimizeFor(GrContext* ctx) { optimize_for(ctx, &paint); } | 395 void optimizeFor(GrContext* ctx) { optimize_for(ctx, &paint); } |
| 388 }; | 396 }; |
| 389 struct DrawTextOnPath final : Op { | 397 struct DrawTextOnPath final : Op { |
| 390 static const auto kType = Type::DrawTextOnPath; | 398 static const auto kType = Type::DrawTextOnPath; |
| 391 DrawTextOnPath(size_t bytes, const SkPath& path, | 399 DrawTextOnPath(size_t bytes, const SkPath& path, |
| 392 const SkMatrix* matrix, const SkPaint& paint) | 400 const SkMatrix* matrix, const SkPaint& paint) |
| 393 : bytes(bytes), path(path), paint(paint) { | 401 : bytes(bytes), path(path), paint(paint) { |
| 394 if (matrix) { this->matrix = *matrix; } | 402 if (matrix) { this->matrix = *matrix; } |
| 395 } | 403 } |
| 396 size_t bytes; | 404 size_t bytes; |
| 397 SkPath path; | 405 SkPath path; |
| 398 SkMatrix matrix = SkMatrix::I(); | 406 SkMatrix matrix = SkMatrix::I(); |
| 399 SkPaint paint; | 407 SkPaint paint; |
| 400 void draw(SkCanvas* c) { | 408 void draw(SkCanvas* c, const SkMatrix&) { |
| 401 c->drawTextOnPath(pod<void>(this), bytes, path, &matrix, paint); | 409 c->drawTextOnPath(pod<void>(this), bytes, path, &matrix, paint); |
| 402 } | 410 } |
| 403 void optimizeFor(GrContext* ctx) { optimize_for(ctx, &paint); } | 411 void optimizeFor(GrContext* ctx) { optimize_for(ctx, &paint); } |
| 404 void makeThreadsafe() { make_threadsafe(&path, &matrix); } | 412 void makeThreadsafe() { make_threadsafe(&path, &matrix); } |
| 405 }; | 413 }; |
| 406 struct DrawTextRSXform final : Op { | 414 struct DrawTextRSXform final : Op { |
| 407 static const auto kType = Type::DrawTextRSXform; | 415 static const auto kType = Type::DrawTextRSXform; |
| 408 DrawTextRSXform(size_t bytes, const SkRect* cull, const SkPaint& paint) | 416 DrawTextRSXform(size_t bytes, const SkRect* cull, const SkPaint& paint) |
| 409 : bytes(bytes), paint(paint) { | 417 : bytes(bytes), paint(paint) { |
| 410 if (cull) { this->cull = *cull; } | 418 if (cull) { this->cull = *cull; } |
| 411 } | 419 } |
| 412 size_t bytes; | 420 size_t bytes; |
| 413 SkRect cull = kUnset; | 421 SkRect cull = kUnset; |
| 414 SkPaint paint; | 422 SkPaint paint; |
| 415 void draw(SkCanvas* c) { | 423 void draw(SkCanvas* c, const SkMatrix&) { |
| 416 c->drawTextRSXform(pod<void>(this), bytes, pod<SkRSXform>(this, byte s), | 424 c->drawTextRSXform(pod<void>(this), bytes, pod<SkRSXform>(this, byte s), |
| 417 maybe_unset(cull), paint); | 425 maybe_unset(cull), paint); |
| 418 } | 426 } |
| 419 void optimizeFor(GrContext* ctx) { optimize_for(ctx, &paint); } | 427 void optimizeFor(GrContext* ctx) { optimize_for(ctx, &paint); } |
| 420 }; | 428 }; |
| 421 struct DrawTextBlob final : Op { | 429 struct DrawTextBlob final : Op { |
| 422 static const auto kType = Type::DrawTextBlob; | 430 static const auto kType = Type::DrawTextBlob; |
| 423 DrawTextBlob(const SkTextBlob* blob, SkScalar x, SkScalar y, const SkPai nt& paint) | 431 DrawTextBlob(const SkTextBlob* blob, SkScalar x, SkScalar y, const SkPai nt& paint) |
| 424 : blob(sk_ref_sp(blob)), x(x), y(y), paint(paint) {} | 432 : blob(sk_ref_sp(blob)), x(x), y(y), paint(paint) {} |
| 425 sk_sp<const SkTextBlob> blob; | 433 sk_sp<const SkTextBlob> blob; |
| 426 SkScalar x,y; | 434 SkScalar x,y; |
| 427 SkPaint paint; | 435 SkPaint paint; |
| 428 void draw(SkCanvas* c) { c->drawTextBlob(blob.get(), x,y, paint); } | 436 void draw(SkCanvas* c, const SkMatrix&) { |
| 437 c->drawTextBlob(blob.get(), x,y, paint); | |
| 438 } | |
| 429 void optimizeFor(GrContext* ctx) { optimize_for(ctx, &paint); } | 439 void optimizeFor(GrContext* ctx) { optimize_for(ctx, &paint); } |
| 430 }; | 440 }; |
| 431 | 441 |
| 432 struct DrawPatch final : Op { | 442 struct DrawPatch final : Op { |
| 433 static const auto kType = Type::DrawPatch; | 443 static const auto kType = Type::DrawPatch; |
| 434 DrawPatch(const SkPoint cubics[12], const SkColor colors[4], const SkPoi nt texs[4], | 444 DrawPatch(const SkPoint cubics[12], const SkColor colors[4], const SkPoi nt texs[4], |
| 435 SkXfermode* xfermode, const SkPaint& paint) | 445 SkXfermode* xfermode, const SkPaint& paint) |
| 436 : xfermode(sk_ref_sp(xfermode)), paint(paint) { | 446 : xfermode(sk_ref_sp(xfermode)), paint(paint) { |
| 437 copy_v(this->cubics, cubics, 12); | 447 copy_v(this->cubics, cubics, 12); |
| 438 if (colors) { copy_v(this->colors, colors, 4); has_colors = true; } | 448 if (colors) { copy_v(this->colors, colors, 4); has_colors = true; } |
| 439 if (texs ) { copy_v(this->texs , texs , 4); has_texs = true; } | 449 if (texs ) { copy_v(this->texs , texs , 4); has_texs = true; } |
| 440 } | 450 } |
| 441 SkPoint cubics[12]; | 451 SkPoint cubics[12]; |
| 442 SkColor colors[4]; | 452 SkColor colors[4]; |
| 443 SkPoint texs[4]; | 453 SkPoint texs[4]; |
| 444 sk_sp<SkXfermode> xfermode; | 454 sk_sp<SkXfermode> xfermode; |
| 445 SkPaint paint; | 455 SkPaint paint; |
| 446 bool has_colors = false; | 456 bool has_colors = false; |
| 447 bool has_texs = false; | 457 bool has_texs = false; |
| 448 void draw(SkCanvas* c) { | 458 void draw(SkCanvas* c, const SkMatrix&) { |
| 449 c->drawPatch(cubics, has_colors ? colors : nullptr, has_texs ? texs : nullptr, | 459 c->drawPatch(cubics, has_colors ? colors : nullptr, has_texs ? texs : nullptr, |
| 450 xfermode.get(), paint); | 460 xfermode.get(), paint); |
| 451 } | 461 } |
| 452 void optimizeFor(GrContext* ctx) { optimize_for(ctx, &paint); } | 462 void optimizeFor(GrContext* ctx) { optimize_for(ctx, &paint); } |
| 453 }; | 463 }; |
| 454 struct DrawPoints final : Op { | 464 struct DrawPoints final : Op { |
| 455 static const auto kType = Type::DrawPoints; | 465 static const auto kType = Type::DrawPoints; |
| 456 DrawPoints(SkCanvas::PointMode mode, size_t count, const SkPaint& paint) | 466 DrawPoints(SkCanvas::PointMode mode, size_t count, const SkPaint& paint) |
| 457 : mode(mode), count(count), paint(paint) {} | 467 : mode(mode), count(count), paint(paint) {} |
| 458 SkCanvas::PointMode mode; | 468 SkCanvas::PointMode mode; |
| 459 size_t count; | 469 size_t count; |
| 460 SkPaint paint; | 470 SkPaint paint; |
| 461 void draw(SkCanvas* c) { c->drawPoints(mode, count, pod<SkPoint>(this), paint); } | 471 void draw(SkCanvas* c, const SkMatrix&) { |
| 472 c->drawPoints(mode, count, pod<SkPoint>(this), paint); | |
| 473 } | |
| 462 void optimizeFor(GrContext* ctx) { optimize_for(ctx, &paint); } | 474 void optimizeFor(GrContext* ctx) { optimize_for(ctx, &paint); } |
| 463 }; | 475 }; |
| 464 struct DrawVertices final : Op { | 476 struct DrawVertices final : Op { |
| 465 static const auto kType = Type::DrawVertices; | 477 static const auto kType = Type::DrawVertices; |
| 466 DrawVertices(SkCanvas::VertexMode mode, int count, SkXfermode* xfermode, int nindices, | 478 DrawVertices(SkCanvas::VertexMode mode, int count, SkXfermode* xfermode, int nindices, |
| 467 const SkPaint& paint, bool has_texs, bool has_colors, bool has_indices) | 479 const SkPaint& paint, bool has_texs, bool has_colors, bool has_indices) |
| 468 : mode(mode), count(count), xfermode(sk_ref_sp(xfermode)), nindices( nindices) | 480 : mode(mode), count(count), xfermode(sk_ref_sp(xfermode)), nindices( nindices) |
| 469 , paint(paint), has_texs(has_texs), has_colors(has_colors), has_indi ces(has_indices) {} | 481 , paint(paint), has_texs(has_texs), has_colors(has_colors), has_indi ces(has_indices) {} |
| 470 SkCanvas::VertexMode mode; | 482 SkCanvas::VertexMode mode; |
| 471 int count; | 483 int count; |
| 472 sk_sp<SkXfermode> xfermode; | 484 sk_sp<SkXfermode> xfermode; |
| 473 int nindices; | 485 int nindices; |
| 474 SkPaint paint; | 486 SkPaint paint; |
| 475 bool has_texs; | 487 bool has_texs; |
| 476 bool has_colors; | 488 bool has_colors; |
| 477 bool has_indices; | 489 bool has_indices; |
| 478 void draw(SkCanvas* c) { | 490 void draw(SkCanvas* c, const SkMatrix&) { |
| 479 SkPoint* vertices = pod<SkPoint>(this, 0); | 491 SkPoint* vertices = pod<SkPoint>(this, 0); |
| 480 size_t offset = count*sizeof(SkPoint); | 492 size_t offset = count*sizeof(SkPoint); |
| 481 | 493 |
| 482 SkPoint* texs = nullptr; | 494 SkPoint* texs = nullptr; |
| 483 if (has_texs) { | 495 if (has_texs) { |
| 484 texs = pod<SkPoint>(this, offset); | 496 texs = pod<SkPoint>(this, offset); |
| 485 offset += count*sizeof(SkPoint); | 497 offset += count*sizeof(SkPoint); |
| 486 } | 498 } |
| 487 | 499 |
| 488 SkColor* colors = nullptr; | 500 SkColor* colors = nullptr; |
| (...skipping 18 matching lines...) Expand all Loading... | |
| 507 : atlas(sk_ref_sp(atlas)), count(count), xfermode(xfermode), has_col ors(has_colors) { | 519 : atlas(sk_ref_sp(atlas)), count(count), xfermode(xfermode), has_col ors(has_colors) { |
| 508 if (cull) { this->cull = *cull; } | 520 if (cull) { this->cull = *cull; } |
| 509 if (paint) { this->paint = *paint; } | 521 if (paint) { this->paint = *paint; } |
| 510 } | 522 } |
| 511 sk_sp<const SkImage> atlas; | 523 sk_sp<const SkImage> atlas; |
| 512 int count; | 524 int count; |
| 513 SkXfermode::Mode xfermode; | 525 SkXfermode::Mode xfermode; |
| 514 SkRect cull = kUnset; | 526 SkRect cull = kUnset; |
| 515 SkPaint paint; | 527 SkPaint paint; |
| 516 bool has_colors; | 528 bool has_colors; |
| 517 void draw(SkCanvas* c) { | 529 void draw(SkCanvas* c, const SkMatrix&) { |
| 518 auto xforms = pod<SkRSXform>(this, 0); | 530 auto xforms = pod<SkRSXform>(this, 0); |
| 519 auto texs = pod<SkRect>(this, count*sizeof(SkRSXform)); | 531 auto texs = pod<SkRect>(this, count*sizeof(SkRSXform)); |
| 520 auto colors = has_colors | 532 auto colors = has_colors |
| 521 ? pod<SkColor>(this, count*(sizeof(SkRSXform) + sizeof(SkRect))) | 533 ? pod<SkColor>(this, count*(sizeof(SkRSXform) + sizeof(SkRect))) |
| 522 : nullptr; | 534 : nullptr; |
| 523 c->drawAtlas(atlas.get(), xforms, texs, colors, count, xfermode, | 535 c->drawAtlas(atlas.get(), xforms, texs, colors, count, xfermode, |
| 524 maybe_unset(cull), &paint); | 536 maybe_unset(cull), &paint); |
| 525 } | 537 } |
| 526 void optimizeFor(GrContext* ctx) { optimize_for(ctx, &paint, &atlas); } | 538 void optimizeFor(GrContext* ctx) { optimize_for(ctx, &paint, &atlas); } |
| 527 }; | 539 }; |
| (...skipping 11 matching lines...) Expand all Loading... | |
| 539 } | 551 } |
| 540 SkASSERT(fUsed + skip <= fReserved); | 552 SkASSERT(fUsed + skip <= fReserved); |
| 541 auto op = (T*)(fBytes.get() + fUsed); | 553 auto op = (T*)(fBytes.get() + fUsed); |
| 542 fUsed += skip; | 554 fUsed += skip; |
| 543 new (op) T{ std::forward<Args>(args)... }; | 555 new (op) T{ std::forward<Args>(args)... }; |
| 544 op->type = (uint32_t)T::kType; | 556 op->type = (uint32_t)T::kType; |
| 545 op->skip = skip; | 557 op->skip = skip; |
| 546 return op+1; | 558 return op+1; |
| 547 } | 559 } |
| 548 | 560 |
| 549 template <typename... Args> | 561 template <typename Fn, typename... Args> |
| 550 inline void SkLiteDL::map(void (*const fns[])(void*, Args...), Args... args) { | 562 inline void SkLiteDL::map(const Fn fns[], Args... args) { |
| 551 auto end = fBytes.get() + fUsed; | 563 auto end = fBytes.get() + fUsed; |
| 552 for (uint8_t* ptr = fBytes.get(); ptr < end; ) { | 564 for (uint8_t* ptr = fBytes.get(); ptr < end; ) { |
| 553 auto op = (Op*)ptr; | 565 auto op = (Op*)ptr; |
| 554 auto type = op->type; | 566 auto type = op->type; |
| 555 auto skip = op->skip; | 567 auto skip = op->skip; |
| 556 if (auto fn = fns[type]) { // We replace no-op functions with nullptrs | 568 if (auto fn = fns[type]) { // We replace no-op functions with nullptrs |
| 557 fn(op, args...); // to avoid the overhead of a pointless call . | 569 fn(op, args...); // to avoid the overhead of a pointless call . |
| 558 } | 570 } |
| 559 ptr += skip; | 571 ptr += skip; |
| 560 } | 572 } |
| (...skipping 162 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 723 if (colors) { | 735 if (colors) { |
| 724 bytes += count*sizeof(SkColor); | 736 bytes += count*sizeof(SkColor); |
| 725 } | 737 } |
| 726 void* pod = this->push<DrawAtlas>(bytes, | 738 void* pod = this->push<DrawAtlas>(bytes, |
| 727 atlas, count, xfermode, cull, paint, color s != nullptr); | 739 atlas, count, xfermode, cull, paint, color s != nullptr); |
| 728 copy_v(pod, xforms, count, | 740 copy_v(pod, xforms, count, |
| 729 texs, count, | 741 texs, count, |
| 730 colors, colors ? count : 0); | 742 colors, colors ? count : 0); |
| 731 } | 743 } |
| 732 | 744 |
| 733 typedef void(* skcanvas_fn)(void*, SkCanvas*); | 745 typedef void(* draw_fn)(void*, SkCanvas*, const SkMatrix&); |
| 734 typedef void(*grcontext_fn)(void*, GrContext*); | 746 typedef void(*grcontext_fn)(void*, GrContext*); |
| 735 typedef void(* void_fn)(void*); | 747 typedef void(* void_fn)(void*); |
| 736 | 748 |
| 737 // All ops implement draw(). | 749 // All ops implement draw(). |
| 738 #define M(T) [](void* op, SkCanvas* c) { ((T*)op)->draw(c); }, | 750 #define M(T) [](void* op, SkCanvas* c, const SkMatrix& original) { ((T*)op)->dra w(c, original); }, |
| 739 static const skcanvas_fn draw_fns[] = { TYPES(M) }; | 751 static const draw_fn draw_fns[] = { TYPES(M) }; |
| 740 #undef M | 752 #undef M |
| 741 | 753 |
| 742 // Ops that implement optimizeFor() or makeThreadsafe() return void from those f unctions; | 754 // Ops that implement optimizeFor() or makeThreadsafe() return void from those f unctions; |
| 743 // the (throwing) defaults return int. | 755 // the (throwing) defaults return int. |
| 744 #define M(T) std::is_void<decltype(((T*)nullptr)->optimizeFor(nullptr))>::value \ | 756 #define M(T) std::is_void<decltype(((T*)nullptr)->optimizeFor(nullptr))>::value \ |
| 745 ? [](void* op, GrContext* ctx) { ((T*)op)->optimizeFor(ctx); } : (grcontext_ fn)nullptr, | 757 ? [](void* op, GrContext* ctx) { ((T*)op)->optimizeFor(ctx); } : (grcontext_ fn)nullptr, |
| 746 static const grcontext_fn optimize_for_fns[] = { TYPES(M) }; | 758 static const grcontext_fn optimize_for_fns[] = { TYPES(M) }; |
| 747 #undef M | 759 #undef M |
| 748 | 760 |
| 749 #define M(T) std::is_void<decltype(((T*)nullptr)->makeThreadsafe())>::value \ | 761 #define M(T) std::is_void<decltype(((T*)nullptr)->makeThreadsafe())>::value \ |
| 750 ? [](void* op) { ((T*)op)->makeThreadsafe(); } : (void_fn)nullptr, | 762 ? [](void* op) { ((T*)op)->makeThreadsafe(); } : (void_fn)nullptr, |
| 751 static const void_fn make_threadsafe_fns[] = { TYPES(M) }; | 763 static const void_fn make_threadsafe_fns[] = { TYPES(M) }; |
| 752 #undef M | 764 #undef M |
| 753 | 765 |
| 754 // Older libstdc++ has pre-standard std::has_trivial_destructor. | 766 // Older libstdc++ has pre-standard std::has_trivial_destructor. |
| 755 #if defined(__GLIBCXX__) && (__GLIBCXX__ < 20130000) | 767 #if defined(__GLIBCXX__) && (__GLIBCXX__ < 20130000) |
| 756 template <typename T> using can_skip_destructor = std::has_trivial_destructo r<T>; | 768 template <typename T> using can_skip_destructor = std::has_trivial_destructo r<T>; |
| 757 #else | 769 #else |
| 758 template <typename T> using can_skip_destructor = std::is_trivially_destruct ible<T>; | 770 template <typename T> using can_skip_destructor = std::is_trivially_destruct ible<T>; |
| 759 #endif | 771 #endif |
| 760 | 772 |
| 761 // Most state ops (matrix, clip, save, restore) have a trivial destructor. | 773 // Most state ops (matrix, clip, save, restore) have a trivial destructor. |
| 762 #define M(T) !can_skip_destructor<T>::value ? [](void* op) { ((T*)op)->~T(); } : (void_fn)nullptr, | 774 #define M(T) !can_skip_destructor<T>::value ? [](void* op) { ((T*)op)->~T(); } : (void_fn)nullptr, |
| 763 static const void_fn dtor_fns[] = { TYPES(M) }; | 775 static const void_fn dtor_fns[] = { TYPES(M) }; |
| 764 #undef M | 776 #undef M |
| 765 | 777 |
| 766 void SkLiteDL::onDraw (SkCanvas* canvas) { this->map(draw_fns, canvas); } | 778 void SkLiteDL::onDraw(SkCanvas* canvas) { |
| 767 void SkLiteDL::optimizeFor (GrContext* ctx) { this->map(optimize_for_fns, ct x); } | 779 SkMatrix original = canvas->getTotalMatrix(); |
| 768 void SkLiteDL::makeThreadsafe() { this->map(make_threadsafe_fns) ; } | 780 this->map(draw_fns, canvas, original); |
| 781 } | |
| 782 void SkLiteDL::optimizeFor (GrContext* ctx) { this->map(optimize_for_fns, ctx) ; } | |
| 783 void SkLiteDL::makeThreadsafe() { this->map(make_threadsafe_fns); } | |
| 769 | 784 |
| 770 SkRect SkLiteDL::onGetBounds() { | 785 SkRect SkLiteDL::onGetBounds() { |
| 771 return fBounds; | 786 return fBounds; |
| 772 } | 787 } |
| 773 | 788 |
| 774 bool SkLiteDL::empty() const { | 789 bool SkLiteDL::empty() const { |
| 775 return fUsed == 0; | 790 return fUsed == 0; |
| 776 } | 791 } |
| 777 | 792 |
| 778 SkLiteDL:: SkLiteDL(SkRect bounds) : fUsed(0), fReserved(0), fBounds(bounds) {} | 793 SkLiteDL:: SkLiteDL(SkRect bounds) : fUsed(0), fReserved(0), fBounds(bounds) {} |
| 779 | 794 |
| 780 SkLiteDL::~SkLiteDL() { | 795 SkLiteDL::~SkLiteDL() { |
| 781 this->reset(SkRect::MakeEmpty()); | 796 this->reset(SkRect::MakeEmpty()); |
| 782 } | 797 } |
| 783 | 798 |
| 784 sk_sp<SkLiteDL> SkLiteDL::New(SkRect bounds) { | 799 sk_sp<SkLiteDL> SkLiteDL::New(SkRect bounds) { |
| 785 return sk_sp<SkLiteDL>(new SkLiteDL(bounds)); | 800 return sk_sp<SkLiteDL>(new SkLiteDL(bounds)); |
| 786 } | 801 } |
| 787 | 802 |
| 788 void SkLiteDL::reset(SkRect bounds) { | 803 void SkLiteDL::reset(SkRect bounds) { |
| 789 SkASSERT(this->unique()); | 804 SkASSERT(this->unique()); |
| 790 this->map(dtor_fns); | 805 this->map(dtor_fns); |
| 791 | 806 |
| 792 // Leave fBytes and fReserved alone. | 807 // Leave fBytes and fReserved alone. |
| 793 fUsed = 0; | 808 fUsed = 0; |
| 794 fBounds = bounds; | 809 fBounds = bounds; |
| 795 } | 810 } |
| OLD | NEW |