OLD | NEW |
(Empty) | |
| 1 /* |
| 2 * Copyright 2016 Google Inc. |
| 3 * |
| 4 * Use of this source code is governed by a BSD-style license that can be |
| 5 * found in the LICENSE file. |
| 6 */ |
| 7 |
| 8 #include "SkCanvas.h" |
| 9 #include "SkPipeFormat.h" |
| 10 #include "SkReadBuffer.h" |
| 11 |
| 12 class SkPipeReader { |
| 13 public: |
| 14 |
| 15 bool parse(SkReadBuffer&, SkCanvas*); |
| 16 }; |
| 17 |
| 18 template <typename T> const T* skip(SkReadBuffer& reader, int count) { |
| 19 return (const T*)reader.skip(count * sizeof(T)); |
| 20 } |
| 21 |
| 22 template <typename T> const T* skip(SkReadBuffer& reader) { |
| 23 return (const T*)reader.skip(sizeof(T)); |
| 24 } |
| 25 |
| 26 static SkRRect read_rrect(SkReadBuffer& reader) { |
| 27 SkRRect rrect; |
| 28 rrect.readFromMemory(reader.skip(SkRRect::kSizeInMemory), SkRRect::kSizeInMe
mory); |
| 29 return rrect; |
| 30 } |
| 31 |
| 32 ////////////////////////////////////////////////////////////////////////////////
/////////////////// |
| 33 |
| 34 #define CHECK_SET_SCALAR(Field) \ |
| 35 do { if (nondef & k##Field##_NonDef) { \ |
| 36 paint.set##Field(reader.readScalar()); \ |
| 37 }} while (0) |
| 38 |
| 39 #define CHECK_SET_FLATTENABLE(Field) \ |
| 40 do { if (nondef & k##Field##_NonDef) { \ |
| 41 paint.set##Field(reader.read##Field()); \ |
| 42 }} while (0) |
| 43 |
| 44 /* |
| 45 * Header: |
| 46 * paint flags : 32 |
| 47 * non_def bits : 16 |
| 48 * xfermode enum : 8 |
| 49 * pad zeros : 8 |
| 50 */ |
| 51 static SkPaint read_paint(SkReadBuffer& reader) { |
| 52 uint32_t packedFlags = reader.read32(); |
| 53 uint32_t extra = reader.read32(); |
| 54 unsigned nondef = extra >> 16; |
| 55 SkXfermode::Mode mode = (SkXfermode::Mode)((extra >> 8) & 0xFF); |
| 56 SkASSERT((extra & 0xFF) == 0); |
| 57 |
| 58 SkPaint paint; |
| 59 |
| 60 packedFlags >>= 6; |
| 61 paint.setStrokeJoin((SkPaint::Join)(packedFlags & 3)); packedFlags >>=
2; |
| 62 paint.setStrokeCap((SkPaint::Cap)(packedFlags & 3)); packedFlags >>=
2; |
| 63 paint.setFilterQuality((SkFilterQuality)(packedFlags & 3)); packedFlags >>=
2; |
| 64 paint.setTextAlign((SkPaint::Align)(packedFlags & 3)); packedFlags >>=
2; |
| 65 paint.setHinting((SkPaint::Hinting)(packedFlags & 2)); packedFlags >>=
2; |
| 66 paint.setFlags(packedFlags); |
| 67 |
| 68 CHECK_SET_SCALAR(TextSize); |
| 69 CHECK_SET_SCALAR(TextScaleX); |
| 70 CHECK_SET_SCALAR(TextSkewX); |
| 71 CHECK_SET_SCALAR(StrokeWidth); |
| 72 CHECK_SET_SCALAR(StrokeMiter); |
| 73 |
| 74 if (nondef & kColor_NonDef) { |
| 75 paint.setColor(reader.read32()); |
| 76 } |
| 77 if (nondef & kTypeface_NonDef) { |
| 78 } |
| 79 |
| 80 CHECK_SET_FLATTENABLE(PathEffect); |
| 81 CHECK_SET_FLATTENABLE(Shader); |
| 82 CHECK_SET_FLATTENABLE(Xfermode); |
| 83 CHECK_SET_FLATTENABLE(MaskFilter); |
| 84 CHECK_SET_FLATTENABLE(ColorFilter); |
| 85 CHECK_SET_FLATTENABLE(Rasterizer); |
| 86 CHECK_SET_FLATTENABLE(ImageFilter); |
| 87 |
| 88 if (!(nondef & kXfermode_NonDef)) { |
| 89 paint.setXfermodeMode(mode); |
| 90 } |
| 91 |
| 92 return paint; |
| 93 } |
| 94 |
| 95 ////////////////////////////////////////////////////////////////////////////////
/////////////////// |
| 96 |
| 97 typedef void (*SkPipeHandler)(SkReadBuffer&, uint32_t packedVerb, SkCanvas*); |
| 98 |
| 99 static void save_handler(SkReadBuffer& reader, uint32_t packedVerb, SkCanvas* ca
nvas) { |
| 100 SkASSERT(kSave_Verb == unpack_verb(packedVerb)); |
| 101 canvas->save(); |
| 102 } |
| 103 |
| 104 static void restore_handler(SkReadBuffer& reader, uint32_t packedVerb, SkCanvas*
canvas) { |
| 105 SkASSERT(kRestore_Verb == unpack_verb(packedVerb)); |
| 106 canvas->restore(); |
| 107 } |
| 108 |
| 109 static void concat_handler(SkReadBuffer& reader, uint32_t packedVerb, SkCanvas*
canvas) { |
| 110 SkASSERT(kConcat_Verb == unpack_verb(packedVerb)); |
| 111 SkMatrix::TypeMask tm = (SkMatrix::TypeMask)unpack_verb_extra(packedVerb); |
| 112 |
| 113 SkMatrix matrix; |
| 114 matrix.reset(); |
| 115 if (tm & SkMatrix::kPerspective_Mask) { |
| 116 matrix.set9(skip<SkScalar>(reader, 9)); |
| 117 } else if (tm & SkMatrix::kAffine_Mask) { |
| 118 const SkScalar* tmp = skip<SkScalar>(reader, 6); |
| 119 matrix[SkMatrix::kMScaleX] = tmp[0]; |
| 120 matrix[SkMatrix::kMSkewX] = tmp[1]; |
| 121 matrix[SkMatrix::kMTransX] = tmp[2]; |
| 122 matrix[SkMatrix::kMScaleY] = tmp[3]; |
| 123 matrix[SkMatrix::kMSkewY] = tmp[4]; |
| 124 matrix[SkMatrix::kMTransY] = tmp[5]; |
| 125 } else if (tm & SkMatrix::kScale_Mask) { |
| 126 const SkScalar* tmp = skip<SkScalar>(reader, 4); |
| 127 matrix[SkMatrix::kMScaleX] = tmp[0]; |
| 128 matrix[SkMatrix::kMTransX] = tmp[1]; |
| 129 matrix[SkMatrix::kMScaleY] = tmp[2]; |
| 130 matrix[SkMatrix::kMTransY] = tmp[3]; |
| 131 } else if (tm & SkMatrix::kTranslate_Mask) { |
| 132 const SkScalar* tmp = skip<SkScalar>(reader, 2); |
| 133 matrix[SkMatrix::kMTransX] = tmp[0]; |
| 134 matrix[SkMatrix::kMTransY] = tmp[1]; |
| 135 } |
| 136 canvas->concat(matrix); |
| 137 } |
| 138 |
| 139 static void clipRect_handler(SkReadBuffer& reader, uint32_t packedVerb, SkCanvas
* canvas) { |
| 140 SkASSERT(kClipRect_Verb == unpack_verb(packedVerb)); |
| 141 SkRegion::Op op = (SkRegion::Op)(unpack_verb_extra(packedVerb) >> 1); |
| 142 bool isAA = unpack_verb_extra(packedVerb) & 1; |
| 143 canvas->clipRect(*skip<SkRect>(reader), op, isAA); |
| 144 } |
| 145 |
| 146 static void clipRRect_handler(SkReadBuffer& reader, uint32_t packedVerb, SkCanva
s* canvas) { |
| 147 SkASSERT(kClipRect_Verb == unpack_verb(packedVerb)); |
| 148 SkRegion::Op op = (SkRegion::Op)(unpack_verb_extra(packedVerb) >> 1); |
| 149 bool isAA = unpack_verb_extra(packedVerb) & 1; |
| 150 canvas->clipRRect(read_rrect(reader), op, isAA); |
| 151 } |
| 152 |
| 153 static void clipPath_handler(SkReadBuffer& reader, uint32_t packedVerb, SkCanvas
* canvas) { |
| 154 SkASSERT(kClipRect_Verb == unpack_verb(packedVerb)); |
| 155 SkRegion::Op op = (SkRegion::Op)(unpack_verb_extra(packedVerb) >> 1); |
| 156 bool isAA = unpack_verb_extra(packedVerb) & 1; |
| 157 SkPath path; |
| 158 reader.readPath(&path); |
| 159 canvas->clipPath(path, op, isAA); |
| 160 } |
| 161 |
| 162 static void clipRegion_handler(SkReadBuffer& reader, uint32_t packedVerb, SkCanv
as* canvas) { |
| 163 SkASSERT(kClipRect_Verb == unpack_verb(packedVerb)); |
| 164 SkRegion::Op op = (SkRegion::Op)(unpack_verb_extra(packedVerb) >> 1); |
| 165 SkRegion region; |
| 166 reader.readRegion(®ion); |
| 167 canvas->clipRegion(region, op); |
| 168 } |
| 169 |
| 170 static void drawDRRect_handler(SkReadBuffer& reader, uint32_t packedVerb, SkCanv
as* canvas) { |
| 171 SkASSERT(kDrawDRRect_Verb == unpack_verb(packedVerb)); |
| 172 const SkRRect* outer = skip<SkRRect>(reader); |
| 173 const SkRRect* inner = skip<SkRRect>(reader); |
| 174 canvas->drawDRRect(*outer, *inner, read_paint(reader)); |
| 175 } |
| 176 |
| 177 static void drawText_handler(SkReadBuffer& reader, uint32_t packedVerb, SkCanvas
* canvas) { |
| 178 SkASSERT(kDrawText_Verb == unpack_verb(packedVerb)); |
| 179 uint32_t len = unpack_verb_extra(packedVerb); |
| 180 if (0 == len) { |
| 181 len = reader.read32(); |
| 182 } |
| 183 const void* text = reader.skip(SkAlign4(len)); |
| 184 SkScalar x = reader.readScalar(); |
| 185 SkScalar y = reader.readScalar(); |
| 186 canvas->drawText(text, len, x, y, read_paint(reader)); |
| 187 } |
| 188 |
| 189 static void drawPosText_handler(SkReadBuffer& reader, uint32_t packedVerb, SkCan
vas* canvas) { |
| 190 SkASSERT(kDrawPosText_Verb == unpack_verb(packedVerb)); |
| 191 uint32_t len = unpack_verb_extra(packedVerb); |
| 192 if (0 == len) { |
| 193 len = reader.read32(); |
| 194 } |
| 195 const void* text = reader.skip(SkAlign4(len)); |
| 196 int count = reader.read32(); |
| 197 const SkPoint* pos = skip<SkPoint>(reader); |
| 198 SkPaint paint = read_paint(reader); |
| 199 SkASSERT(paint.countText(text, len) == count); |
| 200 canvas->drawPosText(text, len, pos, paint); |
| 201 } |
| 202 |
| 203 static void drawPosTextH_handler(SkReadBuffer& reader, uint32_t packedVerb, SkCa
nvas* canvas) { |
| 204 SkASSERT(kDrawPosTextH_Verb == unpack_verb(packedVerb)); |
| 205 uint32_t len = unpack_verb_extra(packedVerb); |
| 206 if (0 == len) { |
| 207 len = reader.read32(); |
| 208 } |
| 209 const void* text = reader.skip(SkAlign4(len)); |
| 210 int count = reader.read32(); |
| 211 const SkScalar* xpos = skip<SkScalar>(reader); |
| 212 SkScalar constY = reader.readScalar(); |
| 213 SkPaint paint = read_paint(reader); |
| 214 SkASSERT(paint.countText(text, len) == count); |
| 215 canvas->drawPosTextH(text, len, xpos, constY, paint); |
| 216 } |
| 217 |
| 218 static void drawTextOnPath_handler(SkReadBuffer& reader, uint32_t packedVerb, Sk
Canvas* canvas) { |
| 219 sk_throw(); |
| 220 } |
| 221 |
| 222 static void drawTextBlob_handler(SkReadBuffer& reader, uint32_t packedVerb, SkCa
nvas* canvas) { |
| 223 sk_throw(); |
| 224 } |
| 225 |
| 226 static void drawTextRSXform_handler(SkReadBuffer& reader, uint32_t packedVerb, S
kCanvas* canvas) { |
| 227 sk_throw(); |
| 228 } |
| 229 |
| 230 static void drawPatch_handler(SkReadBuffer& reader, uint32_t packedVerb, SkCanva
s* canvas) { |
| 231 sk_throw(); |
| 232 } |
| 233 |
| 234 static void drawPaint_handler(SkReadBuffer& reader, uint32_t packedVerb, SkCanva
s* canvas) { |
| 235 sk_throw(); |
| 236 } |
| 237 |
| 238 static void drawRect_handler(SkReadBuffer& reader, uint32_t packedVerb, SkCanvas
* canvas) { |
| 239 sk_throw(); |
| 240 } |
| 241 |
| 242 static void drawOval_handler(SkReadBuffer& reader, uint32_t packedVerb, SkCanvas
* canvas) { |
| 243 sk_throw(); |
| 244 } |
| 245 |
| 246 static void drawRRect_handler(SkReadBuffer& reader, uint32_t packedVerb, SkCanva
s* canvas) { |
| 247 sk_throw(); |
| 248 } |
| 249 |
| 250 static void drawPath_handler(SkReadBuffer& reader, uint32_t packedVerb, SkCanvas
* canvas) { |
| 251 sk_throw(); |
| 252 } |
| 253 |
| 254 static void drawPoints_handler(SkReadBuffer& reader, uint32_t packedVerb, SkCanv
as* canvas) { |
| 255 sk_throw(); |
| 256 } |
| 257 |
| 258 static void drawImage_handler(SkReadBuffer& reader, uint32_t packedVerb, SkCanva
s* canvas) { |
| 259 sk_throw(); |
| 260 } |
| 261 |
| 262 static void drawImageRect_handler(SkReadBuffer& reader, uint32_t packedVerb, SkC
anvas* canvas) { |
| 263 sk_throw(); |
| 264 } |
| 265 |
| 266 static void drawImageNine_handler(SkReadBuffer& reader, uint32_t packedVerb, SkC
anvas* canvas) { |
| 267 sk_throw(); |
| 268 } |
| 269 |
| 270 static void drawVertices_handler(SkReadBuffer& reader, uint32_t packedVerb, SkCa
nvas* canvas) { |
| 271 sk_throw(); |
| 272 } |
| 273 |
| 274 static void drawPicture_handler(SkReadBuffer& reader, uint32_t packedVerb, SkCan
vas* canvas) { |
| 275 sk_throw(); |
| 276 } |
| 277 |
| 278 static void drawAnnotation_handler(SkReadBuffer& reader, uint32_t packedVerb, Sk
Canvas* canvas) { |
| 279 sk_throw(); |
| 280 } |
| 281 |
| 282 const SkPipeHandler gPipeHandlers[] = { |
| 283 save_handler, |
| 284 restore_handler, |
| 285 concat_handler, |
| 286 |
| 287 clipRect_handler, |
| 288 clipRRect_handler, |
| 289 clipPath_handler, |
| 290 clipRegion_handler, |
| 291 |
| 292 drawDRRect_handler, |
| 293 drawText_handler, |
| 294 drawPosText_handler, |
| 295 drawPosTextH_handler, |
| 296 drawTextOnPath_handler, |
| 297 drawTextBlob_handler, |
| 298 drawTextRSXform_handler, |
| 299 drawPatch_handler, |
| 300 drawPaint_handler, |
| 301 drawPoints_handler, |
| 302 drawRect_handler, |
| 303 drawPath_handler, |
| 304 drawOval_handler, |
| 305 drawRRect_handler, |
| 306 |
| 307 drawImage_handler, |
| 308 drawImageRect_handler, |
| 309 drawImageNine_handler, |
| 310 |
| 311 drawVertices_handler, |
| 312 |
| 313 drawPicture_handler, |
| 314 drawAnnotation_handler, |
| 315 }; |
| 316 |
| 317 ////////////////////////////////////////////////////////////////////////////////
/////////////////// |
| 318 |
| 319 bool SkPipeReader::parse(SkReadBuffer& reader, SkCanvas* canvas) { |
| 320 while (!reader.eof()) { |
| 321 uint32_t packedVerb = reader.read32(); |
| 322 Verb verb = unpack_verb(packedVerb); |
| 323 if (verb > SK_ARRAY_COUNT(gPipeHandlers)) { |
| 324 return false; |
| 325 } |
| 326 gPipeHandlers[verb](reader, packedVerb, canvas); |
| 327 if (!reader.isValid()) { |
| 328 return false; |
| 329 } |
| 330 } |
| 331 return true; |
| 332 } |
OLD | NEW |