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 | 8 |
9 #include "SkAnnotation.h" | 9 #include "SkAnnotation.h" |
10 #include "SkBitmapDevice.h" | 10 #include "SkBitmapDevice.h" |
11 #include "SkBitmapHeap.h" | 11 #include "SkBitmapHeap.h" |
12 #include "SkCanvas.h" | 12 #include "SkCanvas.h" |
13 #include "SkColorFilter.h" | 13 #include "SkColorFilter.h" |
14 #include "SkData.h" | 14 #include "SkData.h" |
15 #include "SkDrawLooper.h" | 15 #include "SkDrawLooper.h" |
16 #include "SkGPipe.h" | 16 #include "SkGPipe.h" |
17 #include "SkGPipePriv.h" | 17 #include "SkGPipePriv.h" |
18 #include "SkImageFilter.h" | 18 #include "SkImageFilter.h" |
19 #include "SkMaskFilter.h" | 19 #include "SkMaskFilter.h" |
20 #include "SkWriteBuffer.h" | 20 #include "SkWriteBuffer.h" |
21 #include "SkPaint.h" | 21 #include "SkPaint.h" |
22 #include "SkPatchUtils.h" | 22 #include "SkPatchUtils.h" |
23 #include "SkPathEffect.h" | 23 #include "SkPathEffect.h" |
24 #include "SkPictureFlat.h" | 24 #include "SkPictureFlat.h" |
25 #include "SkRasterizer.h" | 25 #include "SkRasterizer.h" |
26 #include "SkRRect.h" | 26 #include "SkRRect.h" |
27 #include "SkShader.h" | 27 #include "SkShader.h" |
28 #include "SkStream.h" | 28 #include "SkStream.h" |
| 29 #include "SkTextBlob.h" |
29 #include "SkTSearch.h" | 30 #include "SkTSearch.h" |
30 #include "SkTypeface.h" | 31 #include "SkTypeface.h" |
31 #include "SkWriter32.h" | 32 #include "SkWriter32.h" |
32 | 33 |
33 enum { | 34 enum { |
34 kSizeOfFlatRRect = sizeof(SkRect) + 4 * sizeof(SkVector) | 35 kSizeOfFlatRRect = sizeof(SkRect) + 4 * sizeof(SkVector) |
35 }; | 36 }; |
36 | 37 |
37 static bool isCrossProcess(uint32_t flags) { | 38 static bool isCrossProcess(uint32_t flags) { |
38 return SkToBool(flags & SkGPipeWriter::kCrossProcess_Flag); | 39 return SkToBool(flags & SkGPipeWriter::kCrossProcess_Flag); |
(...skipping 893 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
932 fWriter.writePath(path); | 933 fWriter.writePath(path); |
933 if (matrix) { | 934 if (matrix) { |
934 fWriter.writeMatrix(*matrix); | 935 fWriter.writeMatrix(*matrix); |
935 } | 936 } |
936 } | 937 } |
937 } | 938 } |
938 } | 939 } |
939 | 940 |
940 void SkGPipeCanvas::onDrawTextBlob(const SkTextBlob* blob, SkScalar x, SkScalar
y, | 941 void SkGPipeCanvas::onDrawTextBlob(const SkTextBlob* blob, SkScalar x, SkScalar
y, |
941 const SkPaint& paint) { | 942 const SkPaint& paint) { |
942 // FIXME: blob serialization only supports SkWriteBuffers | 943 NOTIFY_SETUP(this); |
943 // -- convert to SkWriter32 to avoid unrolling? | 944 this->writePaint(paint); |
944 this->INHERITED::onDrawTextBlob(blob, x, y, paint); | 945 |
| 946 // FIXME: this is inefficient but avoids duplicating the blob serialization
logic. |
| 947 SkWriteBuffer blobBuffer; |
| 948 blob->flatten(blobBuffer); |
| 949 |
| 950 size_t size = sizeof(uint32_t) + 2 * sizeof(SkScalar) + blobBuffer.bytesWrit
ten(); |
| 951 if (this->needOpBytes(size)) { |
| 952 this->writeOp(kDrawTextBlob_DrawOp); |
| 953 fWriter.writeScalar(x); |
| 954 fWriter.writeScalar(y); |
| 955 fWriter.write32(SkToU32(blobBuffer.bytesWritten())); |
| 956 uint32_t* pad = fWriter.reservePad(blobBuffer.bytesWritten()); |
| 957 blobBuffer.writeToMemory(pad); |
| 958 } |
945 } | 959 } |
946 | 960 |
947 void SkGPipeCanvas::onDrawPicture(const SkPicture* picture, const SkMatrix* matr
ix, | 961 void SkGPipeCanvas::onDrawPicture(const SkPicture* picture, const SkMatrix* matr
ix, |
948 const SkPaint* paint) { | 962 const SkPaint* paint) { |
949 // we want to playback the picture into individual draw calls | 963 // we want to playback the picture into individual draw calls |
950 // | 964 // |
951 // todo: do we always have to unroll? If the pipe is not cross-process, seem
s like | 965 // todo: do we always have to unroll? If the pipe is not cross-process, seem
s like |
952 // we could just ref the picture and move on...? <reed, scroggo> | 966 // we could just ref the picture and move on...? <reed, scroggo> |
953 // | 967 // |
954 this->INHERITED::onDrawPicture(picture, matrix, paint); | 968 this->INHERITED::onDrawPicture(picture, matrix, paint); |
(...skipping 367 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1322 return fCanvas->shuttleBitmap(bitmap, slot); | 1336 return fCanvas->shuttleBitmap(bitmap, slot); |
1323 } | 1337 } |
1324 | 1338 |
1325 void BitmapShuttle::removeCanvas() { | 1339 void BitmapShuttle::removeCanvas() { |
1326 if (NULL == fCanvas) { | 1340 if (NULL == fCanvas) { |
1327 return; | 1341 return; |
1328 } | 1342 } |
1329 fCanvas->unref(); | 1343 fCanvas->unref(); |
1330 fCanvas = NULL; | 1344 fCanvas = NULL; |
1331 } | 1345 } |
OLD | NEW |