1d0fb9fc8829373b88adf55224fde0e456a9d8665Chris Craik/*
2d0fb9fc8829373b88adf55224fde0e456a9d8665Chris Craik * Copyright 2011, The Android Open Source Project
3d0fb9fc8829373b88adf55224fde0e456a9d8665Chris Craik *
4d0fb9fc8829373b88adf55224fde0e456a9d8665Chris Craik * Redistribution and use in source and binary forms, with or without
5d0fb9fc8829373b88adf55224fde0e456a9d8665Chris Craik * modification, are permitted provided that the following conditions
6d0fb9fc8829373b88adf55224fde0e456a9d8665Chris Craik * are met:
7d0fb9fc8829373b88adf55224fde0e456a9d8665Chris Craik *  * Redistributions of source code must retain the above copyright
8d0fb9fc8829373b88adf55224fde0e456a9d8665Chris Craik *    notice, this list of conditions and the following disclaimer.
9d0fb9fc8829373b88adf55224fde0e456a9d8665Chris Craik *  * Redistributions in binary form must reproduce the above copyright
10d0fb9fc8829373b88adf55224fde0e456a9d8665Chris Craik *    notice, this list of conditions and the following disclaimer in the
11d0fb9fc8829373b88adf55224fde0e456a9d8665Chris Craik *    documentation and/or other materials provided with the distribution.
12d0fb9fc8829373b88adf55224fde0e456a9d8665Chris Craik *
13d0fb9fc8829373b88adf55224fde0e456a9d8665Chris Craik * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ``AS IS'' AND ANY
14d0fb9fc8829373b88adf55224fde0e456a9d8665Chris Craik * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
15d0fb9fc8829373b88adf55224fde0e456a9d8665Chris Craik * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
16d0fb9fc8829373b88adf55224fde0e456a9d8665Chris Craik * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR
17d0fb9fc8829373b88adf55224fde0e456a9d8665Chris Craik * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
18d0fb9fc8829373b88adf55224fde0e456a9d8665Chris Craik * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
19d0fb9fc8829373b88adf55224fde0e456a9d8665Chris Craik * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
20d0fb9fc8829373b88adf55224fde0e456a9d8665Chris Craik * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
21d0fb9fc8829373b88adf55224fde0e456a9d8665Chris Craik * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
22d0fb9fc8829373b88adf55224fde0e456a9d8665Chris Craik * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
23d0fb9fc8829373b88adf55224fde0e456a9d8665Chris Craik * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
24d0fb9fc8829373b88adf55224fde0e456a9d8665Chris Craik */
25d0fb9fc8829373b88adf55224fde0e456a9d8665Chris Craik
26d487c56b47c747d3e331ee1892e4c0473363afd2Chris Craik#define LOG_TAG "InspectorCanvas"
27d487c56b47c747d3e331ee1892e4c0473363afd2Chris Craik#define LOG_NDEBUG 1
28d487c56b47c747d3e331ee1892e4c0473363afd2Chris Craik
29d0fb9fc8829373b88adf55224fde0e456a9d8665Chris Craik#include "config.h"
30d0fb9fc8829373b88adf55224fde0e456a9d8665Chris Craik#include "InspectorCanvas.h"
31d0fb9fc8829373b88adf55224fde0e456a9d8665Chris Craik
32d487c56b47c747d3e331ee1892e4c0473363afd2Chris Craik#include "AndroidLog.h"
33d0fb9fc8829373b88adf55224fde0e456a9d8665Chris Craik#include "SkPicture.h"
34d0fb9fc8829373b88adf55224fde0e456a9d8665Chris Craik
35d0fb9fc8829373b88adf55224fde0e456a9d8665Chris Craiknamespace WebCore {
36d0fb9fc8829373b88adf55224fde0e456a9d8665Chris Craik
37d0fb9fc8829373b88adf55224fde0e456a9d8665Chris Craik
38d0fb9fc8829373b88adf55224fde0e456a9d8665Chris Craikvoid InspectorCanvas::setHasText()
39d0fb9fc8829373b88adf55224fde0e456a9d8665Chris Craik{
40d0fb9fc8829373b88adf55224fde0e456a9d8665Chris Craik    m_hasText = true;
41d0fb9fc8829373b88adf55224fde0e456a9d8665Chris Craik    setHasContent();
42d0fb9fc8829373b88adf55224fde0e456a9d8665Chris Craik}
43d0fb9fc8829373b88adf55224fde0e456a9d8665Chris Craik
44d0fb9fc8829373b88adf55224fde0e456a9d8665Chris Craikvoid InspectorCanvas::setHasContent()
45d0fb9fc8829373b88adf55224fde0e456a9d8665Chris Craik{
46d0fb9fc8829373b88adf55224fde0e456a9d8665Chris Craik    m_hasContent = true;
47d0fb9fc8829373b88adf55224fde0e456a9d8665Chris Craik    if (m_hasText) {
48d0fb9fc8829373b88adf55224fde0e456a9d8665Chris Craik        // has text. Have to paint properly, so no further
49d0fb9fc8829373b88adf55224fde0e456a9d8665Chris Craik        // information is useful
50d0fb9fc8829373b88adf55224fde0e456a9d8665Chris Craik        m_picture->abortPlayback();
51d0fb9fc8829373b88adf55224fde0e456a9d8665Chris Craik    }
52d0fb9fc8829373b88adf55224fde0e456a9d8665Chris Craik}
53d0fb9fc8829373b88adf55224fde0e456a9d8665Chris Craik
54d0fb9fc8829373b88adf55224fde0e456a9d8665Chris Craikvoid InspectorCanvas::setIsBackground(const SkPaint& paint)
55d0fb9fc8829373b88adf55224fde0e456a9d8665Chris Craik{
56d0fb9fc8829373b88adf55224fde0e456a9d8665Chris Craik    // TODO: if the paint is a solid color, opaque, and the last instruction in
57d0fb9fc8829373b88adf55224fde0e456a9d8665Chris Craik    // the picture, replace the picture with simple draw rect info
58d0fb9fc8829373b88adf55224fde0e456a9d8665Chris Craik    setHasContent();
59d0fb9fc8829373b88adf55224fde0e456a9d8665Chris Craik}
60d0fb9fc8829373b88adf55224fde0e456a9d8665Chris Craik
61d0fb9fc8829373b88adf55224fde0e456a9d8665Chris Craikvoid InspectorCanvas::commonDrawBitmap(const SkBitmap& bitmap,
62d0fb9fc8829373b88adf55224fde0e456a9d8665Chris Craik                                       const SkIRect* rect,
63d0fb9fc8829373b88adf55224fde0e456a9d8665Chris Craik                                       const SkMatrix&,
64d0fb9fc8829373b88adf55224fde0e456a9d8665Chris Craik                                       const SkPaint&)
65d0fb9fc8829373b88adf55224fde0e456a9d8665Chris Craik{
66d0fb9fc8829373b88adf55224fde0e456a9d8665Chris Craik    setHasContent();
67d0fb9fc8829373b88adf55224fde0e456a9d8665Chris Craik}
68d0fb9fc8829373b88adf55224fde0e456a9d8665Chris Craik
69d0fb9fc8829373b88adf55224fde0e456a9d8665Chris Craikvoid InspectorCanvas::drawPaint(const SkPaint& paint)
70d0fb9fc8829373b88adf55224fde0e456a9d8665Chris Craik{
71d0fb9fc8829373b88adf55224fde0e456a9d8665Chris Craik    setHasContent();
72d0fb9fc8829373b88adf55224fde0e456a9d8665Chris Craik}
73d0fb9fc8829373b88adf55224fde0e456a9d8665Chris Craik
74d0fb9fc8829373b88adf55224fde0e456a9d8665Chris Craikvoid InspectorCanvas::drawPath(const SkPath&, const SkPaint& paint)
75d0fb9fc8829373b88adf55224fde0e456a9d8665Chris Craik{
76d0fb9fc8829373b88adf55224fde0e456a9d8665Chris Craik    setHasContent();
77d0fb9fc8829373b88adf55224fde0e456a9d8665Chris Craik}
78d0fb9fc8829373b88adf55224fde0e456a9d8665Chris Craikvoid InspectorCanvas::drawPoints(PointMode, size_t,
79d0fb9fc8829373b88adf55224fde0e456a9d8665Chris Craik                                 const SkPoint [], const SkPaint& paint)
80d0fb9fc8829373b88adf55224fde0e456a9d8665Chris Craik{
81d0fb9fc8829373b88adf55224fde0e456a9d8665Chris Craik    setHasContent();
82d0fb9fc8829373b88adf55224fde0e456a9d8665Chris Craik}
83d0fb9fc8829373b88adf55224fde0e456a9d8665Chris Craik
84d0fb9fc8829373b88adf55224fde0e456a9d8665Chris Craikvoid InspectorCanvas::drawRect(const SkRect& rect, const SkPaint& paint)
85d0fb9fc8829373b88adf55224fde0e456a9d8665Chris Craik{
86d0fb9fc8829373b88adf55224fde0e456a9d8665Chris Craik    if (rect.fLeft == 0
87d0fb9fc8829373b88adf55224fde0e456a9d8665Chris Craik            && rect.fTop == 0
88d0fb9fc8829373b88adf55224fde0e456a9d8665Chris Craik            && rect.width() >= m_picture->width()
89d0fb9fc8829373b88adf55224fde0e456a9d8665Chris Craik            && rect.height() >= m_picture->height()) {
90d0fb9fc8829373b88adf55224fde0e456a9d8665Chris Craik        // rect same size as canvas, treat layer as a single color rect until
91d0fb9fc8829373b88adf55224fde0e456a9d8665Chris Craik        // more content is drawn
92d0fb9fc8829373b88adf55224fde0e456a9d8665Chris Craik        setIsBackground(paint);
93d0fb9fc8829373b88adf55224fde0e456a9d8665Chris Craik    } else {
94d0fb9fc8829373b88adf55224fde0e456a9d8665Chris Craik        // regular rect drawing path
95d0fb9fc8829373b88adf55224fde0e456a9d8665Chris Craik        setHasContent();
96d0fb9fc8829373b88adf55224fde0e456a9d8665Chris Craik    }
97d487c56b47c747d3e331ee1892e4c0473363afd2Chris Craik    ALOGV("draw rect at %f %f, size %f %f, picture size %d %d",
98d487c56b47c747d3e331ee1892e4c0473363afd2Chris Craik          rect.fLeft, rect.fTop, rect.width(), rect.height(),
99d487c56b47c747d3e331ee1892e4c0473363afd2Chris Craik          m_picture->width(), m_picture->height());
100d0fb9fc8829373b88adf55224fde0e456a9d8665Chris Craik}
101d0fb9fc8829373b88adf55224fde0e456a9d8665Chris Craikvoid InspectorCanvas::drawSprite(const SkBitmap& , int , int ,
102d0fb9fc8829373b88adf55224fde0e456a9d8665Chris Craik                                 const SkPaint* paint)
103d0fb9fc8829373b88adf55224fde0e456a9d8665Chris Craik{
104d0fb9fc8829373b88adf55224fde0e456a9d8665Chris Craik    setHasContent();
105d0fb9fc8829373b88adf55224fde0e456a9d8665Chris Craik}
106d0fb9fc8829373b88adf55224fde0e456a9d8665Chris Craik
107d0fb9fc8829373b88adf55224fde0e456a9d8665Chris Craikvoid InspectorCanvas::drawText(const void*, size_t byteLength, SkScalar,
108d0fb9fc8829373b88adf55224fde0e456a9d8665Chris Craik                               SkScalar, const SkPaint& paint)
109d0fb9fc8829373b88adf55224fde0e456a9d8665Chris Craik{
110d0fb9fc8829373b88adf55224fde0e456a9d8665Chris Craik    setHasText();
111d0fb9fc8829373b88adf55224fde0e456a9d8665Chris Craik}
112d0fb9fc8829373b88adf55224fde0e456a9d8665Chris Craik
113d0fb9fc8829373b88adf55224fde0e456a9d8665Chris Craikvoid InspectorCanvas::drawPosText(const void* , size_t byteLength,
114d0fb9fc8829373b88adf55224fde0e456a9d8665Chris Craik                                  const SkPoint [], const SkPaint& paint)
115d0fb9fc8829373b88adf55224fde0e456a9d8665Chris Craik{
116d0fb9fc8829373b88adf55224fde0e456a9d8665Chris Craik    setHasText();
117d0fb9fc8829373b88adf55224fde0e456a9d8665Chris Craik}
118d0fb9fc8829373b88adf55224fde0e456a9d8665Chris Craik
119d0fb9fc8829373b88adf55224fde0e456a9d8665Chris Craikvoid InspectorCanvas::drawPosTextH(const void*, size_t byteLength,
120d0fb9fc8829373b88adf55224fde0e456a9d8665Chris Craik                                   const SkScalar [], SkScalar,
121d0fb9fc8829373b88adf55224fde0e456a9d8665Chris Craik                                   const SkPaint& paint)
122d0fb9fc8829373b88adf55224fde0e456a9d8665Chris Craik{
123d0fb9fc8829373b88adf55224fde0e456a9d8665Chris Craik    setHasText();
124d0fb9fc8829373b88adf55224fde0e456a9d8665Chris Craik}
125d0fb9fc8829373b88adf55224fde0e456a9d8665Chris Craik
126d0fb9fc8829373b88adf55224fde0e456a9d8665Chris Craikvoid InspectorCanvas::drawTextOnPath(const void*, size_t byteLength,
127d0fb9fc8829373b88adf55224fde0e456a9d8665Chris Craik                                     const SkPath&, const SkMatrix*,
128d0fb9fc8829373b88adf55224fde0e456a9d8665Chris Craik                                     const SkPaint& paint)
129d0fb9fc8829373b88adf55224fde0e456a9d8665Chris Craik{
130d0fb9fc8829373b88adf55224fde0e456a9d8665Chris Craik    setHasText();
131d0fb9fc8829373b88adf55224fde0e456a9d8665Chris Craik}
132d0fb9fc8829373b88adf55224fde0e456a9d8665Chris Craik
133d0fb9fc8829373b88adf55224fde0e456a9d8665Chris Craik} // namespace WebCore
134