| OLD | NEW |
| 1 /* | 1 /* |
| 2 * Copyright 2011 Google Inc. | 2 * Copyright 2011 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 "SkPDFDevice.h" | 8 #include "SkPDFDevice.h" |
| 9 | 9 |
| 10 #include "SkAnnotation.h" | 10 #include "SkAnnotation.h" |
| (...skipping 1857 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1868 entry->fNext.reset(contentEntries->detach()); | 1868 entry->fNext.reset(contentEntries->detach()); |
| 1869 contentEntries->reset(entry); | 1869 contentEntries->reset(entry); |
| 1870 } else { | 1870 } else { |
| 1871 lastContentEntry->fNext.reset(entry); | 1871 lastContentEntry->fNext.reset(entry); |
| 1872 setLastContentEntry(entry); | 1872 setLastContentEntry(entry); |
| 1873 } | 1873 } |
| 1874 newEntry.detach(); | 1874 newEntry.detach(); |
| 1875 return entry; | 1875 return entry; |
| 1876 } | 1876 } |
| 1877 | 1877 |
| 1878 void SkPDFDevice::finishContentEntry(const SkXfermode::Mode xfermode, | 1878 void SkPDFDevice::finishContentEntry(SkXfermode::Mode xfermode, |
| 1879 SkPDFFormXObject* dst, | 1879 SkPDFFormXObject* dst, |
| 1880 SkPath* shape) { | 1880 SkPath* shape) { |
| 1881 if (xfermode != SkXfermode::kClear_Mode && | 1881 if (xfermode != SkXfermode::kClear_Mode && |
| 1882 xfermode != SkXfermode::kSrc_Mode && | 1882 xfermode != SkXfermode::kSrc_Mode && |
| 1883 xfermode != SkXfermode::kDstOver_Mode && |
| 1883 xfermode != SkXfermode::kSrcIn_Mode && | 1884 xfermode != SkXfermode::kSrcIn_Mode && |
| 1884 xfermode != SkXfermode::kDstIn_Mode && | 1885 xfermode != SkXfermode::kDstIn_Mode && |
| 1885 xfermode != SkXfermode::kSrcOut_Mode && | 1886 xfermode != SkXfermode::kSrcOut_Mode && |
| 1886 xfermode != SkXfermode::kDstOut_Mode && | 1887 xfermode != SkXfermode::kDstOut_Mode && |
| 1887 xfermode != SkXfermode::kSrcATop_Mode && | 1888 xfermode != SkXfermode::kSrcATop_Mode && |
| 1888 xfermode != SkXfermode::kDstATop_Mode && | 1889 xfermode != SkXfermode::kDstATop_Mode && |
| 1889 xfermode != SkXfermode::kModulate_Mode) { | 1890 xfermode != SkXfermode::kModulate_Mode) { |
| 1890 SkASSERT(!dst); | 1891 SkASSERT(!dst); |
| 1891 return; | 1892 return; |
| 1892 } | 1893 } |
| 1894 if (xfermode == SkXfermode::kDstOver_Mode) { |
| 1895 SkASSERT(!dst); |
| 1896 ContentEntry* firstContentEntry = getContentEntries()->get(); |
| 1897 if (firstContentEntry->fContent.getOffset() == 0) { |
| 1898 // For DstOver, an empty content entry was inserted before the rest |
| 1899 // of the content entries. If nothing was drawn, it needs to be |
| 1900 // removed. |
| 1901 SkAutoTDelete<ContentEntry>* contentEntries = getContentEntries(); |
| 1902 contentEntries->reset(firstContentEntry->fNext.detach()); |
| 1903 } |
| 1904 return; |
| 1905 } |
| 1893 if (!dst) { | 1906 if (!dst) { |
| 1894 SkASSERT(xfermode == SkXfermode::kSrc_Mode || | 1907 SkASSERT(xfermode == SkXfermode::kSrc_Mode || |
| 1895 xfermode == SkXfermode::kSrcOut_Mode); | 1908 xfermode == SkXfermode::kSrcOut_Mode); |
| 1896 return; | 1909 return; |
| 1897 } | 1910 } |
| 1898 | 1911 |
| 1899 ContentEntry* contentEntries = getContentEntries()->get(); | 1912 ContentEntry* contentEntries = getContentEntries()->get(); |
| 1900 SkASSERT(dst); | 1913 SkASSERT(dst); |
| 1901 SkASSERT(!contentEntries->fNext.get()); | 1914 SkASSERT(!contentEntries->fNext.get()); |
| 1902 // We have to make a copy of these here because changing the current | 1915 // We have to make a copy of these here because changing the current |
| 1903 // content into a form-xobject will destroy them. | 1916 // content into a form-xobject will destroy them. |
| 1904 SkClipStack clipStack = contentEntries->fState.fClipStack; | 1917 SkClipStack clipStack = contentEntries->fState.fClipStack; |
| 1905 SkRegion clipRegion = contentEntries->fState.fClipRegion; | 1918 SkRegion clipRegion = contentEntries->fState.fClipRegion; |
| 1906 | 1919 |
| 1920 SkMatrix identity; |
| 1921 identity.reset(); |
| 1922 SkPaint stockPaint; |
| 1923 |
| 1907 SkAutoTUnref<SkPDFFormXObject> srcFormXObject; | 1924 SkAutoTUnref<SkPDFFormXObject> srcFormXObject; |
| 1908 if (isContentEmpty()) { | 1925 if (isContentEmpty()) { |
| 1909 SkASSERT(xfermode == SkXfermode::kClear_Mode); | 1926 // If nothing was drawn and there's no shape, then the draw was a |
| 1927 // no-op, but dst needs to be restored for that to be true. |
| 1928 // If there is shape, then an empty source with Src, SrcIn, SrcOut, |
| 1929 // DstIn, DstAtop or Modulate reduces to Clear and DstOut or SrcAtop |
| 1930 // reduces to Dst. |
| 1931 if (shape == NULL || xfermode == SkXfermode::kDstOut_Mode || |
| 1932 xfermode == SkXfermode::kSrcATop_Mode) { |
| 1933 ScopedContentEntry content(this, &clipStack, clipRegion, identity, |
| 1934 stockPaint); |
| 1935 SkPDFUtils::DrawFormXObject(this->addXObjectResource(dst), |
| 1936 &content.entry()->fContent); |
| 1937 return; |
| 1938 } else { |
| 1939 xfermode = SkXfermode::kClear_Mode; |
| 1940 } |
| 1910 } else { | 1941 } else { |
| 1911 SkASSERT(!fContentEntries->fNext.get()); | 1942 SkASSERT(!fContentEntries->fNext.get()); |
| 1912 srcFormXObject.reset(createFormXObjectFromDevice()); | 1943 srcFormXObject.reset(createFormXObjectFromDevice()); |
| 1913 } | 1944 } |
| 1914 | 1945 |
| 1915 SkMatrix identity; | |
| 1916 identity.reset(); | |
| 1917 | |
| 1918 // TODO(vandebo) srcFormXObject may contain alpha, but here we want it | 1946 // TODO(vandebo) srcFormXObject may contain alpha, but here we want it |
| 1919 // without alpha. | 1947 // without alpha. |
| 1920 if (xfermode == SkXfermode::kSrcATop_Mode) { | 1948 if (xfermode == SkXfermode::kSrcATop_Mode) { |
| 1921 // TODO(vandebo): In order to properly support SrcATop we have to track | 1949 // TODO(vandebo): In order to properly support SrcATop we have to track |
| 1922 // the shape of what's been drawn at all times. It's the intersection of | 1950 // the shape of what's been drawn at all times. It's the intersection of |
| 1923 // the non-transparent parts of the device and the outlines (shape) of | 1951 // the non-transparent parts of the device and the outlines (shape) of |
| 1924 // all images and devices drawn. | 1952 // all images and devices drawn. |
| 1925 drawFormXObjectWithMask(addXObjectResource(srcFormXObject.get()), dst, | 1953 drawFormXObjectWithMask(addXObjectResource(srcFormXObject.get()), dst, |
| 1926 &clipStack, clipRegion, | 1954 &clipStack, clipRegion, |
| 1927 SkXfermode::kSrcOver_Mode, true); | 1955 SkXfermode::kSrcOver_Mode, true); |
| (...skipping 11 matching lines...) Expand all Loading... |
| 1939 filledPaint.setStyle(SkPaint::kFill_Style); | 1967 filledPaint.setStyle(SkPaint::kFill_Style); |
| 1940 this->drawPath(d, *shape, filledPaint, NULL, true); | 1968 this->drawPath(d, *shape, filledPaint, NULL, true); |
| 1941 | 1969 |
| 1942 dstMaskStorage.reset(createFormXObjectFromDevice()); | 1970 dstMaskStorage.reset(createFormXObjectFromDevice()); |
| 1943 dstMask = dstMaskStorage.get(); | 1971 dstMask = dstMaskStorage.get(); |
| 1944 } | 1972 } |
| 1945 drawFormXObjectWithMask(addXObjectResource(dst), dstMask, &clipStack, | 1973 drawFormXObjectWithMask(addXObjectResource(dst), dstMask, &clipStack, |
| 1946 clipRegion, SkXfermode::kSrcOver_Mode, true); | 1974 clipRegion, SkXfermode::kSrcOver_Mode, true); |
| 1947 } | 1975 } |
| 1948 | 1976 |
| 1949 SkPaint stockPaint; | 1977 if (xfermode == SkXfermode::kClear_Mode) { |
| 1950 | |
| 1951 if (xfermode == SkXfermode::kSrcATop_Mode) { | |
| 1952 ScopedContentEntry content(this, &clipStack, clipRegion, identity, | |
| 1953 stockPaint); | |
| 1954 if (content.entry()) { | |
| 1955 SkPDFUtils::DrawFormXObject(this->addXObjectResource(dst), | |
| 1956 &content.entry()->fContent); | |
| 1957 } | |
| 1958 } else if (xfermode == SkXfermode::kClear_Mode || !srcFormXObject.get()) { | |
| 1959 return; | 1978 return; |
| 1960 } else if (xfermode == SkXfermode::kSrc_Mode || | 1979 } else if (xfermode == SkXfermode::kSrc_Mode || |
| 1961 xfermode == SkXfermode::kDstATop_Mode) { | 1980 xfermode == SkXfermode::kDstATop_Mode) { |
| 1962 ScopedContentEntry content(this, &clipStack, clipRegion, identity, | 1981 ScopedContentEntry content(this, &clipStack, clipRegion, identity, |
| 1963 stockPaint); | 1982 stockPaint); |
| 1964 if (content.entry()) { | 1983 if (content.entry()) { |
| 1965 SkPDFUtils::DrawFormXObject( | 1984 SkPDFUtils::DrawFormXObject( |
| 1966 this->addXObjectResource(srcFormXObject.get()), | 1985 this->addXObjectResource(srcFormXObject.get()), |
| 1967 &content.entry()->fContent); | 1986 &content.entry()->fContent); |
| 1968 } | 1987 } |
| 1969 if (xfermode == SkXfermode::kSrc_Mode) { | 1988 if (xfermode == SkXfermode::kSrc_Mode) { |
| 1970 return; | 1989 return; |
| 1971 } | 1990 } |
| 1991 } else if (xfermode == SkXfermode::kSrcATop_Mode) { |
| 1992 ScopedContentEntry content(this, &clipStack, clipRegion, identity, |
| 1993 stockPaint); |
| 1994 if (content.entry()) { |
| 1995 SkPDFUtils::DrawFormXObject(this->addXObjectResource(dst), |
| 1996 &content.entry()->fContent); |
| 1997 } |
| 1972 } | 1998 } |
| 1973 | 1999 |
| 1974 SkASSERT(xfermode == SkXfermode::kSrcIn_Mode || | 2000 SkASSERT(xfermode == SkXfermode::kSrcIn_Mode || |
| 1975 xfermode == SkXfermode::kDstIn_Mode || | 2001 xfermode == SkXfermode::kDstIn_Mode || |
| 1976 xfermode == SkXfermode::kSrcOut_Mode || | 2002 xfermode == SkXfermode::kSrcOut_Mode || |
| 1977 xfermode == SkXfermode::kDstOut_Mode || | 2003 xfermode == SkXfermode::kDstOut_Mode || |
| 1978 xfermode == SkXfermode::kSrcATop_Mode || | 2004 xfermode == SkXfermode::kSrcATop_Mode || |
| 1979 xfermode == SkXfermode::kDstATop_Mode || | 2005 xfermode == SkXfermode::kDstATop_Mode || |
| 1980 xfermode == SkXfermode::kModulate_Mode); | 2006 xfermode == SkXfermode::kModulate_Mode); |
| 1981 | 2007 |
| (...skipping 322 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2304 } | 2330 } |
| 2305 | 2331 |
| 2306 bool SkPDFDevice::onReadPixels(const SkBitmap& bitmap, int x, int y, | 2332 bool SkPDFDevice::onReadPixels(const SkBitmap& bitmap, int x, int y, |
| 2307 SkCanvas::Config8888) { | 2333 SkCanvas::Config8888) { |
| 2308 return false; | 2334 return false; |
| 2309 } | 2335 } |
| 2310 | 2336 |
| 2311 bool SkPDFDevice::allowImageFilter(SkImageFilter*) { | 2337 bool SkPDFDevice::allowImageFilter(SkImageFilter*) { |
| 2312 return false; | 2338 return false; |
| 2313 } | 2339 } |
| OLD | NEW |