Subversion Repositories tpanel

Rev

Rev 28 | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 28 Rev 31
Line 175... Line 175...
175
{
175
{
176
    DECL_TRACER("TPage::show()");
176
    DECL_TRACER("TPage::show()");
177
 
177
 
178
    if (!_setBackground)
178
    if (!_setBackground)
179
    {
179
    {
-
 
180
        if (gPageManager && gPageManager->getCallbackBG())
-
 
181
            _setBackground = gPageManager->getCallbackBG();
-
 
182
        else
-
 
183
        {
180
        MSG_WARNING("No callback \"setBackground\" was set!");
184
            MSG_WARNING("No callback \"setBackground\" was set!");
181
        return;
185
            return;
-
 
186
        }
182
    }
187
    }
183
 
188
 
184
    ulong handle = (pageID << 16) & 0xffff0000;
189
    ulong handle = (pageID << 16) & 0xffff0000;
185
    MSG_DEBUG("Processing page " << pageID);
190
    MSG_DEBUG("Processing page " << pageID);
186
 
191
 
Line 196... Line 201...
196
            DecodeDataToBitmap(rawImage, &bm);
201
            DecodeDataToBitmap(rawImage, &bm);
197
            SkImageInfo info = bm.info();
202
            SkImageInfo info = bm.info();
198
            size_t rowBytes = info.minRowBytes();
203
            size_t rowBytes = info.minRowBytes();
199
            size_t size = info.computeByteSize(rowBytes);
204
            size_t size = info.computeByteSize(rowBytes);
200
            calcPosition(info.width(), info.height(), &l, &t);
205
            calcPosition(info.width(), info.height(), &l, &t);
-
 
206
            MSG_DEBUG("Background image size: l=" << l << ", t=" << t << ", w=" << info.width() << ", h=" << info.height());
201
            sk_sp<SkImage> im = SkImage::MakeFromBitmap(bm);
207
            sk_sp<SkImage> im = SkImage::MakeFromBitmap(bm);
202
            bm.allocN32Pixels(width, height);
208
            bm.allocN32Pixels(width, height);
203
            bm.eraseColor(TColor::getSkiaColor(sr[0].cf));
209
            bm.eraseColor(TColor::getSkiaColor(sr[0].cf));
204
            SkCanvas can(bm, SkSurfaceProps(1, kUnknown_SkPixelGeometry));
210
            SkCanvas can(bm, SkSurfaceProps(1, kUnknown_SkPixelGeometry));
205
            SkRect rect = SkRect::MakeXYWH(l, l, info.width(), info.height());
211
            SkRect rect = SkRect::MakeXYWH(l, t, info.width(), info.height());
206
            SkPaint paint;
212
            SkPaint paint;
207
            paint.setBlendMode(SkBlendMode::kSrc);
213
            paint.setBlendMode(SkBlendMode::kSrc);
208
            can.drawImageRect(im, rect, &paint);
214
            can.drawImageRect(im, rect, &paint);
209
            rowBytes = bm.info().minRowBytes();
215
            rowBytes = bm.info().minRowBytes();
210
            size = bm.info().computeByteSize(rowBytes);
216
            size = bm.info().computeByteSize(rowBytes);
211
 
217
 
212
            if (gPageManager && gPageManager->getScaleFactor() != 1.0)
218
            if (gPageManager && gPageManager->getScaleFactor() != 1.0)
213
            {
219
            {
214
                paint.setFilterQuality(kHigh_SkFilterQuality);
220
                paint.setFilterQuality(kHigh_SkFilterQuality);
215
                // Calculate new dimension
221
                // Calculate new dimension
216
                int lwidth = (int)((double)info.width() * gPageManager->getScaleFactor());
222
                double scaleFactor = gPageManager->getScaleFactor();
217
                int lheight = (int)((double)info.height() * gPageManager->getScaleFactor());
223
                MSG_DEBUG("Using scale factor " << scaleFactor);
218
                int twidth = (int)((double)width * gPageManager->getScaleFactor());
224
                int lwidth = (int)((double)info.width() * scaleFactor);
219
                int theight = (int)((double)height * gPageManager->getScaleFactor());
225
                int lheight = (int)((double)info.height() * scaleFactor);
220
                int lleft = (int)(((double)(twidth - lwidth) / 2.0) * gPageManager->getScaleFactor());
226
                int twidth = (int)((double)width * scaleFactor);
221
                int ltop = (int)(((double)(theight - lheight) / 2.0) * gPageManager->getScaleFactor());
227
                int theight = (int)((double)height * scaleFactor);
222
                calcPosition(lwidth, lheight, &lleft, &ltop);
228
                calcPosition(lwidth, lheight, &l, &t, true);
-
 
229
                MSG_DEBUG("Scaled background image: l=" << l << ", t=" << t << ", w=" << lwidth << ", h=" << lheight << ", total w=" << twidth << ", total h=" << theight);
223
                // Create a canvas and draw new image
230
                // Create a canvas and draw new image
224
                sk_sp<SkImage> im = SkImage::MakeFromBitmap(bm);
231
                sk_sp<SkImage> im = SkImage::MakeFromBitmap(bm);
225
                bm.allocN32Pixels(twidth, theight);
232
                bm.allocN32Pixels(twidth, theight);
226
                bm.eraseColor(TColor::getSkiaColor(sr[0].cf));
233
                bm.eraseColor(TColor::getSkiaColor(sr[0].cf));
227
                SkCanvas can(bm, SkSurfaceProps(1, kUnknown_SkPixelGeometry));
234
                SkCanvas can1(bm, SkSurfaceProps(1, kUnknown_SkPixelGeometry));
228
                SkRect rect = SkRect::MakeXYWH(lleft, ltop, lwidth, lheight);
235
                SkRect rect = SkRect::MakeXYWH(l, t, lwidth, lheight);
229
                can.drawImageRect(im, rect, &paint);
236
                can1.drawImageRect(im, rect, &paint);
230
                rowBytes = bm.info().minRowBytes();
237
                rowBytes = bm.info().minRowBytes();
231
                size = bm.info().computeByteSize(rowBytes);
238
                size = bm.info().computeByteSize(rowBytes);
232
            }
239
            }
233
 
240
 
234
            _setBackground(handle, (unsigned char *)bm.getPixels(), size, rowBytes, TColor::getColor(sr[0].cf));
241
            _setBackground(handle, (unsigned char *)bm.getPixels(), size, rowBytes, TColor::getColor(sr[0].cf));
Line 573... Line 580...
573
 
580
 
574
    mZOrder = ZORDER_INVALID;
581
    mZOrder = ZORDER_INVALID;
575
    mVisible = false;
582
    mVisible = false;
576
}
583
}
577
 
