OLD | NEW |
1 | 1 |
2 /* | 2 /* |
3 * Copyright 2006 The Android Open Source Project | 3 * Copyright 2006 The Android Open Source Project |
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 "SkPaint.h" | 9 #include "SkPaint.h" |
10 #include "SkAnnotation.h" | 10 #include "SkAnnotation.h" |
(...skipping 1992 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2003 return (a << 24) | (b << 16) | (c << 8) | d; | 2003 return (a << 24) | (b << 16) | (c << 8) | d; |
2004 } | 2004 } |
2005 | 2005 |
2006 enum FlatFlags { | 2006 enum FlatFlags { |
2007 kHasTypeface_FlatFlag = 0x01, | 2007 kHasTypeface_FlatFlag = 0x01, |
2008 kHasEffects_FlatFlag = 0x02, | 2008 kHasEffects_FlatFlag = 0x02, |
2009 kHasNonDefaultPaintOptionsAndroid_FlatFlag = 0x04, | 2009 kHasNonDefaultPaintOptionsAndroid_FlatFlag = 0x04, |
2010 }; | 2010 }; |
2011 | 2011 |
2012 // The size of a flat paint's POD fields | 2012 // The size of a flat paint's POD fields |
2013 // Include an SkScalar for hinting scale factor whether it is | 2013 static const uint32_t kPODPaintSize = 5 * sizeof(SkScalar) + |
2014 // supported or not so that an SKP is valid whether it was | |
2015 // created with support or not. | |
2016 | |
2017 static const uint32_t kPODPaintSize = 6 * sizeof(SkScalar) + | |
2018 1 * sizeof(SkColor) + | 2014 1 * sizeof(SkColor) + |
2019 1 * sizeof(uint16_t) + | 2015 1 * sizeof(uint16_t) + |
2020 6 * sizeof(uint8_t); | 2016 6 * sizeof(uint8_t); |
2021 | 2017 |
2022 /* To save space/time, we analyze the paint, and write a truncated version of | 2018 /* To save space/time, we analyze the paint, and write a truncated version of |
2023 it if there are not tricky elements like shaders, etc. | 2019 it if there are not tricky elements like shaders, etc. |
2024 */ | 2020 */ |
2025 void SkPaint::flatten(SkFlattenableWriteBuffer& buffer) const { | 2021 void SkPaint::flatten(SkFlattenableWriteBuffer& buffer) const { |
2026 uint8_t flatFlags = 0; | 2022 uint8_t flatFlags = 0; |
2027 if (this->getTypeface()) { | 2023 if (this->getTypeface()) { |
(...skipping 16 matching lines...) Expand all Loading... |
2044 } | 2040 } |
2045 #endif | 2041 #endif |
2046 | 2042 |
2047 if (buffer.isOrderedBinaryBuffer()) { | 2043 if (buffer.isOrderedBinaryBuffer()) { |
2048 SkASSERT(SkAlign4(kPODPaintSize) == kPODPaintSize); | 2044 SkASSERT(SkAlign4(kPODPaintSize) == kPODPaintSize); |
2049 uint32_t* ptr = buffer.getOrderedBinaryBuffer()->reserve(kPODPaintSize); | 2045 uint32_t* ptr = buffer.getOrderedBinaryBuffer()->reserve(kPODPaintSize); |
2050 | 2046 |
2051 ptr = write_scalar(ptr, this->getTextSize()); | 2047 ptr = write_scalar(ptr, this->getTextSize()); |
2052 ptr = write_scalar(ptr, this->getTextScaleX()); | 2048 ptr = write_scalar(ptr, this->getTextScaleX()); |
2053 ptr = write_scalar(ptr, this->getTextSkewX()); | 2049 ptr = write_scalar(ptr, this->getTextSkewX()); |
2054 // Dummy value for obsolete hinting scale factor. TODO: remove with nex
t picture version | |
2055 ptr = write_scalar(ptr, SK_Scalar1); | |
2056 ptr = write_scalar(ptr, this->getStrokeWidth()); | 2050 ptr = write_scalar(ptr, this->getStrokeWidth()); |
2057 ptr = write_scalar(ptr, this->getStrokeMiter()); | 2051 ptr = write_scalar(ptr, this->getStrokeMiter()); |
2058 *ptr++ = this->getColor(); | 2052 *ptr++ = this->getColor(); |
2059 // previously flags:16, textAlign:8, flatFlags:8 | 2053 // previously flags:16, textAlign:8, flatFlags:8 |
2060 // now flags:16, hinting:4, textAlign:4, flatFlags:8 | 2054 // now flags:16, hinting:4, textAlign:4, flatFlags:8 |
2061 *ptr++ = (this->getFlags() << 16) | | 2055 *ptr++ = (this->getFlags() << 16) | |
2062 // hinting added later. 0 in this nibble means use the default. | 2056 // hinting added later. 0 in this nibble means use the default. |
2063 ((this->getHinting()+1) << 12) | | 2057 ((this->getHinting()+1) << 12) | |
2064 (this->getTextAlign() << 8) | | 2058 (this->getTextAlign() << 8) | |
2065 flatFlags; | 2059 flatFlags; |
2066 *ptr++ = pack_4(this->getStrokeCap(), this->getStrokeJoin(), | 2060 *ptr++ = pack_4(this->getStrokeCap(), this->getStrokeJoin(), |
2067 this->getStyle(), this->getTextEncoding()); | 2061 this->getStyle(), this->getTextEncoding()); |
2068 } else { | 2062 } else { |
2069 buffer.writeScalar(fTextSize); | 2063 buffer.writeScalar(fTextSize); |
2070 buffer.writeScalar(fTextScaleX); | 2064 buffer.writeScalar(fTextScaleX); |
2071 buffer.writeScalar(fTextSkewX); | 2065 buffer.writeScalar(fTextSkewX); |
2072 // Dummy value for obsolete hinting scale factor. TODO: remove with nex
t picture version | |
2073 buffer.writeScalar(SK_Scalar1); | |
2074 buffer.writeScalar(fWidth); | 2066 buffer.writeScalar(fWidth); |
2075 buffer.writeScalar(fMiterLimit); | 2067 buffer.writeScalar(fMiterLimit); |
2076 buffer.writeColor(fColor); | 2068 buffer.writeColor(fColor); |
2077 buffer.writeUInt(fFlags); | 2069 buffer.writeUInt(fFlags); |
2078 buffer.writeUInt(fHinting); | 2070 buffer.writeUInt(fHinting); |
2079 buffer.writeUInt(fTextAlign); | 2071 buffer.writeUInt(fTextAlign); |
2080 buffer.writeUInt(flatFlags); | 2072 buffer.writeUInt(flatFlags); |
2081 | 2073 |
2082 buffer.writeUInt(fCapType); | 2074 buffer.writeUInt(fCapType); |
2083 buffer.writeUInt(fJoinType); | 2075 buffer.writeUInt(fJoinType); |
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2120 uint8_t flatFlags = 0; | 2112 uint8_t flatFlags = 0; |
2121 if (buffer.isOrderedBinaryBuffer()) { | 2113 if (buffer.isOrderedBinaryBuffer()) { |
2122 SkASSERT(SkAlign4(kPODPaintSize) == kPODPaintSize); | 2114 SkASSERT(SkAlign4(kPODPaintSize) == kPODPaintSize); |
2123 const void* podData = buffer.getOrderedBinaryBuffer()->skip(kPODPaintSiz
e); | 2115 const void* podData = buffer.getOrderedBinaryBuffer()->skip(kPODPaintSiz
e); |
2124 const uint32_t* pod = reinterpret_cast<const uint32_t*>(podData); | 2116 const uint32_t* pod = reinterpret_cast<const uint32_t*>(podData); |
2125 | 2117 |
2126 // the order we read must match the order we wrote in flatten() | 2118 // the order we read must match the order we wrote in flatten() |
2127 this->setTextSize(read_scalar(pod)); | 2119 this->setTextSize(read_scalar(pod)); |
2128 this->setTextScaleX(read_scalar(pod)); | 2120 this->setTextScaleX(read_scalar(pod)); |
2129 this->setTextSkewX(read_scalar(pod)); | 2121 this->setTextSkewX(read_scalar(pod)); |
2130 // Skip the hinting scalar factor, which is not supported. | |
2131 read_scalar(pod); | |
2132 this->setStrokeWidth(read_scalar(pod)); | 2122 this->setStrokeWidth(read_scalar(pod)); |
2133 this->setStrokeMiter(read_scalar(pod)); | 2123 this->setStrokeMiter(read_scalar(pod)); |
2134 this->setColor(*pod++); | 2124 this->setColor(*pod++); |
2135 | 2125 |
2136 // previously flags:16, textAlign:8, flatFlags:8 | 2126 // previously flags:16, textAlign:8, flatFlags:8 |
2137 // now flags:16, hinting:4, textAlign:4, flatFlags:8 | 2127 // now flags:16, hinting:4, textAlign:4, flatFlags:8 |
2138 uint32_t tmp = *pod++; | 2128 uint32_t tmp = *pod++; |
2139 this->setFlags(tmp >> 16); | 2129 this->setFlags(tmp >> 16); |
2140 | 2130 |
2141 // hinting added later. 0 in this nibble means use the default. | 2131 // hinting added later. 0 in this nibble means use the default. |
(...skipping 462 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2604 case SkXfermode::kPlus_Mode: | 2594 case SkXfermode::kPlus_Mode: |
2605 return 0 == this->getAlpha(); | 2595 return 0 == this->getAlpha(); |
2606 case SkXfermode::kDst_Mode: | 2596 case SkXfermode::kDst_Mode: |
2607 return true; | 2597 return true; |
2608 default: | 2598 default: |
2609 break; | 2599 break; |
2610 } | 2600 } |
2611 } | 2601 } |
2612 return false; | 2602 return false; |
2613 } | 2603 } |
OLD | NEW |