15d4ba8869476831ee73b15a052af8003d0a1fa2ereed@google.com/*
25d4ba8869476831ee73b15a052af8003d0a1fa2ereed@google.com * Copyright 2012 Google Inc.
35d4ba8869476831ee73b15a052af8003d0a1fa2ereed@google.com *
45d4ba8869476831ee73b15a052af8003d0a1fa2ereed@google.com * Use of this source code is governed by a BSD-style license that can be
55d4ba8869476831ee73b15a052af8003d0a1fa2ereed@google.com * found in the LICENSE file.
65d4ba8869476831ee73b15a052af8003d0a1fa2ereed@google.com */
75d4ba8869476831ee73b15a052af8003d0a1fa2ereed@google.com
85d4ba8869476831ee73b15a052af8003d0a1fa2ereed@google.com#include "SkImage_Base.h"
95d4ba8869476831ee73b15a052af8003d0a1fa2ereed@google.com#include "SkImagePriv.h"
105d4ba8869476831ee73b15a052af8003d0a1fa2ereed@google.com#include "SkBitmap.h"
115d4ba8869476831ee73b15a052af8003d0a1fa2ereed@google.com#include "SkCanvas.h"
1297b6b0730dcb0feee9224ff04eb3985ca4bd0216robertphillips@google.com#include "GrContext.h"
1397b6b0730dcb0feee9224ff04eb3985ca4bd0216robertphillips@google.com#include "GrTexture.h"
145d4ba8869476831ee73b15a052af8003d0a1fa2ereed@google.com
155d4ba8869476831ee73b15a052af8003d0a1fa2ereed@google.comclass SkImage_Gpu : public SkImage_Base {
165d4ba8869476831ee73b15a052af8003d0a1fa2ereed@google.compublic:
1797b6b0730dcb0feee9224ff04eb3985ca4bd0216robertphillips@google.com    SK_DECLARE_INST_COUNT(SkImage_Gpu)
185d4ba8869476831ee73b15a052af8003d0a1fa2ereed@google.com
194d24b747e272355395f456e088a2d0177c00ddb5commit-bot@chromium.org    explicit SkImage_Gpu(const SkBitmap&);
205d4ba8869476831ee73b15a052af8003d0a1fa2ereed@google.com    virtual ~SkImage_Gpu();
215d4ba8869476831ee73b15a052af8003d0a1fa2ereed@google.com
228572fc01ac4f6bdcf173b05417776abc55f729c1reed    virtual void onDraw(SkCanvas*, SkScalar x, SkScalar y, const SkPaint*) const SK_OVERRIDE;
238572fc01ac4f6bdcf173b05417776abc55f729c1reed    virtual void onDrawRectToRect(SkCanvas*, const SkRect* src, const SkRect& dst,
248572fc01ac4f6bdcf173b05417776abc55f729c1reed                                  const SkPaint*) const SK_OVERRIDE;
258572fc01ac4f6bdcf173b05417776abc55f729c1reed    virtual GrTexture* onGetTexture() const SK_OVERRIDE;
26ace135453db02cfe83d7c7bbeaa679f98d18fbe2reed@google.com    virtual bool getROPixels(SkBitmap*) const SK_OVERRIDE;
2797b6b0730dcb0feee9224ff04eb3985ca4bd0216robertphillips@google.com
288572fc01ac4f6bdcf173b05417776abc55f729c1reed    GrTexture* getTexture() const { return fBitmap.getTexture(); }
295d4ba8869476831ee73b15a052af8003d0a1fa2ereed@google.com
3076d5b477c92ef076374fc7ea9d551c798656bebdpiotaixr    virtual SkShader* onNewShader(SkShader::TileMode,
3176d5b477c92ef076374fc7ea9d551c798656bebdpiotaixr                                  SkShader::TileMode,
3276d5b477c92ef076374fc7ea9d551c798656bebdpiotaixr                                  const SkMatrix* localMatrix) const SK_OVERRIDE;
33d2a3522503ca0c39829f1bb41f01201d1affdaf6piotaixr
34d2a3522503ca0c39829f1bb41f01201d1affdaf6piotaixr    virtual bool isOpaque() const SK_OVERRIDE;
35d2a3522503ca0c39829f1bb41f01201d1affdaf6piotaixr
365d4ba8869476831ee73b15a052af8003d0a1fa2ereed@google.comprivate:
375d4ba8869476831ee73b15a052af8003d0a1fa2ereed@google.com    SkBitmap    fBitmap;
385d4ba8869476831ee73b15a052af8003d0a1fa2ereed@google.com
395d4ba8869476831ee73b15a052af8003d0a1fa2ereed@google.com    typedef SkImage_Base INHERITED;
405d4ba8869476831ee73b15a052af8003d0a1fa2ereed@google.com};
415d4ba8869476831ee73b15a052af8003d0a1fa2ereed@google.com
425d4ba8869476831ee73b15a052af8003d0a1fa2ereed@google.com///////////////////////////////////////////////////////////////////////////////
435d4ba8869476831ee73b15a052af8003d0a1fa2ereed@google.com
444d24b747e272355395f456e088a2d0177c00ddb5commit-bot@chromium.orgSkImage_Gpu::SkImage_Gpu(const SkBitmap& bitmap)
454d24b747e272355395f456e088a2d0177c00ddb5commit-bot@chromium.org    : INHERITED(bitmap.width(), bitmap.height())
464d24b747e272355395f456e088a2d0177c00ddb5commit-bot@chromium.org    , fBitmap(bitmap) {
4749f085dddff10473b6ebf832a974288300224e60bsalomon    SkASSERT(fBitmap.getTexture());
485d4ba8869476831ee73b15a052af8003d0a1fa2ereed@google.com}
495d4ba8869476831ee73b15a052af8003d0a1fa2ereed@google.com
5097b6b0730dcb0feee9224ff04eb3985ca4bd0216robertphillips@google.comSkImage_Gpu::~SkImage_Gpu() {
5197b6b0730dcb0feee9224ff04eb3985ca4bd0216robertphillips@google.com}
525d4ba8869476831ee73b15a052af8003d0a1fa2ereed@google.com
5376d5b477c92ef076374fc7ea9d551c798656bebdpiotaixrSkShader* SkImage_Gpu::onNewShader(SkShader::TileMode tileX,
5476d5b477c92ef076374fc7ea9d551c798656bebdpiotaixr                                   SkShader::TileMode tileY,
5576d5b477c92ef076374fc7ea9d551c798656bebdpiotaixr                                   const SkMatrix* localMatrix) const
5676d5b477c92ef076374fc7ea9d551c798656bebdpiotaixr{
5776d5b477c92ef076374fc7ea9d551c798656bebdpiotaixr    return SkShader::CreateBitmapShader(fBitmap, tileX, tileY, localMatrix);
58cef04f818820e59fb534eb226f967f72497845d3piotaixr}
59cef04f818820e59fb534eb226f967f72497845d3piotaixr
608572fc01ac4f6bdcf173b05417776abc55f729c1reedvoid SkImage_Gpu::onDraw(SkCanvas* canvas, SkScalar x, SkScalar y, const SkPaint* paint) const {
615d4ba8869476831ee73b15a052af8003d0a1fa2ereed@google.com    canvas->drawBitmap(fBitmap, x, y, paint);
625d4ba8869476831ee73b15a052af8003d0a1fa2ereed@google.com}
635d4ba8869476831ee73b15a052af8003d0a1fa2ereed@google.com
64dfec28d4a9e05d1d525f377b380b4df3c5e07c7bcommit-bot@chromium.orgvoid SkImage_Gpu::onDrawRectToRect(SkCanvas* canvas, const SkRect* src, const SkRect& dst,
658572fc01ac4f6bdcf173b05417776abc55f729c1reed                                   const SkPaint* paint) const {
66dfec28d4a9e05d1d525f377b380b4df3c5e07c7bcommit-bot@chromium.org    canvas->drawBitmapRectToRect(fBitmap, src, dst, paint);
67dfec28d4a9e05d1d525f377b380b4df3c5e07c7bcommit-bot@chromium.org}
68dfec28d4a9e05d1d525f377b380b4df3c5e07c7bcommit-bot@chromium.org
698572fc01ac4f6bdcf173b05417776abc55f729c1reedGrTexture* SkImage_Gpu::onGetTexture() const {
704d24b747e272355395f456e088a2d0177c00ddb5commit-bot@chromium.org    return fBitmap.getTexture();
7197b6b0730dcb0feee9224ff04eb3985ca4bd0216robertphillips@google.com}
7297b6b0730dcb0feee9224ff04eb3985ca4bd0216robertphillips@google.com
73ace135453db02cfe83d7c7bbeaa679f98d18fbe2reed@google.combool SkImage_Gpu::getROPixels(SkBitmap* dst) const {
7428fcae2ec77eb16a79e155f8d788b20457f1c951commit-bot@chromium.org    return fBitmap.copyTo(dst, kN32_SkColorType);
75ace135453db02cfe83d7c7bbeaa679f98d18fbe2reed@google.com}
76ace135453db02cfe83d7c7bbeaa679f98d18fbe2reed@google.com
77d2a3522503ca0c39829f1bb41f01201d1affdaf6piotaixrbool SkImage_Gpu::isOpaque() const {
78d2a3522503ca0c39829f1bb41f01201d1affdaf6piotaixr    return fBitmap.isOpaque();
79d2a3522503ca0c39829f1bb41f01201d1affdaf6piotaixr}
80d2a3522503ca0c39829f1bb41f01201d1affdaf6piotaixr
8197b6b0730dcb0feee9224ff04eb3985ca4bd0216robertphillips@google.com///////////////////////////////////////////////////////////////////////////////
8297b6b0730dcb0feee9224ff04eb3985ca4bd0216robertphillips@google.com
834d24b747e272355395f456e088a2d0177c00ddb5commit-bot@chromium.orgSkImage* SkImage::NewTexture(const SkBitmap& bitmap) {
844d24b747e272355395f456e088a2d0177c00ddb5commit-bot@chromium.org    if (NULL == bitmap.getTexture()) {
855d4ba8869476831ee73b15a052af8003d0a1fa2ereed@google.com        return NULL;
865d4ba8869476831ee73b15a052af8003d0a1fa2ereed@google.com    }
87fbfcd5602128ec010c82cb733c9cdc0a3254f9f3rmistry@google.com
884d24b747e272355395f456e088a2d0177c00ddb5commit-bot@chromium.org    return SkNEW_ARGS(SkImage_Gpu, (bitmap));
8997b6b0730dcb0feee9224ff04eb3985ca4bd0216robertphillips@google.com}
9097b6b0730dcb0feee9224ff04eb3985ca4bd0216robertphillips@google.com
9197b6b0730dcb0feee9224ff04eb3985ca4bd0216robertphillips@google.comGrTexture* SkTextureImageGetTexture(SkImage* image) {
9297b6b0730dcb0feee9224ff04eb3985ca4bd0216robertphillips@google.com    return ((SkImage_Gpu*)image)->getTexture();
935d4ba8869476831ee73b15a052af8003d0a1fa2ereed@google.com}
94