584
 
578
void TPage::calcPosition(int im_width, int im_height, int *left, int *top)
585
void TPage::calcPosition(int im_width, int im_height, int *left, int *top, bool scale)
579
{
586
{
580
    DECL_TRACER("TPage::calcPosition(int im_width, int im_height, int *left, int *top)");
587
    DECL_TRACER("TPage::calcPosition(int im_width, int im_height, int *left, int *top)");
581
 
588
 
582
    int nw = width;
589
    int nw = width;
583
    int nh = height;
590
    int nh = height;
584
 
591
 
585
    if (gPageManager && gPageManager->getScaleFactor() != 1.0)
592
    if (scale && gPageManager && gPageManager->getScaleFactor() != 1.0)
586
    {
593
    {
587
        nw = (int)((double)width * gPageManager->getScaleFactor());
594
        nw = (int)((double)width * gPageManager->getScaleFactor());
588
        nh = (int)((double)height * gPageManager->getScaleFactor());
595
        nh = (int)((double)height * gPageManager->getScaleFactor());
589
    }
596
    }
590
 
597
 
Line 592... Line 599...
592
    {
599
    {
593
        case 0: // absolute position
600
        case 0: // absolute position
594
            *left = sr[0].bx;
601
            *left = sr[0].bx;
595
            *top = sr[0].by;
602
            *top = sr[0].by;
596
 
603
 
597
            if (gPageManager && gPageManager->getScaleFactor() != 1.0)
604
            if (scale && gPageManager && gPageManager->getScaleFactor() != 1.0)
598
            {
605
            {
599
                *left = (int)((double)sr[0].bx * gPageManager->getScaleFactor());
606
                *left = (int)((double)sr[0].bx * gPageManager->getScaleFactor());
600
                *left = (int)((double)sr[0].by * gPageManager->getScaleFactor());
607
                *left = (int)((double)sr[0].by * gPageManager->getScaleFactor());
601
            }
608
            }
602
        break;
609
        break;
Line 619... Line 626...
619
        case 4: // left, middle
626
        case 4: // left, middle
620
            *left = 0;
627
            *left = 0;
621
            *top = (nh - im_height) / 2;
628
            *top = (nh - im_height) / 2;
622
        break;
629
        break;
623
 
630
 
624
        case 5: // center, middle
-
 
625
            *left = (nw - im_width) / 2;
-
 
626
            *top = (nh - im_height) / 2;
-
 
627
        break;
-
 
628
 
-
 
629
        case 6: // right, middle
631
        case 6: // right, middle
630
            *left = nw - im_width;
632
            *left = nw - im_width;
631
            *top = (nh - im_height) / 2;
633
            *top = (nh - im_height) / 2;
632
        break;
634
        break;
633
 
635
 
Line 643... Line 645...
643
 
645
 
644
        case 9: // right, bottom
646
        case 9: // right, bottom
645
            *left = nw - im_width;
647
            *left = nw - im_width;
646
            *top = nh - im_height;
648
            *top = nh - im_height;
647
        break;
649
        break;
-
 
650
 
-
 
651
        default:    // center middle
-
 
652
            *left = (nw - im_width) / 2;
-
 
653
            *top = (nh - im_height) / 2;
648
    }
654
    }
649
 
655
 
650
    if (*left < 0)
656
    if (*left < 0)
651
        *left = 0;
657
        *left = 0;
652
 
658